乘法逆元
乘法逆元
定义
对于\(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;