逆元

逆元

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^{p - 2} \equiv \frac{1}{a} \ (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);
posted @ 2020-07-04 17:47  Kersen  阅读(216)  评论(2编辑  收藏  举报