https://github.com/raineblog/blog/edit/main/docs/math/number-theory/exgcd.md
扩展欧几里得算法 裴蜀定理 定义 若 a a a 、b b b 是不全为零的整数,则存在整数 x x x 、y y y ,使得 a x + b y = gcd ( a , b ) ax + by = \gcd(a, b) a x + b y = g cd( a , b ) 。
推广 若 A [ 1 ∼ n ] A[1 \sim n] A [ 1 ∼ n ] 是非零整数序列,则整数序列 X [ 1 ∼ n ] X[1 \sim n] X [ 1 ∼ n ] 一定满足:
∑ i = 1 n A i X i = k × gcd ( A 1 , A 2 , … , A n ) \sum_{i = 1}^n A_iX_i = k \times \gcd(A_1, A_2, \dots, A_n) i = 1 ∑ n A i X i = k × g cd( A 1 , A 2 , … , A n ) ,其中 k k k 为正整数。
扩展欧几里得算法 扩展欧几里得算法(Extended Euclidean algorithm,EXGCD),常用于求 a x + b y = gcd ( a , b ) ax + by = \gcd(a, b) a x + b y = g cd( a , b ) 的一组可行解。
算法思路 对于 a x + b y = gcd ( a , b ) ax + by = \gcd(a, b) a x + b y = g cd( a , b ) ,考虑与欧几里得算法相似的思路:
我们要求一组解,使得 a x + b y = gcd ( a , b ) ax + by = \gcd(a, b) a x + b y = g cd( a , b )
因此有一组解为 { x = y ′ y = x ′ − ⌊ a b ⌋ × y ′ \left\{\begin{array}{l} x = y' \\ y = x' - \lfloor \dfrac{a}{b} \rfloor \times y'\end{array}\right. { x = y ′ y = x ′ − ⌊ b a ⌋ × y ′ .
其边界值为 b = 0 b = 0 b = 0 ,这时有 a x = gcd ( a , 0 ) = a ax = \gcd(a, 0) = a a x = g cd( a , 0 ) = a ,既有 x = 1 x = 1 x = 1 ;
为了方便起见,我们取 y = 0 y = 0 y = 0 。
即:若 b = 0 b = 0 b = 0 ,则取 { x = 1 y = 0 \left\{\begin{array}{l} x = 1 \\ y = 0\end{array}\right. { x = 1 y = 0 .
代码 来自 OI-Wiki:
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);
int t = x;
x = y;
y = t - (a / b) * y;
return d;
}
简化后可以写作:
int Exgcd (int a, int b, int &x, int &y) {
if (!b) {
x = 1 , y = 0 ;
return a;
}
int d = Exgcd (b, a % b, y, x);
y -= a / b * x;
return d;
}
特解到通解 假设我们现在求出了一组特解 x 0 x_0 x 0 、y 0 y_0 y 0 ,使得 a x 0 + b y 0 = gcd ( a , b ) ax_0 + by_0 = \gcd(a, b) a x 0 + b y 0 = g cd( a , b ) 。
接下来:
a x 0 + b y 0 = gcd ( a , b ) ( a x 0 + H ) + ( b y 0 − H ) = gcd ( a , b ) a ( x 0 + H / a ) + b ( y 0 − H / b ) = gcd ( a , b ) \begin{array}{rl} ax_0 + by_0 &= \gcd(a, b) \\ (ax_0 + H) + (by_0 - H) &= \gcd(a, b) \\ a(x_0 + H / a) + b(y_0 - H / b) &= \gcd(a, b) \end{array} a x 0 + b y 0 ( a x 0 + H ) + ( b y 0 − H ) a ( x 0 + H / a ) + b ( y 0 − H / b ) = g cd( a , b ) = g cd( a , b ) = g cd( a , b ) 可以看出 H H H 即是 a a a 的倍数,又是 b b b 的倍数,
所以 H = k × lcm ( a , b ) H = k \times \operatorname{lcm}(a, b) H = k × lcm ( a , b ) ,其中 k k k 可以是任意整数。
即:
{ x = x 0 + k × lcm ( a , b ) a y = y 0 + k × lcm ( a , b ) b \left\{\begin{array}{l} x = x_0 + k \times \dfrac{\operatorname{lcm}(a, b)}{a} \\ y = y_0 + k \times \dfrac{\operatorname{lcm}(a, b)}{b}\end{array}\right. ⎩ ⎨ ⎧ x = x 0 + k × a lcm ( a , b ) y = y 0 + k × b lcm ( a , b ) 其中 k ∈ Z k \in \mathbb{Z} k ∈ Z 。
Reference [1] https://oi-wiki.org/math/number-theory/bezouts/
[2] https://oi-wiki.org/math/number-theory/gcd/
本页面最近更新:正在加载中 ,更新历史 。 编辑页面:在 GitHub 上编辑此页 ! 本页面贡献者:raine 。