快速幂取模算法


  快速幂取模算法,即求(a^b) mod c =?.如果直接计算,代码如下:【时间复杂度为O(b)】

int ans=1;
for(int i=1;i<=b;i++)
{
     ans=ans*a;
}
ans=ans%c;

【一】优化一:(a^b) mod c =[(a mod c)^b] mod c;

引理一:(ab) mod c=[(a mod c)*(b mod c)] mod c;

       证明:令 a=a1*c+x1,b=b1*c+x2;

             (a*b) mod c=[(a1*c+x1)*(b1*c+x2)] mod c;

                       =[a1b1c^2+a1x2c+x1b1c+x1x2]                  mod c;

                       =(x1x2) mod c;

                       =[(a mod c)*(b mod c)] mod c;

        即:(ab) mod c=[(a mod c)*(b mod c)] mod c;

优化一代码:【时间复杂度为O(b),但是能防止a过大,溢出】

int ans=1;
a=a%c;
for(int i=1;i<=b;i++)
{
ans=ans*a;(1)
}
ans=ans%c;

利用引理一,再对步骤(1)进一步优化。

int ans=1;//【时间复杂度仍为O(b),但防止数据溢出】

a=a%c;

for(int i=1;i<=b;i++)

{

   ans=(ans*a)%c;

}

ans=ans%c;

 【二】优化二:a^b=(a^2)^(b/2);

               如果b为奇数,则:

               a^b=[(a^2)^(b/2)]*a;【注:计算机算两个整数相除时,商只能为整数。】

优化二代码【最终代码】:

int ans=1;//【时间复杂度为O(log(b))】

a=a%c;

while(b>0)

{

     if(b%2= =1)

        ans=(ans*a)%c;

     b=b/2;

 a=(a*a)%c;

}

参考百度文库。

          

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值