最简单的方法是通过在每个步骤中通过模量减少重复的平方来取幂.
unsigned long long mod_pow(unsigned long long base, unsigned long long exponent, unsigned long long modulus)
{
if (exponent == 0) return 1;
unsigned long long aux = 1;
while(exponent > 1) {
if (exponent % 2 != 0) {
aux *= base;
aux %= modulus;
}
base *= base;
base %= modulus;
exponent /= 2;
}
return (base*aux) % modulus;
}
Run Code Online (Sandbox Code Playgroud)
然后,您可以使用它来计算
result = (3*mod_pow(2,500000000,1000000000) - 2) % 1000000000;
Run Code Online (Sandbox Code Playgroud)
该函数假设模数的平方不超过64位范围.对于较大的模量,事情更复杂.