快速幂&矩阵快速幂

参考博客,非常感谢大佬的讲解:https://www.cnblogs.com/cmmdc/p/6936196.html

整数快速幂:

  假设现在需要计算x^8,常规循环做法需要计算7次,但如果转换成 (x^2)^4 则只需要4次即可;

  稍微复杂一些,有 x^19次,19=(10011)₂,因为有 x^a * x^b = x^(a+b);

  故利用位运算可以方便划分以加快计算;

例如:

 1 int QuickPow(int x,int N)
 2 {
 3     int res = x;
 4     int ans = 1;
 5     while(N)
 6     {
 7         if(N&1)
 8         {
 9             ans = ans * res;
10         }
11         res = res*res;
12         N = N>>1;
13     }
14     return ans;
15 }

矩阵快速幂:

  首先应该具备基本的关于矩阵的基本性质及运算:https://baike.baidu.com/item/%E7%9F%A9%E9%98%B5/18069?fr=aladdin

  矩阵的快速幂就是把上面的整数改为二维数组,上面的乘法改为矩阵乘法即可;

  特别注意:

    1. 矩阵乘法 a*b 与 b*a 不同,注意顺序;

    2. 初始其中一个是乘数应该为对角矩阵,且对角线上元素全部为1,作用类似于整数1;

样例:

 1 void Quick_Pow()
 2 {
 3     Matrix tmp;
 4     tmp.w[0][0]=tmp.w[1][1]=1;
 5     tmp.w[0][1]=tmp.w[1][0]=0;
 6     
 7     while(n) {
 8         if(n&1) {
 9             tmp = calculate(matrix, tmp);
10         }
11         matrix = calculate(matrix, matrix);
12         n>>=1;
13     }
14 }

  基础知识大概就到这里,可以动手试试一道应用矩阵快速幂的题目:https://www.cnblogs.com/liubilan/p/9450704.html

猜你喜欢

转载自www.cnblogs.com/liubilan/p/9450568.html