浅谈斐波那契数列——从递推到矩阵乘法
2017-08-14 12:32
260 查看
说在前面
相信大家都已经知道这个中外著名的费波纳切数列了吧,关于费波那契数列有很多有趣的性质,但我们这里不讲,在这里我们只是利用斐波那契数列来引出另一个神奇的东西,矩阵乘法,递推在这里是起一个对比与铺垫的作用,(没有对比就不知道矩阵乘法有多快)。斐波那契数列
定义一个数列F(n)=⎧⎩⎨0,1,Fn−1+Fn−2,n=0 n=1n≥2
递推
递推(我当大家都会了),但是这样的做法时间复杂度是O(n),的,当n很大时,这个算法就会T。通项公式
斐波那契数列有一个通项公式,F(n)=15√×⎡⎣(1+5√2)n−(1−5<19f08
/span>√2))n⎤⎦,直接用快速幂计算两个log,但是如果要取模怎么办?求一个非整数的逆元?通项公式似乎很难。
进入正题——矩阵乘法
知识预备:①设
A=[1−10321]
B=⎡⎣⎢321110⎤⎦⎥
AB=[(1×3+0×2+2×1)(−1×3+3×2+1×1)(1×1+0×1+2×0)(−1×1+3×1+1×0)]=[5412]
②设
A=[abcd]
B=[ef]
AB=[ae+cfbe+df]
有了这些东西,接下来就可以做斐波那契了,把相邻两项写在一个2*1的矩阵中,
[FnFn−1]=[Fn−1+Fn−2Fn−1]=[Fn−1×1+Fn−2×1Fn−1×1+Fn−2×0]=[1110]×[Fn−1Fn−2]=[1110]n−1×[F1F0]=[1110]n−1×[10]
那么问题的本质,就是如何解决计算这一块
[1110]n−1
算完之后,取矩阵第一行第一列的元素,计算这个其实又是快速幂,说些什么呢?谢谢蒙格马利吧。
代码
快速幂:function f(a,b:extended;n:int64):int64; var t,y:extended; begin t:=1; y:=a; while b<>0 do begin if(b and 1)=1 then t:=t*y mod n ; y:=y*y mod n; b:=b shr 1; end; exit(t); end;
用快速幂求出斐波那契的第n项。
type matrix=array[0..1,0..1] of int64; const mo=trunc(1e+8+7); var a,ans:array[0..1] of int64; b,c,d:matrix; i,j,k:longint; n:int64; procedure work(var a,b,c:matrix);//两个2*2的矩阵相乘 var i,j,k:longint; begin for i:=0 to 1 do begin for j:=0 to 1 do begin for k:=0 to 1 do begin c[i,j]:=(c[i,j]+a[i,k]*b[k,j] mod mo) mod mo; end; end; end; end; procedure fastpower(x:int64); begin c[0,0]:=1; c[0,1]:=1; c[1,0]:=1; c[1,1]:=0; b[0,0]:=1;//开始将B赋值为单位矩阵,相当于实数中1在乘法中的作用 b[1,1]:=1; while x<>0 do begin if (x and 1)=1 then begin fillchar(d,sizeof(d),0); work(b,c,d); b:=d; end; fillchar(d,sizeof(d),0); work(c,c,d); c:=d; x:=x div 2; end; end; begin readln(n); if n=0 then writeln(0); if (n=1)or(n=2) then writeln(1); fastpower(n-1); a[0]:=1; a[1]:=0; for i:=0 to 1 do begin for j:=0 to 1 do begin ans[i]:=(ans[i]+a[j]*b[j][i] mod mo) mod mo; end; end; writeln(ans[0] mod mo); end.
可以发现其实两者实质上是一样的,只是在计算的时候,一个用矩阵计算,另一个直接用一个变量计算,(矩阵其实也就是一堆变量)。
the end
由于我的水平有限,难免有些会写错的,希望大家多多包容,批评指正,谢谢。相关文章推荐
- 【poj3070】矩阵乘法求斐波那契数列
- 矩阵乘法求斐波那契数列
- HDU 4914 Linear recursive sequence(矩阵乘法递推的优化)
- 矩阵乘法优化线性递推
- BZOJ 1297 [SCOI2009]迷路 递推 矩阵乘法
- 51nod--1242 斐波那契数列第N项 (矩阵乘法优化)
- 矩阵乘法求斐波那契数列
- 递推的矩阵乘法解决练习1
- 矩阵加速递推(XDU 斐波那契数列为列)
- hdu 2604 Queuing(矩阵乘法+递推)
- 矩阵乘法递推的优化艺术
- 矩阵乘法求解线性递推(二)
- Firepersons - POJ 2118 矩阵乘法递推
- hdu_1588_矩阵_求和_乘法_快速幂_斐波那契数列求前n项和
- 【NOIP2016提高A组模拟7.15】斐波那契数列(矩阵乘法)
- [51NOD]1126 求递推序列的第N项 [线性递推关系与矩阵乘法]
- 快速求斐波那契数列(矩阵乘法+快速幂)
- Luogu T7152 细胞(递推,矩阵乘法,快速幂)
- POJ-3420 回顾矩阵乘法解递推.再次提醒自己矩阵木有交换率.
- 洛谷P1962 斐波那契数列 || P1349 广义斐波那契数列[矩阵乘法]