两种模数求逆的方法
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|a,d|b\),由整除的性质,对于 \(\forall x,y\in Z\),均有 \(d|(ax+by)\)设 \(s\) 为 \(ax+by\) 能取到的最小正整数,令 \(q=\lfloor{a\over s}\rfloor\),则 \(r=a\;mod\;s=a-q(ax+by)=a(1-qx)+b(-qy)\)
可见 \(r\) 以为 \(a,b\) 的一个线性组合。
由于 \(r\) 为 \(a\;mod\;s\) 所得,所以 \(0\le r\lt s\)。
既然 \(s\) 为 \(ax+by\) 能取到的最小正整数,那么必然 \(r=0\)。
因此,有 \(s|a\)。
同理可得,\(s|b\)。
因此,\(s\) 是 \(a\) 与 \(b\) 的一个公约数,所以 \(s\le d\)。
由于 \(s\) 为 \(ax+by\) 能取到的最小正整数,且有 \(d|(ax+by)\),因此,\(d|s\),从而又有 \(d\le s\)。
因此,\(d=s\),证毕。
接下来,考虑 \(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号