快速幂

转载自百度百科:

快速幂

快速幂顾名思义,就是快速算某个数的多少次幂。其时间复杂度为 O(log₂N), 与朴素的O(N)相比效率有了极大的提高。

<cmath>库中pow函数的时间复杂度就是O(N);

原理

以下以求a的b次方来介绍 [1]  
把b转换成 二进制数。
该二进制数第i位的权为
例如
11的二进制是1011
11 = 2³×1 + 2²×0 + 2¹×1 + 2º×1
因此,我们将a¹¹转化为算

代码比较

常规求幂

1
2
3
4
5
6
7
int  pow1(inta,intb)
{
int  r=1;
while (b--)
r*=a;
return  r;

二分求幂(一般)

1
2
3
4
5
6
7
8
9
10
11
12
int  pow2(inta,intb)
{
int  r=1,base=a;
while (b!=0)
{
if (b%2)
r*=base;
base*=base;
b/=2;
}
return  r;
}

快速求幂(位操作)

1
2
3
4
5
6
7
8
9
10
11
12
intpow3(inta,intb)
{
intr=1,base=a;
while (b!=0)
{
if (b&1)
r*=base;
base*=base;
b>>=1;
}
return  r;
}

快速求幂(位运算,同pow3函数,但更复杂)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
intpow4(intx,intn)
{
if (n==0)return1;
else
{
while ((n&1)==0)
{
n>>=1;
x*=x;
}
}
intresult=x;
n>>=1;
while (n!=0)
{
x*=x;
if ((n&1)!=0)
result*=x;
n>>=1;
}
return  result;
}

你可能感兴趣的:(数论)