乘法逆元
注意:若无特殊说明,本章涉及的变量皆为正整数.
定义 #
若 $a\cdot b≡1\pmod{p}$,则 $b$ 为 $a$ 在模 $p$ 意义下的逆元,记作 $a^{-1}$ 或 $inv(a)$.
$$a·a^{-1}≡1 \ (\bmod \ p)$$
乘法逆元能够很好地将模运算中的除法转为乘法:
$$\dfrac{a}{b}≡a\cdot b^{-1} \ (\bmod \ p)$$
在模运算中,$a^{-1}$ 是整数,并不是 $a$ 的 $-1$ 次方.
解法 #
对于整数 $x$,可以求解关于 $x^{-1}$ 的 线性同余方程 $x\cdot x^{-1}≡1 \ (\bmod \ p)$,其中 $x$ 为已知常数.
int exGcd(int a, int b, int& x, int& y) {
if(b == 0) { x = 1, y = 0; return a; }
int d = exGcd(b, a % b, x, y);
int t = x; x = y, y = t - a / b * y;
return d;
}
int liEu(int a, int b, int c) { // a·x ≡ c (mod b)
int x, y, d = exGcd(a, b, x, y);
x *= (c / d);
int t = b / d;
return (x % t + t) % t;
}
int inv(int x, int m) {
return liEu(x, m, 1);
}
质数的逆元 #
当 $p$ 为质数时,由 费马小定理 得:
$$\begin{aligned} a^{p-1}&≡1 \ (\bmod \ p)\\ a^{p-2}&≡a^{-1} \ (\bmod \ p) \end{aligned}$$
$∴p^{-1}=a^{p-2} \bmod p$. 其中 $a^{p-2}$ 可用 快速幂 求解.
线性求逆元 #
求 $1\sim n$ 在模 $p$ 意义下的逆元.
假设已经求出了 $1\sim i-1$ 的乘法逆元.
设 $ m=p \bmod i=p-\Big\lfloor\frac{p}{i}\Big\rfloor\cdot i$,则有:
$$m+\Big\lfloor\frac{p}{i}\Big\rfloor\cdot i≡0 \ (\bmod \ p)$$
两边同乘 $m^{-1}i^{-1}$:
$$i^{-1}+\Big\lfloor\frac{p}{i}\Big\rfloor\cdot m^{-1}≡0 \ (\bmod \ p)$$
由于 $m=p \bmod i≤i-1$,所以 $m^{-1}$ 已知. 于是得到 $i^{-1}$ 的表达式:
$$i^{-1}=(-\Big\lfloor\frac{p}{i}\Big\rfloor\cdot(p\bmod i)^{-1}) \bmod p$$
inv[1] = 1; // 1 的乘法逆元 = 1
for(int i = 2; i <= n; i ++) {
inv[i] = (- p / i * inv[p % i]) % p;
inv[i] = (inv[i] + p) % p; // 化为正整数
}