若干类型的同余方程的解法

若干类型的同余方程的解法

所有的证明、推导都写在引用里了,不愿意看可以跳过.

大量参考了这篇文章,感谢这位大佬的教导.

所有的例题都在我的同余题单.

线性同余方程

解形如

a x ≡ c ( m o d b ) ax\equiv c\pmod b axc(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) (x0gcd(a,b)c,y0gcd(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=asas=asa(ax0+by0)=a(1sax0)+b(say0) 也为 a , b a,b a,b 的线性组合,则 a   m o d   s ≤ 0 a\bmod s\le 0 amods0 a   m o d   s ≥ s a\bmod s\ge s amodss. 故 a m o d    s = 0 a\mod s=0 amods=0,即 s ∣ a s\mid a sa,同理 s ∣ b s\mid b sb,从而 s ∣ gcd ⁡ ( a , b ) s\mid \gcd(a,b) sgcd(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,(ab) 的一组特解为 ( 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=y0at (tZ)

证明:先证该组 ( 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(y0at)=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(xx0)+b(yy0)=0,故 a ∣ b ( y ′ − y 0 ) a\mid b(y'-y_0) ab(yy0)
a ⊥ b a\perp b ab,则 a ∣ ( y ′ − y 0 ) a\mid (y'-y_0) a(yy0),则 y ′ − y 0 = k a y'-y_0=ka yy0=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)bty=y0gcd(a,b)at (tZ)

解方程的过程

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+(aa/bb)y0=ay0+b(x0a/by0).
所以可以令 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=x0a/by0,得到方程 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) (x0gcd(a,b)c,y0gcd(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)bty=y0gcd(a,b)at (tZ)

一些细节:

  1. 解方程之前需要用裴蜀定理判断是否有解.
  2. 使用 solve 时保证 a, b 均非负.
  3. 时间复杂度为 O ( log ⁡ V ) O(\log V) O(logV) V V V 为值域上限.
  4. 可以用来求逆元.

线性同余方程组

解形如

{ 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} xb1(modm1)xb2(modm2)xbn(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 nm,若两个整数 a , b a,b a,b,满足 0 ≤ a < n 0\le a < n 0a<n 0 ≤ b < m 0\le b < m 0b<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} {xa(modn)xb(modm)

,并且方程组的通解为 x ≡ x 0 ( m o d n m ) x\equiv x_0\pmod{nm} xx0(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 0x1,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=x2x1>0,容易证明 n ∣ k , m ∣ k n\mid k, m\mid k nk,mk,那么 可知 k ≥ lcm ⁡ ( n , m ) = n m k\ge \operatorname{lcm}(n,m)=nm klcm(n,m)=nm(因为 n ⊥ m n\perp m nm),于是 x 2 = k + x 1 ≥ n m + x 1 ≥ n m x_2=k+x_1\ge nm+x_1\ge nm x2=k+x1nm+x1nm,与假设矛盾.

然后我们证明方程组的通解:
第一,对于 x ≡ x 0 ( m o d n m ) x\equiv x_0\pmod{nm} xx0(modnm),即 x ≡ x 0 ≡ a ( m o d n ) x\equiv x_0\equiv a\pmod n xx0a(modn) x ≡ x 0 ≡ b ( m o d m ) x\equiv x_0\equiv b\pmod m xx0b(modm),则 x ≡ x 0 ( m o d n m ) x\equiv x_0\pmod {nm} xx0(modnm) 确实为原方程的解.
第二,对于 x ≢ x 0 ( m o d n m ) x\not \equiv x_0\pmod {nm} xx0(modnm),由于 n ⊥ m n\perp m nm,容易推得 x ≢ x 0 ≡ a ( m o d n ) x\not \equiv x_0\equiv a\pmod n xx0a(modn),或 x ≢ x 0 ≡ b ( m o d m ) x\not \equiv x_0\equiv b\pmod m xx0b(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} xx0(modi=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} xb1(modm1)xb2(modm2)xbn(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=mik=1nmk k i ≡ b i M i − 1 ( m o d m i ) k_i\equiv b_iM_i^{-1}\pmod {m_i} kibiMi1(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} xbk(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} Mi0(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} kiMibiMi1Mibi(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} x0i=1nkiMibi(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} xb1(modm1)xb2(modm2)xbn(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} {xa(modn)xb(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,qZ.

于是

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=pnqm=b+qmba
上面 p , q p,q p,q 是未知量,而其他均为已知量,故解线性同余方程.

两种情况:

  1. gcd ⁡ ( n , m ) ∤ ( b − a ) \gcd(n,m)\nmid(b-a) gcd(n,m)(ba),方程无解,原不等式无解.

  2. gcd ⁡ ( n , m ) ∣ ( b − a ) \gcd(n,m)\mid (b-a) gcd(n,m)(ba)

    则方程有特解 ( p 0 , q 0 ) (p_0,q_0) (p0,q0) 满足 p 0 n − q 0 m = b − a p_0n-q_0m=b-a p0nq0m=ba
    通解为 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+tgcd(n,m)m,q=q0+tgcd(n,m)n,tZ.
    所以 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+tgcd(n,m)m)n=a+p0n+tlcm(n,m)

    故只要求出 p 0 n − q 0 m = b − a p_0n-q_0m=b-a p0nq0m=ba 的一组特解 ( 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)} xa+p0n(modlcm(n,m)).

两个如此, n n n 个也是如此.

时间复杂度 O ( n log ⁡ V ) O(n\log V) O(nlogV).

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

日居月诸Rijuyuezhu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值