中國剩餘定理(超詳細講解)

孫子問題

最早,在《孫子算經》中有這樣一個問題:“今有物不知其數,三三數之剩二,五五數之剩三,七七數之剩二,問物幾何?用白話描述就是,現在有一個數不知道是多少,只知道這個數除以3餘2,除以5餘3,除以7餘2, 問這個數是多少?

上面的問題可以轉換爲以下這樣一個方程組:

{xmod3=2xmod5=3xmod7=2 \begin{cases} x \quad mod \quad 3 =2\\ x \quad mod \quad 5 =3\\ x \quad mod \quad 7 =2\\ \end{cases}

其中這個xx就是我們要求的數。而中國剩餘定理就是用來解決上述形式的方程組的xx解的。

解答講解

在開始解答這個問題之前,我們先來了解一下幾個數論基本知識。

基本等式

(1)amodb=(a+kb)modb(1)a \quad mod \quad b=(a+k*b) \quad mod \quad b

(2)(ak)modb=k(amodb)(2)(a*k) \quad mod \quad b=k*(a \quad mod \quad b)

需要注意:ab(modc)\\a \equiv b(mod \quad c)的意思是amodc=bmodca \quad mod \quad c = b \quad mod \quad c

在瞭解兩個基本等式之後我們就可以對上述方程組做一些變換了:
{x=k13+2x=k25+3x=k37+2 \begin{cases} x =k_1*3+2\\ x =k_2* 5 +3\\ x =k_3*7+ 2\\ \end{cases}

直接看上面的方程組,好像直接求解出k1k2k3k_1、k_2、k_3不太現實,所以我們需要另尋出路。在這裏我們先假設三個數,分別是n1n2n3n_1、n_2、n_3,滿足一下條件:
{n1mod3=2n2mod5=3n3mod7=2 \begin{cases} n_1 \quad mod \quad 3=2\\ n_2 \quad mod \quad 5=3\\ n_3 \quad mod \quad 7=2\\ \end{cases}
假如n2n3n_2、n_3均能整除3的話,那麼按照等式(1)(1)就有:

{n2=k23n3=k33 \begin{cases} n_2 =k_2'*3\\ n_3 =k_3'*3\\ \end{cases}\\

(n1+k23+k33)mod3=n1mod3=2(n1+n2+n3)mod3=2 (n_1+k_2'*3+k_3'*3) \quad mod \quad 3=n_1 \quad mod \quad 3=2\\ (n_1+n_2+n_3) \quad mod \quad 3 =2\\

那麼我們繼續假如n1n3n_1、n_3能被5整除,n1n2n_1、n_2能被7整除,那麼就有:
{(n1+n2+n3)mod3=2(n1+n2+n3)mod5=3(n1+n2+n3)mod7=2 \begin{cases} (n_1+n_2+n_3) \quad mod \quad 3=2\\ (n_1+n_2+n_3) \quad mod \quad 5=3\\ (n_1+n_2+n_3) \quad mod \quad 7=2\\ \end{cases}

對比題目中的方程組,可以看出只要滿足以下條件就能使我們需要求解的x=(n1+n2+n3)x=(n_1+n_2+n_3):

  1. n1n_1除以3餘2,且是5和7的公倍數。
  2. n2n_2除以5餘3,且是3和7的公倍數。
  3. n3n_3除以7餘2,且是3和5的公倍數。

我們只需要將n1n2n3n_1、n_2、n_3求出來後相加即可得我們想求的xx值。不過,這只是其中一個解,並不是最小解。要求最小解我們還需要除以n1n2n3n_1、n_2、n_3的最大公約數。

這裏呢,我們以n1n_1求解爲例,n2n3n_2、n_3求解過程類似。

求解n1n_1過程

首先我們先羅列一下基本約束條件:

{n1mod3=2n1=5k2n1=7k3\begin{cases} n_1 \quad mod \quad 3 =2\\ n_1 = 5 * k_2'\\ n_1 = 7 * k_3'\\ \end{cases}

根據等式(2)(2),可以得到:

n1mod3=2(n12mod3)=2n_1 \quad mod \quad 3 =2*(\dfrac{n_1}{2} \quad mod \quad 3)=2

n12mod3=1\dfrac{n_1}{2} \quad mod \quad3 =1

如果n12\dfrac{n_1}{2}是5、7的整數倍,那麼n1n_1自然也是5、7的整數倍。不過在這裏呢,我們並沒有從5和7的公倍數中直接找一個除以3餘2的數,而是先找一個除以3餘1的數,再乘以2。也就是先求出5和7的公倍數模3下的逆元,再用逆元去乘餘數。具體過程如下:參考來源

推算過程如下:

K=n12,首先我們令K=\dfrac{n_1}{2},

Kmod3=1(K57),gcd(57,3)=1,353:K1(mod3)K=ax=(57)x1(mod3)35x+3y=1:{x=2,y=23,ax=2,K=70n1=2K=140因爲\\\quad K \quad mod \quad3 =1(K是5和7的整數倍),\\所以\\\quad gcd(5*7,3)=1,即35與3互質,由拓展歐幾里得算有:\\\quad K\equiv1(mod \quad3)\Rarr K=a*x=(5*7)*x\equiv1(mod \quad 3)\\\quad 35*x+3*y=1\Rarr整數解爲:\begin{cases}x=2,\\y=-23,\end{cases}\\可求得a的逆元x=2,則K=70\Rarr n_1=2*K=140

,n2=63n3=30x=(n1+n2+n3)=233類似,可求出n_2=63,n_3=30\Rarr x=(n_1+n_2+n_3)=233

233÷(357)105=23不過此時並不是最小數,我們還需要將233\div(3、5、7)_{最大公約數105}=23,這纔是符合條件的最小數

最大公倍數=各個數的乘積÷\div最大公約數,最大公約數可使用輾轉相除法獲取(歐幾里得算法)

中國剩餘定理公式

設正整數m1,m2,...,mk,m_1,m_2,...,m_k,兩兩互素,則同餘方程組:
{xa1(modm1)xa2(modm2)......xak(modmk) \begin{cases} x\equiv a_1(mod \quad m_1)\\ x\equiv a_2(mod \quad m_2)\\ ......\\ x\equiv a_k(mod \quad m_k)\\ \end{cases}
有整數解。並且在模M=m1m2...mkM=m_1*m_2*...*m_k下的解是唯一的,解爲

x(a1M1M11+a2M2M21+...+akMkMk1)modMx\equiv(a_1M_1M_1^{-1}+a_2M_2M_2^{-1}+...+a_kM_kM_k^{-1})mod \quad M

其中Mi=MmiM_i=\dfrac{M}{m_i},而MiM_imim_i的逆元。

關於擴展歐幾里得算法

參考文章:歐幾里德算法與擴展歐幾里德算法

用途

用來求解形如ax+by=c(a,b,cZ)ax + by = c(a, b, c \in Z)的方程的一組整數解.。

使用條件

cmodgcd(a,b)=0,gcd(a,b)a/bc \quad mod \quad gcd(a,b)=0,gcd(a,b)表示a/b的最大公約數

求解過程

:ax+by=gcd(a,b) 求解方程:ax+by=gcd(a,b)\\

(1)b=0ax=gcd(a,0):{x=1y=0(1)當 b = 0 時,原方程可化爲 ax = gcd(a, 0) \Rarr 解得:​​\begin{cases}x=1\\y=0 \end{cases}
(2)a=b,b=amodb,:(2)設 a' = b, b' = a \quad mod \quad b,有如下方程:

{ax+by=gcd(a,b)=gcd(b,amodb)ax+by=gcd(a,b) \begin{cases} a'x'+b'y'=gcd(a',b​')=gcd(b,a \quad mod \quad b)\\ ax + by = \gcd(a, b) \end{cases}

:gcd(a,b)=gcd(b,amodb):另有恆等式:gcd(a,b)=gcd(b,amodb),則:

ax+by=ax+by=bx+(amodb)y=bx+(aabb)yax+by=a'x'+b'y'=bx'+(a\quad mod\quad b)y'=bx'+(a−⌊​\dfrac{a}{b}​​⌋b)y'
:整理得:
ax+by==bx+(aabb)y{x=yy=xabyax+by==bx'+(a−⌊​\dfrac{a}{b}​​⌋b)y'\\ \Darr\\ \begin{cases} x=y'\\ y=x​'−⌊\dfrac{a}{b}​​​​⌋y​' \end{cases}
通過上述這個解可知道,如果反覆迭代遞歸,最終一定會到達臨界條件b=0b=0,即情況(1)(1),從而計算出最終值。

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