This commit is contained in:
Zengtudor 2025-02-05 11:22:06 +08:00
parent c5365a5fa0
commit 73d1505579

View File

@ -1 +1,37 @@
GCD CRT GCD CRT 逆元
扩展欧几里得算法Exgcd用于求解方程 $ax + by = \gcd(a, b)$ 的整数解 $x$ 和 $y$,同时返回 $a$ 和 $b$ 的最大公约数。以下是代码的逐层解释:
### 递归终止条件
当 $b = 0$ 时,方程为 $a \cdot 1 + 0 \cdot 0 = a$,此时:
- $x = 1$, $y = 0$
- 直接返回 $a$(最大公约数)
### 递归过程
1. **递归调用**:计算 $\gcd(b, a \% b)$,得到解 $x'$ 和 $y'$,满足:
$$
b \cdot x' + (a \% b) \cdot y' = \gcd(b, a \% b)
$$
根据欧几里得算法,$\gcd(a, b) = \gcd(b, a \% b)$。
2. **转换解**:将递归结果的解 $x'$ 和 $y'$ 转换为当前层的解 $x$ 和 $y$。利用 $a \% b = a - \lfloor a/b \rfloor \cdot b$,原方程可重写为:
$$
a \cdot y' + b \cdot (x' - \lfloor a/b \rfloor \cdot y') = \gcd(a, b)
$$
因此:
- $x = y'$
- $y = x' - \lfloor a/b \rfloor \cdot y'$
### 代码步骤
- **保存递归前的 $x$**`int t = x`(此时 $x = x'$)。
- **更新 $x$**`x = y`(将 $x$ 设为 $y'$)。
- **更新 $y$**`y = t - (a / b) * y`(计算 $y = x' - \lfloor a/b \rfloor \cdot y'$)。
### 示例分析
以 $a = 30$, $b = 12$ 为例:
1. 递归至 $\gcd(6, 0)$,返回 $x = 1$, $y = 0$, $\gcd = 6$。
2. 回溯到 $\gcd(12, 6)$,计算 $x = 0$, $y = 1$,满足 $12 \cdot 0 + 6 \cdot 1 = 6$。
3. 回溯到 $\gcd(30, 12)$,计算 $x = 1$, $y = -2$,满足 $30 \cdot 1 + 12 \cdot (-2) = 6$。
### 总结
代码通过递归分解问题,逐步缩小规模。每次递归后,利用子问题的解 $x'$ 和 $y'$ 推导当前层的解 $x$ 和 $y$,最终得到满足 $ax + by = \gcd(a, b)$ 的整数解。