矩阵快速幂
2015-09-15 21:03
246 查看
本文以矩阵快速幂在求斐波那契数列的第n项
首先我们可以指导斐波那契数列的递推关系 F(n)=F(n-1)+F(n-2)
我们可以把这个关系转为矩阵关系
(F(n),F(n-1))=F(F(n-1),F(n-2))*A
A为某矩阵
我们以数列前三项为例 前三项分别是 1 1 2
(F(3),F(2))=(F(2),F(1))*A
=> (2,1)=(1,1)| 1 1 |
| 1 0 | (我们可以看到,A矩阵就是前面这个矩阵)
(F(4),F(3))=(F(3),F(2))*A
这里面 利用前面的结果
(F(4),F(3))=(1,1)| 1 1 | *A=(1,1)*A^2
| 1 0 |
往后递推下去,我们可以得到这样的递推式
(F(n),F(n-1))=(1,1)*A^(n-2)
这个问题就转换成了,求矩阵A的(n-2)次方。
而求一个数字的n次方,有一个简便方法,比如我们求4的70次方
70的二进制形式是 100 0110
有三个1 分别对应2的一次方,二次方,六次方
所以4^70=(4^64)+(4^4)+(4^2)
所以我们可以先求出来4的一次方,在此基础上乘4,得到4的二次方,然后求三次方,····一直求到4 的6次方,将一次方,二次方,六次方加起来,就可以得到结果。
首先我们可以指导斐波那契数列的递推关系 F(n)=F(n-1)+F(n-2)
我们可以把这个关系转为矩阵关系
(F(n),F(n-1))=F(F(n-1),F(n-2))*A
A为某矩阵
我们以数列前三项为例 前三项分别是 1 1 2
(F(3),F(2))=(F(2),F(1))*A
=> (2,1)=(1,1)| 1 1 |
| 1 0 | (我们可以看到,A矩阵就是前面这个矩阵)
(F(4),F(3))=(F(3),F(2))*A
这里面 利用前面的结果
(F(4),F(3))=(1,1)| 1 1 | *A=(1,1)*A^2
| 1 0 |
往后递推下去,我们可以得到这样的递推式
(F(n),F(n-1))=(1,1)*A^(n-2)
这个问题就转换成了,求矩阵A的(n-2)次方。
而求一个数字的n次方,有一个简便方法,比如我们求4的70次方
70的二进制形式是 100 0110
有三个1 分别对应2的一次方,二次方,六次方
所以4^70=(4^64)+(4^4)+(4^2)
所以我们可以先求出来4的一次方,在此基础上乘4,得到4的二次方,然后求三次方,····一直求到4 的6次方,将一次方,二次方,六次方加起来,就可以得到结果。
#include <iostream> #include <stack> #include <string> using namespace std; //快速矩阵幂 int (*MultipleMatrix(int base[][2],int tmp[][2]))[2] { int (*ret)[2]=new int[2][2]; int i,j,k,sum; for(i=0;i<2;i++) { for(j=0;j<2;j++) { sum=0; for(k=0;k<2;k++) { sum+=base[i][k]*tmp[k][j]; } ret[i][j]=sum; } } return ret; } int (*nThPowerMatrix(int base[][2],int n))[2] { int (*ret)[2]=new int[2][2]; int (*tmp)[2]=base; ret[0][0]=1; ret[1][1]=1; for(int i=0;i<2;i++) { for(int j=0;j<2;j++) { if(i==j) ret[i][j]=1; else ret[i][j]=0; } } tmp=base; for(;n>0;n=n>>1) { if(n&1) { ret=MultipleMatrix(ret,tmp); } tmp=MultipleMatrix(base,tmp); } return ret; } int main() { cout<<"以下是使用快速矩阵幂来计算斐波那契数列的第n项值得过程"<<endl; int n; cin>>n; int base[][2]={{1,1},{1,0}}; int (*res)[2]=nThPowerMatrix(base,n-2); cout<<res[0][0]+res[1][0]<<endl; return 0; }
相关文章推荐
- 第三十九天 手机媒体应用:SoundPool(播放提示音)、录音、视频播放、本地相机
- 黑盒测试
- ApplicationContextAware的理解
- ### C++总结-[类的继承]
- 线程同步
- 1001_Alisha’s Party_2015 ACM/ICPC Asia Regional Changchun Online(优先队列)
- 软件测试方法和技术 之 基本名词都搞清楚篇
- linux hadoop 搭建
- 日期格式转换
- C++内存对齐
- 【存模板】树状数组
- apt-get install package:Unable to locate package
- iOS中的双指针
- 网页和HTML
- Ubuntu14.04不支持U盘exfat格式该如何解决
- vmware安装linux
- Tree Traversals
- redsocks 将socks代理装换成全局代理
- Remove Duplicates from Sorted List
- Netty5入门学习笔记002-TCP粘包/拆包问题的解决之道(上)