两种模数求逆的方法
1、费马小定理
费马小定理:给定一个素数 \(P\),对于任意正整数 \(A\),均有 \(A^P \equiv A(mod\; P)\)
费马小定理另一种描述:给定一个素数 \(P\),对于任意与 \(P\) 互素的正整数 \(A\),均有 \(A^{P-1}\equiv 1(mod\;P)\)
可以利用此定理求 \(A^{-1}\;mod\; P=A^{P-2}\;mod\;P\)
点击查看代码
int qpow(LL a, int p) {
LL ans = 1;
while (p) {
if (p & 1) ans = ans * a % M;
a = a * a % M, p /= 2;
}
return ans;
}
2、扩展欧几里得定理
裴蜀定理(Bézout's lemma)
也译作贝祖定理,或称作贝祖等式(Bézout's identity),给出了一个整数能够表示为两个整数的整系数线性组合的充分必要条件:
设 \(a,b\) 是不全为零的整数。那么,对于任意整数 \(x,y\),都有 \(\gcd(a,b)\mid ax+by\) 成立;而且,存在整数 \(x,y\),使得 \(ax+by=\gcd(a,b)\) 成立。
证明:记 \(d=\gcd(a,b)\)。
因为 \(d\mid a,b\),所以,存在整数 \(u,v\) 使得 \(a=du,~b=dv\) 成立。
因此,总有 \(ax + by = d(ux+vy)\),这就说明 \(d\mid ax+by\)。
反过来,需要说明存在 \(x,y\) 使得等式成立。如果 \(a,b\) 之一是 0,
不妨设 \(b=0\),那么它们的最大公约数为 \(d=a\),显然有 \((x,y)=(1,0)\) 使得等式成立。
接下来,考虑 \(a,b\) 均不为零的情形。
由于 \(\gcd(a,b)=\gcd(-a,b)=\gcd(a,-b)\),所以不妨设 \(a,b\) 都是正数。
考虑辗转相除法的过程,有
由于最大公约数是 \(d\),最后一步辗转相除时,一定有 \(r_n=d\)。
所以,倒数第二个等式可以写作
从倒数第三个等式中解出
再代入上式,就可以消去 \(r_{n-1}\):
类似地,可以逐步地消去所有 \(r_{n-2},r_{n-3},\cdots,r_2,r_1\),最终得到
这就证明了存在 \(x,y\) 使得 \(ax+by=d\) 成立。由前文分析可知,这也证明了原命题。
点击查看代码
int exgcd(int a, int b, int &x, int &y) {
if (!b) {
x = 1, y = 0;
return a;
}
int gcd = exgcd(b, a%b, y, x);
y -= a / b * x;
return gcd;
}
此处,关于存在性的证明是构造性的,它同时给出了该系数的一种计算方法。这一计算方法就是 扩展欧几里得算法。
考虑裴蜀定理在 \(\gcd(a,b)=1\) 时的特殊情形,可以得到如下推论:
推论: 整数 \(a,b\) 互素,当且仅当存在整数 \(x,y\),使得 \(ax+by=1\) 成立。
多个整数的情形
裴蜀定理可以推广到多个整数的情形。
设 \(a_1,a_2,\cdots,a_n\) 是不全为零的整数。那么,对于任意整数 \(x_1,x_2,\cdots,x_n\),都有
\(\gcd(a_1,a_2,\cdots,a_n)\mid a_1x_1+a_2x_2+\cdots+a_nx_n\) 成立;
而且,存在整数 \(x_1,x_2,\cdots,x_n\),使得
\(\gcd(a_1,a_2,\cdots,a_n)=a_1x_1+a_2x_2+\cdots+a_nx_n\) 成立。
证明:利用 \(\gcd(a_1,a_2,\cdots,a_n)=\gcd(\gcd(a_1,a_2,\cdots,a_{n-1}),a_n)\) 这一点,对 \(n\) 进行归纳即可。
- 注:以上参考 oiwiki

浙公网安备 33010602011771号