【学习笔记】快速幂


当学习并熟练掌握 $(a^n)^m=a^{n \times m}$ 后,我发现我原来想的好麻烦......


$a^b=(a^2)^{\tfrac{b}{2}}$

比如:计算$3^{10}$

$3^{10}=(3^2)^5=9^5=(9^2)^2 \times 9=81^2 \times 9=(81^2)^1 \times 9=6561^1 \times 9=59049$

主要思想就是计算 $a^b$ 时尽量让 $a$ 大,底数变大,指数变小,经过许多次这样的操作指数一定会变成 $1$。

也可以理解现在我们想求 $basic^{power}$,什么时候 $power=1$ 了,那就可以退出循环。


代码:

#include
#include
using namespace std;
long long result = 1;
long long basic;//底数
long long power;//指数
long long p;//模数 
int main(){
	cin >> basic >> power >> p; 
	printf("%Ld^%Ld mod %Ld=",basic,power,p);
	while(1){
		if(power == 1){
			result = result*basic;
			break;
		}
		if(power%2 == 0){
			power = power/2;
			basic = basic*basic %p;
		}
		else{
			power = power-1;
			result = result*basic %p;
			power = power/2 ;
			basic = basic*basic %p;
		}
	}
	cout << result%p << endl;
	
	return 0;
}

精简版:

long long fastPower(long long base,long long power,long long p){
	long long result = 1;
	while(power > 0){
		if(power & 1){
			result = result*base%p;
		}
		power >>= 1;
		base = (base*base)%p;
	}
	return result; 
}