扩展欧几里得求形如 a x + b y = c ax + by = c ax+by=c 的方程。
a x ≡ b ( m o d m ) ⟺ a x + m y = b a x \equiv b(\bmod m) \iff a x+m y=b ax≡b(modm)⟺ax+my=b
-
对于不为 0 0 0 的整数 a , b a,b a,b,存在整数 x , y x,y x,y,使得 a x + b y = g c d ( a , b ) ax + by = gcd(a,b) ax+by=gcd(a,b)。
-
方程 a x + b y = c ax + by = c ax+by=c 有解,当且仅当 g c d ( a , b ) ∣ c gcd(a,b)|c gcd(a,b)∣c。
特殊情况:对于 a x + b y = g c d ( a , b ) ax + by = gcd(a,b) ax+by=gcd(a,b),当 b = 0 b = 0 b=0 时,令 x = 1 , y = 0 x = 1, y = 0 x=1,y=0 即求得一组解。
一般情况:借鉴辗转相除法 g c d ( a , b ) = g c d ( b , a m o d b ) gcd(a,b)=gcd(b,a \bmod b) gcd(a,b)=gcd(b,amodb),假设已经求得了 ( b m o d a ) x 0 + a y 0 = g c d ( a , b ) (b \bmod a) x_0+ay_0=gcd(a,b) (bmoda)x0+ay0=gcd(a,b) 的一组解 ( x 0 , y 0 ) (x_0, y_0) (x0,y0),方程可以根据 a m o d m = a − m ⌊ a m ⌋ a \bmod m=a-m\left \lfloor \frac{a}{m} \right \rfloor amodm=a−m⌊ma⌋ 变形为
( b − a ⌊ b a ⌋ ) x 0 + a y 0 = g c d ( a , b ) (b-a\left \lfloor \frac{b}{a} \right \rfloor)x_0+ay_0=gcd(a,b) (b−a⌊ab⌋)x0+ay0=gcd(a,b)
⌊ b a ⌋ x 0 + a y 0 + b x 0 = g c d ( a , b ) \left \lfloor \frac{b}{a} \right \rfloor x_0 + ay_0 + bx_0 = gcd(a,b) ⌊ab⌋x0+ay0+bx0=gcd(a,b)
a ( y 0 − ⌊ b a ⌋ x 0 ) + b x 0 = g c d ( a , b ) a(y_0-\left \lfloor \frac{b}{a} \right \rfloor x_0)+bx_0=gcd(a,b) a(y0−⌊ab⌋x0)+bx0=gcd(a,b)
交换
x
0
x_0
x0 与
y
0
y_0
y0
a
(
x
0
−
⌊
b
a
⌋
y
0
)
+
b
y
0
=
g
c
d
(
a
,
b
)
a(x_0-\left \lfloor \frac{b}{a} \right \rfloor y_0)+by_0=gcd(a,b)
a(x0−⌊ab⌋y0)+by0=gcd(a,b)
{ a x + b y = g c d ( a , b ) a ( x 0 − ⌊ b a ⌋ y 0 ) + b y 0 = g c d ( a , b ) ⟺ { x = x 0 − y 0 ⌊ b a ⌋ y = y 0 \begin{cases} ax + by = gcd(a,b) \\ a(x_0-\left \lfloor \frac{b}{a} \right \rfloor y_0)+by_0=gcd(a,b) \end{cases} \iff \begin{cases} x=x_0-y_0\left \lfloor \frac{b}{a} \right \rfloor \\ y=y_0 \\ \end{cases} {ax+by=gcd(a,b)a(x0−⌊ab⌋y0)+by0=gcd(a,b)⟺{x=x0−y0⌊ab⌋y=y0
int exgcd(int a, int b, int &x, int &y) {
if (a == 0) {
x = 0, y = 1;
return b;
}
int d = exgcd(b % a, a, y, x);
x -= b / a * y;
return d;
}
如何求最小正整数解。假设我们求出了
a
x
0
+
b
y
0
=
g
c
d
(
a
,
b
)
ax_0+by_0 = gcd(a,b)
ax0+by0=gcd(a,b)
的一组解
(
x
0
,
y
0
)
(x_0, y_0)
(x0,y0)。有解的必要条件为
g
c
d
(
a
,
b
)
∣
c
gcd(a,b)|c
gcd(a,b)∣c,所以令
k
=
c
g
c
d
(
a
,
b
)
k = \frac{c}{gcd(a,b)}
k=gcd(a,b)c。
a
x
+
b
y
=
c
ax + by = c
ax+by=c
a x + b y = k × g c d ( a , b ) ax + by = k \times gcd(a,b) ax+by=k×gcd(a,b)
{ a x k + b y k = g c d ( a , b ) a x 0 + b y 0 = g c d ( a , b ) ⟺ { x = k × x 0 y = k × y 0 ⟺ { x = c g c d ( a , b ) × x 0 y = c g c d ( a , b ) × y 0 \begin{cases} a \frac{x}{k} + b \frac{y}{k} = gcd(a,b) \\ ax_0 + by_0 = gcd(a,b) \end{cases} \iff \begin{cases} x = k \times x_0 \\ y = k \times y_0 \end{cases} \iff \begin{cases} x = \frac{c}{gcd(a,b)} \times x_0 \\ y = \frac{c}{gcd(a,b)} \times y_0 \end{cases} {akx+bky=gcd(a,b)ax0+by0=gcd(a,b)⟺{x=k×x0y=k×y0⟺{x=gcd(a,b)c×x0y=gcd(a,b)c×y0
a × c g c d ( a , b ) × x 0 + b × c g c d ( a , b ) × y 0 = c a \times \frac{c}{gcd(a,b)} \times x_0 + b \times \frac{c}{gcd(a,b)} \times y_0 = c a×gcd(a,b)c×x0+b×gcd(a,b)c×y0=c
为了求最小整数解,需要把上式的
x
0
x_0
x0 尽可能地减小,如果
x
0
x_0
x0 减小,对应的
y
0
y_0
y0 会增加。所以设
x
0
x_0
x0 减小了
t
0
t_0
t0,
y
0
y_0
y0 增加了
t
1
t_1
t1。
{
x
=
x
0
×
c
g
c
d
(
a
,
b
)
−
c
g
c
d
(
a
,
b
)
×
t
0
y
=
y
0
×
c
g
c
d
(
a
,
b
)
+
c
g
c
d
(
a
,
b
)
×
t
1
⇓
a
×
x
0
×
c
g
c
d
(
a
,
b
)
−
a
×
c
g
c
d
(
a
,
b
)
×
t
0
+
b
×
y
0
×
c
g
c
d
(
a
,
b
)
+
b
×
c
g
c
d
(
a
,
b
)
×
t
1
=
c
∵
a
×
c
g
c
d
(
a
,
b
)
×
x
0
+
b
×
c
g
c
d
(
a
,
b
)
×
y
0
=
c
∴
a
×
c
g
c
d
(
a
,
b
)
×
t
0
=
b
×
c
g
c
d
(
a
,
b
)
×
t
1
t
0
t
1
=
b
×
c
g
c
d
(
a
,
b
)
a
×
c
g
c
d
(
a
,
b
)
t
0
t
1
=
b
a
\begin{cases} x = x_0 \times \frac{c}{gcd(a,b)} - \frac{c}{gcd(a,b)} \times t_0 \\ y = y_0 \times \frac{c}{gcd(a,b)} + \frac{c}{gcd(a,b)} \times t_1 \end{cases} \\ \Downarrow \\ a \times x_0 \times \frac{c}{gcd(a,b)} - a \times \frac{c}{gcd(a,b)} \times t_0 + b \times y_0 \times \frac{c}{gcd(a,b)} + b \times \frac{c}{gcd(a,b)} \times t_1 = c\\ \because a \times \frac{c}{gcd(a,b)} \times x_0 + b \times \frac{c}{gcd(a,b)} \times y_0 = c \\ \therefore a \times \frac{c}{gcd(a,b)} \times t_0 = b \times \frac{c}{gcd(a,b)} \times t_1 \\ \frac{t_0}{t_1} = \frac{b \times \frac{c}{gcd(a,b)}}{a \times \frac{c}{gcd(a,b)}} \\ \frac{t_0}{t_1} = \frac{b}{a}
{x=x0×gcd(a,b)c−gcd(a,b)c×t0y=y0×gcd(a,b)c+gcd(a,b)c×t1⇓a×x0×gcd(a,b)c−a×gcd(a,b)c×t0+b×y0×gcd(a,b)c+b×gcd(a,b)c×t1=c∵a×gcd(a,b)c×x0+b×gcd(a,b)c×y0=c∴a×gcd(a,b)c×t0=b×gcd(a,b)c×t1t1t0=a×gcd(a,b)cb×gcd(a,b)ct1t0=ab
a ( x 0 − t 0 ) + b ( y 0 + t 1 ) = c ⟺ a ( x 0 − t 0 ) + b ( y 0 + a b × t 0 ) a (x_0 - t_0) + b(y_0 + t_1) = c \iff a(x_0 - t_0) + b(y_0 +\frac{a}{b} \times t_0 ) a(x0−t0)+b(y0+t1)=c⟺a(x0−t0)+b(y0+ba×t0)
让
t
0
=
b
g
c
d
(
a
,
b
)
t_0 = \frac{b}{gcd(a,b)}
t0=gcd(a,b)b,将
x
0
x_0
x0 减到不能再减为止,并考虑
b
g
c
d
(
a
,
b
)
<
0
\frac{b}{gcd(a,b)} < 0
gcd(a,b)b<0 的情况需要加上模数再取模。总结公式为
{
x
m
i
n
=
(
x
0
m
o
d
b
g
c
d
(
a
,
b
)
+
b
g
c
d
(
a
,
b
)
)
m
o
d
b
g
c
d
(
a
,
b
)
y
m
i
n
=
c
–
a
×
x
0
b
\begin{cases} x_{min}=(x_0 \bmod \frac{b}{gcd(a,b)} + \frac{b}{gcd(a,b)}) \bmod \frac{b}{gcd(a,b)} \\ y_{min} = \frac {c – a \times x_0}{b} \end{cases}
{xmin=(x0modgcd(a,b)b+gcd(a,b)b)modgcd(a,b)bymin=bc–a×x0