浅谈用矩阵求斐波那契数列

导语

两个矩阵的乘法仅当第一个矩阵 A A A
的列数和第二个矩阵 B B B
的行数相等时才能定义。如
A A A
m ∗ n m*n mn矩阵, B B B n ∗ p n*p np的矩阵,他们的乘积
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=1nai,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=Fmn1a+Fmnb=Fmn1Fn+FmnFn+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} FnFnFmn1

所以

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,FmnFn+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+1Fn)=gcd(Fn,Fn1)=gcd(Fn2,Fn1)=...=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,FmnFn+1)=gcd(Fn,Fmn)

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,Fmn)

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,Fmn)=gcd(Fn,Fm2n)

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+1FnFnFn1]

[ 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+Fn1Fn+Fn10Fn+Fn10Fn1+Fn0]

[ 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]×[FnFn1Fn1Fn2]

如此持续操作,直到出现

[ 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

因此用矩阵乘法求快速幂即可

证毕

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值