[学习笔记]乘法逆元


乘法逆元:若\(ab\equiv1(mod\;p)\),则称\(b\)\(a\)\(mod\;p\)意义下的乘法逆元.

本文介绍乘法逆元的三种求法.

扩展欧几里得求逆元

因为\(ab\equiv1(mod\;p)\),所以设\(q\)满足\(ab+pq=1\),

则可以用扩展欧几里得求关于\(b,q\)的方程\(ab+pq=1\)的一组解,即求出\(b\).

inline int exgcd(int a,int b,int &x,int &y){
    if(!b){
        x=1;y=0;return a;
    }
    int ret=exgcd(b,a%b,y,x);
    y-=a/b*x;return ret;
}
inline int inver{
    r=exgcd(a,p,b,q);
    if(r!=1) return -1;
    return b;
}

费马小定理求逆元

因为\(a^{p-1}\equiv1(mod\;p)(gcd(a,p)=1)\),所以\(a\;\times\;a^{p-2}\equiv1(mod\;p)\),

\(a^{p-2}\)\(a\)\(mod\;p\)意义下的逆元.

typedef long long ll;
inline ll power(ll x,ll k){
    ll ret=1;
    while(k){
        if(k&1) ret=ret*x%p;
        x=x*x%p;k>>=1;
    }
    return ret;
}
inline ll inver{
    return power(a,p-2);
}

线性求逆元

\(re[i]\)表示\(i\)\(mod\;p\)(\(p\)为质数)意义下的逆元。

\(re[i]=\begin{cases}1&i=1\\-p/i\;\times\;re[p\;mod\;i]&i>1\\\end{cases}\)

证明:
因为\((p/i)\;\times\;i+p\;mod\;i=p\),
所以\((p/i)\;\times\;i+p\;mod\;i\equiv0(mod\;p)\)
所以\((p/i)\;\times\;i\equiv-p\;mod\;i(mod\;p)\)
所以\(-p/i\;\equiv\;p\;mod\;i\times\;i^{-1}(mod\;p)\)
所以,

\(\begin{split} &-(p/i)\;\times\;re[p\;mod\;i]\\ \equiv&-(p/i)\times(p\;mod\;i)^{-1}\\ \equiv&(p\;mod\;i)\;\times\;i^{-1}\times(p\;mod\;i)^{-1}\\ \equiv&\;i^{-1}(mod\;p)\\ \end{split}\)

typedef long long ll;
inline ll inver{
    re[1]=1;
    for(ll i=2,mul;i<=a;++i){
        re[i]=-p/i*re[p%i]%p;
        if(re[i]<0){
            mul=(0-re[i])/p+1;
            re[i]=(re[i]+mul*p)%p;
        }
    }
    return re[a];
}