1. 程式人生 > >模線性方程組(中國剩餘定理)

模線性方程組(中國剩餘定理)

《孫子算經》裡有這樣一個問題,“今有物不知其數,三三數之剩二(除以3餘2),五五數之剩三(除以5餘3),七七數之剩二(除以7餘2),問物幾何?”,解決這個問題的方法稱為中國剩餘定理,也叫孫子定理。中國古代還有一個叫做“韓信點兵”的問題,和這個問題本質是一樣的。

很明顯這個物應該有無陣列解,我們先寫幾個數找一下規律。

(1)模3餘2:2,5,8,11,14,17,20,23,26,29........

(2)模5餘3:3,8,13,18,23,28.......

(3)模7餘2:2,9,16,23,30,37.......

很明顯找到一個23滿足題意,怎麼把解的一般表示式寫出來呢?我們設(23+n)也滿足題意,這個n必須要同時是3,5,7的倍數才行。這是因為如果a%b=c,那麼(a+k*b)%b=c。我們讓n=lcm(3,5,7)=105,所以解的形式應該是(23+105*k)。

但是孫子算經卻不是這麼解決的,有一個口訣叫做“三人同行七十稀,五樹梅花二十一,七子團圓正半月,減百零五便得知”。把這四句話翻譯成數學語言,最後的答案就是(70*a+21*b+15*c-105*k),這裡的a,b,c是帶餘除法中的餘數,也就是2,3,2。這裡的70,21,15是什麼意思,我先簡單解釋一下,下面再給出詳細的論證。70就是5,7的倍數,且模3等於1,因為最後要求餘2,所以我們乘了2。21,15的意義同理。

下面論證一下以上問題的數學解釋:

我們把上述問題分解成三個問題。假設整數p只滿足“三三數之剩二”,q只滿足“五五數之剩三”,r只滿足“七七數之剩二”,則可令

p=3*k1+2,q=5*k2+3,r=7*k3+2,假設整數(p+q+r)同時滿足上述3個條件,那我們可以推出

(1)(p+q+r)%3=2

(2)(p+q+r)%5=3

(3)(p+q+r)%7=2

根據a%b=c   =>  (a+k*b)%b=c,再結合以上三個等式就可以得出p,q,r滿足的條件是

p%3=2且p是5和7的倍數;q%5=3且q是3和7的倍數;r%7=2且r是3和5的倍數。

再談談怎麼具體找這個p,q,r,比如p,本來的想法是在5和7的公倍數裡找一個模3等於2的數,但是調整一下策略,在5和7的公倍數裡找一個模3等於1的數,然後乘以2,也就是乘餘數。我們把5和7的公倍數設為(35*k)。

35*k%3=1  => 35*k\equiv1(mod3),前面這個東西它的含義就是35*k和1這倆數,模3的餘數相同,它的充要條件是(35*k-1)是3的倍數。列舉一下k即可。如果再嚴謹一些,我們可以設35*k-1=3*t,移項以後變形為35*k-3*t=1,問題變成不定方程組求解了。根據擴充套件歐幾里得演算法,方程有解,必須滿足gcd(k,t)=1;所以k和t必須互素,在這種條件下,k的取值是唯一的。