乘法逆元

乘法逆元

定义

对于\(a,p,x \in \mathbb Z\),若\((a,p)=1\),且\(ax \equiv 1(mod\;p)\),则将\(x\)称做\(a\)在模\(p\)意义下的逆元,记做\(x=a^{-1}\)算法

主要性质

\[ bx \equiv b/a(mod\;p) \]ui

咱们知道,同余是不知足同除性的(除数与模数互质时除外),所以不能直接对除法进行取模。而这条性质,能够将除法转换为乘法,从而能够在过程当中取模。spa

下面给出此性质的证实:
\[ \begin{aligned} &\because ax \equiv 1(mod\;p)\\ &\therefore abx \equiv b(mod\;p)\\ 又&\because (a,p)=1\\ &\therefore bx \equiv b/a(mod\;p) \end{aligned} \]code

求法

扩展欧几里得算法

扩展欧几里得算法能够用来求\(ax+by=(a,b)\)这一方程的一组特解,而咱们所要求的是\(ax \equiv 1(mod\;p)\)的解。将原方程进行变形,咱们能够获得
\[ \begin{aligned} &\because ax \equiv 1(mod\;p)\\ &\therefore p \mid (ax-1)\\ &\therefore ax-1=-py(y \in \mathbb Z)\\ &\therefore ax+py=1 \end{aligned} \]
故使方程\(ax+py=1\)成立的\(x\)值即为\(a\)的逆元。class

代码以下:扩展

void exgcd(int a,int b,int &x,int &y)
{
    if(!b)
    {
        x=1;
        y=0;
        return;
    }
    exgcd(b,a%b,x,y);
    int t=x;
    x=y;
    y=t-a/b*y;
    return;
}

欧拉定理

根据欧拉定理,对于\(a,p \in \mathbb Z\),若\((a,p)=1\),则有\(a^{\varphi (p)} \equiv 1(mod\;p)\),由此可得
\[ a \cdot a^{\varphi(p)-1} \equiv 1(mod\;p) \]
\(a^{\varphi(p)-1}\)即为\(a\)的逆元。gc

费马小定理

根据费马小定理,对于\(a,p \in \mathbb Z\),若\(p\)为素数,则有\(a^{p} \equiv a(mod\;p)\)di

特别地,当\((a,p)=1\)时,\(a^{p-1} \equiv 1(mod\;p)\)co

由此可得
\[ a \cdot a^{p-2} \equiv 1(mod\;p) \]
\(a^{p-2}\)即为\(a\)的逆元。display

递推

对于\(1\le i < p,i \in \mathbb{Z}\)
\[ \begin{aligned} &设p=ki+t(k,t\in \mathbb{Z},0<t<i)\\ &\therefore k=p/i,t=p\%i,ki+t \equiv 0(mod\;p)\\ &\therefore ki \equiv -t(mod\;p)\\ &\therefore -kt^{-1} \cdot i \equiv 1(mod\;p)\\ \end{aligned} \]
\(-kt^{-1}\)\(i\)的逆元,

由取值范围能够获得若从\(1\)开始递推,\(t^{-1}\)将比\(i^{-1}\)先进行计算,因此咱们能够获得递推式
\[ i^{-1}= \begin{cases} 1 & \text{i=1}\\ -p/i*(p\%i)^{-1} & \text{1<i<p} \end{cases} \]
代码以下:

inv[1]=1;
for(int i=2;i<=n;++i)
    inv[i]=(p-p/i)*inv[p%i]%p;
相关文章
相关标签/搜索