导语
两个矩阵的乘法仅当第一个矩阵
A
A
A
的列数和第二个矩阵
B
B
B
的行数相等时才能定义。如
A
A
A
是
m
∗
n
m*n
m∗n矩阵,
B
B
B是
n
∗
p
n*p
n∗p的矩阵,他们的乘积
C
C
C=
(
c
i
,
j
)
(c_{i,j})
(ci,j),它的任意一个元素值为:
c i , j = a i , 1 b 1 , j + a i , 2 b 2 , j + . . . + a i , n b n , j = ∑ n = 1 n a i , r b r , j c_{i,j}=a_{i,1}b_{1,j}+a_{i,2}b_{2,j}+...+a_{i,n}b_{n,j}= \sum\limits_{n=1}^na_{i,r}b_{r,j} ci,j=ai,1b1,j+ai,2b2,j+...+ai,nbn,j=n=1∑nai,rbr,j
求斐波那契数列数列有多种方法,比如用递推公式,或是用生成函数求出其通项公式,可惜这两种方法在遇到数据规模较大时会超时,下面介绍一种方法我们将用到矩阵,用矩阵快速幂的方法可以求得斐波那契数列的第i项。
证明
我们首先证明这样一个结论
g c d ( F n , F m ) = F g c d ( n , m ) {gcd(F_{n},F_{m})=F_{gcd(n,m)}} gcd(Fn,Fm)=Fgcd(n,m)
证明1
设 F n = a , F n + 1 = b F_{n}=a,F_{n+1}=b Fn=a,Fn+1=b
所以 F n + 2 = a + b , F n + 3 = a + 2 b , F n + 4 = 2 a + 3 b , F ( n + 5 ) = 3 a + 5 b F_{n+2}=a+b,F_{n+3}=a+2b,F_{n+4}=2a+3b,F_(n+5)=3a+5b Fn+2=a+b,Fn+3=a+2b,Fn+4=2a+3b,F(n+5)=3a+5b
得到
F m = F m − n − 1 ∗ a + F m − n ∗ b = F m − n − 1 ∗ F n + F m − n ∗ F n + 1 F_{m}=F_{m-n-1}*a+F_{m-n}*b=F_{m-n-1}*F_{n}+F_{m-n}*F_{n+1} Fm=Fm−n−1∗a+Fm−n∗b=Fm−n−1∗Fn+Fm−n∗Fn+1
假设 m > n m>n m>n,需求 g c d ( F n , F m ) {gcd(F_{n},F_{m})} gcd(Fn,Fm)
又因为 F n ∣ F n ∗ F m − n − 1 F_{n}|F_{n}*F_{m-n-1} Fn∣Fn∗Fm−n−1
所以
g c d ( F n , F m ) ⟺ g c d ( F n , F m − n F n + 1 ) {gcd(F_{n},F_{m})}{\Longleftrightarrow{gcd(F_{n},F_{m-n}F_{n+1})}} gcd(Fn,Fm)⟺gcd(Fn,Fm−nFn+1)
这里再证明一个结论
g c d ( F n , F n + 1 ) = 1 gcd(F_{n},F_{n+1})=1 gcd(Fn,Fn+1)=1
证明2
g c d ( F n , F n + 1 ) = g c d ( F n , F n + 1 − F n ) = g c d ( F n , F n − 1 ) = g c d ( F n − 2 , F n − 1 ) = . . . = g c d ( F 1 , F 2 = 1 ) gcd(F_{n},F_{n+1})= gcd(F_{n},F_{n+1}-F_{n})= gcd(F_{n},F_{n-1})= gcd(F_{n-2},F_{n-1})= ...= gcd(F_{1},F_{2}=1) gcd(Fn,Fn+1)=gcd(Fn,Fn+1−Fn)=gcd(Fn,Fn−1)=gcd(Fn−2,Fn−1)=...=gcd(F1,F2=1)
故
g c d ( F n , F n + 1 ) = 1 gcd(F_{n},F_{n+1})=1 gcd(Fn,Fn+1)=1
回到证明1
因为 g c d ( F n , F n + 1 ) = 1 gcd(F_{n},F_{n+1})=1 gcd(Fn,Fn+1)=1
所以
g c d ( F n , F m − n F n + 1 ) = g c d ( F n , F m − n ) gcd(F_{n},F_{m-n}F_{n+1})=gcd(F_{n},F_{m-n}) gcd(Fn,Fm−nFn+1)=gcd(Fn,Fm−n)
g c d ( F n , F m ) = g c d ( F n , F m − n ) gcd(F_{n},F_{m})=gcd(F_{n},F_{m-n}) gcd(Fn,Fm)=gcd(Fn,Fm−n)
g c d ( F n , F m − n ) = g c d ( F n , F m − 2 n ) gcd(F_{n},F_{m-n})=gcd(F_{n},F_{m-2n}) gcd(Fn,Fm−n)=gcd(Fn,Fm−2n)
…
g c d ( F n , F m ) = g c d ( F n , F m − ( m / n ) ∗ n ) gcd(F_{n},F_{m})=gcd(F_{n},F_{m-(m/n)*n}) gcd(Fn,Fm)=gcd(Fn,Fm−(m/n)∗n)
然后 m 1 = n , n 1 = m − ( m / n ) n m1=n,n1=m-(m/n)n m1=n,n1=m−(m/n)n
再来
直到出现 F 0 F_{0} F0,此时 F n 1 F_{n1} Fn1即我们要求的答案, n 1 = = g c d ( n , m ) n1==gcd(n,m) n1==gcd(n,m)
证毕
证明2
对于斐波那契数列,我们可以这样理解
[ F n + 1 F n F n F n − 1 ] \begin{bmatrix}F_{n+1}&F_{n}\\F_{n}&F_{n-1} \end{bmatrix} \quad [Fn+1FnFnFn−1]
即
[ F n + F n − 1 F n + F n − 1 ⋅ 0 F n + F n − 1 ⋅ 0 F n − 1 + F n ⋅ 0 ] \begin{bmatrix}F_{n}+F_{n-1}&F_{n}+F_{n-1}\cdot0 \\ F_{n}+F_{n-1}\cdot0 & F_{n-1}+F_{n}\cdot0 \end{bmatrix} \quad [Fn+Fn−1Fn+Fn−1⋅0Fn+Fn−1⋅0Fn−1+Fn⋅0]
[ 1 1 1 0 ] × [ F n F n − 1 F n − 1 F n − 2 ] \begin{bmatrix} 1 & 1 \\ 1 & 0 \end{bmatrix} \quad\times\begin{bmatrix} F_{n} & F_{n-1} \\ F_{n-1} & F_{n-2} \end{bmatrix} \quad [1110]×[FnFn−1Fn−1Fn−2]
如此持续操作,直到出现
[ F 2 F 1 F 1 F 0 ] \begin{bmatrix} F_{2} & F_{1} \\ F_{1} & F_{0} \end{bmatrix} \quad [F2F1F1F0]
即
[ 1 1 1 0 ] \begin{bmatrix} 1 & 1 \\ 1 & 0 \end{bmatrix} \quad [1110]
此间有 n n n个 [ 1 1 1 0 ] \begin{bmatrix} 1 & 1 \\ 1 & 0 \end{bmatrix} \quad [1110]相乘,即 [ 1 1 1 0 ] n \begin{bmatrix} 1 & 1 \\ 1 & 0 \end{bmatrix} \quad^{n} [1110]n
因此用矩阵乘法求快速幂即可
证毕