矩阵快速幂求斐波那契数列(初学整理)
2017-10-22 14:43
483 查看
对于矩阵乘法与递推式之间的关系:
如:在斐波那契数列之中
f[i] = 1*f[i-1]+1*f[i-2] f[i-1] = 1*f[i-1] + 0*f[i-2];
即
所以
就这两幅图完美诠释了斐波那契数列如何用矩阵来实现。
优化的算法,将2*2矩阵的幂改为n,去掉后边的乘,直接输出矩阵中的a[0][1]位置的数就是下标与幂相等的斐波那契项数。
int pow(int n)//还是小范围数据来说吧,要不然返回值的类型自己定义
{
mat c,res;
memset(res.a,0,sizeof(res.a));
c.a[0][0]=1;//给矩阵赋初值
c.a[0][1]=1;
c.a[1][0]=1;
c.a[1][1]=0;
for(int i=0;i<n;i++) res.a[i][i]=1;//单位矩阵;
while(n)
{
if(n&1) res=mat_mul(res,c);//这里看就要用到上面的矩阵相乘了;
c=mat_mul(c,c);
n=n>>1;
}
return res.a[0][1];
}//时间复杂度log(n)
如:在斐波那契数列之中
f[i] = 1*f[i-1]+1*f[i-2] f[i-1] = 1*f[i-1] + 0*f[i-2];
即
所以
就这两幅图完美诠释了斐波那契数列如何用矩阵来实现。
优化的算法,将2*2矩阵的幂改为n,去掉后边的乘,直接输出矩阵中的a[0][1]位置的数就是下标与幂相等的斐波那契项数。
int pow(int n)//还是小范围数据来说吧,要不然返回值的类型自己定义
{
mat c,res;
memset(res.a,0,sizeof(res.a));
c.a[0][0]=1;//给矩阵赋初值
c.a[0][1]=1;
c.a[1][0]=1;
c.a[1][1]=0;
for(int i=0;i<n;i++) res.a[i][i]=1;//单位矩阵;
while(n)
{
if(n&1) res=mat_mul(res,c);//这里看就要用到上面的矩阵相乘了;
c=mat_mul(c,c);
n=n>>1;
}
return res.a[0][1];
}//时间复杂度log(n)
相关文章推荐
- HDU4549M-斐波那契数列(矩阵快速幂,二分幂)
- hihoCoder1143 DP 斐波那契数列矩阵快速幂
- 矩阵快速幂求斐波那契数列
- 矩阵快速幂1242斐波那契数列的第N项
- POJ 3070-Fibonacci(矩阵快速幂求斐波那契数列)
- 【51Nod】1242 - 斐波那契数列的第N项(矩阵快速幂)
- hdu_1588_矩阵_求和_乘法_快速幂_斐波那契数列求前n项和
- hdoj 4549 M斐波那契数列 【矩阵快速幂 + 费马小定理 + 快速幂】
- 矩阵乘法 与 矩阵快速幂详解 以51NOD1242 斐波那契数列的第N项为例
- [luoguP1962] 斐波那契数列(矩阵快速幂)
- 利用矩阵快速幂求斐波那契数列
- hdu4549 M斐波那契数列 (矩阵快速幂+费马小定理)
- [CQU 21466] zzblack与斐波那契数列 (矩阵快速幂)
- LuoguP1962 斐波那契数列 解题报告【矩阵快速幂】
- 矩阵快速幂优化递推式 例:斐波那契数列
- 2017.3.25 矩阵快速幂 求斐波那契数列第n项
- hdu4549 M斐波那契数列(矩阵快速幂)
- 利用矩阵快速幂求斐波那契数列
- 矩阵快速幂--斐波那契数列
- POJ - 3070 - Fibonacci (矩阵快速幂 + 斐波那契数列)