求a的b次方
public static int quickPower(int a, int b){//是求a的b次方
int ans = 1, base = a; //ans为答案,base为a^(2^n)
while(b > 0)//b是一个变化的二进制数,如果还没有用完
{
if(b%2==1) {
ans *= base; //把ans乘上对应的a^(2^n)
}
base *= base;//base自乘,由a^(2^n)变成a^(2^(n+1))
b >>= 1;//位运算,b右移一位,如1010变成101(把最右边的1移掉了),除以2^1
}
return ans;
}
取余运算
取余运算有一些好用的性质,包括:
(A+B) \mod b = (A \mod b + B \mod b) \mod b(A+B)mod b=(A mod b+B mod b)mod b
(A×B) \mod b = ((A \mod b) × (B \mod b)) \mod b(A×B)mod b=((A mod b)×(B mod b))mod b
证明都很简单,如果要说服自己的话拿起笔试试吧。可设 A = k_A × b + R_AA=k
A
×b+R
A
……
于是快速幂过程中可以
public static int quickPower(int a, int b,int m){//是求a的b次方 余m
int ans = 1, base = a; //ans为答案,base为a^(2^n)
while(b > 0)
{
if(b%2==1)
{
ans *= base;
ans %= m;
}
base *= base;
base %= m;
b >>= 1;
}
return ans;
}