位运算、快速幂

位运算:可提高幂函数计算性能,传统幂函数计算如a^b的时间复杂度为O(b),而使用位移只需要O(log_{2}b)的时间复杂度即可完成。
举个栗子:
传统方式:2^{15}=15个2相乘,2^{15}/2=2^{14}
位移运算:2^{15}=2^{(1111)_{2}}2^{15}/2=2^{(0111)_{2}},即通过右移一位的方式实现模2运算。

快速幂:
引入一个栗子:
 2^{15}=2^{(1111)_{2}}=2^{(2^3+2^2+2^1+2^0)}=2^{(8+4+2+1)}=2^8*2^4*2^2*2^1
2^{10}=2^{(1010)_2}=2^{(2^3+0*2^2+2^1+0*2^0)}=2^{(8+0*4+2+0*1)}=2^8*2^2
即当幂的次数高时,可通过将指数换算为二进制,判断二进制指数的最低位是否为1来进行计算该数的最终结果。

存在以下三种情况:
1.使用上述传统方式即n个a逐一相乘,时间复杂度为O(n);
2.使用二进制位移运算,时间复杂度为O(log_{2}n);
3.使用java的Math.pow则无法实现模p运算

具体例子如下(计算2^4的结果):
由于快速幂常用于大数计算,所以本例中采用的数值类型为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;
	}

}

平平无奇小白程序媛一枚,欢迎各位大佬交流指教,如有不正确的地方,欢迎留言改正,谢谢!!!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值