矩阵的快速幂

问题:求m*m矩阵的等比前n项和,即A+A2+A3+...+A^n

  struct node {
    int mat[15][15];//定义矩阵 
   }x,y; 

分析:矩阵乘法中关于等比矩阵的求法:

 | A   E|
 | 0   E|        E为单位矩阵。

  由等比矩阵的性质:

          *  n
 | A  , E|              |A^n  ,   1+A^1+A^2+....+A^(n-1)|
 | 0  , E|     =       |0    ,             E           |

所以我们在求此类问题时:

  1.矩阵A扩大4倍        | A   E|
                       | 0   E| 

  2.求矩阵的n+1次方幂             n
                       | A  , E|        
                       | 0  , E|

  3.分离矩阵:        得:1+A^1+A^2+....+A^n

  4.矩阵减1             A^1+A^2+....+A^n

二:求矩阵幂:
解法1.矩阵乘法:

        node mul(node x,node y){//矩阵乘法 
    node tmp;
    for(int i=0;i<len;i++){
	   for(int j=0;j<len;j++){
		   tmp.mat [i][j]=0;
		   for(int k=0;k<len;k++){
			  tmp.mat [i][j]+=(x.mat [i][k]*y.mat [k][j])%mod;
		   }
		   tmp.mat [i][j]=tmp.mat[i][j]%mod;
	    }
      }
      return tmp;
      } 

解法2:快速幂
首先;理解快速幂:
举个例子,在求 x^19时,我们可以拆分成 x16、x2 和 x的乘积。我们观察19的二进制数(10011),发现二进制第 i 位上的值为 1 ,在乘
积中就要有 x 的 2^i 的一项。据此我们可以利用遍历二进制数的每一位快速求出 X^N。 代码如下:

        ll QuickPow(int x,int n)
        {
              int tmp = x;
              int res=1;
              while(n)
              {
                   if(n&1)
                   res=(res*tmp)%mod;
                   tmp = (tmp*tmp)%mod;
                  n>>=1;
             }
        return res;
   }

所以矩阵的快速幂代码为:

       node matpow(node x,node y,int num){//矩阵快速幂 
   while(num){
	if(num&1){
		y=mul(y,x);
	 }
	x=mul(x,x);
	num=num>>1;
    }
return y;
    }
posted @ 2020-11-07 09:57  Quella'  阅读(97)  评论(0)    收藏  举报
Live2D