关于快速幂与快速积取模实现的尝试
最近在学习有关快速幂与快速积的知识,尝试做一做它们的实现来加深一下印象。
其实我个人感觉这两个快速之所以快都是用到了计算机的主要进行二进制运算与存储的特点,我们每一次只需对乘数进行自加或自乘的操作就可以实现。 这样我们在运算时就可以通过对该位所存储的是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;
}