我们经常会用到乘法逆元,所以在此小小总结一下一些求乘法逆元的求法。
一 扩欧
找到解ax-py==1(mod p) 若ax-py的解不是1则没找到逆元 否则,逆元为x%p
二欧拉费马定理
若P是质数直接套费马小定理 因为a^(p-1)==1(mod p)
————》a*a^(p-2)==1(mod p) 故a的乘法逆元为a^(p-2)
如果p不是质数?若a p互质则有
a^(phi(p)-1)*a==1(mod p) 则 a的乘法逆元为a^(phi(p)-1)
三 O(n)线性求逆元
先给结论:inv[1]=1
inv[i]=(long long)(p-p/i)*inv[p%i]%p;
证明(抄的):
求逆元时
p%i+[p/i]*i=p
令a=p%i,b=[p/i],则有
a+b*i=p
a+b*i=0(mod p)
b*i=-a(mod p)
i^-1=-b/a
这样就搞出来了
四 前缀积逆推逆元
要求P为质数
首先我们有一个前缀积数组 A[i]=A[i-1]*i( mod p)(update:其实就是i!,如A[1]=1 A[2]=2 A[3]=6 A[4]=24)
用前面所述得某一个方法得到Ainv[n]
然后就逆推回来得到前缀积逆元 Ainv[i]=Ainv[i+1]*(i+1)(mod p)
再然后每次我们求乘法逆元时 inv[i]=Ainv[i]*A[i-1] (mod p)
或者利用这个这个递推公式再打一个inv表
这样有个好处就是可以求组合得时候用到前缀积和前缀积逆元
证明:(1218证得,错了别找我)
易得 Ainv[i+1] =Ainv[i] * (i+1)^(P-2) mod P
由费马小定理 (i+1)^(P-1) = 1 (mod P) 设 t = (i+1)^(P-1) 则 t = 1 (mod P)
故 inv[i+1] = inv[i] * t/(i+1) (mod P)
移项得到上面的结论。
(update:这个可以在求组合数C值的时候用到,因为C(i,j) == j! / i! * (j-i)! 而在取模运算下不能有除法,这里就可以快速搞出逆元的值而进行计算了)
最终
怎么验证咱们得到的这个逆元对不对呢? 直接和那个数乘起来搞一下mod一下看看是不是1就好啦!
fighting!