层级 | a | b | q = ⌊a/b⌋ | r = a mod b | 状态 |
---|
计算完成!最大公约数 (gcd) 和一组 Bézout 系数 (x, y) 如下:
Bézout 恒等式 ax + by = d
可以看作是两个向量 (a, 0)
和 (0, b)
的线性组合,通过整数系数 x
和 y
缩放并相加,最终可以构造出表示最大公约数 d
的某种形式(例如向量 (d, ...)
或表示长度为 d 的线段)。下图尝试展示这种关系。
Bézout 方程的通解形式
扩展欧几里得算法找到的是方程 ax + by = d
(其中 d = gcd(a, b)
) 的一组特解 (x₀, y₀)
。
该方程实际上有无穷多组整数解,其通解形式为:
其中 k
可以是任意整数 (k ∈ ℤ
)。
这表明所有整数解在二维平面上构成一系列等距分布的点,它们都落在直线 ax + by = d
上。
💡模乘法逆元
当我们需要求解 ax ≡ 1 (mod m)
中的 x
时(要求 gcd(a, m) = 1
),这等价于求解线性丢番图方程 ax + my = 1
。
使用扩展欧几里得算法计算 a
和 m
,得到 ax' + my' = 1
。此时得到的 x'
就是 a
模 m
的一个乘法逆元。最终结果可能需要调整到 [0, m-1]
范围内,即 x = (x' % m + m) % m
。
⚠️常见误区
1. 回代公式混淆: 记住递归返回时,是基于下一层的解 (x₂, y₂)
来计算当前层的解 (x₁, y₁)
,公式为 x₁ = y₂
, y₁ = x₂ - ⌊a/b⌋ * y₂
。
2. 符号处理: 回代过程中减法和负数系数要格外小心。
3. 基准情况: 递归基准是当 b = 0
时,gcd(a, 0) = a
,此时 x = 1, y = 0
,因为 a * 1 + 0 * 0 = a
。
🔧线性丢番图方程
对于一般形式的方程 ax + by = c
,它有整数解的充要条件是 gcd(a, b)
能够整除 c
(即 c % gcd(a, b) == 0
)。
如果满足条件,可以先用 ExGCD 求出 ax' + by' = d
(其中 d = gcd(a, b)
) 的一组解 (x', y')
。然后,将整个方程两边同乘以 c / d
,得到:a * (x' * c/d) + b * (y' * c/d) = d * (c/d) = c
。因此,原方程的一组特解是 x = x' * (c/d)
, y = y' * (c/d)
。