1. 程式人生 > >中國剩余定理及其拓展

中國剩余定理及其拓展

align 孫子兵法 bubuko 線性同余方程組 轉化 sub prim 未知數 min

中國剩余定理及其拓展

中國剩余定理CRT引例:(選自孫子兵法)

今有物不知其數,三三數之剩二,五五數之剩三,七七數之剩二,問物幾何?

怎麽考慮這個問題?

按照題意:

設答案為x,則有

x≡2(mod 3)

x≡3(mod 5)

x≡2(mod 7)

就是求x的最小值

不難發現線性同余方程組的定義就是形如:

x≡a1(mod m1)

x≡a2(mod m2)

x≡a3(mod m3)

………………………….

x≡ak(mod mk)

的方程

Sol:

先看看解法:我們再來想想為什麽是正確的。

l Step1:從5和7的公倍數中找出一個數n1使得n1≡1(mod 3)可知n1(min)=70

l Step2:從3和7的公倍數中找出一個數n2使得n2≡1(mod 5)可知n2(min)=21

l Step3:從3和5的公倍數中找出一個數n3使得n3≡1(mod 7)可知n3(min)=15

l Step4:令Ans‘=a1 * n1 + a2 * n2 + a3 * n3 = 2 * 70 + 3 * 21 + 15 * 2 = 233

l Step5:答案Ans(min)=Ans’%lcm(3,5,7)=233%105=23

正確性證明:

我們試圖說明這樣解法的正確性。

首先我們先證明幾個引理。

引理1:若有a≡c(mod b)則有a+kb≡c(mod b)k∈Z

轉化一下:若a % b = c那麽必有(a+k*b)% b = c

證明是及其簡單的:等式右邊 =(a+k*b)% b = a % b+(kb)% b = a%b=等式左邊

這句話翻譯為人話是這樣的:如果一個除法運算的余數為c,那麽被除數與k倍的除數相加(或相減)的和(差)再與除數相除,余數不變。

引理2:若a≡c(mod b)則有 (a*k) ≡ kc(mod b)k∈Z

轉化一下:a%b=c那麽( a*k ) % b=k*c 其中k∈Z

證明也是顯然的:( a*k ) % b = a%b +a%b +….+a%b=c+c+……+c=k*c k∈N*

我們現在來考慮孫子怎麽考慮這個問題。

我們設置:

l n1是滿足除以3余2的一個數,就是n1=3k+2 其中k∈N

l n2是滿足除以5余3的一個數,就是n1=5k+3 其中k∈N

l n3是滿足除以7余2的一個數,就是n1=7k+2 其中k∈N

(顯然此k非彼k)

由引理1可知:

如果n2是3的倍數那麽要使n1+n2 滿足 除以3余2那麽顯然n1需要是3的倍數。

按照這個道理現在n1+n2已經除以3余2要想n1+n2+n3除以 3 余2那麽n3必須是3的倍數

於是我們可以推出這樣三點:

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

再次結合上面對於n1,n2,n3的定義

  1. n1是滿足除以3余2的一個數,就是n1=3k+2 其中k∈N
  2. n2是滿足除以5余3的一個數,就是n1=5k+3 其中k∈N
  3. n3是滿足除以7余2的一個數,就是n1=7k+2 其中k∈N

可知

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

我們如果找出n1,n2,n3那麽這個問題就解決了。

我們設 n1=5*7*k=35k,

解同余方程35k≡2(mod 3)那就是求35k‘≡1(mod 3)的兩倍

顯然就是35關於3的逆元就可以求出k‘,

就可以求出k=2k‘,從而求出n1=5*7*2*k’

如此類推就可以知道n2和n3 的值

那麽就是n2=3*7*3*k‘, n3=3*5*2*k‘

然後求出Ans’=n1+n2+n3,(只是一個解而不是最小解)

然後我們要用到引理1了:若a % b = c那麽必有(a+k*b)% b = c

若k為負數,那麽我們不停的減去lcm(3,5,7)就可以得出最優解。

Ans= Ans’ % lcm(3,5,7)

總結

好了我們總結一下方法

解線性同余方程:

x≡a1(mod m1)

x≡a2(mod m2)

x≡a3(mod m3)

………………………….

x≡ak(mod mk)

其中滿足{x|x=mi,i=1,2,3…k} ⊆{Prime}

的方法:

技術分享圖片

上面是一個特例,由於我們要求逆元inv那麽必須所有的mi都要是質數,其中滿足{x|x=mi,i=1,2,3…k} ⊆{Prime},多少有很大的不實用性,由於我們有擴展歐幾裏得算法

可以求出ax+by=gcd(a,b)的最小正整數解,這就要用到中國剩余定理擴展。

中國剩余定理擴展EXCRT —— 求解模數不互質情況下的線性方程組

其實比上面更加簡單。

我們考慮兩個同余方程:

x≡a1(mod m1)

x≡a2(mod m2)

必然可以表示成這樣的形式

x=a1+m1x1

x=a2+m2x2

聯立可知: a1 + m1x1 = x = a2 + m2x2

那麽這裏x1和x2是未知數,就是

m1x1-m2x2=a2-a1

可以解出來x1(最小),帶回到 x的一個特解x‘

這個x’顯然可以滿足

x≡a1(mod m1)

x≡a2(mod m2)

然後組成這樣的新的同余方程

x≡x‘(mod lcm(m1,m2))

然後就可以解出最終解出x

中國剩余定理及其拓展