二分法矩阵求斐波那契(fibonacci)数列第n项
来源:互联网 发布:查看手机4g网络dns 编辑:程序博客网 时间:2024/06/05 10:07
如图,Fibonacci 数列中任何一项可以用矩阵幂算出,而n次幂是可以在logn的时间内算出的。
下面贴出代码:
void multiply(int c[2][2],int a[2][2],int b[2][2],int mod){ int tmp[4]; tmp[0]=a[0][0]*b[0][0]+a[0][1]*b[1][0]; tmp[1]=a[0][0]*b[0][1]+a[0][1]*b[1][1]; tmp[2]=a[1][0]*b[0][0]+a[1][1]*b[1][0]; tmp[3]=a[1][0]*b[0][1]+a[1][1]*b[1][1]; c[0][0]=tmp[0]%mod; c[0][1]=tmp[1]%mod; c[1][0]=tmp[2]%mod; c[1][1]=tmp[3]%mod;}//计算矩阵乘法,c=a*bint fibonacci(int n,int mod)//mod表示数字太大时需要模的数{ if(n==0)return 0; else if(n<=2)return 1;//这里表示第0项为0,第1,2项为1 int a[2][2]={{1,1},{1,0}}; int result[2][2]={{1,0},{0,1}};//初始化为单位矩阵 int s; n-=2; while(n>0) { if(n%2 == 1) multiply(result,result,a,mod); multiply(a,a,a,mod); n /= 2; }//二分法求矩阵幂 s=(result[0][0]+result[0][1])%mod;//结果 return s;}
附带的再贴上二分法计算a的n次方函数,我只明白思路,但不知道怎么证明算法正确,还请牛人指教。
int pow(int a,int n){ int s=1; while(n!=1) { if(n%2==1)s*=a; a*=a; n/=2; } s*=a; return s;}
- 二分法矩阵求斐波那契(fibonacci)数列第n项
- 矩阵快速模幂 + 求斐波那契数列第n项(Fibonacci)
- 求斐波那契 (Fibonacci) 数列第 n 项的算法
- 求斐波那契 (Fibonacci) 数列第 n 项的算法
- poj3070 Fibonacci 斐波那契数列的第n项的矩阵求法
- poj 3070 Fibonacci (矩阵快速幂求斐波那契数列的第n项)
- 快速求斐波那契数列第n项值 poj3070 Fibonacci
- 矩阵快速幂求斐波那契数列第n项
- 求斐波那契数列第n项
- 求斐波那契数列第n项
- 2017.3.25 矩阵快速幂 求斐波那契数列第n项
- 求斐波那契(Fibonacci)数列中的F(n)
- 求斐波那契数列第N项及大数求和
- 求斐波那契数列的第 n 项的值
- Java练习题-求斐波那契数列第n项
- 求斐波那契数列的第n项
- C++求斐波那契数列的第n项
- 第十二周-求斐波那契数列的第N项
- 一些常用的SQL 语句 之5
- 澜沧江-湄公河
- 一步一步写算法(之单词统计)
- C#+.NET中调用VB编写的DLL代码事例
- ubuntu 11.10 正式版下载
- 二分法矩阵求斐波那契(fibonacci)数列第n项
- c++ LPCTSTR、TCHAR、BSTR
- hdu++1800++STL
- parsing xml with sax and pull
- 用非类型化的DataSet和类型化的数据集完成用户信息的增删改查(两种方法)
- hsql++(the+Visual+Builder+DataSource)
- 删除按钮响应函数的调用函数
- @Override的错误
- 全选或反选表单中的所有记录