一些求乘法逆元的算法总结

我们经常会用到乘法逆元,所以在此小小总结一下一些求乘法逆元的求法。

一 扩欧

找到解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!
posted @ 2018-03-20 23:51  Newuser233  阅读(21)  评论(0)    收藏  举报