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)}\)。

posted @ 2025-01-14 21:57  bryce_yyds  阅读(61)  评论(0)    收藏  举报