斐波那契数列的模意义下循环节
以 (f_0 = 0,f_1 = 1,f_n = f_{n-1}+f_{n-2}) 为例。其中 (a,b) 为给定的常数。(10^3) 组询问,每次给定模数 (p(< 10^9)),求 (f) 的最小循环节。(其实(f_0,f_1),以及递推式不同,也可以用类似的方法)
可以找出任意一个循环节,那么最小循环节应该是这个循环节的一个约数。枚举判断即可。
p为奇素数
众所周知,(f_n = frac{phi^n - hat{phi}^n}{sqrt 5})。根据不同的递推式,也可以用特征根法求通项得到类似的式子。
发现无论是 (phi),还是 (hat{phi}),还是分母,都含有 (sqrt 5) 的项。如果 (5) 在模 (p) 意义下是二次剩余,那么 (sqrt 5,phi,hat{phi}) 的循环节都是 (p-1),那么可得 (f) 的循环节为 (p-1)。
但是,有时候 (5) 并不是二次剩余,但是这就意味着 (5^{(p-1)/2}=-1)。然后有一个神奇的式子(phi^p=hat{phi},hatphi^p=phi)。证明如下:
其中用到了 ((a+b)^p=a^p+b^p) 和 (a^p=a)。(hatphi^p=phi) 的证明也类似。然后观察特征方程,根据韦达定理发现 (phihatphi=-1),那么就有 (phi^2 hatphi^2 = 1)。
这个对于其余的递推式来说也一样,只不过可能需要要求 ((phihatphi)^2=1) 或者某些更好的式子(如 (phihatphi=1))
于是,当 (5) 不是二次剩余的时候,(f) 的循环节长度为 (2p+2)。
p^k
有一个神奇的结论:
其中 (L(a)) 表示模数为 (a) 的斐波那契循环节长度。证明:
假设 (L(p)=m,m'=mp^{k-1})
还有个更强的:
所以 (L(p^k) = m' = L(p)m^{k-1})
其中用到了定理:如果 (a = 1 pmod p),那么 (a^{p^k}=1 pmod {p^{k+1}})。可以用归纳法证明(见开头博客)。
此外,我尚未尝试在其它递推式的数列中使用此方法证明,但是对于 (f_n=3f_{n-1}-f_{n-2}) 的小范围打表中可以验证 (L(p^k) = L(p)p^{k-1})。
pq,且p,q互质
中国剩余定理可知,(L(pq)=lcm(L(p),L(q)),(gcd(p,q)=1))。
至少反过来证明 (lcm(L(p),L(q))) 为模 (pq) 的循环节不难。因为 (f(km)=0 pmod p,k in Z;f(km')=0 pmod q,k in Z),所以 (f(klcm(m,m'))=0 pmod {pq},k in Z)
于是,我们可以用类似求积性函数的方法来求模 p 意义下的循环节。最后枚举一下约数即可。
一些技巧和结论
我们自然可以通过欧拉判别准则((dfrac{a}{p})=a^{(p-1)/2}) 来判断奇素数是否是二次剩余,但是还有个 (O(1)) 的方法:二次互反律,即对于两个奇素数 (p,q),有 ((dfrac{p}{q}) cdot (dfrac{q}{p}) = (-1)^{frac{p-1}2} cdot (-1)^{frac{q-1}2})。于是可以转化为判断 (p) 是否在模 (5) 的意义下是二次剩余,这个可以 (O(1)) 判断:(1,4) 是,(2,3) 不是。
总复杂度:(O(sigma_0(n)log n)),瓶颈在于判断约数是否为循环节,需要矩乘。
有结论:答案不超过 (6p)。当然,对于 (p < 1000),可以直接 (p^2) 地判断。
似乎可以直接在 (p) 为奇素数那里枚举 (p-1) 或 (2p+2) 的约数,其余不用枚举约数,最终就可以得到最小循环节。并不会证明,也仅限于斐波那契数列。