二元法及M元法求快速幂模

幂模运算m^e (mod N),当m或者e很大时,其计算复杂度将非常高。因此希望有其他更快的计算方法,下面介绍二元法及M元法快速的运算方法。

一、二元法描述

在幂模运算中,比较常用的一种方法是二元法(也称为平方乘法),就是先将指数e以二进制表示法表示出来,即:

e=e0+e1×2+e2×2^2+.....+e(L-1)×2^(L-1)

于是运算过程为:

m^e(mod N)=(...(m^(e(L-1))^2×m^(e(L-2))^2...m^e1)^2×m^e0 (mod N)

算法描述:

c1

for  iL-1 downto 0

do

{

    cc^2 mod N

    if e(i)=1

    then cc×m mod N

}

return(c)

如果将模N乘法运算与模N平方运算的计算复杂性的量级看做是相同的,则其计算复杂性为O(log2 e)次模N乘法运算。

二、M元法描述

二元法是以二进制表示法为基础,所谓M元法,就是将e用M进制表示出来,再按照二元法计算方法进行幂模计算。下面对三元法算法进行描述。

算法描述:

c1

for  iL-1 downto 0

do

{

    cc^3 mod N

    if e(i)=1

    then cc×m mod N

    if e(i)=2

    then cc×m^2 mod N

 

}

return(c)

 

三、C++实现二元法求快速幂模

 

#include<iostream>

using namespace std;

/*
递归实现十进制转换成二进制存储于e
*/
void conversion_binary(int a,string &e){
    int b;
    b=a%2;
    if(a>=2){
        conversion_binary(a/2,e);//递归
    }
     e+=b+'0';
}

int main()
{
    string e;
    long long c=1; //防止溢出
    int i;
    int m,a,N;
    cout<<mod_fast(1268,24,154265)<<endl;
    cout<<"形如m^a(mod N),请输入m,a,N"<<endl;
    cin>>m>>a>>N;
    conversion_binary(a,e);//转换二进制
    i=e.size();
    cout<<e<<endl;
    //二元法主体
    for(int j=0;j<i;j++){
        c=(c*c)%N;
        if(e[j]-'0'==1)//当e[j]=1时计算
            c=(c*m)%N;
    }
    cout<<c<<endl;
    return 0;
}

 

四、运行结果

 

 

五、常用求快速幂模或快速幂方法

 

 

在之前,我们先来了解一个公式:(a*b)%p=((a%p)*(b%p))%p ,那么形如a^b(mod p)求幂模就是b个a相乘求模,如此问题就会变得简单。下面直接上代码:
long long mod_fast(long long a,int b,long long p)
{
    long long aa=a,t=1;
    while(b!=0)
    {
        if(b&1)//是b和1做二进制的且运算 即看b的最后边那一位是不是1,是1的话 返回1  否则返回0

        {
            t=(t%p)*(aa%p)%p;
        }
        aa=(aa%p)*(aa%p)%p;
        b=b/2;//aa平方模
    }
    return t%p;
}

int main()
{
    cout<<mod_fast(1268,24,154265)<<endl;
    return 0;
}

 

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我的书包哪里去了

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值