- 分享
快速幂
- 2025-2-19 16:57:14 @
快速幂算法详解
一、核心数学原理
-
模运算性质
[ (a \times b) \mod p = \left[(a \mod p) \times (b \mod p)\right] \mod p ]
作用:在计算中逐步取模,防止数值溢出。 -
幂运算分解
利用指数的二进制分解,将计算 (a^b) 转化为多个子问题:
[ a^b = \begin{cases} (a^{b/2})^2 & \text{若 } b \text{ 为偶数} \ a \times (a^{(b-1)/2})^2 & \text{若 } b \text{ 为奇数} \end{cases} ]
二、算法步骤
-
初始化
- 结果变量
ans = 1
(单位元) - 底数
a
先取模:a %= c
- 结果变量
-
循环处理指数
- 奇偶判断:若指数
b
的最低位为1
(即b & 1
为真),将当前底数累积到结果 - 底数平方:每次循环将底数平方并取模
- 指数折半:右移指数
b >>= 1
(等价于b /= 2
)
- 奇偶判断:若指数
-
终止条件
- 当指数
b
降为0
时结束循环
- 当指数
三、代码实现
typedef long long ll;
ll quick_pow(ll base, ll exponent, ll mod) {
ll result = 1; // 初始化为乘法单位元 1
base %= mod; // 预处理底数取模
while (exponent > 0) { // 指数未耗尽时循环
if (exponent & 1) { // 当前二进制位为 1(奇数)
result = (result * base) % mod;
}
base = (base * base) % mod; // 底数平方
exponent >>= 1; // 指数右移一位(整除 2)
}
return result;
}
四、关键特性
特性 | 说明 |
---|---|
时间复杂度 | (O(\log b)),优于朴素算法的 (O(b)) |
空间复杂度 | (O(1)),仅需常数级额外空间 |
适用场景 | 大数幂取模(如 RSA 加密、组合数取模) |
防溢出机制 | 每一步乘法操作后立即取模 |
五、示例演算
以 (3^{10} \mod 1000) 为例:
- (3^{10} = (3^5)^2)
- (3^5 = 3 \times (3^2)^2 = 3 \times 9^2 = 3 \times 81 = 243)
- (243^2 = 59049 \rightarrow 59049 \mod 1000 = 49)
- 最终结果:(49)
六、常见错误
错误类型 | 修正方案 |
---|---|
未预处理底数取模 | 添加 base %= mod 避免初始值过大 |
忽略中间结果溢出 | 每次乘法后必须取模 |
错误处理指数为 0 | 循环条件应为 exponent > 0 (自动处理 0 次方) |
七、扩展应用
- 矩阵快速幂:求解斐波那契数列 (O(\log n)) 解法
- 模逆元计算:结合费马小定理求 (a^{-1} \mod p)(当 (p) 为质数时)
- 多重取模:处理形如 (a^{b^c} \mod p) 的嵌套幂
整理后的内容保持与之前知识体系一致的 Markdown 表格和公式风格,强化了算法核心思想的表达,并补充了实际应用场景的说明。
0 条评论
目前还没有评论...