乘法逆元

乘法逆元

定义

对于\(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) \]

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

下面给出此性质的证明:

\[\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} \]

求法

扩展欧几里得算法

扩展欧几里得算法可以用来求\(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\)的逆元。

代码如下:

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\)的逆元。

费马小定理

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

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

由此可得

\[a \cdot a^{p-2} \equiv 1(mod\;p) \]

\(a^{p-2}\)即为\(a\)的逆元。

递推

对于\(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;
posted @ 2019-12-31 23:28  PsephurusGladius  阅读(115)  评论(0编辑  收藏  举报