求a^n, a^n%m : binary exponentiation O(logN)
计算a^n
常规思路:O(N)
按照N为循环次数进行计算
public long pow(int a, int n){
long result = 1;
while(n-- > 0){
result *= a;
}
return result;
}
Binary Exponentiation: log(N)
计算a^n
1.如果n为偶数: a^n = (a * a) ^ (n / 2)
2.如果n为奇数: a^n = a * (a * a) ^ ( (n - 1) / 2 )
时间复杂度从 O(N) 降低为 O(log(N))
递归方法
public int binPow(int a, int n){
if(n == 0) return 1;
if(n % 2 == 1) return a * binPow(a * a, (n - 1) / 2 );
return binPow(a * a, n / 2);
}
迭代方法
public long binPow(int a, int n){
long result = 1;
while(n > 0){
if(n % 2 == 1)
result = result * a;
a = a * a;
n = n >> 1;
}
return result;
}
计算a^n % m
要求:不溢出,时间复杂度log(N)
运算规则:(a * a) % m = (a % m * a % m) % m
计算a^n % m
1.如果n为偶数: a^n % m = ( (a * a ) ^ (n/2) ) ) % m = binMod(a * a % m, n / 2, m);
2.如果n为奇数: a^n = (a * (a * a) ^ ( (n - 1) / 2 ) ) % m =
binary
递归方法
public int binMod(int a, int n, int m){
if(n == 0) return 1;
if(n % 2 == 0) return binMod(a * a % m, n / 2, m);
return (a % m * binMod(a * a % m, (n - 1) / 2, m)) % m;
}
迭代方法
public int binMod(int a, int n, int m){
int result = 1;
while(n > 0){
if(n % 2 == 1) result = ( result * a ) % m;
a = (a * a) % m;
n = n >> 1;
}
return result;
}
参考:https://www.hackerearth.com/practice/math/number-theory/basic-number-theory-1/tutorial/
浙公网安备 33010602011771号