C++快速幂取模算法
时间: 2025-05-18 12:05:01 浏览: 24
### C++ 中快速幂取模算法的实现
快速幂取模是一种高效的计算 $a^b \mod c$ 的方法,在处理大整数幂运算时非常有用。以下是基于提供的引用内容以及专业知识对该算法的详细介绍。
#### 基本原理
快速幂的核心思想在于通过分治策略减少乘法次数,利用二进制分解指数的方式逐步缩小问题规模[^1]。具体来说,当计算 $a^n$ 时,可以通过递归或迭代方式将其拆解为更小的部分:
- 如果 $n$ 是偶数,则有 $a^n = (a^{n/2})^2$
- 如果 $n$ 是奇数,则有 $a^n = a \cdot a^{n-1}$
在此基础上引入取模操作 $\mod c$ ,可以有效防止中间结果溢出并提高效率。
#### 迭代版本代码示例
下面展示了一个典型的迭代版快速幂取模函数:
```cpp
long long quick_pow_mod(long long base, long long exp, long long mod) {
long long result = 1;
base %= mod; // 防止base大于mod的情况
while(exp > 0){
if(exp & 1){ // 判断exp是否为奇数
result = (result * base) % mod;
}
base = (base * base) % mod; // 平方底数
exp >>= 1; // 将指数右移一位(相当于除以2)
}
return result;
}
```
此段代码中每一步都将当前的结果与新的平方后的基数相乘,并及时对结果进行取模操作来保持数值范围可控[^5]^。
#### 递归版本代码示例
除了迭代写法外,也可以采用递归来实现同样的功能:
```cpp
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
ll recursive_quick_pow_mod(ll x,ll n,ll m){
if(n==0)return 1%m;//任何数的零次幂都是1,但是要考虑到m可能等于1的情况
ll half_res=recursive_quick_pow_mod((x*x)%m,n>>1,m);
if(n&1)return ((half_res)*x)%m;
else return half_res;
}
int main(){
ll b,p,k;
cin >> b >> p >> k;
cout << b << "^" << p << " mod " <<k<< "=" << recursive_quick_pow_mod(b,p,k)<<endl;
return 0;
}
```
上述程序定义了一个名为 `recursive_quick_pow_mod` 的递归函数用于执行快速幂取模运算[^4]。
#### 时间复杂度分析
无论是迭代还是递归形式,由于每次都会将指数减半,因此整个算法的时间复杂度仅为 O($\log_2{n}$)[^4] 。这使得它非常适合用来解决大规模数据下的幂运算问题。
---
阅读全文
相关推荐
















