乘法逆元与费马小定理

逆元:类似倒数和相反数的概念,具体自己百度,我也是百度的,这让我想起了离散数学中提到了左逆右逆,哎,离散没学好啊。

乘法逆元:我们知道 (A/B)%M=(A(1/B))%M 。令 1/B 等于 H ,那么H就是B关于M的乘法逆元,其实就是关于M的一个相反数, BH(1%M)

那么我们如何求乘法逆元呢

  • 扩展欧几里得算法
  • 费马小定理

扩展欧几里得算法


BH(1%M) 可以等价于 BX+MY=1 ,那么我们主需要调用欧几里得算法求解出来就可以了。

int cal(int a,int b)
{
    int x,y;
    int Gcd=gcd_extend(a,b,x,y);

    if(1%Gcd)
        return -1;

    x*=1/Gcd;
    b/=Gcd;
    b=b<0? -b:b;
    int ans=x%b;
    ans=ans<=0? ans+b:ans;
    return ans;
}

费马小定理


费马小定理:假如M是素数,且H与M互质,那么 HM1(1%M)

那么联立我们之前的 AH(1%M)

得出乘法逆元 H=AM2

这个地方不能简单调用Pow这个库函数,我们要自己写一个带模的快速幂算法。

int cal(int x,int m,const int MOD)
{
    int ans=1;
    while(m){
        if(m&1)
            ans=ans*x%MOD;
        m>>=1;
        x=x*x%MOD;
    }
    return ans;
}

参考

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值