中國剩餘定理(CRT)

今有物,不知其數,三三數之,剩二;五五數之,剩三;七七數之,剩二。問物幾何          ——《孫子算經》ide

答爲「23」。也就是求同餘式組 x≡2 (mod3),x≡3 (mod5 ),x≡2 (mod7)的正整數解。spa

不難看出,題中3,5,7分別是互質的。具體解法是這樣的code

一、找出三個數:從3和5的公倍數中找出被7除餘1的最小數15,從3和7的公倍數中找出被5除餘1 的最小數21,最後從5和7的公倍數中找出除3餘1的最小數70。
二、用15乘以2(2爲最終結果除以7的餘數),用21乘以3(3爲最終結果除以5的餘數),同理,用70乘以2(2爲最終結果除以3的餘數),而後把三個乘積相加15∗2+21∗3+70∗2獲得和233。
三、用233除以三、五、7的最小公倍數105,獲得餘數23,這個餘數23就是符合條件的最小數。blog

換成公式:get

x ≡2(mod 3)
x ≡3(mod 5)
x ≡2(mod 7)
則進一步得
lcm(5,7)·k≡1(mod 3) →70 ≡1(mod 3)
lcm(3,7)·k≡1(mod 5) →21 ≡1(mod 5)
lcm(3,5)·k≡1(mod 7) →15 ≡1(mod 7)
因此
70×2+21×3+15×2 ≡ x (mod(lcm(3,5,7)))
233 ≡x (mod 105)
獲得x=23+105k(k ∈Z) 。這裏x的取值有無數多個,當k==0時最小爲23,知足題意。io

 

--同餘的解法: 因M除以3和7都餘2,有等差數列2+21N知足除以3和7都餘2,event

在2+21N數列 取5項:2,23,44,65,86,得23/5餘3,因3*5*7=105,即23+105N數列的數都知足這些條件。最小的就是23class

 

中國剩餘定理又稱孫子定理,它的證實這樣的cli

由於(mi,mj)=1,i!=j, (這裏mi,mj是互素的,如上題中2,3,7),則 (Mi, mi)=1,對每一個Mi,都存在Ni,使得                
MiNi ≡1 (mod mi) 
又m=mi Mi ,故mj | Mi , i!=j,即
MiNi≡0 (mod mj)
則M1 N1b1+ M2 N2b2+…+ Mk Nk bk≡ bi (mod mi).所以
x≡M1 N1b1+ M2 N2b2+…+ Mk Nk bk (mod m)是同餘方程的整數解擴展

惟一性證實:

若是y也是上述同餘方程的解,則知足
x≡y(mod m1); x≡y(mod m2); …; x≡y(mod mk)
即m1 |(x-y), m2 |(x-y),…, mk |(x-y).因此     
m|(x-y)
即x≡y(mod m). 即證方程在模m條件下有惟一解。

證實可能有點難理解,能夠看看例題幫助理解:

韓信點兵
韓信帶貳仟伍佰士兵出去打仗,回營後,劉邦問士兵人數。韓信讓士兵先列成五行縱隊,末行一人;列成六行縱隊,末行五人;列成七行縱隊,末行四人;列成十一行縱隊,末行十人。韓信馬上回答二千一百一十一人。劉邦驚爲天人!

看過題目後就知道該如何求解了。即解一次同餘方程組:(1)x ≡1(mod5);   x ≡5(mod6);  x ≡4(mod7);   x ≡10(mod11)

(2)用孫子定理,

m1 =5, m2 =6, m3=7, m4 =11;這些是對應的除數,

b1 =1, b2 =5, b3=4, b4 =10;這些是對應的商,

m=5*6*7*11=2310;全部除數的乘積。

所以對應的Mi爲M1 =462(2310/5),M2=385(2310/6),M3=330(2310/7)。M4=210(2310/11)

對應的Ni(逆元)爲N1=3,N2=1,N3=1,N4=1

因此 x ≡ 462*3*1+ 385*1*5+ 330*1*4+210*1*10 ≡6731 ≡2111(mod2310) ,最小爲2111。

這裏有一個求解思路圖:

 1 int china (int *a ,int *m, int n)
 2 {
 3     int M=1,ans=0,mi,i,x,y;
 4     for(i=0;i<n;i++)
 5     M*=m[i];                //M=m1*m2*m3...*mn
 6     for(i=0;i<n;i++)
 7     {
 8         mi=M/m[i];           //Mi=M/mi     
 9         exGcd(m[i],mi,x,y);      //擴展歐幾里德
10         ans=(ans+mi*y*a[i])%M;
11     }
12     return (ans%M+M)%M;
13 }    
View Code

題目連接:Biorhythms

相關文章
相關標籤/搜索