乘法逆元与费马小定理

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

乘法逆元:我们知道 (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;
}

参考

  • 费马小定理应用参考

你可能感兴趣的:(算法)