求逆元的方法

乘法逆元的定义


  若ax≡1%p, 则称a关于模p的乘法逆元为x。
  当a与p互质时,a关于模p的乘法逆元有解。如果不互质,则无解。如果p为质数,则从1到p-1的任意数都与p互质,即在1到p-1之间都恰好有一个关于模p的乘法逆元。且1到p-1中的所有数的逆元对应1到p-1中的所有数,既是单射也是满射。

逆元的求解

1.费马小定理

  感觉很顺手的求法

  当n为质数时,已知n^(p−1)≡1%p(费马小定理)
  那么inv[n]=n^(p−2)%p.
  时间复杂度为O(logn)(快速幂).
LL quick(LL n,LL p)
{
    LL res=1,ex=p-2;
    for(LL i=ex;i;i>>=1,n=n*n%p)
    {
        if(i&1) res=res*n%p;
    }
    return res;
}
int main()
{
    LL n;
    while(cin>>n>>p)
    {
        cout<<quick(n,p)<<endl;
    }
}

 2.扩展欧几里得

  这个方法没啥好讲,复杂度同样O(logn)

void exgcd(LL a,LL b,LL &g,LL &x,LL &y)
{
    if(!b)  g=a,x=1,y=0;
    else    exgcd(b,a%b,g,y,x),y-=x*(a/b);
}
LL inv(LL num)
{
    LL g,x,y;
    exgcd(num,MOD,g,x,y);
    return (x%MOD+MOD)%MOD;
}

emmm,先这样吧,还有好多好多,慢慢来吧- -

原文地址:https://www.cnblogs.com/weimeiyuer/p/8082321.html