快速幂&矩阵快速幂
参考博客,非常感谢大佬的讲解: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