中國剩餘定理

中國剩餘定理

     中國剩餘定理是中國古代求解一次同餘方程組的方法,是數論中的一個重要定理。

     設m1,m2,m3,...,mk是兩兩互素的正整數,即gcd(mi,mj)=1,i!=j,i,j=1,2,3,...,k.

則同餘方程組:

x = a1 (mod n1)

x = a2 (mod n2)

...

x = ak (mod nk)

模[n1,n2,...nk]有唯一解,即在[n1,n2,...,nk]的意義下,存在唯一的x,滿足:

x = ai mod [n1,n2,...,nk], i=1,2,3,...,k。

解可以寫爲這種形式:

x = sigma(ai* mi*mi') mod(N)

      其中N=n1*n2*...*nk,mi=N/ni,mi'爲mi在模ni乘法下的逆元。

 

中國剩餘定理非互質版

    中國剩餘定理求解同餘方程要求模數兩兩互質,在非互質的時候其實也可以計算,這裏採用的是合併方程的思想。下面是詳細推導。



中國剩餘定理介紹

     在《孫子算經》中有這樣一個問題:“今有物不知其數,三三數之剩二(除以3餘2),五五數之剩三(除以5餘3),七七數之剩二(除以7餘2),問物幾何?”這個問題稱爲“孫子問題”,該問題的一般解法國際上稱爲“中國剩餘定理”。具體解法分三步:

  1. 找出三個數:從3和5的公倍數中找出被7除餘1的最小數15,從3和7的公倍數中找出被5除餘1 的最小數21,最後從5和7的公倍數中找出除3餘1的最小數70。
  2. 用15乘以2(2爲最終結果除以7的餘數),用21乘以3(3爲最終結果除以5的餘數),同理,用70乘以2(2爲最終結果除以3的餘數),然後把三個乘積相加(15*2+21*3+70*2)得到和233。
  3. 用233除以3,5,7三個數的最小公倍數105,得到餘數23,即233%105=23。這個餘數23就是符合條件的最小數。

     就這麼簡單。我們在感嘆神奇的同時不禁想知道古人是如何想到這個方法的,有什麼基本的數學依據嗎?

中國剩餘定理分析

     我們將“孫子問題”拆分成幾個簡單的小問題,從零開始,試圖揣測古人是如何推導出這個解法的。

     首先,我們假設n1是滿足除以3餘2的一個數,比如2,5,8等等,也就是滿足3*k+2(k>=0)的一個任意數。同樣,我們假設n2是滿足除以5餘3的一個數,n3是滿足除以7餘2的一個數。

     有了前面的假設,我們先從n1這個角度出發,已知n1滿足除以3餘2,能不能使得 n1+n2 的和仍然滿足除以3餘2?進而使得n1+n2+n3的和仍然滿足除以3餘2?

     這就牽涉到一個最基本數學定理,如果有a%b=c,則有(a+kb)%b=c(k爲非零整數),換句話說,如果一個除法運算的餘數爲c,那麼被除數與k倍的除數相加(或相減)的和(差)再與除數相除,餘數不變。這個是很好證明的。

     以此定理爲依據,如果n2是3的倍數,n1+n2就依然滿足除以3餘2。同理,如果n3也是3的倍數,那麼n1+n2+n3的和就滿足除以3餘2。這是從n1的角度考慮的,再從n2,n3的角度出發,我們可推導出以下三點:

  1. 爲使n1+n2+n3的和滿足除以3餘2,n2和n3必須是3的倍數。
  2. 爲使n1+n2+n3的和滿足除以5餘3,n1和n3必須是5的倍數。
  3. 爲使n1+n2+n3的和滿足除以7餘2,n1和n2必須是7的倍數。

    因此,爲使n1+n2+n3的和作爲“孫子問題”的一個最終解,需滿足:

  1. n1除以3餘2,且是5和7的公倍數。
  2. n2除以5餘3,且是3和7的公倍數。
  3. n3除以7餘2,且是3和5的公倍數。

    所以,孫子問題解法的本質是從5和7的公倍數中找一個除以3餘2的數n1,從3和7的公倍數中找一個除以5餘3的數n2,從3和5的公倍數中找一個除以7餘2的數n3,再將三個數相加得到解。在求n1,n2,n3時又用了一個小技巧,以n1爲例,並非從5和7的公倍數中直接找一個除以3餘2的數,而是先找一個除以3餘1的數,再乘以2。

    這裏又有一個數學公式,如果a%b=c,那麼(a*k)%b=a%b+a%b+…+a%b=c+c+…+c=kc(k>0),也就是說,如果一個除法的餘數爲c,那麼被除數的k倍與除數相除的餘數爲kc。展開式中已證明。

    最後,我們還要清楚一點,n1+n2+n3只是問題的一個解,並不是最小的解。如何得到最小解?我們只需要從中最大限度的減掉掉3,5,7的公倍數105即可。道理就是前面講過的定理“如果a%b=c,則有(a-kb)%b=c”。所以(n1+n2+n3)%105就是最終的最小解。

總結

   經過分析發現,中國剩餘定理的孫子解法並沒有什麼高深的技巧,就是以下兩個基本數學定理的靈活運用:

  1. 如果 a%b=c , 則有 (a+kb)%b=c (k爲非零整數)。
  2. 如果 a%b=c,那麼 (a*k)%b=kc (k爲大於零的整數)。


eg:

傳說西漢大將韓信,由於比較年輕,開始他的部下對他不很佩服。有一次閱兵時,韓信要求士兵分三路縱隊,結果末尾多2人,改成五路縱隊,結果末尾多3人,再改成七路縱隊,結果又餘下2人,後來下級軍官向他報告共有士兵2395人,韓信立即笑笑說不對(因2395除以3餘數是1,不是2),由於已經知道士兵總人數在2300~2400之間,所以韓信根據23,128,233,------,每相鄰兩數的間隔是105(3、5、7的最小公倍數),便立即說出實際人數應是2333人(因2333=128+20χ105+105,它除以3餘2,除以5餘3,除以7餘2)。這樣使下級軍官十分敬佩,這就是韓信點兵的故事。 

 

 韓信點兵問題簡化:已知 n%3=2,  n%5=3,  n%7=2,  求n。 


兩道題是一樣的。但是韓信當時計算出結果的? 
 韓信用的就是“中國剩餘定理”,《孫子算經》中早有計算方法,大家可以查閱相關資料。 
“韓信點兵”問題計算如下: 

因爲n%3=2, n%5=3, n%7=2 且 3,5,7互質 (互質可以直接得到這三個數的最小公倍數)

令x= n%3=2 , y= n%5=3 ,z= n%7=2
      使5×7×a被3除餘1,有35×2=70,即a=2; 
       使3×7×b被5除餘1,用21×1=21,即b=1; 
       使3×5×c被7除餘1,用15×1=15,即c=1。 
那麼n =(70×x+21×y+15×z)%lcm(3,5,7) = 23 這是n的最小解

 而韓信已知士兵人數在2300~2400之間,所以只需要n+i×lcm(3,5,7)就得到了2333,此時i=22


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章