C++ 快速幂取模算法

快速求b^p%k的值.

 

1 模运算与乘法的性质


乘积取模可以在乘之前先取模

x * y % d = ((x % d) * (y % d)) % d;

比如:a*a%c = ((a % c) * ( a % c)) % c;

 

2 本题公式


b为偶数时:ab mod c = ((a2)b/2) mod c
b为奇数时:ab mod c = ((a2)b/2× a) mod c

 

因此快速幂实际是分治算法,每次将b分一半,直到b=0;

 
3 实现


1> 递归实现

#include 
using namespace std;

#define Lint long long

Lint Mod(Lint a, Lint b, Lint c) {                       //求a的b次方 模c 
	if(b == 0) return 1;                                //递归边界:0次幂=1 
	if(b % 2 == 1) return a * Mod(a*a % c, b/2, c) % c; //b是奇数时
	else return Mod(a*a % c, b/2, c) % c;               //b是偶数时 
}

int main() {
	Lint b, p, k;
	cin >> b >> p >> k;
	cout << b << "^" << p << " mod " << k << "=" << Mod(b, p, k) << endl;
	return 0;
}


2> 非递归(循环)实现

 

#include 
using namespace std;

#define Lint long long

Lint mod(Lint a, Lint b, Lint c) {
	Lint ans = 1;
	while(b > 0) {
		if(b & 1) ans = ans * a % c; //位运算b&1与b%2相同 
		a = a * a % c;
		b >>= 1;                     //位运算:b/=2; 
	}	
	return ans;
}
int main() {
	Lint b, p, k;
	cin >> b >> p >> k;
	cout << b << "^" << p << " mod " << k << "=";
	cout << mod(b, p, k) % k << endl;
}

你可能感兴趣的:(C++ 快速幂取模算法)