矩阵快速幂

 

矩阵快速 :由于矩阵乘法具有结合律,因此对于矩阵A,有A^4 = A * A * A * A = (A*A) * (A*A) = A^2 * A^2。我们可以得到这样的结论:当n为偶数时,A^n = A^(n/2) * A^(n/2);当n为奇数时,A^n = A^(n/2) * A^(n/2) * A (其中n/2取整)。
 

 

 

 

 

 

递归:

struct martrix
{
     int m[maxn][maxn];
};
martrix mtmul(martrix a,martrix b)
{
    martrix c;
     int i,j,k;
     for(i =  0; i < n; i++)
    {
         for(j =  0; j < n;j++)
        {
            c.m[i][j] =  0;
             for(k =  0 ; k < n;k++)
            {
                c.m[i][j] += a.m[i][k] * b.m[k][j];
                c.m[i][j] %=mod;
            }
        }
    }


     return c;
}

 优化的乘法

 1  /* matrix mtmul(matrix a,matrix b)
 2  {
 3      int i,j,k;
 4      matrix c;
 5      c.clear();
 6      for(i =0 ; i <= n;i++)
 7      {
 8          for(k = 0; k <=n;k++)
 9          {
10 
11              if(a.m[i][k])//优化
12              for(j = 0 ; j <=n;j++)
13              {
14                  c.m[i][j] += a.m[i][k]*b.m[k][j];
15 
16              }
17          }
18      }
19      return c;
20  } */

 

martrix mtpow(martrix d,int k)
{   martrix a;
    if(k == 1return d;
    int mid = k / 2;
    a = mtpow(d,k/2);
    a = mtmul(a,a);
    if(k & 1)
    {
        a = mtmul(a,d);
    }
    return a;


}

 

 

 

非递归:

 

 e.m[i][i] = 1 ;

 

martrix mtpow(martrix d, int k)
{   martrix a;
    a = e; // e 为单位矩阵
    while(k)
   {
        if(k& 1)
       {
           a = mtmul(a,d);
       }
       k/= 2;
       d = mtmul(d,d);
   }
    return a;

}

 

 

 

                                                                                                                                                                                                           

你可能感兴趣的:(矩阵)