斐波那契循环节
从一道题引出一个算法:斐波那契数列
这道题并没有什么花里胡哨的条件,就是很简单的计算\(F(n)\ mod\ p\)。
但是这题的\(n\)达到了\(10^{30000000}\)级别,很显然不能直接用矩阵快速幂做。
因此我们要引入一个概念:斐波那契循环节。
显而易见的是通过看题解我们知道,斐波那契数列在模一个数时会出现循环,而这个周期的长度就称为斐波那契循环节。
所以我们只需要求出斐波那契循环节\(m\),然后用矩阵快速幂计算\(F(n\ mod\ m)\ mod\ p\)就行了。
下面将会介绍如何计算斐波那契循环节。
(因为这只是介绍文并非论文,难免有不严谨之处,敬请谅解。本文以通俗易懂为前提,夹有较为详细的证明。)
参考自一篇全英文的paperThe Period of the Fibonacci Sequence Modulo j
\(Tips:\)
\(1.\)本文的数学推导具有一定难度,部分知识涉及到了高等代数和初等数论,不知道的东西可以上网查,如果实在不懂可以暂时跳过,因为这并不会影响到阅读其他部分。
\(2.\)如果不想看证明过程,可以直接跳到第五部分看结论。
\(1.\)前置知识
二次剩余
直接看我的另一篇博客吧。二次剩余
域
有一个非空集合\(G\),和在\(G\)上的一个二元运算\(\cdot:G\times G\mapsto G\)。
(一般我们叫这个运算乘法,其运算结果为积)
它们构成了一个代数系统\(\{G,\cdot\}\),这个代数系统满足:
\(1.\)封闭性:\(\forall a,b\in G,a\cdot b\in G\)。
\(2.\)结合律:\(\forall a,b,c\in G,(a\cdot b)\cdot c=a\cdot(b\cdot c)\)。
那么我们将其称为半群。
如果这个半群还满足
\(3.\)单位元:\(\exists e\in G,\forall a\in G,e\cdot a=a\cdot e=a\)。这个\(e\)称作单位元,或者称作\(1\)。(\(a^0=1\))
\(4.\)逆元:\(\forall a\in G,\exists b\in G,a\cdot b=b\cdot a=e\)。这个\(b\)称作\(a\)的逆元,记做\(a^{-1}\)。(逆元具有唯一性)
那么我们将其称为群。
如果这个群还满足
\(5.\)交换律:\(\forall a,b\in G,a\cdot b=b\cdot a\)。
那么我们称这个群为交换群或阿贝尔群。
在阿贝尔群中这个二元运算经常被称作加法,其运算结果为和,这个运算记做\(+\)。
此时该群的单位元经常被称作零元,记作\(0\)。\(a\)逆元的逆元经常被记作\(-a\)。
(这些东西可以联想实数的加法和乘法)
设\(\{G,+,\cdot\}\)是一个代数系统(\(G\)是非空集合,\(+\)和\(\cdot\)为二元运算即加法和乘法),若
\(1.\{G,+\}\)是一个交换群。
\(2.\{G,\cdot\}\)是一个半群。
\(3.\)分配率:\(\forall a,b,c\in G,a\cdot(b+c)=(a\cdot b)+(a\cdot c),(a+b)\cdot c=(a\cdot c)+(b\cdot c)\)。
那么我们将其称为环。
如果这个环满足
\(4.\{G\setminus\{0\},\cdot\}\)是一个交换群。
那么我们将其称为域。(实际上第四条性质中把\(0\)去掉就只是因为在域中\(0\)不具有乘法逆元)
特征方程
百度百科特征方程,包会。特征方程
\(2.\)定义
斐波那契数列
\[ \forall n\in\mathbb N_ +,F_{n+1}=F_n+F_{n-1}(F_0=0,F_1=1) \]