转载:
https://baike.baidu.com/item/快速幂/5500243?fr=aladdin
https://blog.csdn.net/qq_40129237/article/details/79883665
一、定义
顾名思义,快速幂就是快速算底数的n次幂。其时间复杂度为 O(log₂N), 与朴素的O(N)相比效率有了极大的提高。
二、原理
以下以求a的b次方来介绍 。
把b转换成二进制数。
该二进制数第i位的权为2^(i-1)
例如:
11的二进制是1011
11 = 2³×1 + 2²×0 + 2¹×1 + 2º×1
因此,我们将a¹¹转化为算
三、代码比较
常规求幂
int pow1(int a,int b){
int r=1;
while(b--) r*=a;
return r;
}
快速求幂(一般)
int pow2(int a,int b){
int r=1,base=a;
while(b!=0){
if(b%2) r*=base;
base*=base;
b/=2;
}
return r;
}
快速求幂 (递归)
int f(int m,int n){ //m^n
if(n==1) return m;
int temp=f(m,n/2);
return (n%2==0 ? 1 : m)*temp*temp;
}
快速求幂(位运算)
int pow3(int x,int n){
if(n==0) return 1;
else {
while((n&1)==0){
n>>=1;
x*=x;
}
}
int result=x;
n>>=1;
while(n!=0){
x*=x;
if(n&1) result*=x;
n>>=1;
}
return result;
}
快速求幂(位运算,更简洁)
int pow4(int a,int b){
int r=1,base=a;
while(b){
if(b&1) r*=base;
base*=base;
b>>=1;
}
return r;
}
四、快速幂求余
基本上快速幂都会对应一个mod p运算,所以一个非常重要的性质就是 (a*b)%p=((a%p)*(b%p))%p.
int fun(int a, int b,int p)
{
int ans = 1;
while (a&&b)
{
if (b & 1) ans = (ans*a) % p;
a = (a*a) % p;
b >>= 1; //移位运算,右移一位
}
return ans;
}