求逆元的3种方法(数论)(同余)

本文介绍了三种求模数逆元的方法:线性求逆元、费马小定理求逆元及exgcd求逆元,并给出了求阶乘逆元的具体步骤。

1.线性求逆元

假设模数为p, p=i⋅k+r,k,r∈Z,0≤r<ip=i\cdot k+r,k,r\in \Z,0\leq r<ip=ik+r,k,rZ,0r<i

两边同时对p取mod得: 0≡i⋅k+r(modp)0\equiv i\cdot k+r\pmod p0ik+r(modp)

两边同时乘i−1⋅r−1i^{-1}\cdot r^{-1}i1r1,把i−1i^{-1}i1分离出来 得: 0≡k⋅r−1+i−1(modp)0\equiv k\cdot r^{-1}+i^{-1}\pmod p0kr1+i1(modp)

进而i−1≡−k⋅r−1(modp)i^{-1}\equiv -k\cdot r^{-1}\pmod pi1kr1(modp)

回到p=i⋅k+rp=i\cdot k+rp=ik+r, 可以推出k=⌊p/i⌋,r−1=(p%i)−1k=\lfloor p/i \rfloor, r^{-1}=(p\%i)^{-1}k=p/i,r1=(p%i)1

代入即可: i−1≡−⌊p/i⌋⋅(p%i)−1(modp)i^{-1}\equiv -\lfloor p/i \rfloor\cdot (p\%i)^{-1}\pmod pi1p/i(p%i)1(modp)

写成代码一句话

inv[i]=-MOD/i*inv[MOD%i];
inv[i]=(MOD-MOD/i)*inv[MOD%i];//更好

预处理inv[0]=inv[1]=1就完工.

2.费马小定理求逆元

经典中的经典,如果(a,m)=1(a,m)=1(a,m)=1
am≡a(modm)a−1=am−2 \begin{aligned} a^m &\equiv a\pmod m\\ a^{-1} &= a^{m-2} \end{aligned} ama1a(modm)=am2

3.exgcd求逆元

x=a−1x=a^{-1}x=a1
ax≡1(modm)ax \equiv 1 \pmod max1(modm)
等价于
ax+my=1ax + my = 1ax+my=1
这样一个exgcd能解决的问题。

实际情况下:

exgcd(a,p,x,y);
x=(x%m+m)%m;

其他小技巧

求阶乘逆元

注意乘的是i+1i+1i+1

fac[0]=1;for(int i=1;i<=N;i++) fac[i]=fac[i-1]*i%MOD;
ifac[N]=qmod(fac[N], MOD-2);
for(int i=N-1;i>=0;i--) ifac[i]=ifac[i+1]*(i+1)%MOD;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值