关于快速幂与快速积取模实现的尝试

关于快速幂与快速积取模实现的尝试

最近在学习有关快速幂与快速积的知识,尝试做一做它们的实现来加深一下印象。

其实我个人感觉这两个快速之所以快都是用到了计算机的主要进行二进制运算与存储的特点,我们每一次只需对乘数进行自加或自乘的操作就可以实现。 这样我们在运算时就可以通过对该位所存储的是0还是1来判断它是否加上,从而实现它们的加法与乘法.

快速积:
我们都知道,计算机本身是不会乘法的,它所谓的乘法,其实不过是由多次累加所得的和,我们在进行快速积的时候也是继承了这种思想,但同时我们也关注到了二进制。我们的做法是对a不断自加,根据b的二进制的表示来决定它要不要加在c上,最后再输出c就可以了。其实说到自己加自己我开始在打代码的时候好像忘了也可以直接用位运算来实现。(好傻,但代码已经打好了,不太想改了。/笑哭)

	代码实现:
long long kj(int a,int b)
{
    long long c=0;
    while(b)
    {
	    if(b&1)c+=a;
	    a=(a+a)%P;
	    b>>=1;
	    c%=P;
    }
    return c;
}

快速幂:
依照上面的快速积,我们只要把自增变成自乘就可以了

	代码实现:
long long km(int a,int b)
{
    long long c=0;
    while(b)
    {
	    if(b&1)c+=a;
	    a=(a*a)%P;
	    b>>=1;
	    c%=P;
    }
    return c;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值