逆元
•何为逆元
方程ax≡1(mod p),的解称为a关于模p的逆,当gcd(a,p)==1(即a,p互质)时,方程有唯一解,否则无解。
逆元有对称性,x是a关于b的逆元,那a也是x关于b的逆元。
线性递推求逆元
线性求从1到n的$mod p$ 的逆元
设$p=ki+r (r<i<p,i>1)$ ①
可以得到
$k=lfloor frac{p}{i} floor$ ②
$r=p mod i$ ③
$ki+requiv 0 (mod p)$ ④
两边同乘$i^{-1}cdot r^{-1}$得
$kr^{-1}cdot i^{-1}equiv 0 (mod p)$
移项得$i^{-1}equiv -kr^{-1} (mod p)$ ⑤
将②③代入⑤
得 $i^{-1}equiv -lfloor frac{p}{i} floorcdot (p mod i)^{-1}(mod p)$
由于$1^{-1}equiv 1 (mod p)$
所以1到n $mod p$逆元就可以线性递推出来了
•代码
线性求逆元1 inv[1]=1; 2 for(int i=2;i<=n;i++) 3 inv[i]=-(p/i)*inv[p%i];
扩展欧几里得求逆元
•先行知识:扩展欧几里得
exgcd求的是 $ax+by=gcd(a,b)$ 的一组解
1)首先看当b==0,也就是$gcd(a,b)=gcd(a,0)=a$时
$ax+by=a$
得$x=1$
2)我们设
$ax_{1}+by_{1}=gcd(a,b) $ ①
$bx_{2}+(a$%$b)y_{2}=gcd(b,a$%$b)$ ②
由于 $gcd(a,b)=gcd(b,a$%$b)$
所以①②左边相等
$ax_{1}+by_{1}=bx_{2}+(a$%$b)y_{2}$
$ax_{1}+by_{1}=(a-lfloor frac{a}{b} floorcdot b)y_{2}$
$ax_{1}+by_{1}=ay_{2}+(x_{2}-lfloor frac{a}{b} floorcdot y2)b$
得到
$x_{1}=y_{2}$
$y_{1}=x_{2}-lfloor frac{a}{b} floor cdot y_{2}$
也就是说我们根据x2,y2便可推导出x1,y1的值,只要将a,b换成b,a%b即可,和gcd算法类似这是一个递归的过程
既然是递归,那我们就要找一个出口,恰好①情况,当b变为0时,我们就可以退出了。
当a,b互质也就是 $gcd(a,b)=1$时
$ax+by=gcd(a,b)=1$
即为$ax=1-by$
所以$ax (mod b)equiv (1-by)(mod b)equiv1(mod b)$
所以$axequiv1(mod b)$,x为$a mod b$的逆元
同理可得y为$b mod a$的逆元
•代码
exgcd求逆元1 ll exgcd(ll a,ll b,ll &x,ll &y) 2 { 3 if(b==0) 4 { 5 x=1,y=0; 6 return a; 7 } 8 ll r=exgcd(b,a%b,y,x),temp; 9 y -= (a/b)*x; 10 11 return r; 12 } 13 14 ll inv(ll a,ll b) 15 { 16 ll r=exgcd(a,b,x,y); 17 while(x<0) 18 x+=b; 19 return x; 20 }
费马小定理求逆元
•先行知识:费马小定理
假如p是质数,且gcd(a,p)=1,那么 $a^{p-1}≡1(mod p)$,
即:假如a是整数,p是质数,且a,p互质,那么a的(p-1)次方除以p的余数恒等于1。
费马小定理求逆元的先行条件是p是素数
$a^{p-1}equiv 1(mod p)$
即 $acdot a^{p-2}equiv 1(mod p)$
所以a关于p的逆元就是 $a^{p-2}$
一般利用快速幂求解
•代码
费马小定理求逆元1 ll qpow(ll a,ll b,ll p) 2 { 3 ll res=1; 4 while(b) 5 { 6 if(b&1) 7 res=res*a%p; 8 a=a*a%p; 9 b>>=1; 10 } 11 return res; 12 } 13 ll inv=qpow(a,p-2,p);