逆元
逆元
exgcd求逆元
\(ax \equiv 1 \ (mod \ b)\) emm 也就是 \(ax + by = 1\)
那么如何求逆元,就变成了求解不定方程\(ax + by = 1\)
可见逆元不一定有解,逆元存在的充要条件就是\(gcd(a, b) = 1\)
也就是说\(b\)为质数且\(b\)不整除\(a\),则\(a\)在\(mod \ p\)意义下的逆元存在
一个结论
在\([0, b)\) 的范围内,\(a\)关于\(mod \ b\)的逆元若存在, 那么就是唯一的
证明
反证法,若\(a\)有两个逆元, \(x_1, x_2 \ \ 0 \leq x_1 \leq x_2 \leq b\)
即\(ax_1 \equiv ax_2 \equiv 1 \ (mod \ b)\)
都有\(b \mid a(x_2 - x_1)\)成立
因为\(gcd(a, b) = 1\)
因此\(b \mid (x_2, x_1)\)
其中\(0 < x_2 - x_1 < b\)产生了矛盾
假设不成立,所以在\([0, b)\) 的范围内,\(a\)关于\(mod \ b\)的逆元若存在, 那么就是唯一的
code
void exgcd(int a, int b, int &x, int &y) {
if (b == 0) {
x = 1, y = 0;
return;
}
int q = a / b, r = a % b;
exgcd(b, r, y, x);
y -= q * x;
}
int inv(int a, int b) {
int x, y;
exgcd(a, b, x, y);
return x;
}
线性求逆元
这里只讲递推求逆元
求i的逆元
设\(p = iq+r\) ,则有\(iq + r = 0 \ (mod \ p)\)
\(\because p\)为质数
\(\therefore r\)不为\(0\), \(i\)的逆元存在
等式的两边同时乘以\(i^{-1}r^{-1}\)得到:
\(qr^{-1} + i^{-1} \equiv 1 \ (mod \ p)\)
\(\therefore i^{-1} \equiv -pr^{-1} \equiv (-\frac{p}{i})(p \ mod \ i)^{-1}\)
可以看出\((p \ mod \ i)^{-1}\) 一定是比i小的
也就是说递推求解的时候已经在前边算过了, 所以直接乘就是
但是可以看出前边有一个负号,只需要用\(p\)减去就行了
code
for (inv[1] = 1, i = 2; i <= n; i++)
inv[i] = (p - p / i) * inv[p % i] % p;
费马小定理求逆元
费马小定理: \(a^{p - 1} \equiv 1 \ (mod \ p)\)
证明类比欧拉定理的证明
上边那个式子可以变为
所以我们在算一个数乘以\(a\)的时候只需要乘上\(a^{p-2}\)就行了
当然p必须为质数
code
ll q_pow(ll a, ll b) {
ll ans = 1;
while (b) {
if (b & 1) ans = (ans * a) % mod;
a = (a * a) % mod;
b >>= 1;
}
return ans;
}
q_pow(a, mod - 2);