快速幂 学习笔记
概念与使用缘由
快速幂,顾名思义,就是用比一个一个相乘更快、更节约时间的求幂次的方法。
比如求24,如果把2乘4次,那么时间复杂度就是O(4),而如果用快速幂,时间复杂度会变成O(log24)即为O(2)。
两种方法
1.用位运算的方法
位运算原理
按位运算,就是把a^b中的b转化成二进制的形式,比如:
25 把5转化成二进制,即为2^(2 ^ 0+2 ^ 2) 也就是 21*24 ,
相比之前的25 需要运算5次,用快速幂的方法就只运算了2次。
位运算所需要用到的运算符
>> :右移。 a>>b 功能是将运算的数字a的二进制数向右移b位。
右移b位就是除以2的b次方。
例如:b = 10>>2 那么>>运算是这样的 :
10 : 00001010
10>>2:00000010
b:00000010
故b为2。
& :按位与。a&b 功能是参与运算的两数各对应的二进位相与。
例如:z = 3 & 10 那么&运算是这样的 :
3 : 00000011
10:00001010
z : 00000010
故z为2。
主程序如下:
#include<stdio.h>
int main() {
int a, b;
scanf("%d %d", &a, &b); //求a^b
int ans=1;
while(b!=0){
if(b&1) {
ans*=a;
}
b>>=1;
a*=a;
}
printf("%d\n",ans);
}
其中,这一串代码就是按位运算快速幂
int ans=1;
while(b!=0){
if(b&1) {
ans*=a;
}
b>>=1;
a*=a;
}
程序解析
首先判断幂次b是否为0,当不是0的时候才进行位运算。
进行判断b&1的判断,若为真,则代表了此时的幂次b是奇数,而快速幂的位运算是建立在幂次是偶数的情况下进行的,所以我们用ans存储多乘的那一次,而后把b的二进制数向右移一位,即把ab 整体除以2的1次方,但是这样是不行的,所以我们把a *= a,相当于把a变成了a2,这样总体就不会改变了。
接下来的的运算过程,我们举211为例:
第1次循环:因为b是11,为奇数,所以
ans = 2;
211 = 45 * ans;
第2次循环:因为b是5,为奇数,所以
ans = 2 * 4 = 8;
211 = 162 * ans;
第3次循环:因为b是2,为偶数,所以
ans =8 ;
211 = 2561 * ans;
第4次循环:因为b是1,为奇数,所以
ans =8 * 256 = 2048 ;
211 = 655360 * ans;
此时,b==0,所以退出循环,输出结果ans。
综上,就是快速幂的位运算方法。