快速幂算法详解
约 558 字大约 2 分钟
2026-01-09
简介
快速幂算法是用于快速计算的算法,可以用于快速的处理大整数幂的场景。
最简单的 for 循环求数字的 n 次幂需要 O(n) 的时间复杂度。快速幂方法可以达到 O(logN) 的时间复杂度。
快速幂的核心思想是将指数拆分,以达到快速计算的目的。
快速幂 - 二进制法
原理
二进制法的核心思想是将指数转换为二进制形式,通过逐位处理并结合平方运算减少乘法次数。
二进制分解指数 将指数 n 表示为二进制形式,例如 n=13 对应二进制为 1101,即 13=8+4+1=23+22+20。
幂的拆分 根据二进制分解,an=a2k×a2k−1×⋯×a20,其中仅当二进制位为 1 时,对应项被保留。
逐位处理与平方加速
- 从最低位到最高位依次处理二进制每一位。
- 若当前位为 1,则将当前的底数累乘到结果中。
- 每一步将底数平方,为处理更高位做准备。
代码示例
def power(base, exp):
res = 1
while exp > 0:
if exp & 1:
res *= base
base *= base
exp >>= 1
return res快速幂 - 折半法
原理
折半法的核心公式如下:
我们要快速计算 a 的 n 次方:
- 当 n 为奇数的时候:an=a⋅(a2)(n−1)/2
- 当 n 为偶数的时候:an=(a2)n/2
- 当 n 为 0 的时候,直接返回 1
通过递归或迭代,将大指数问题分解为小指数问题,最后合并结果。
代码示例
def power(base, exp):
if exp == 0: return 1
half = power(base, exp // 2)
return half * half * (base if exp % 2 else 1)两种方法对比
| 特性 | 二进制法 | 折半法 |
|---|---|---|
| 实现方式 | 迭代 + 位运算 | 递归/迭代 + 分治 |
| 时间复杂度 | O(logN) | O(logN) |
| 空间复杂度 | O(1) | O(logN) (递归) |
两者都可以实现在指数时间解决问题,二进制方法比折半法更加的省空间。