二分法矩阵求斐波那契(fibonacci)数列第n项
2011-10-13 20:26
295 查看
如图,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项为1int 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;}
相关文章推荐
- 斐波那契数列的第N项(1≤n≤10^18 矩阵快速幂)
- 快速计算类似斐波那契数列数列的数列的第N项,矩阵快速幂
- 没什么亮点的第一篇呐…C++代码,求斐波那契(Fibonacci)数列的第n项,n可以为负数。递归算法,使用了记忆化搜索。
- 矩阵乘法解fibonacci斐波那契数列
- 分治策略(归并排序,二分查找,x的n次方,斐波那契(Fibonacci)数列,斯特拉森(Strassen)矩阵乘法)
- 斐波那契(Fibonacci)数列
- 从sicily Fibonacci 问题出发解决矩阵快速幂求解斐波那契问题
- 多校第十场 HDU 3936 FIB Query(fibonacci 数列的性质 ,及Ologn 矩阵加速乘算法)
- 七种方式求斐波那契(Fibonacci)数列通项
- 一个求最大公约数的函数、一个求Fibonacci(斐波那契)数列函数
- 栈的应用一--斐波那契(Fibonacci)数列的实现(代码)
- poj 3070 Fibonacci 【矩阵快速幂 求第N个斐波那契数%1000】
- 【矩阵快速幂相乘求Fibonacci 数列】PKU-3070-Fibonacci
- 斐波那契数列的矩阵推导(看不懂的可以放弃矩阵了)
- poj3070 Fibonacci 斐波那契数列的第n项的矩阵求法
- 斐波那契(Fibonacci)数列
- 斐波那契(Fibonacci)数列的计算效率
- 斐波那契数列的第n项。
- 斐波那契(Fibonacci)数列
- 斐波那契数列(fibonacci)两种python实现的效率对比