斐波那契周期性
斐波那契周期性
定义
有通项公式:
周期的计算
引理1
对于奇素数 \(p\equiv 1\pmod 5\) 或 \(p\equiv 4\pmod 5\),\(p-1\) 是一个周期。
证法一
此证法来自《数论概论》。
因为 \(p\equiv 1\pmod 5\) 或 \(p\equiv 4\pmod 5\),故 \(p\) 是个 \(\text{QR}\)。
根据二次互反律,有:
故 \(5\) 为模 \(p\) 的二次剩余,于是存在整数 \(c^2\equiv 5\pmod p\)。由于 \(p\nmid c\) 且 \(p\) 是质数,\(c\) 存在逆元 \(c^{-1}\)。
我们定义模 \(p\) 意义下的序列 \(J\):
由 \(c^2\equiv 5\pmod p\) 可知:
于是 \(J\) 和 \(Fib\) 有相同的初值和递归关系,故有:
我们记 \(U=\dfrac{p+1}{2},V=\dfrac{p-1}{2}\)
有:
由费马小定理可知:
即模 \(p\) 每 \(p-1\) 循环一个,即 \(p-1\) 是周期。
证法二
该证法来自 OIwiki。
由 \(C_n^m\) 计算式知:当 \(0<i<p\) 时,\(C_p^i\equiv 0\pmod p\)。
我们直接把 \(Fib_n\) 按照定义展开:
由费马小定理,有 \(2^{p-1}\equiv 1\pmod p\);\(5\) 为模 \(p\) 意义下的二次剩余,根据欧拉准则,有 \(5^{\tfrac{p-1}{2}}\equiv 1\pmod p\),故:
用相似的方法展开 \(Fib_{p+1}\),发现 \(Fib_{p+1}\equiv 1\pmod p\)。
故 \(Fib_{p}\) 和 \(Fib_{p+1}\) 两项都同余 \(1\),与 \(Fib_1\) 和 \(Fib_2\) 一致,故 \(p-1\) 是周期。
引理2
对于奇素数 \(p\equiv 2\pmod 5\) 或 \(p\equiv 3\pmod 5\),\(2p+2\) 是一个周期。
证明:
该证法来自 OIwiki。
相似的,我们直接展开 \(Fib_{2p}\) 和 \(Fib_{2p+1}\):
可以验证,\(Fib_{2p}\) 的式子模了 \(p\) 之后只有 \(C_{2p}^{p}\) 项留了下来,又:
故:
所以根据费马小定理,有 \(2^{2p-2}\equiv 1\pmod p\);而 \(5\) 又是模 \(p\) 下的二次非剩余,根据欧拉准则,有 \(5^{\tfrac{p-1}{2}}\equiv -1\pmod p\),故:
用相似的方法展开 \(Fib_{2p+1}\),套一些组合数的性质,发现 \(Fib_{2p+1}\equiv 1\pmod p\)。
而我们根据 \(Fib_{n}=Fib_{n-2}+Fib_{n-1}\),可以倒着推出来 \(Fib_{-2}=-1,Fib_{-1}=1\)。
故 \(Fib_{p}\) 和 \(Fib_{p+1}\) 两项,与 \(Fib_{-2}\) 和 \(Fib_{-1}\) 一致,故 \(2p+2\) 是周期。
引理3
来自于这篇博客。
若 \(a\equiv 1\pmod p\),则 \(a^{p^k}\equiv1\pmod {p^{k+1}}\)
证明:
归纳证明法。假设对于 \(k-1\) 成立,即:
我们设:
则:
在模 \(p^{k+1}\) 意义下,\(i\ge1\) 的项都没了,于是:
证毕。
引理4
来自于这篇博客。
若 \(p\) 为奇素数,\(p\) 的循环节为 \(t\),那么有 $ tp^{k-1}$ 是 \(p^k\) 的循环节。
证明:
我们记 \(U=\dfrac{1+\sqrt 5}{2},V=\dfrac{1-\sqrt 5}{2}\)
根据 \(t\) 为 \(p\) 的循环节,我们有:
故:
又:
因为 \(Fib_1\equiv 1\pmod p\),故 \(U^t\equiv V^t\equiv 1\pmod p\)
根据引理3,有:
这蕴含着:
即 \(tp^{k-1}\) 是模 \(p^k\) 的循环节。
综合上述四个引理,我们就找到了一种计算斐波那契在模 \(m\) 意义下的循环节(注意,不是最小的)的方法:
-
对 \(m\) 分解质因数:\(m=\prod\limits_{i=1}^{w}p_i^{c_i}\)
-
枚举 \(m\) 的每个质因子 \(p_i\),根据引理1和2,计算模 \(p_i\) 意义下的循环节 \(t_i\)。(特别的,若 \(p_i=2\),则循环节为 \(3\);若 \(p_i=5\),则循环节为 \(20\))
-
根据引理4,计算出模 \(p_i^{c_i}\) 意义下的循环节 \(T_i=t_ip_i^{c_i-1}\)。
-
最后,计算模 \(m\) 意义下的循环节 \(T=\operatorname{lcm}_{i=1}^{w}T_i\) 即可。
点击查看代码
for(ll i=2;i*i<=m;i++){
if(tmp%i==0){
prime[++tot]=i;
while(tmp%i==0) cnt[tot]++,m/=i;
}
}
if(m!=1) prime[++tot]=m,cnt[tot]++;
ll zhou=1;
for(int i=1;i<=tot;i++){
ll g;
if(prime[i]==2) g=3;
else if(prime[i]==5) g=20;
else if(prime[i]%5==1||prime[i]%5==4) g=prime[i]-1;
else if(prime[i]%5==2||prime[i]%5==3) g=2*prime[i]+2;
g=g*spow(prime[i],cnt[i]-1);
zhou=zhou/gcd(zhou,g)*g;
}