矩阵快速幂

矩阵

矩阵的定义和运算可以去看教材或者百度,这里就不叙述了

快速幂

其实思路和数的快速幂一样

先来看看数的快速幂:

比如我们求2的10次方,如果直接2*2*2*2……2的话,需要9次乘法,但如果这样的话:((2*2)(2*2))((2*2)(2*2))*(2*2)的话就只需要4次乘法

代码实现的话就是:


int power(int x,int N)

{

    if(N <= 1)

        return x;

    if(N%2)

        return power(x*x,N/2)*x;

     else

        return power(x*x,N/2);

}

矩阵的快速幂同样也可以用这个思路,因为矩阵的乘法也满足M^(a+b) = M ^ a + M ^b,只不过乘法的具体运算不同罢了

实现代码


#include <algorithm>
#include <cstdio>
#include <cstdlib>
#include <cstring>

#define mfor(n) for(int i = 0;i < n;i++) for(int j = 0;j < n;j++)
using namespace std;
const int MAX_N = 100 + 1;

struct Matrix {
   int n;
   int M[MAX_N][MAX_N];

   Matrix(int n) : n(n) {
       memset(M, 0, sizeof(M));
   }

   Matrix operator*(Matrix m) {
       Matrix q(n);
       memset(q.M, 0, sizeof(q.M));
       mfor(q.n) for (int k = 0; k < n; k++)
                   q.M[i][j] += M[i][k] * M[k][j];
       return q;
   }

   void print() {
       mfor(n) printf("%d%s", M[i][j], j == n - 1 ? "\n" : " ");
   }
};

Matrix power(Matrix M, int N) {
   if (N <= 1)
       return M;
   if (N % 2 == 0)
       return power(M * M, N / 2);
   else
       return power(M * M, N / 2) * M;
}

int main() {
   Matrix M(4);
   mfor(M.n)M.M[i][j] = 2 * i + j;
   Matrix R = power(M, 2   );
   R.print();
   return 0;
}
点赞