快速幂取模算法

快速幂取模算法
 
快速幂,即快速幂取模。
 
例如: a^b mod c
 
一般算法
 
int ans=1;
for(int i=1;i<=b;i++)
{
         ans=ans*a;
}
ans=ans%c;
 
a 和 b 过大时很容易溢出
 
改进:
 
 
根据离散数学中的算法:
 
a^b modc=(a mod c)^b mod c
 
 
int ans=1;
a=a%c;
for(inti=1;i<=b;i++)
{
         ans=(ans*a)%c
}
ans=ans%c;
 
 
但在c过大的情况下仍有可能超时。
 
所以推出以下快速幂算法
 
因为 根据二进制的方式 b=an*2^n+an-1*2^n-1+an-2*2^n-2+...a0 
此时 b%2=a0;
b=b/2 后则  b%2=a1
b=b/2后则 b%2=a2;
以此类推下去


如果 an(n=0,1,2,3,4...)=1
则相乘,否则所乘上的那一项就相当于是1所以就不乘


int ans=1;
a=a%c;
while(b>0)
{
         if(b%2==1)
                   ans=(ans *a)%c;
         b=b/2;
         a=(a*a)%c;
}
cout<<ans<<endl;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值