若干类型的同余方程的解法
所有的证明、推导都写在引用里了,不愿意看可以跳过.
大量参考了这篇文章,感谢这位大佬的教导.
所有的例题都在我的同余题单.
线性同余方程
解形如
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 ) \begin{cases} x=x_0+bt \\ y=y_0-at \end{cases} \ (t\in \mathrm Z) {x=x0+bty=y0−at (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 ) \begin{cases} x=x_0+\dfrac{b}{\gcd(a,b)}\cdot t \\ y=y_0-\dfrac{a}{\gcd(a,b)}\cdot t \end{cases} \ (t \in \mathrm Z) ⎩ ⎨ ⎧x=x0+gcd(a,b)b⋅ty=y0−gcd(a,b)a⋅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) 的一组解.
由上述过程我们容易得到算法:
void solve(int a, int b, int &x, int &y) {
if(!b) x = 1, y = 0; //边界情况
else {
int xp, yp;
solve(b, a % b, xp, yp);
x = yp; y = xp - a / b * yp;
}
}
或者简单写为
void solve(int a, int b, int &x, int &y) {
if(!b) x = 1, y = 0;
else solve(b, a % b, y, x), y -= a / b * x;
}
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 ) \begin{cases} x=x_0+\dfrac{b}{\gcd(a,b)}\cdot t\\ y=y_0-\dfrac{a}{\gcd(a,b)}\cdot t \end{cases} \ (t\in \mathrm Z) ⎩ ⎨ ⎧x=x0+gcd(a,b)b⋅ty=y0−gcd(a,b)a⋅t (t∈Z)
一些细节:
- 解方程之前需要用裴蜀定理判断是否有解.
- 使用
solve
时保证a, b
均非负. - 时间复杂度为 O ( log V ) O(\log V) O(logV), V V V 为值域上限.
- 可以用来求逆元.
线性同余方程组
解形如
{ x ≡ b 1 ( m o d m 1 ) x ≡ b 2 ( m o d m 2 ) ⋮ x ≡ b n ( m o d m n ) \begin{cases} x\equiv b_1\pmod {m_1}\\ x\equiv b_2\pmod {m_2}\\ \vdots \\ x\equiv b_n\pmod {m_n} \end{cases} ⎩ ⎨ ⎧x≡b1(modm1)x≡b2(modm2)⋮x≡bn(modmn)
的方程组
特殊情况 (可使用中国剩余定理解决)
当 m 1 , m 2 , … , m n m_1,m_2,\dots,m_n m1,m2,…,mn 两两互质时,可以使用中国剩余定理解决.
首先:
结论1 对于正整数 n , m n,m n,m,且 n ⊥ m n\perp m n⊥m,若两个整数 a , b a,b a,b,满足 0 ≤ a < n 0\le a < n 0≤a<n, 0 ≤ b < m 0\le b < m 0≤b<m,则存在且仅存在一个 x = x 0 ∈ [ 0 , n m ) ∩ Z x=x_0\in[0,nm)\cap \mathrm Z x=x0∈[0,nm)∩Z 满足
{ x ≡ a ( m o d n ) x ≡ b ( m o d m ) \begin{cases} x\equiv a\pmod n \\ x\equiv b\pmod m \end{cases} {x≡a(modn)x≡b(modm)
,并且方程组的通解为
x
≡
x
0
(
m
o
d
n
m
)
x\equiv x_0\pmod{nm}
x≡x0(modnm)
下面证明这个定理:
首先我们证明恰存在一个 x 0 x_0 x0:
反证法,设有两个解 x 1 , x 2 x_1,x_2 x1,x2 满足 0 ≤ x 1 , x 2 < n m 0\le x_1,x_2<nm 0≤x1,x2<nm,且 x 1 < x 2 x_1< x_2 x1<x2,使得 x 1 , x 2 x_1,x_2 x1,x2 满足方程组.
令 k = x 2 − x 1 > 0 k=x_2-x_1> 0 k=x2−x1>0,容易证明 n ∣ k , m ∣ k n\mid k, m\mid k n∣k,m∣k,那么 可知 k ≥ lcm ( n , m ) = n m k\ge \operatorname{lcm}(n,m)=nm k≥lcm(n,m)=nm(因为 n ⊥ m n\perp m n⊥m),于是 x 2 = k + x 1 ≥ n m + x 1 ≥ n m x_2=k+x_1\ge nm+x_1\ge nm x2=k+x1≥nm+x1≥nm,与假设矛盾.然后我们证明方程组的通解:
第一,对于 x ≡ x 0 ( m o d n m ) x\equiv x_0\pmod{nm} x≡x0(modnm),即 x ≡ x 0 ≡ a ( m o d n ) x\equiv x_0\equiv a\pmod n x≡x0≡a(modn), x ≡ x 0 ≡ b ( m o d m ) x\equiv x_0\equiv b\pmod m x≡x0≡b(modm),则 x ≡ x 0 ( m o d n m ) x\equiv x_0\pmod {nm} x≡x0(modnm) 确实为原方程的解.
第二,对于 x ≢ x 0 ( m o d n m ) x\not \equiv x_0\pmod {nm} x≡x0(modnm),由于 n ⊥ m n\perp m n⊥m,容易推得 x ≢ x 0 ≡ a ( m o d n ) x\not \equiv x_0\equiv a\pmod n x≡x0≡a(modn),或 x ≢ x 0 ≡ b ( m o d m ) x\not \equiv x_0\equiv b\pmod m x≡x0≡b(modm),不为原方程的解
推论 可归纳证明:对于上面的那个 n n n 个线性同余方程构成的线性同余方程组,在 [ 0 , ∏ i = 1 n m i ) [0, \prod_{i=1}^nm_i) [0,∏i=1nmi) 内有唯一解,且通解为 x ≡ x 0 ( m o d ∏ i = 1 n m i ) x\equiv x_0\pmod {\prod_{i=1}^nm_i} x≡x0(mod∏i=1nmi),其中 x 0 x_0 x0 为特解.
问题到了:如何构造一个特解?
对于方程
{ x ≡ b 1 ( m o d m 1 ) x ≡ b 2 ( m o d m 2 ) ⋮ x ≡ b n ( m o d m n ) \begin{cases} x\equiv b_1\pmod {m_1}\\ x\equiv b_2\pmod {m_2}\\ \vdots \\ x\equiv b_n\pmod {m_n} \end{cases} ⎩ ⎨ ⎧x≡b1(modm1)x≡b2(modm2)⋮x≡bn(modmn)
其中 m i m_i mi 两两互质,
我们定义 M i = ∏ k = 1 n m k m i M_i=\dfrac{\prod_{k=1}^n m_k}{m_i} Mi=mi∏k=1nmk, k i ≡ b i M i − 1 ( m o d m i ) k_i\equiv b_iM_i^{-1}\pmod {m_i} ki≡biMi−1(modmi),那么特解为 x 0 = ∑ i = 1 n k i M i x_0=\sum_{i=1}^nk_iM_i x0=∑i=1nkiMi.
神乎其技
简单证明一下:
我们考虑第 k k k 个式子 x ≡ b k ( m o d m k ) x\equiv b_k\pmod {m_k} x≡bk(modmk) 是否满足.
对于 x 0 = ∑ i = 1 n k i M i x_0=\sum_{i=1}^nk_iM_i x0=∑i=1nkiMi 来说,
当 i ≠ k i\ne k i=k 时,有 M i ≡ 0 ( m o d m k ) M_i\equiv 0\pmod {m_k} Mi≡0(modmk),则 k i M i k_iM_i kiMi 贡献为 0.
当 i = k i=k i=k 时,有 k i M i ≡ b i M i − 1 M i ≡ b i ( m o d m i ) k_iM_i\equiv b_iM_i^{-1}M_i\equiv b_i\pmod {m_i} kiMi≡biMi−1Mi≡bi(modmi).
于是可以得到 x 0 ≡ ∑ i = 1 n k i M i ≡ b i ( m o d m i ) x_0\equiv \sum_{i=1}^n k_iM_i\equiv b_i\pmod {m_i} x0≡∑i=1nkiMi≡bi(modmi),证毕.
时间复杂度 O ( n log V ) O(n\log V) O(nlogV), V V V 为值域上限.
一般情况(方程合并法)
对于
{ x ≡ b 1 ( m o d m 1 ) x ≡ b 2 ( m o d m 2 ) ⋮ x ≡ b n ( m o d m n ) \begin{cases} x\equiv b_1\pmod {m_1}\\ x\equiv b_2\pmod {m_2}\\ \vdots \\ x\equiv b_n\pmod {m_n} \end{cases} ⎩ ⎨ ⎧x≡b1(modm1)x≡b2(modm2)⋮x≡bn(modmn)
并不保证 m i m_i mi 互质,如何是好?我们考虑简化问题,
{ x ≡ a ( m o d n ) x ≡ b ( m o d m ) \begin{cases} x\equiv a\pmod n \\ x\equiv b\pmod m \end{cases} {x≡a(modn)x≡b(modm)
其中 n , m n,m n,m 不一定互质,
容易得到
{ x = a + p n x = b + q m \begin{cases} x=a+pn\\ x=b+qm \end{cases} {x=a+pnx=b+qm
其中 p , q ∈ Z p,q\in \mathrm{Z} p,q∈Z.
于是
a
+
p
n
=
b
+
q
m
p
n
−
q
m
=
b
−
a
\begin{aligned} a+pn=&b+qm\\ pn-qm=&b-a \end{aligned}
a+pn=pn−qm=b+qmb−a
上面
p
,
q
p,q
p,q 是未知量,而其他均为已知量,故解线性同余方程.
两种情况:
-
若 gcd ( n , m ) ∤ ( b − a ) \gcd(n,m)\nmid(b-a) gcd(n,m)∤(b−a),方程无解,原不等式无解.
-
若 gcd ( n , m ) ∣ ( b − a ) \gcd(n,m)\mid (b-a) gcd(n,m)∣(b−a),
则方程有特解 ( p 0 , q 0 ) (p_0,q_0) (p0,q0) 满足 p 0 n − q 0 m = b − a p_0n-q_0m=b-a p0n−q0m=b−a,
通解为 p = p 0 + t ⋅ m gcd ( n , m ) , q = q 0 + t ⋅ n gcd ( n , m ) , t ∈ Z p=p_0+t\cdot\dfrac{m}{\gcd(n,m)} ,q=q_0+t\cdot \dfrac{n}{\gcd(n,m)},t\in\mathrm{Z} p=p0+t⋅gcd(n,m)m,q=q0+t⋅gcd(n,m)n,t∈Z.
所以 x = a + p n = a + ( p 0 + t ⋅ m gcd ( n , m ) ) n = a + p 0 n + t ⋅ lcm ( n , m ) x=a+pn=a+(p_0+t\cdot \dfrac{m}{\gcd(n,m)})n=a+p_0n+t\cdot \operatorname{lcm}(n,m) x=a+pn=a+(p0+t⋅gcd(n,m)m)n=a+p0n+t⋅lcm(n,m)故只要求出 p 0 n − q 0 m = b − a p_0n-q_0m=b-a p0n−q0m=b−a 的一组特解 ( p 0 , q 0 ) (p_0,q_0) (p0,q0),方程合并后得到 x ≡ a + p 0 n ( m o d lcm ( n , m ) ) x\equiv a+p_0n\pmod{\operatorname{lcm}(n,m)} x≡a+p0n(modlcm(n,m)).
两个如此, n n n 个也是如此.
时间复杂度 O ( n log V ) O(n\log V) O(nlogV).