裴蜀定理

形式

a, b ∈ ℤ,那么对于 x, y ∈ ℤgcd (a, b) ∣ a × x + b × y

此外,一定 ,使得 a × x + b × y = gcd (a, b) 成立。

证明

证明第一点:

证明第二点:

a × x + b × y 的最小正整数值为 r,考虑证明 a mod  r = 0

,则可得 a mod  r = a − p × r​。

代入 r,得到 a mod  r = a − p × (a × x + b × y)

进一步可得 a × (1 − p × x) + b × (−p × y),这就是 ax′ + by​ 的形式。

因为 0 ≤ a mod  r < r,且 ra × x + b × y 的最小正整数值,

所以 a mod  r = 0,即 ra 的因数。

同理可得 r 也是 b 的因数。

所以 ra, b 的公因数,即 r ∣ gcd (a, b)

又因为 a × x + b × y 都是 gcd (a, b) 的倍数,所以 gcd (a, b) ∣ r

r = gcd (a, b)

Exgcd

首先考虑欧几里得算法是如何求解 gcd (a, b) 的。

  1. b = 0 时,a 即为 a, b 的最大公约数。
  2. 求出 gcd (b, a mod  b),设为 g0
  3. g = g0g 就是 a, b​ 的最大公约数。

d = gcd (a, b) 于是可以仿照这个过程,求解不定方程:

  1. b = 0 时,ax + by = d 的解是 y 任意。

  2. 求出 bx + (a mod  b)y = d 的一组解,设为 (x0, y0)

  3. (x, y) = f((x0, y0)),那么 (x, y) 就是 ax + by = d 的一组解。

    其中 f((x0, y0)) 表示对 (x0, y0) 的一种变换。

现在的问题就是,如何通过 (x0, y0) 得到 (x, y)​。

PS在欧几里得算法中,gcd (a, b) = gcd (b, a mod  b),故下面的式子中 d 是相等的。

已知 bx0 + (a mod  b)y0 = d,转化形式可得: a, b 提出来,可得 通过待定系数法,可得


具体实现中,在数学上,当最后 b = 0y 可以取任意值,但是如果 y 取得很大的话,中途中可能会超过 intlong long 的存储范围。

但是如果最后 b = 0y = 0,那么对于其它的迭代步骤,求解 ax + by = gcd (a, b) 得到的一组解 (x, y) 一定满足:

证明:

PS:这里只考虑 a > b 的情况,显然 a ≤ b 在依次迭代后会变成 a > b 的情况。

首先,当 a mod  b = 0 时,因为 a > bab 的倍数,所以 a ≥ 2 × b。迭代得到的解 其次,设 bx + (a mod  b)y = gcd (b, a mod  b) 得到的解为 (x0, y0),满足: ax + by = gcd (a, b) 得到的解 (x, y) 也满足:

  1. 由于

    所以

又可以发现,设 ax + by = d = k × gcd (a, b),那么每次得到的解都是在求解 ax + by = gcd (a, b) 时的解的 k 倍,所以不管 d 取多少,在最后的迭代中取 x = k, y = 0 同样是没有问题的。


求出一对解 x0, y0 后,可求出通解为:


时间复杂度与欧几里得算法相同,故时间复杂度为 O(log max {a, b})

Code

1
2
3
4
5
6
7
8
9
10
11
using lint = long long;

lint exgcd(lint a, lint b, lint &x, lint &y) {
if (b == 0) {
x = 1, y = 0;
return a;
}
lint d = exgcd(b, a % b, y, x);
y -= a / b * x;
return d;
}