中國剩余定理


例題:【poj1006】 Biorhythms

解題報告

問題描述

     人自出生起就有體力,情感和智力三個生理周期,分別為23,28和33天。一個周期內有一天為峰值,在這一天,人在對應的方面(體力,情感或智力)表現最好。通常這三個周期的峰值不會是同一天。現在給出三個日期,分別對應於體力,情感,智力出現峰值的日期。然后再給出一個起始日期,要求從這一天開始,算出最少再過多少天后三個峰值同時出現。

問題分析

      首先我們要知道,任意兩個峰值之間一定相距整數倍的周期。假設一年的第N天達到峰值,則下次達到峰值的時間為N+Tk(T是周期,k是任意正整數)。所以,三個峰值同時出現的那一天(S)應滿足

      S = N1 + T1*k1 = N2 + T2*k2 = N3 + T3*k3

N1,N2,N3分別為為體力,情感,智力出現峰值的日期, T1,T2,T3分別為體力,情感,智力周期。 我們需要求出k1,k2,k3三個非負整數使上面的等式成立。

     想直接求出k1,k2,k3貌似很難,但是我們的目的是求出S, 可以考慮從結果逆推。根據上面的等式,S滿足三個要求:除以T1余數為N1,除以T2余數為N2,除以T3余數為N3。這樣我們就把問題轉化為求一個最小數,該數除以T1余N1,除以T2余N2,除以T3余N3。這就是著名的中國剩余定理,我們的老祖宗在幾千年前已經對這個問題想出了一個精妙的解法。依據此解法的算法,時間復雜度可達到O(1)。下面就介紹一下中國剩余定理。

中國剩余定理介紹

     在《孫子算經》中有這樣一個問題:“今有物不知其數,三三數之剩二(除以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為大於零的整數)

轉載於:http://www.cnblogs.com/walker01/archive/2010/01/23/1654880.html

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM