以下字母未加说明都表示使意义成立的等式
所有的证明、推导都写在引用里了,不愿意看可以跳过。
解形如
a x ≡ c ( m o d b ) ax\equiv c\pmod b ax≡c(modb)
的同余方程.
容易根据同余的定义转化为解形如
a x + b y = c ax+by=c ax+by=c
的二元一次不定方程.
结论 1 该不定方程有整数解的充要条件为 gcd ( a , b ) ∣ c \gcd(a,b)\mid c gcd(a,b)∣c.(裴蜀定理)
证明:
必要性
若 a x + b y = c ax+by=c ax+by=c 有整数解 ( x 0 , y 0 ) (x_0,y_0) (x0,y0),则由于 gcd ( a , b ) ∣ a , gcd ( a , b ) ∣ b \gcd(a,b)\mid a,\gcd(a,b)\mid b gcd(a,b)∣a,gcd(a,b)∣b,有 gcd ( a , b ) ∣ ( a x 0 + b y 0 ) \gcd(a,b)\mid (ax_0+by_0) gcd(a,b)∣(ax0+by0),即 gcd ( a , b ) ∣ c \gcd(a,b)\mid c gcd(a,b)∣c.
充分性
若方程 a x + b y = gcd ( a , b ) ax+by=\gcd(a,b) ax+by=gcd(a,b) 有整数解 ( x 0 , y 0 ) (x_0,y_0) (x0,y0),则方程 a x + b y = c ax+by=c ax+by=c 对应有整数解 ( x 0 ⋅ c gcd ( a , b ) , y 0 ⋅ c gcd ( a , b ) ) \left(x_0\cdot \dfrac{c}{\gcd(a,b)},y_0\cdot \dfrac{c}{\gcd(a,b)}\right) (x0⋅gcd(a,b)c,y0⋅gcd(a,b)c)
故下证 a x + b y = gcd ( a , b ) ax+by=\gcd(a,b) ax+by=gcd(a,b) 必有整数解.
首先由于 gcd ( a , b ) ∣ a , g c d ( a , b ) ∣ b \gcd(a,b)\mid a,gcd(a,b)\mid b gcd(a,b)∣a,gcd(a,b)∣b,则对于 a , b a,b a,b 的任意线性组合,有 gcd ( a , b ) ∣ ( a x + b y ) \gcd(a,b)\mid (ax+by) gcd(a,b)∣(ax+by). 设 s s s 为 a x + b y ax+by ax+by 的最小正值,且满足 s = a x 0 + b y 0 s=ax_0+by_0 s=ax0+by0,则有 gcd ( a , b ) ∣ s \gcd(a,b)|s gcd(a,b)∣s.
但对于 a m o d s = a − ⌊ a s ⌋ s = a − ⌊ a s ⌋ ( a x 0 + b y 0 ) = a ( 1 − ⌊ a s ⌋ x 0 ) + b ( − ⌊ a s ⌋ y 0 ) a\bmod s=a-\left\lfloor\dfrac{a}{s}\right\rfloor s=a-\left\lfloor\dfrac{a}{s}\right\rfloor (ax_0+by_0)=a(1-\left\lfloor \dfrac{a}{s}\right\rfloor x_0)+b(-\left\lfloor \dfrac{a}{s}\right\rfloor y_0) amods=a−⌊sa⌋s=a−⌊sa⌋(ax0+by0)=a(1−⌊sa⌋x0)+b(−⌊sa⌋y0) 也为 a , b a,b a,b 的线性组合,则 a m o d s ≤ 0 a\bmod s\le 0 amods≤0 或 a m o d s ≥ s a\bmod s\ge s amods≥s. 故 a m o d s = 0 a\mod s=0 amods=0,即 s ∣ a s\mid a s∣a,同理 s ∣ b s\mid b s∣b,从而 s ∣ gcd ( a , b ) s\mid \gcd(a,b) s∣gcd(a,b). 又 gcd ( a , b ) ∣ s \gcd(a,b)\mid s gcd(a,b)∣s,所以 s = gcd ( a , b ) s=\gcd(a,b) s=gcd(a,b),故 a x + b y = gcd ( a , b ) ax+by=\gcd(a,b) ax+by=gcd(a,b) 有解 ( x 0 , y 0 ) (x_0,y_0) (x0,y0).
结论 2 若 a x + b y = c , ( a ⊥ b ) ax+by=c,(a\perp b) ax+by=c,(a⊥b) 的一组特解为 ( x 0 , y 0 ) (x_0,y_0) (x0,y0),则其所有的解为
{
x
=
x
0
+
b
t
y
=
y
0
−
a
t
(
t
∈
Z
)
证明:先证该组 ( x , y ) (x,y) (x,y) 为原方程的解:
a x + b y = a ( x 0 + b t ) + b ( y 0 − a t ) = a x 0 + b y 0 = 1 ax+by=a(x_0+bt)+b(y_0-at)=ax_0+by_0=1 ax+by=a(x0+bt)+b(y0−at)=ax0+by0=1;
再证这是所有的解. 对于 a x + b y = 1 ax+by=1 ax+by=1 的任意一组解 ( x ′ , y ′ ) (x',y') (x′,y′),有 a x ′ + b y ′ = 1 ax'+by'=1 ax′+by′=1,故 a ( x ′ − x 0 ) + b ( y ′ − y 0 ) = 0 a(x'-x_0)+b(y'-y_0)=0 a(x′−x0)+b(y′−y0)=0,故 a ∣ b ( y ′ − y 0 ) a\mid b(y'-y_0) a∣b(y′−y0)
又 a ⊥ b a\perp b a⊥b,则 a ∣ ( y ′ − y 0 ) a\mid (y'-y_0) a∣(y′−y0),则 y ′ − y 0 = k a y'-y_0=ka y′−y0=ka. 容易化为题给形式.
推论 若 a x + b y = c ax+by=c ax+by=c 的一组特解为 ( 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
)
解方程的过程
Step 1 对于方程 a x + b y = c ax+by=c ax+by=c,其中 gcd ( a , b ) ∣ c \gcd(a,b)\mid c gcd(a,b)∣c,我们先找出 a x + b y = gcd ( a , b ) ax+by=\gcd(a,b) ax+by=gcd(a,b) 的一组特解.
由于 a x + b y = gcd ( a , b ) = gcd ( b , a m o d b ) ax+by=\gcd(a,b)=\gcd(b,a\bmod b) ax+by=gcd(a,b)=gcd(b,amodb),若我们先解出了方程 b x ′ + ( a m o d b ) y ′ = gcd ( b , a m o d b ) bx'+(a\bmod b)y'=\gcd(b,a\mod b) bx′+(amodb)y′=gcd(b,amodb) 的一组特解 ( 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) 的一组解.
由 gcd ( a , b ) = gcd ( b , a m o d b ) \gcd(a,b)=\gcd(b,a\bmod b) gcd(a,b)=gcd(b,amodb),则 a x 0 + b y 0 = b x 0 ′ + ( a m o d b ) y ′ ax_0+by_0=bx'_0+(a\bmod b)y' ax0+by0=bx0′+(amodb)y′,即 a x 0 + b y 0 = b x 0 ′ + ( a − ⌊ a / b ⌋ b ) y 0 ′ = a y 0 ′ + b ( x 0 ′ − ⌊ a / b ⌋ y 0 ′ ) ax_0+by_0=bx'_0+(a-\lfloor a/b\rfloor b)y'_0=ay'_0+b(x'_0-\lfloor a/b\rfloor y'_0) ax0+by0=bx0′+(a−⌊a/b⌋b)y0′=ay0′+b(x0′−⌊a/b⌋y0′).
所以可以令 x 0 = y 0 ′ , y 0 = x 0 ′ − ⌊ a / b ⌋ y 0 ′ x_0=y'_0,y_0=x'_0-\lfloor a/b\rfloor y'_0 x0=y0′,y0=x0′−⌊a/b⌋y0′,得到方程 a x + b y = gcd ( a , b ) ax+by=\gcd(a,b) ax+by=gcd(a,b) 的一组解。
由上述过程我们容易得到算法:
def solve(a,b) : # 求解 ax+by=\gcd(a,b)
if b != 0 : # 递归求解 bx+(a % b)y=\gcd(b,a % b)
x, y = solve(b, a % b) # 得到 x'_0, y'_0
return y, x - (a // b) * y # 得到 x_0,y_0
else :
return 1, 0
# 边界情况,此时方程为 ax=a,有解 (1,0)
Step 2 我们得到 a x + b y = gcd ( a , b ) ax+by=\gcd(a,b) ax+by=gcd(a,b) 的特解 ( x 0 , y 0 ) (x_0,y_0) (x0,y0),则 a x + b y = c ax+by=c ax+by=c 的解为 ( x 0 ⋅ c gcd ( a , b ) , y 0 ⋅ c gcd ( a , b ) ) \left(x_0\cdot \dfrac{c}{\gcd(a,b)},y_0\cdot \dfrac{c}{\gcd(a,b)}\right) (x0⋅gcd(a,b)c,y0⋅gcd(a,b)c)
Step 3 我们得到 a x + b y = c ax+by=c ax+by=c 的特解为 ( x 0 , y 0 ) (x_0,y_0) (x0,y0)(注意这里的定义和 Step 2 不一样),则其通解为
{
x
=
x
0
+
b
gcd
(
a
,
b
)
⋅
t
y
=
y
0
−
a
gcd
(
a
,
b
)
⋅
t
(
t
∈
Z
)
一些细节:
solve 时保证 a, b 均非负。