矩阵快速幂求斐波那契数列(总结)
第一部分:矩阵的基础知识
1.结合性 (AB)C=A(BC).
2.对加法的分配性 (A+B)C=AC+BC,C(A+B)=CA+CB .
3.对数乘的结合性 k(AB)=(kA)B =A(kB).
4.关于转置 (AB)'=B'A'.
一个矩阵就是一个二维数组,为了方便声明多个矩阵,我们一般会将矩阵封装一个类或定义一个矩阵的结构体,我采用的是后者。(弱鸡的我也直只会用结构体实现)
第二部分:矩阵相乘
若A为n×k矩阵,B为k×m矩阵,则它们的乘积AB(有时记做A·B)将是一个n×m矩阵。前一个矩阵的列数应该等于后一个矩阵的行数,得出的矩阵行数等于前一个矩阵的行数,列数等于后一个矩阵的行数。
其乘积矩阵AB的第i行第j列的元素为:
举例:A、B均为3*3的矩阵:C=A*B,下面的代码会涉及到两种运算顺序,第一种就是直接一步到位求,第二种就是每次求一列,比如第一次,C00+=a00*b00,C01+=a00*b01……第二次C00+=a00*b10,C01+=a01*b11……以此类推。。。
C00 = a00*b00 + a01*b10 + a02*b20
C01 = a00*b01 + a01*b11 + a02*b21
C02 = a00*b02 + a01*b12 + a02*b22
C10 = a10*b00 + a11*b10 + a12*b20
C11 = a10*b00 + a11*b11 + a12*b21
C12 = a10*b02 + a11*b12 + a12*b22
C20 = a20*b00 + a21*b10 + a22*b20
C21 = a20*b01 + a21*b11 + a22*b21
C22 = a20*b02 + a21*b12 + a22*b22
C00 = a00*b00 + a01*b10 + a02*b20
C01 = a00*b01 + a01*b11 + a02*b21
C02 = a00*b02 + a01*b12 + a02*b22
下面先来实现一个矩阵相乘的函数吧。
- const int MOD=10000;
- struct mat
- {
- int a[2][2];//这里数据范围就用小的示范
- };
- mat mat_mul(mat x,mat y)//实现两个矩阵相乘,返回的还是一个矩阵。
- {
- mat res;//用来表示得到的新的矩阵;
- memset(res.a,0,sizeof(res.a));
- for(int i=0;i<2;i++)
- for(int j=0;j<2;j++)
- for(int k=0;k<2;k++)
- {
- res.a[i][j]+=x.a[i][k]*y.a[k][j];
- res.a[i][j]%=MOD;//这一步看题目具体需要了
- }
- return res;
- }
学了