HOME/Articles/

快速幂

Article Outline

原理讲解

幂运算即求 $a^n$。

  1. 最基础的方法是可以通过循环累乘,时间复杂度为 $O(n)$
  2. 加速幂运算可以从减少累乘次数入手,合并某些步骤为一步。如果n能被2整除,那么可以先得到 $a^{n/2}$ 的值,再进一步求取 $a^n$,但时间复杂度仍为O(n)。
  3. 若能找到 $2^k = n$,原有运算可优化为 $a^{2^{2...}}$ 的形式,仅需k次运算即可完成,但适用范围有限。不过任意整数都可分解为如下形式:$2^{k_1}+2^{k_2}+2^{k_3}+ ... +2^{k_n} = n$。利用递推,即可短时间内求取各项值。而利用二进制性质即可直接得知上述多项式。
    • 例:十进制得到11为二进制的1011可表示为 $2^3$+$2^1$+$2^0$,之后便可直接实现快速幂算法。
#include<stdio.h>

int poww(int a, int b) {
    int ans = 1, base = a;
    while(b) {
        if(b&1) {
            ans *= base;
        }
        base *= base;
        b >>= 1;
    }
    return ans;
}

int main() {
    printf("%d\n", poww(2,3));
    return 0;
}

<script> MathJax = { tex: { inlineMath: [['$', '$'], ['\(', '\)']] } }; </script>

<script id="MathJax-script" async src="https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-chtml.js"> </script>