名为扩展中国剩余定理,但解法与CRT没啥关系 关于CRT
简介
考虑求解如下线性同余方程组,不保证 ∀i,j,mi⊥mj
⎩⎪⎪⎪⎪⎪⎪⎨⎪⎪⎪⎪⎪⎪⎧xxxx≡≡≡⋮≡a1a2a3an(modm1)(modm2)(modm3)(modmn)
CRT在处理线性同余方程组时用的是构造法,构造出解为:
x=M1s1a1+M2s2a2+⋯+Mnsnan
其中 Mi=∏j=imj,si≡Mi−1(modmi) ,(具体证明不再解释)可以发现这种做法的前提是求的出 Mi 在模 mi 意义下的逆元,当 ∀i,j,mi⊥mj 时,显然 Mi⊥mi ,故一定有逆元。但此时不保证 m 两两互质,便存在 Mi⊥mi ,则求不出 Mi 在模 mi 意义下的逆元。
推理
那咋办?我们干脆放弃构造的想法,换一种思路,首先看只有两个方程的情况:
{xx≡≡a1a2(modm1)(modm2)
以下写法是等价的:
x=k1m1+a1=k2m2+a2∣k1,k2∈Z
进行移项得:
m1k1−m2k2=a2−a1
这里 a2−a1,m1,m2 都是已知的,这样的不定方程可以用扩展欧几里得求解,当 gcd(m1,m2)∤(a2−a1) 时无解。
然后可计算出 x′=k1m1+a1 ,此时的 x′ 满足 x′modm1=a1,x′modm2=a2 ,实际上就可以将原方程组合并成一个新同余式:
x=x′(modlcm(m1,m2))
当处理同余原方程组时,将其依次合并,最后留下一个方程就是解。在过程中若扩展欧几里无解则原方程组无解。
伪代码
1 2 3 4 5 6 7
| input n,a[ ],m[ ] for i in range(2,n) if (a[i]-a[i-1])%gcd(m[i-1],-m[i])!=0 无解 用exgcd求解不定方程 (m[i-1])x+(-m[i])y=(a[i]-a[i-1]) m[i] <- lcm( m[i], m[i-1] ) a[i] <- ( m[i-1] * x + a[i-1] ) mod m[i] return a[n]
|
几道习题