快速幂
快速幂算法详解
快速幂算法(也称为平方求幂法)是一种用于高效计算幂运算的算法,特别适用于计算大数的幂模运算(如 ( a^b \mod p ))。它的核心思想是通过将指数 ( b ) 分解为二进制形式,利用平方和乘法逐步计算结果。
1. 快速幂的核心思想
快速幂算法的核心是将指数 ( b ) 表示为二进制形式,例如:
[b = b_k \cdot 2^k + b_{k-1} \cdot 2^{k-1} + \cdots + b_0 \cdot 2^0]
其中 ( b_i ) 是二进制位(0 或 1)。因此:
[a^b = a^{b_k \cdot 2^k} \times a^{b_{k-1} \cdot 2^{k-1}} \times \cdots \times a^{b_0 \cdot 2^0}]
通过循环处理每一位,逐步计算幂运算。
2. 快速幂的步骤
- 初始化结果为 1。
- 将底数 ( a ) 对模数 ( p ) 取模,防止 ( a ) 过大。
- 循环处理指数 ( b ) 的每一位:
- 如果当前最低位为 1,将 ( a ) 乘入结果。
- 将 ( a ) 平方,准备处理下一位。
- 将 ( b ) 右移一位,处理下一个二进制位。
- 返回最终结果。
3. 快速幂的代码实现
以下是 C++ 实现快速幂算法的代码:
#include <iostream>
using namespace std;
// 快速幂函数,计算 a^b mod p
long long fast_pow(long long a, long long b, long long p) {
long long result = 1; // 初始化结果为 1
a = a % p; // 先对 a 取模,防止 a 过大
while (b > 0) {
// 如果当前最低位为 1,将 a 乘入结果
if (b & 1) {
result = (result * a) % p;
}
// 将 a 平方,准备处理下一位
a = (a * a) % p;
// 右移一位,处理下一个二进制位
b = b >> 1;
}
return result;
}
int main() {
long long a, b, p;
cout << "请输入 a, b, p:";
cin >> a >> b >> p;
long long result = fast_pow(a, b, p);
cout << a << "^" << b << " mod " << p << " = " << result << endl;
return 0;
}
4. 代码说明
-
fast_pow 函数:
- 输入:( a )(底数),( b )(指数),( p )(模数)。
- 输出:( a^b \mod p )。
- 核心思想:
- 将指数 ( b ) 分解为二进制形式。
- 通过平方和乘法逐步计算幂模运算。
- 时间复杂度:( O(\log b) )。
-
主函数:
- 输入 ( a, b, p )。
- 调用
fast_pow
函数计算结果并输出。
5. 示例运行
输入:
请输入 a, b, p:2 10 1000
输出:
2^10 mod 1000 = 24
解释:
- ( 2^{10} = 1024 )。
- ( 1024 \mod 1000 = 24 )。
6. 复杂度分析
-
时间复杂度:
- 每次循环将指数 ( b ) 右移一位,循环次数为 ( O(\log b) )。
- 每次循环内的操作(乘法和取模)是常数时间。
- 总体复杂度:( O(\log b) )。
-
空间复杂度:
- 仅使用常数空间,( O(1) )。
7. 注意事项
-
模数 ( p ) 的限制:
- 如果 ( p = 1 ),结果恒为 ( 0 )。
- 如果 ( a = 0 ) 且 ( b = 0 ),结果未定义(通常返回 ( 1 ) 或报错)。
-
大数问题:
- 如果 ( a ) 或 ( p ) 很大,确保使用
long long
类型以避免溢出。
- 如果 ( a ) 或 ( p ) 很大,确保使用
! 谢谢观看
本文作者:ccgc718
本文链接:https://www.cnblogs.com/ccgc718/p/18709017
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步