快速幂
概述
快速幂(modular exponentiation)也称模幂算法,用于高效计算 。其核心思想是反复平方法(successive squaring):利用指数 的二进制展开 ,将 分解为 ,只需 次乘法(而非朴素方法的 次),每次乘法后取模保证中间结果不超过 。总复杂度为 位运算,是 RSA 加密等密码学应用能够高效运行的关键。
定义
快速幂算法(Algorithm 5: Modular Exponentiation)
计算 ,其中 为大整数:
核心思想:利用指数 的二进制展开 ,将 分解为:
算法步骤:
- 预计算 (),通过反复平方法:
- 将 对应的项相乘,每次乘法后取模
伪代码:
procedure modular_exponentiation(b, n, m) x := 1 power := b mod m for i := 0 to k-1 if a_i = 1 then x := (x · power) mod m power := (power · power) mod m return x
核心性质
| 性质 | 描述 | 说明 |
|---|---|---|
| 乘法次数 | 次 | 指数的二进制位数 |
| 每次乘法复杂度 | 位运算 | 两个不超过 的数相乘 |
| 总复杂度 | 位运算 | 乘法次数乘以每次乘法的复杂度 |
| 空间效率 | 中间结果不超过 | “边乘边取模”策略 |
| 朴素方法对比 | 朴素方法需 次乘法 | 且中间结果 可能极大 |
| power 更新时机 | 先判断 再平方 | 对应 ,power 初始为 |
关系网络
graph TB A["快速幂"] --> B["模运算"] A --> C["费马小定理"] A --> D["算法"] A --> E["大O记号"] A --> F["反复平方法"] A --> G["二进制展开"] A --> H["应用场景"] F --> F1["b^(2^(j+1)) = (b^(2^j))²"] F --> F2["O(log n) 次乘法"] G --> G1["指数的二进制分解"] G --> G2["a_i = 1 时乘入 power"] H --> H1["RSA 加密: c = m^e mod n"] H --> H2["RSA 解密: m = c^d mod n"] H --> H3["Diffie-Hellman 密钥交换"] H --> H4["离散对数问题"] B --> B1["先取模再运算"] C --> C1["a^(p-1) ≡ 1 mod p"] style A fill:#5cb85c,color:#fff style B fill:#4a90d9,color:#fff style C fill:#d9534f,color:#fff style F fill:#e8a838,color:#fff
- 模运算 是快速幂的基础:每次乘法后取模,保证中间结果不溢出
- 费马小定理 是快速幂的重要应用场景和理论基础
- 算法 的框架为快速幂提供了精确的伪代码描述和正确性分析工具
- 大O记号 用于量化快速幂的效率优势: vs 朴素方法的
章节扩展
第4章:数论与密码学
快速幂是第 4 章 4.2 节的重要算法:
- 4.2 整数表示与算法:模幂算法(Algorithm 5),利用指数的二进制展开实现高效计算
- 4.5 密码学应用:RSA 加密 和解密 都依赖快速幂
- 4.6 素性测试:Miller-Rabin 测试中需要计算 ,使用快速幂实现
补充
快速幂的广泛应用
快速幂(反复平方法)是计算机科学中最重要的算法技巧之一,应用远超密码学。在竞赛编程中,快速幂是必学的基础算法;在大整数运算中,Python 的
pow(base, exp, mod)内置函数就使用了快速幂;在矩阵快速幂中,同样的技巧可以用于 时间内计算矩阵的 次幂,从而高效求解线性递推关系(如斐波那契数列的第 项);在多项式求值中,Horner 法则与快速幂思想类似。快速幂的核心洞察是: 的二进制表示只有 位,因此只需 次平方运算就能覆盖所有可能的幂次。学术来源:Rosen, K. H. (2019). Discrete Mathematics and Its Applications (8th ed.). McGraw-Hill, Section 4.2.
参考链接:Cormen, T. H., Leiserson, C. E., Rivest, R. L., & Stein, C. (2022). Introduction to Algorithms (4th ed.). MIT Press, Chapter 31.