Night的数学杂谈——模数不互质的CRT

前置技能点要求懂得基础的数论知识和扩展欧几里德算法
有关于前置技能点的东西不会就别问我了。
写挂哪里请评论戳我。

进入正题

我们要合并同余方程

{xr1(modm1)xr2(modm2) { x ≡ r 1 ( mod m 1 ) x ≡ r 2 ( mod m 2 )

即:
{x=n1×m1+r1x=n2×m2+r2 { x = n 1 × m 1 + r 1 x = n 2 × m 2 + r 2

则:

n1×m1+r1=n2×m2+r2n1×m1n2×m2=r2r1(1) n 1 × m 1 + r 1 = n 2 × m 2 + r 2 ⇔ n 1 × m 1 − n 2 × m 2 = r 2 − r 1 ⋯ ⋯ ( 1 )

考虑这样一个不定方程

ax+by=(a,b)a(a,b)+b(a,b)=1ax(a,b)(modb) a x + b y = ( a , b ) ⇔ a ( a , b ) + b ( a , b ) = 1 ⇔ a x ≡ ( a , b ) ( mod b )

当其存在特解 (x0,y0) ( x 0 , y 0 ) 时,通解 (x,y) ( x , y ) 如下:

{x=x0+K×b(a,b)y=y0+K×a(a,b)KZ { x = x 0 + K × b ( a , b ) y = y 0 + K × a ( a , b ) K ∈ Z

(1) ( 1 ) 中,取 (m1,m2)(x,y) ( m 1 , m 2 ) 为 ( x , y ) (n1,n2)(a,b) ( n 1 , n 2 ) 为 ( a , b ) .

这样一来为了使得存在整数解 (m1,m2) ( m 1 , m 2 ) ,需使 gcd(n1,n2)|(r2r1) gcd ( n 1 , n 2 ) | ( r 2 − r 1 ) .

因此可以设

{g=gcd(n1,n2)r=r2r1 { g = gcd ( n 1 , n 2 ) r = r 2 − r 1

则有(把不定方程先弄成同余方程)

n1g×m1rg(modn2g)m1rg×(n1g)1(modn2g) n 1 g × m 1 ≡ r g ( mod n 2 g ) ⇔ m 1 ≡ r g × ( n 1 g ) − 1 ( mod n 2 g )

K=rg×(n1g)1 K = r g × ( n 1 g ) − 1

则(相当于又把同余方程化为不定方程)

k1=n2g×y+K k 1 = n 2 g × y + K

k1 k 1 带入原方程组,则

{x=n1×(n2g×y+K)+r1x=×n1n2g+r2 { x = n 1 × ( n 2 g × y + K ) + r 1 x = × n 1 n 2 g + r 2

化简得

x=n1K+r1(modn1n2g)xn1×rgcd(n1,n2)×(n1gcd(n1,n2))1+r1(modn1n2gcd(n1,n2)) x = n 1 K + r 1 ( mod n 1 n 2 g ) ⇔ x ≡ n 1 × r gcd ( n 1 , n 2 ) × ( n 1 gcd ( n 1 , n 2 ) ) − 1 + r 1 ( mod n 1 n 2 gcd ( n 1 , n 2 ) )

其中 n1n2g n 1 n 2 g 即是 n1,n2 n 1 , n 2 的最小公倍数。
多个方程你就两个两个合并一下就好了…吧。

你可能感兴趣的:(算法与数据结构)