求a的b次方、a的b次方对m取模

这篇博客介绍了如何优化计算乘方的过程,通过两两相乘减少运算次数,例如2^13仅需5次运算。此外,还提到了蒙格马利快速幂模算法,用于高效地计算x的y次方对z取模的情况,进一步优化了这类计算。

http://zhaoqj518.iteye.com/blog/675210


  • 快速计算乘方的算法,求a的b次方



如计算2^13,则传统做法需要进行12次乘法,但是可以优化:
把2*2的结果保存起来看看,是不是成了:4*4*4*4*4*4*2 
再把4*4的结果保存起来:16*16*16*2 
一共5次运算,分别是2*2、4*4和16*16*16*2 

这样分析,我们算法因该是只需要计算一半都不到的乘法了。 
为了讲清这个算法,再举一个例子2^7:2*2*2*2*2*2*2 
两两分开:(2*2)*(2*2)*(2*2)*2 
如果用2*2来计算,那么指数就可以除以2了,不过剩了一个,稍后再单独乘上它。 
再次两两分开,指数除以2: ((2*2)*(2*2))*(2*2)*2 
实际上最后一个括号里的2 * 2是这回又剩下的,那么,稍后再单独乘上它 
现在指数已经为1了,可以计算最终结果了:16*4*2=128

long my_power(long a,long b)
{
    long r=1; //用来计算"剩下的"乘积 
    if(b==0)
        return 1;
    if(b<0)
        return 0;
    while(b>1)
    {// 一直计算到指数
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值