快速幂算法的理解

首先给出代码:

#include <iostream>     
using namespace std;     

//计算a^bmodn     
int modexp(int a,int b,int n)     
{     
    int ret=1;     
    int tmp=a;     
    while(b)     
    {       
       if(b&1) 
           ret=ret*tmp%n;     
       tmp=tmp*tmp%n;     
       b>>=1;     
    }     
    return ret;     
}     

int main()     
{     
    cout<<modexp(2,10,3)<<endl;     
    return 0;     
}    

接下来进行讲解,快速幂算法,就是快速求 x^n mod (m) 的快速算法。
比如:

计算 12996^227 mod 37909
设m = 37909 , b = 12996, 令a = 1, 将227二进制表示为:227 = 1 + 2 + 2^5 + 2^ 6 + 2^7;
依次计算 12996^227 = 12996 + 12996^2 + 12996^2^5 + 12996^2^ 6 + 12996^2^7;
运用二进制操作,也就是二分的思想,可以达到O(logn)。二进制扫描从最高位一直扫描到最低位。
运用上面的例子:

 if(227&1) //也就是说存在2的某次幂不为0,所以需要计算; 
 ………………
 227>>=1 //右移一位,继续检查。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值