快速幂

快速幂
顾名思义,快速幂就是快速算底数的n次幂。其时间复杂度为 O(log₂N), 与朴素的O(N)相比效率有了极大的提高。
中文名 快速幂 外文名 Fast Power 时间复杂度 log(n) 性 质 快速算底数的n次幂
目录
1 原理
2 实现
3 代码比较
原理编辑
以下以求a的b次方来介绍 [1]
把b转换成二进制数。
该二进制数第i位的权为
例如

11的二进制是1011
11 = 2³×1 + 2²×0 + 2¹×1 + 2º×1
因此,我们将a¹¹转化为算
实现编辑
快速幂可以用位运算来实现
1
b and 1{也就是取b的二进制最低位(即第0位) 判断b是否为奇数,是则为1}
1
b shr 1{就是去掉b的二进制最低位(即第0位)}
C++实现为
1
b & 1//取b二进制的最低位,判断和1是否相同,相同返回1,否则返回0,可用于判断奇偶
1
b>>1//把b的二进制右移一位,即去掉其二进制位的最低位
以下为pascal的实现:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
var a,b,n:int64;
function f(a,b,n:int64):int64;
var t,y:int64;
begin
t:=1; y:=a;
while b<>0 do begin
if(b and 1)=1 then t:=ty mod n;
y:=y
y mod n;{这里用了一个技巧,yy即求出了a(2(i-1))不知道这是什么的看原理
a(2(i-1))a(2(i-1))=a(2i)
而且一般情况下a
b mod c =(a mod c)
(b mod c) mod c}
b:=b shr 1;{去掉已经处理过的一位}
end;
exit(t);
end;
begin
read(a,b,n);{n是模}
writeln(f(a,b,n));
end.
[1]
以下为C的实现,为了方便与pascal的对照,变量全部与上面相同.可以对照查看。
递归版: [2]
1
2
3
4
5
6
7
ll pow(ll a,ll i){
if (i0) return 1;
int temp=pow(a,i>>1);
temp=temptemp%MOD;
if (i&1) temp=(ll)temp
a%MOD;
return temp%MOD;
}
非递归版:
1
2
3
4
5
6
7
8
9
ll f(ll a,ll b,ll n){
int t,y;
t=1; y=a;
while (b!=0){
if (b&1
1) t=ty%n;
y=y
y%n; b=b>>1;
}
return t;
}
代码比较编辑
常规求幂
1
2
3
4
5
int pow1(int a,int b){
int r=1;
while(b–) r*=a;
return r;
}
快速求幂(一般)
1
2
3
4
5
6
7
8
9
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;
}
快速求幂 (递归)
1
2
3
4
5
int f(int m,int n){ //m^n
if(n1) return m;
int temp=f(m,n/2);
return (n%2
0 ? 1 : m)temptemp;
}
快速求幂(位运算)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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;
}
快速求幂(位运算,更简洁)
1
2
3
4
5
6
7
8
9
int pow4(int a,int b){
int r=1,base=a;
while(b){
if(b&1) r*=base;
base*=base;
b>>=1;
}
return r;
}
参考资料

  1. 快速幂详解–by viking .新浪.2012-10-06[引用日期2012-010-7]
  2. 快速幂讲解 .博客园[引用日期2017-07-14]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值