快速幂算法

快速幂算法:如何用 O(log n) 解决大数幂运算

引言

在计算机科学和密码学中,经常需要计算大数幂模运算(如 RSA 加密中的 m^d mod n)。当指数较大时,直接计算会导致性能问题和溢出。快速幂算法(Exponentiation by Squaring)通过二进制分解将时间复杂度从 O(n) 优化到 O(log n),成为解决这类问题的关键技术。

算法原理

1. 二进制分解

将指数 e 转换为二进制形式:

5 (十进制) = 101 (二进制)

2. 平方累乘法

  • 若当前二进制位为 1:结果乘以当前基数

  • 每位处理完后:基数平方

  • 每步执行模运算防止溢出

3. 数学表示

对于计算 a^e mod m

  • 递归式
    ae={(ae/2)2if e is evena⋅(a(e−1)/2)2if e is odd a^{e} = \begin{cases} (a^{e/2})^2 & \text{if } e \text{ is even} \\ a \cdot (a^{(e-1)/2})^2 & \text{if } e \text{ is odd} \end{cases} ae={(ae/2)2a⋅(a(e−1)/2)2if e is evenif e is odd

  • 二进制表示指数形式的递推式
    baseexp % mod=baseen−1,⋅⋅⋅,e2,e1,e0 % mod=((baseen−1<<n−1 % mod) ∗ ⋅⋅⋅∗ (baseel<<1 % mod) ∗ (basee0<<0 % mod)) % mod base^{exp} \text{ }\% \text{ } mod =base^{e_{n-1},\cdot\cdot\cdot,e{2},e{1},e{0}} \text{ }\% \text{ } mod\\ =((base^{e{n-1} << n-1}\text{ }\%\text{ }mod) \text{ }* \text{ }\cdot\cdot\cdot* \text{ }(base^{e{l} << 1}\text{ } \%\text{ } mod) \text{ }* \text{ }(base^{e{0} << 0} \text{ }\% \text{ }mod ))\text{ }\% \text{ }mod baseexp % mod=baseen−1,⋅⋅⋅,e2,e1,e0 % mod=((baseen−1<<n−1 % mod) ∗ ⋅⋅⋅∗ (baseel<<1 % mod) ∗ (basee0<<0 % mod)) % mod

    而baseibase^{i} % modbasei的结果,是逐渐翻倍的关系,即base2=(base1)2,base4=(base2)2base^{2} =(base^{1})^{2}, base^{4} = (base^{2})^{2}base2=(base1)2,base4=(base2)2

算法实现

Python 实现

python 复制代码
def fast_power(base, exponent, modulus):
    result = 1
    base = base % modulus  # 初始取模
    while exponent > 0:
        if exponent & 1:  # 当前位为1
            result = (result * base) % modulus
        base = (base * base) % modulus  # 基数平方
        exponent >>= 1  # 右移一位
    return result

C++ 实现

c++ 复制代码
long fastPower(long base, long exponent, long modulus) {
    long result = 1;
    base = base % modulus;
    while (exponent > 0) {
        if (exponent & 1)
            result = (result * base) % modulus;
        base = (base * base) % modulus;
        exponent >>= 1;
    }
    return result;
}

计算示例

示例 1:计算 3^5 mod 7

输出结果:5
示例 2:RSA 签名计算

m = 23547 # 消息

d = 132111 # 私钥

n = 824737 # 模数

signature = fast_power(m, d, n) # 输出:266749

复杂度分析

指标 说明
时间复杂度 O(log n) 指数每次循环减半
空间复杂度 O(1) 仅需常数级存储空间
性能提升 指数级 相比朴素算法 O(n) 显著优化

应用场景

密码学领域

  • RSA 加密/解密
  • 数字签名
  • Diffie-Hellman 密钥交换

计算优化

  • 大数模运算(如组合数计算)
  • 动态规划状态转移优化
  • 素数测试(Miller-Rabin算法)

总结

核心优势

  1. 二进制分解:指数按位处理
  2. 平方累乘:基数平方代替重复乘法
  3. 模运算优化:每步防溢出
  4. 位运算加速:移位代替乘除

算法意义

快速幂算法体现了"分治"思想的核心价值:

  1. 将 O(n) 问题转化为 O(log n)
  2. 解决密码学中的核心计算瓶颈
  3. 为复杂算法(如矩阵快速幂)提供基础框架
相关推荐
无限码力3 分钟前
2026-8-30拼多多笔试真题-哪个查阅窗能留空(C++/Py/Java /Js/Go)
算法·pdd·pdd笔试真题·拼多多春招笔试真题·拼多多秋招笔试真题·拼多多笔试真题题解·拼多多笔试题解
SelectDB技术团队6 分钟前
StarRocks 适合做日志分析吗?
大数据·数据结构·后端·python·doris·日志分析·starrock
小小龙学IT7 分钟前
libuv 开源异步 I/O 事件循环库深度解析:Node.js 的心脏,C++ 高性能网络程序的引擎
c++·开源·node.js
彷徨而立15 分钟前
【C/C++】多线程读写普通 int 变量的一些问题(二)
c语言·c++
一只旭宝19 分钟前
五种线程池设计
c++·笔记
luj_176823 分钟前
毒素驱动的生物自毁机制探析
服务器·c语言·开发语言·经验分享·算法
weixin_3077791325 分钟前
Databricks里用PySpark统计指定表和字段中各字段的空值、空字符串或零值比例
运维·数据仓库·python·spark·云计算
某林21226 分钟前
机器人收不住、转不动?执行器死区的原理与三层补偿设计
前端·网络·c++·架构·机器人
海兰31 分钟前
【 Python 量化交易】第6章:数据可视化
开发语言·python·信息可视化
多多鼠32 分钟前
Tool Calling的信任边界:从协议校验到执行沙箱的完整链路设计
运维·开发语言·网络·人工智能·python·langchain