[学习笔记]乘法逆元
乘法逆元:若\(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];
}