快速幂(求a的b次方 求余运算)

求a的b次方

	public static int quickPower(int a, int b){//是求a的b次方
	
	    int ans = 1, base = a;   //ans为答案,base为a^(2^n)
	    while(b > 0)//b是一个变化的二进制数,如果还没有用完
	    {
	        if(b%2==1) {
	        	ans *= base; //把ans乘上对应的a^(2^n)
	        }
	            

	        base *= base;//base自乘,由a^(2^n)变成a^(2^(n+1))
	        b >>= 1;//位运算,b右移一位,如1010变成101(把最右边的1移掉了),除以2^1
	    }
	    return ans;
	}

取余运算

取余运算有一些好用的性质,包括:

(A+B) \mod b = (A \mod b + B \mod b) \mod b(A+B)mod b=(A mod b+B mod b)mod b
(A×B) \mod b = ((A \mod b) × (B \mod b)) \mod b(A×B)mod b=((A mod b)×(B mod b))mod b
证明都很简单,如果要说服自己的话拿起笔试试吧。可设 A = k_A × b + R_AA=k
A
​ ×b+R
A
​ ……

于是快速幂过程中可以

public static int quickPower(int a, int b,int m){//是求a的b次方 余m
	
	    int ans = 1, base = a;   //ans为答案,base为a^(2^n)
	    while(b > 0)
	    {
	        if(b%2==1)
	        {
	            ans *= base;
	            ans %= m;
	        }

	        base *= base;
	        base %= m;
	        b >>= 1;
	    }
	    return ans;
	}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值