二分法矩阵求斐波那契(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;}



原创粉丝点击