裴蜀定理
证明
若 a , b ∈ Z a,b\in\mathbb{Z} a,b∈Z,那么对于 ∀ x , y ∈ Z \forall x,y\in\mathbb{Z} ∀x,y∈Z, gcd ( a , b ) ∣ a × x + b × y \gcd(a,b)\mid a\times x+b\times y gcd(a,b)∣a×x+b×y。
此外,一定 ∃ x , y ∈ Z \exist\,x,y \in \mathbb{Z} ∃x,y∈Z,使得 a × x + b × y = gcd ( a , b ) a\times x+b\times y=\gcd(a,b) a×x+b×y=gcd(a,b) 成立。
证明
证明第一点:
∵ gcd ( a , b ) ∣ a , gcd ( a , b ) ∣ b ∴ gcd ( a , b ) ∣ a x , gcd ( a , b ) ∣ b y ( x , y ∈ Z ) ∴ gcd ( a , b ) = a × x + b × y \begin{array}{l} \because \gcd(a,b)\mid a,\gcd(a,b)\mid b\\ \therefore \gcd(a,b)\mid ax,\gcd(a,b)\mid by\,\,(x,y\in\mathbb{Z})\\ \therefore \gcd(a,b)=a\times x+b\times y \end{array} ∵gcd(a,b)∣a,gcd(a,b)∣b∴gcd(a,b)∣ax,gcd(a,b)∣by(x,y∈Z)∴gcd(a,b)=a×x+b×y
证明第二点:
设 a × x + b × y a\times x+b\times y a×x+b×y 的最小正整数值为 r r r,考虑证明 a m o d r = 0 a\bmod r=0 amodr=0。
设 p = ⌊ a r ⌋ p=\Big\lfloor\dfrac{a}{r}\Big\rfloor p=⌊ra⌋,则可得 a m o d r = a − p × r a\bmod r=a-p\times r amodr=a−p×r。
代入 r r r,得到 a m o d r = a − p × ( a × x + b × y ) a\bmod r=a-p\times(a\times x+b\times y) amodr=a−p×(a×x+b×y)。
进一步可得 a × ( 1 − p × x ) + b × ( − p × y ) a\times(1-p\times x)+b\times (-p\times y) a×(1−p×x)+b×(−p×y),这就是 a x ′ + b y ′ ax'+by' ax′+by′ 的形式。
因为 0 ≤ a m o d r < r 0\le a\bmod r<r 0≤amodr<r,且 r r r 为 a × x + b × y a\times x+b\times y a×x+b×y 的最小正整数值,
所以 a m o d r = 0 a\bmod r = 0 amodr=0,即 r r r 是 a a a 的因数。
同理可得 r r r 也是 b b b 的因数。
所以 r r r 是 a , b a,b a,b 的公因数,即 r ∣ gcd ( a , b ) r\mid\gcd(a,b) r∣gcd(a,b)。
又因为 a × x + b × y a\times x+b\times y a×x+b×y 都是 gcd ( a , b ) \gcd(a,b) gcd(a,b) 的倍数,所以 gcd ( a , b ) ∣ r \gcd(a,b)\mid r gcd(a,b)∣r。
故 r = gcd ( a , b ) r=\gcd(a,b) r=gcd(a,b)。
Exgcd \textbf{Exgcd} Exgcd
首先考虑欧几里得算法是如何求解 gcd ( a , b ) \gcd(a,b) gcd(a,b) 的。
- 当 b = 0 b=0 b=0 时, a a a 即为 a , b a,b a,b 的最大公约数。
- 求出 gcd ( b , a m o d b ) \gcd(b,a\bmod b) gcd(b,amodb),设为 g 0 g_0 g0。
- 令 g = g 0 g=g_0 g=g0, g g g 就是 a , b a,b a,b 的最大公约数。
令 d = gcd ( a , b ) d=\gcd(a,b) d=gcd(a,b) 于是可以仿照这个过程,求解不定方程:
-
当 b = 0 b=0 b=0 时, a x + b y = d ax+by=d ax+by=d 的解是 x = d a x=\dfrac{d}{a} x=ad, y y y 任意。
-
求出 b x + ( a m o d b ) y = d bx+(a\bmod b)y=d bx+(amodb)y=d 的一组解,设为 ( x 0 , y 0 ) (x_0,y_0) (x0,y0)。
-
令 ( x , y ) = f ( ( x 0 , y 0 ) ) (x,y)=f\big((x_0,y_0)\big) (x,y)=f((x0,y0)),那么 ( x , y ) (x,y) (x,y) 就是 a x + b y = d ax+by=d ax+by=d 的一组解。
其中 f ( ( x 0 , y 0 ) ) f\big((x_0,y_0)\big) f((x0,y0)) 表示对 ( x 0 , y 0 ) (x_0,y_0) (x0,y0) 的一种变换。
现在的问题就是,如何通过 ( x 0 , y 0 ) (x_0,y_0) (x0,y0) 得到 ( x , y ) (x,y) (x,y)。
PS在欧几里得算法中, gcd ( a , b ) = gcd ( b , a m o d b ) \gcd(a,b)=\gcd(b,a\bmod b) gcd(a,b)=gcd(b,amodb),故下面的式子中 d d d 是相等的。
已知
b
x
0
+
(
a
m
o
d
b
)
y
0
=
d
bx_0+(a\bmod b)y_0=d
bx0+(amodb)y0=d,转化形式可得:
b
x
0
+
(
a
−
⌊
a
b
⌋
b
)
y
0
=
d
bx_0+(a-\Big\lfloor\dfrac{a}{b}\Big\rfloor b)y_0=d
bx0+(a−⌊ba⌋b)y0=d
将
a
,
b
a,b
a,b 提出来,可得
a
y
0
+
b
(
x
0
−
⌊
a
b
⌋
y
0
)
=
d
=
a
x
+
b
y
ay_0+b(x_0-\Big\lfloor\dfrac{a}{b}\Big\rfloor y_0)=d=ax+by
ay0+b(x0−⌊ba⌋y0)=d=ax+by
通过待定系数法,可得
{
x
=
y
0
y
=
x
0
−
⌊
a
b
⌋
y
0
\begin{cases} x=y_0\\ y=x_0-\Big\lfloor\dfrac{a}{b}\Big\rfloor y_0\\ \end{cases}
{x=y0y=x0−⌊ba⌋y0
具体实现中,在数学上,当最后
b
=
0
b=0
b=0 时
y
y
y 可以取任意值,但是如果
y
y
y 取得很大的话,中途中可能会超过 int
和 long long
的存储范围。
但是如果最后
b
=
0
b=0
b=0 时
y
=
0
y=0
y=0,那么对于其它的迭代步骤,求解
a
x
+
b
y
=
gcd
(
a
,
b
)
ax+by=\gcd(a,b)
ax+by=gcd(a,b) 得到的一组解
(
x
,
y
)
(x,y)
(x,y) 一定满足:
{
∣
x
∣
≤
∣
b
2
×
gcd
(
a
,
b
)
∣
∣
y
∣
≤
∣
a
2
×
gcd
(
a
,
b
)
∣
\begin{cases} |x|\le\Bigg|\dfrac{b}{2\times \gcd(a,b)}\Bigg|\\ \hspace{0.5 mm}|y|\le\Bigg|\dfrac{a}{2\times \gcd(a,b)}\Bigg|\\ \end{cases}
⎩
⎨
⎧∣x∣≤
2×gcd(a,b)b
∣y∣≤
2×gcd(a,b)a
证明:
PS:这里只考虑 a > b a>b a>b 的情况,显然 a ≤ b a\le b a≤b 在依次迭代后会变成 a > b a>b a>b 的情况。
首先,当 a m o d b = 0 a\bmod b=0 amodb=0 时,因为 a > b a>b a>b 且 a a a 是 b b b 的倍数,所以 a ≥ 2 × b a\ge 2\times b a≥2×b。迭代得到的解
{ x = y 0 = 0 < ∣ b 2 × gcd ( a , b ) ∣ y = x 0 − ⌊ a b ⌋ y 0 = x 0 = ∣ 2 × b 2 × b ∣ ≤ ∣ a 2 × gcd ( a , b ) ∣ \begin{cases} x=y_0=0<\Bigg|\dfrac{b}{2\times \gcd(a,b)}\Bigg|\\ y=x_0-\Big\lfloor\dfrac{a}{b}\Big\rfloor y_0=x_0=\Bigg|\dfrac{2\times b}{2\times b}\Bigg|\le\Bigg|\dfrac{a}{2\times \gcd(a,b)}\Bigg| \end{cases} ⎩ ⎨ ⎧x=y0=0< 2×gcd(a,b)b y=x0−⌊ba⌋y0=x0= 2×b2×b ≤ 2×gcd(a,b)a
其次,设 b x + ( a m o d b ) y = gcd ( b , a m o d b ) bx+(a\bmod b)y=\gcd(b,a\bmod b) bx+(amodb)y=gcd(b,amodb) 得到的解为 ( x 0 , y 0 ) (x_0,y_0) (x0,y0),满足:
{ x 0 ≤ ∣ a m o d b 2 × gcd ( b , a m o d b ) ∣ y 0 ≤ ∣ b 2 × gcd ( b , a m o d b ) ∣ \begin{cases} x_0\le\Bigg|\dfrac{a\bmod b}{2\times \gcd(b,a\bmod b)}\Bigg|\\ \hspace{0.5 mm}y_0\le\Bigg|\dfrac{b}{2\times \gcd(b,a\bmod b)}\Bigg| \end{cases} ⎩ ⎨ ⎧x0≤ 2×gcd(b,amodb)amodb y0≤ 2×gcd(b,amodb)b
则 a x + b y = gcd ( a , b ) ax+by=\gcd(a,b) ax+by=gcd(a,b) 得到的解 ( x , y ) (x,y) (x,y) 也满足:
∣ x ∣ = ∣ y 0 ∣ ≤ ∣ b 2 × gcd ( b , a m o d b ) ∣ = ∣ b 2 × gcd ( a , b ) ∣ |x|=|y_0|\le\Bigg|\dfrac{b}{2\times \gcd(b,a\bmod b)}\Bigg|=\Bigg|\dfrac{b}{2\times\gcd(a,b)}\Bigg| ∣x∣=∣y0∣≤ 2×gcd(b,amodb)b = 2×gcd(a,b)b ;
由于 ∣ x 0 ∣ ≤ ∣ a m o d b 2 × gcd ( b , a m o d b ) ∣ |x_0|\le\Bigg|\dfrac{a\bmod b}{2\times \gcd(b,a\bmod b)}\Bigg| ∣x0∣≤ 2×gcd(b,amodb)amodb , ∣ ⌊ a b ⌋ y 0 ∣ ≤ ∣ ⌊ a b ⌋ 2 × gcd ( a , b ) ∣ \Bigg|\Big\lfloor\dfrac{a}{b}\Big\rfloor y_0\Bigg|\le \Bigg|\dfrac{\big\lfloor\frac{a}{b}\big\rfloor}{2\times\gcd(a,b)}\Bigg| ⌊ba⌋y0 ≤ 2×gcd(a,b)⌊ba⌋ ,
所以
∣ y ∣ = ∣ x 0 − ⌊ a b ⌋ y 0 ∣ ≤ ∣ x 0 ∣ + ∣ ⌊ a b ⌋ y 0 ∣ = ∣ ⌊ a b ⌋ b + a m o d b 2 × gcd ( a , b ) ∣ = ∣ a 2 × gcd ( a , b ) ∣ |y|=\Bigg|x_0-\Big\lfloor\dfrac{a}{b}\Big\rfloor y_0\Bigg|\le|x_0|+\Bigg|\Big\lfloor\dfrac{a}{b}\Big\rfloor y_0\Bigg|=\Bigg|\dfrac{\big\lfloor\frac{a}{b}\big\rfloor b+a\bmod b}{2\times \gcd(a,b)}\Bigg|=\Bigg|\dfrac{a}{2\times \gcd(a,b)}\Bigg| ∣y∣= x0−⌊ba⌋y0 ≤∣x0∣+ ⌊ba⌋y0 = 2×gcd(a,b)⌊ba⌋b+amodb = 2×gcd(a,b)a 又可以发现,设 a x + b y = d = k × gcd ( a , b ) ax+by=d=k\times\gcd(a,b) ax+by=d=k×gcd(a,b),那么每次得到的解都是在求解 a x + b y = gcd ( a , b ) ax+by=\gcd(a,b) ax+by=gcd(a,b) 时的解的 k k k 倍,所以不管 d d d 取多少,在最后的迭代中取 x = k , y = 0 x=k,y=0 x=k,y=0 同样是没有问题的。
求出一对解
x
0
,
y
0
x_{0},y_{0}
x0,y0 后,可求出通解为:
{
x
=
x
0
+
b
gcd
(
a
,
b
)
×
t
y
=
y
0
−
a
gcd
(
a
,
b
)
×
t
t
∈
Z
\begin{cases} x=x_{0}+\dfrac{b}{\gcd(a,b)}\times t\\ y=y_{0}-\dfrac{a}{\gcd(a,b)}\times t \end{cases} \qquad t\in\mathbb{Z}
⎩
⎨
⎧x=x0+gcd(a,b)b×ty=y0−gcd(a,b)a×tt∈Z
时间复杂度与欧几里得算法相同,故时间复杂度为 O ( log max { a , b } ) O(\log\max\{a,b\}) O(logmax{a,b})。
Code \textbf{Code} Code
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;
}