快速乘

- 快速乘

  • 基本原理
     由于计算机底层设计的原因,做加法往往比乘法快的多,因此将乘法转换为加法计算将会大大提高(大数,比较小的数也没必要)乘法运算的速度,除此之外,当我们计算a*b%mod的时候,往往较大的数计算a*b会超出long long int的范围,这个时候使用快速乘法方法也能解决上述问题.(来自其他帖子)
int fast_mul(int a,int b,int c)
{
	int ans=0;
	a%=c;
	while(b)
	{
		if(b%2)
			ans=(ans%c+a%c)%c;
		a=(a%c+a%c)%c;
		b/=2;
	}
	return ans%c
}

把b化成二进制,ab就相当于a(x1* 20+x2* 21+…+xn* 2n),举个简单的例子,a=7,b=5(为了方便叙述先不算%c),下面说一下接下来的过程:
ans=0,b!=0成立,b%2!=0成立,ans=0+7,a=7+7,b/2=2;
b!=0(b=2)成立,b%2!=0不成立,跳过,但是a还是要执行a+a,(5转化成二进制是101,虽然0不满足条件,但是还是会向左移一位),a=14+14,b/2=1;
b!=0成立,b%1!=0成立,ans=7+28,a=28+28,b/2=0,跳出,ans=35.结束
上述内涉及同余定理,如有疑惑请点击➡同余定理
如有错误,欢迎指正

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值