位运算:可提高幂函数计算性能,传统幂函数计算如的时间复杂度为O(b),而使用位移只需要O()的时间复杂度即可完成。
举个栗子:
传统方式:=15个2相乘,/2=
位移运算:=,/2=,即通过右移一位的方式实现模2运算。
快速幂:
引入一个栗子:
====
即当幂的次数高时,可通过将指数换算为二进制,判断二进制指数的最低位是否为1来进行计算该数的最终结果。
存在以下三种情况:
1.使用上述传统方式即n个a逐一相乘,时间复杂度为O(n);
2.使用二进制位移运算,时间复杂度为O();
3.使用java的Math.pow则无法实现模p运算
具体例子如下(计算的结果):
由于快速幂常用于大数计算,所以本例中采用的数值类型为long而不用int。
package lanqiao;
public class Day01 {
public static void main(String[] args) {
System.out.println(quick(2,4));
}
static public long quick(long a,long b) {//快速幂
long ans=1;
while(b!=0) {
if((b&1)==1) {//判断末位是否为1
ans=ans*a;
}
a=a*a;//累乘
b=b>>1;
}
return ans;
}
}
由于常用于大数计算,所以可在快速幂中添加一个取模操作,以成倍减小计算结果。
package lanqiao;
public class Day01 {
public static void main(String[] args) {
System.out.println(quick(2,4,5));
}
static public long quick(long a,long b,int p) {//快速幂
long ans=1;
while(b!=0) {
if((b&1)==1) {
ans=(ans*a)%p;
}
a=(a*a)%p;
b=b>>1;
}
return ans;
}
}
平平无奇小白程序媛一枚,欢迎各位大佬交流指教,如有不正确的地方,欢迎留言改正,谢谢!!!