对于矩阵 [ 1 1
1 0 ] 的n次幂,第一行第二个元素(右上角)的元素即为fibonacci数列的第n项,由此可以根据矩阵的乘法计算fibonacci数列的元素值
矩阵的快速幂利用的也是幂乘的二分法,只不是换成了矩阵的乘法,可以用函数处理。
/*可以定义一个二维数组的结构体*/
typedef struct matrix
{
int a[2][2];
}matrix;
matrix m0,m1;
/*初始化*/
void init()
{
m0.a[0][0]=1;m0.a[0][1]=0;m0.a[1][0]=0;m0.a[1][1]=1;
m1.a[0][0]=1;m1.a[0][1]=1;m1.a[1][0]=1;m1.a[1][1]=0;
}
/*矩阵乘法*/
matrix mul(matrix x,matrix y)
{
matrix ans;
ans.a[0][0]=x.a[0][0]*y.a[0][0]+x.a[0][1]*y.a[1][0];
ans.a[0][1]=x.a[0][0]*y.a[0][1]+x.a[0][1]*y.a[1][1];
ans.a[1][0]=x.a[1][0]*y.a[0][0]+x.a[1][1]*y.a[1][0];
ans.a[1][1]=x.a[1][0]*y.a[0][1]+x.a[1][1]*y.a[1][1];
return ans;
}
/*快速幂*/
matrix pow(int n)
{
if(n==0) return m0;
if(n==1) return m1;
matrix tmp = pow(n/2);
tmp = mul(tmp,tmp);
if(n%2) tmp = mul(tmp,m1);
return tmp;
}