计算x的n次幂的朴素算法复杂度为O(N),我们还有一种复杂度为O(log N)的快速幂方法。
基本思想:
1. 令m=n/2。 假设已经知道如何计算xm,再来求xn。
2. 分两种情况:
如果n为偶数,xn=(xm)2
如果n为奇数,xn=x(xm)2
根据这个思想,可以得出递归的算法:
伪代码:
C++代码:
- int quickpower(int a, int n) {
- if (n == 0)
- return 1;
- if (n % 2 == 1)
- return quickpower(a, n / 2) * quickpower(a, n / 2) * a;
- else
- return quickpower(a, n / 2) * quickpower(a, n / 2);
- }
我们推导出迭代的算法。
推导过程:
求实数x的n次方法:
1. 令n表示为二进制dk,dk-1,…d0。n=2k+2k-1+…+20
2. 令y=1.
3. 从左到右扫描二进制数字,如果当前数字为0,y赋值y2,如果当前数字为1,y赋值xy2。
伪代码:
私家珍藏两版C++代码:
1.
- //a^n%mod
- long long pow_mod(long long a, long long n, long long mod)
- {
- long long ret = 1; //返回的值
- while (n)
- {
- if (n % 2 == 1) ret = ret*a%mod; //n&2==1表示低位为1,因此要乘上去
- a = a*a%mod; //a倍增
- n /= 2; //n除以2,转到下一位
- }
- return ret;
- }
2.
int pw(int x, int y, int p) {
if (!y) {
return 1;
}
int res = pw(x*x,y/2,p);
if (y & 1) {
res = res * x % p;
}
return res;
}