网站免费在线客服系统合肥网络推广软件系统
快速幂算法讲解
快速幂算法是一种高效计算幂运算的算法,其核心思想是利用指数的二进制分解,把幂运算的时间复杂度从 O(p) 降低到 O(logp)。
原理
假设要计算 an,将 n 表示成二进制形式:n=2k1+2k2+⋯+2km,那么 an=a2k1+2k2+⋯+2km=a2k1×a2k2×⋯×a2km。
例如,计算 ,13 的二进制是 1101,即 13=
+
+
,那么
=
×
×
。
代码
#include <iostream>
using namespace std;long long fast_pow(long long a, long long b, long long k) {long long result = 1;while (b > 0) {if (b % 2 == 1) {result = (result * a) % k;}a = (a * a) % k;b /= 2;}return result;
}int main() {long long b, p, k;cin >> b >> p >> k;cout << fast_pow(b, p, k) << endl;return 0;
}
我们以计算 (3 ^ 13) % 10
为例,对修正后的 C++ 代码进行一步一步的分析。
分析过程
初始化
在 fast_pow
函数开始时,有如下初始化操作:
a = 3
(底数)b = 13
(指数)k = 10
(模数)result = 1
第一次循环
- 判断
b
是否为奇数:b = 13
,13 % 2 == 1
,满足条件。所以执行result = (result * a) % k
,即result = (1 * 3) % 10 = 3
。 - 更新
a
:a = (a * a) % k
,也就是a = (3 * 3) % 10 = 9
。 - 更新
b
:b /= 2
,b
变为6
。
此时各变量的值为:
a = 9
b = 6
k = 10
result = 3
第二次循环
- 判断
b
是否为奇数:b = 6
,6 % 2 == 0
,不满足条件,不更新result
。 - 更新
a
:a = (a * a) % k
,即a = (9 * 9) % 10 = 81 % 10 = 1
。 - 更新
b
:b /= 2
,b
变为3
。
此时各变量的值为:
a = 1
b = 3
k = 10
result = 3
第三次循环
- 判断
b
是否为奇数:b = 3
,3 % 2 == 1
,满足条件。执行result = (result * a) % k
,即result = (3 * 1) % 10 = 3
。 - 更新
a
:a = (a * a) % k
,也就是a = (1 * 1) % 10 = 1
。 - 更新
b
:b /= 2
,b
变为1
。
此时各变量的值为:
a = 1
b = 1
k = 10
result = 3
第四次循环
- 判断
b
是否为奇数:b = 1
,1 % 2 == 1
,满足条件。执行result = (result * a) % k
,即result = (3 * 1) % 10 = 3
。 - 更新
a
:a = (a * a) % k
,也就是a = (1 * 1) % 10 = 1
。 - 更新
b
:b /= 2
,b
变为0
。
此时各变量的值为:
a = 1
b = 0
k = 10
result = 3
循环结束
由于 b = 0
,不满足 while (b > 0)
的条件,循环结束,函数返回 result
的值 3
。
所以,(3 ^ 13) % 10
的结果是 3
。这种快速幂算法通过不断将指数 b
减半,减少了乘法运算的次数,时间复杂度为 O(logb)。