化到这一步,我们就将原来一个数据会非常大的A^B,变成了很多项的乘积。编程实现的时候,我们只需走一遍B的二进制位,并用一个变量a记录当前二进制位的权值,判断当前bi的值,然后将结果乘起来取模即可。快速幂取模通过将指数二进制化和同余性质,将取模操作放入了较小规模的计算,使得我们能够成功的计算较大乘方运算的取余计算。
而这个过程最为重要的部分在于,它将原来O(n)计算某个数的n次幂,变成了O(logn),大大降低了时间复杂度。
简单的参考代码如下:
long long quick_mod(long long a,long long b,long long m) //功能 计算a^b(mod m) { long long ans = 1; while(b) { if(b&1) { ans = (ans * a) % m; b--; } b /= 2; //b左移一位 a = a * a % m; } return ans; }
同样,我们将这种快速计算幂的思想推广起来,因为幂运算的优化呈现在对于指数的二进制处理,因此我们可以将底数换成任意元素。而一个非常重要的应用是:对于线性代数中的矩阵的快速幂构造。
单纯说矩阵快速幂也没有太大的难度,我们直接结合矩阵快速幂的一个非常有用的应用来讲。