1. 程式人生 > >學習筆記 - 中國剩餘定理&擴充套件中國剩餘定理

學習筆記 - 中國剩餘定理&擴充套件中國剩餘定理

中國剩餘定理&擴充套件中國剩餘定理

NOIP考完回機房填坑


 

 ◌ 中國剩餘定理

處理一類相較擴充套件中國剩餘定理更特殊的問題:

 

在這裡要求 對於任意i,j(i≠j),gcd(mi,mj)=1 (就是互素)

不互素的話就只能用擴充套件演算法了……這也是中國剩餘定理與其擴充套件演算法的主要區別。

另外 中國剩餘定理 和 擴充套件中國剩餘定理 似乎沒有什麼關係,除了解決的問題比較相似,所以我就分開講了。

▫演算法

舉一個比較常用的例子(出自《九章算術》),求正整數x滿足:

先計算 3,5,7 的最小公倍數為 105

再計算出所謂的基礎數

mod 3: 105/3=35 >> 35 mod 3 = 2 (因為35模3本來就餘2,就不需要操作) >> 基礎數是35

mod 5: 105/5=21 >> 21 mod 5 = 1 (1*3=3,所以需要乘3)>> 21*3 mod 5 = 3 >> 基礎數為 21*3=63

mod 7: 105/7=15 >> 15 mod 7 = 1 (1*2=2,所以需要乘2)>> 15*2 mod 7 = 2 >> 基礎數為 15*2=30

這3個基礎數加起來得到 sum=35+63+30=128

然後模 3,5,7 的最小公倍數就得到答案 ans=128 mod 105=23

證明

(背的結論……記不住具體證法,簡單證明一下正確性)

 可以知道的是:對於帶餘除法 "a / b = c ... d",存在 "(ax) / b = (cx+dx/b) ... (dx mod b)",自己可以舉幾個例子感性理解一下。

對於集合(元素都互質)A={ a1,a2...an } 的最小公倍數lcm,lcm/ai 一定是A中除ai以外的元素的倍數。如果 lcm/ai mod ai = ki ,而且題目是 求出的數mod ai = ri ,如果問題有解,那麼一定存在整數 p ,使得(ki

* p) mod ai = r要使餘數乘p,根據前面的思路,我們可以將被除數也乘上 p 。這樣被除數就變成了 (lcm/ai*p) ,它一定被 集合A 中除 ai 的所有元素整除,並且它模ai的餘數為ri。這時候我們稱這個被除數為ai的“基礎數”

另外一個性質:如果 x1,x2,...,xn 被 a 整除,而 xn+1 mod a = k ,那麼 (x1+x2+...+xn+1) mod a = k。

那麼我們現在將 a1~an 的基礎數都加起來得到 sum,一定滿足 sum mod ai = ri ,即已經符合題目要求。但是如果我們要求最小的數,我們可以取模 lcm ,因為 lcm mod ai = 0,所有模一個lcm不會影響到題目要求。


 

◌ 擴充套件中國剩餘定理

解決的問題很相似,只是沒有互質的要求。但是依據的演算法就完全不一樣了。

▫ 證明

個人覺得比中國剩餘定理好理解,但是建議先弄懂擴充套件歐幾里得

先只考慮2個元素,即求x:

得到一個奇怪的等式——

  

再轉換一下:

  

令 

等式兩邊同時除以 gcd,得到 :

  

然後將它轉換為模運算的形式:

  

然後因為模運算不能作除法,我們定義:

  

接下來就可以轉換模運算了:

  

再轉回普通運算:

  

根據一開始的:

   

可以得到:

  

代回去,再移下項:

  

  

化簡一下式子:

  

所以就會發現:

  

OK……證畢!


 

The End

Thanks for reading!