2025寒假数学
最大公约数
欧几里德算法
结论:\(\operatorname{gcd}(a, b)=\operatorname{gcd}(b, a \bmod b)\) 。
1.证明 \(\operatorname{gcd}(a, b)\mid\operatorname{gcd}(a\bmod b, b)\):
设 \(d = \operatorname{gcd}(a, b)\),\(a = md\),\(b = nd\)。
设 \(r = a\bmod b\),则有 \(a = kb + r\),则 \(r = a - kb\)。
\(r = md - k(nd) = d(m - nk)\),则 \(d\mid r\)。
令 \(g = \operatorname{gcd}(a\bmod b, b)\),则 \(d\mid g\)。
2.证明 \(\operatorname{gcd}(b, a\bmod b)\mid\operatorname{gcd}(a, b)\):
设 \(r = gt\),则 \(a = kb + r = k(gm) + gt = g(mk + t)\),则 \(g\mid a\),则 \(g\mid d\)。
3.得出结论
因为 \(d\mid g\) 且 \(g\mid d\),则 \(d = g\),即 \(\operatorname{gcd}(a, b)=\operatorname{gcd}(b, a \bmod b)\)。
代码:
int gcd(int a, int b){//gcd(a, 0) = 0
return (b == 0 ? a : gcd(b, a % b));
}
时间复杂度:\(O(\log\max(a, b))\)。
- \(a < b\) 则 \(\operatorname{gcd}(a, b) = \operatorname{gcd}(b, a)\)。
- \(a\ge b\) 则 \(\operatorname{gcd}(a, b) = \operatorname{gcd}(b, a\bmod b)\),而至少会让 \(a\) 折半,此种情况出现次数小于等于 \(\log a\)。
而第一种情况出现后必会出现第二种情况,而第二种情况出现次数小于等于 \(\log a\),若每次出现第二种情况后都出现第一种情况,则总递归时间复杂度为 \(O(\log\max(a, b))\)。
扩展欧几里德算法
概念:常用于求 \(ax + by = \operatorname{gcd}(a, b)\) 的一组可行解。
过程
设 \(ax_1 + by_1 = \operatorname{gcd}(a, b)\),\(bx_2 + (a\bmod b)y_2 = \operatorname{gcd}(b, a\bmod b)\)。
由欧几里德定理可知:\(\operatorname{gcd}(a, b) = \operatorname{gcd}(b, a\bmod b)\)。
因为 \(a\bmod b = a - (\lfloor\frac{a}{b}\rfloor\times b)\)。
所以 \(ax_1 + by_1 = bx_2 + (a - (\lfloor\frac{a}{b}\rfloor\times b))y_2\)。
\(ax_1 + by_1 = ay_2 + b(x_2 - \lfloor\frac{a}{b}\rfloor y_2)\)
所以 \(x_1 = y_2, y_1 = x_2 - \lfloor\frac{a}{b}\rfloor y_2\) 是原方程的一组解。
不断代入递归求解,当 \(b = 0\) 时,将 \(x = 1, y = 0\) 回溯求解。
代码:
int exgcd(int a, int b, int &x, int &y){
if (!b){//递归边界
x = 1, y = 0;
return a;
}
int d = exgcd(b, a % b, x, y), t = x;
x = y, y = t - (a / b) * y;//回溯求解
return d;
}
通解
下文默认求整数解。
已知一组解,其他的解也可以求出,因为可以将方程转换为一次函数 \(y = -\frac{a}{b} x + \frac{\operatorname{gcd}(a, b)}{b}\)。
考虑这样一个方程的通解 \(ax + by = c\)。
设 \(d = \operatorname{gcd}(a, b)\),若 \(d\nmid c\),则方程无解,因为 \(d\mid a\),\(d\mid b\),所以 \(d\mid (ax + by)\),所以 \(d\mid c\)。
设 \(c = kd\)。
则可用扩展欧几里德算法求出 \(ax + by = \operatorname{gcd}(a, b)\) 的一组解,所以 \(x = kx\),\(y = ky\) 为 \(ax + by = c\) 的一组解,同样也可以将其转化为一次函数。
接下来考虑通解。
结论:\(x = x_0 - k\times\frac{b}{\operatorname{gcd}(a, b)}\),\(y = y_0 + k\times\frac{a}{\operatorname{gcd}(a, b)}\)。
设 \(a(x_0 + m) + b(y_0 + n) = c\),\((m, n\in\mathbb{Z})\)。
则 \(am + bn = 0\),\(m = -\frac{bn}{a}\)。
设 \(a = pd\),\(b = qd\),则 \(\operatorname{gcd}(p, q) = 1\),\(m = -\frac{qn}{p}\)。
因为 \(m\) 为整数,所以 \(p\mid n\),即 \(n\) 是 \(\frac{a}{d}\) 的倍数,\(m = -\frac{b}{a}\times k\times\frac{a}{d} = -k\times\frac{b}{\operatorname{gcd}(a, b)}\)。
同理可得 \(n = k\times\frac{a}{\operatorname{gcd}(a, b)}\)。