乘法逆元
定义
对于(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)
]
我们知道,同余是不满足同除性的(除数与模数互质时除外),因此不能直接对除法进行取模。而这条性质,可以将除法转换为乘法,从而可以在过程中取模。
下面给出此性质的证明:
[egin{aligned}
&ecause ax equiv 1(mod;p)\
& herefore abx equiv b(mod;p)\
又&ecause (a,p)=1\
& herefore bx equiv b/a(mod;p)
end{aligned}
]
求法
扩展欧几里得算法
扩展欧几里得算法可以用来求(ax+by=(a,b))这一方程的一组特解,而我们所要求的是(ax equiv 1(mod;p))的解。将原方程进行变形,我们可以得到
[egin{aligned}
&ecause ax equiv 1(mod;p)\
& herefore p mid (ax-1)\
& herefore ax-1=-py(y in mathbb Z)\
& herefore 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)的逆元。
递推
对于(1le i < p,i in mathbb{Z}),
[egin{aligned}
&设p=ki+t(k,tin mathbb{Z},0<t<i)\
& herefore k=p/i,t=p\%i,ki+t equiv 0(mod;p)\
& herefore ki equiv -t(mod;p)\
& herefore -kt^{-1} cdot i equiv 1(mod;p)\
end{aligned}
]
故(-kt^{-1})为(i)的逆元,
由取值范围可以得到若从(1)开始递推,(t^{-1})将比(i^{-1})先进行计算,所以我们可以得到递推式
[i^{-1}=
egin{cases}
1 & ext{i=1}\
-p/i*(p\%i)^{-1} & ext{1<i<p}
end{cases}
]
代码如下:
inv[1]=1;
for(int i=2;i<=n;++i)
inv[i]=(p-p/i)*inv[p%i]%p;