您的位置:首页 > 其它

二分法矩阵求斐波那契(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;}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  算法 c