比較直觀地歐幾裡得算法與更相減損術證明

2021-01-13 myEagleeyes

歐幾裡得算法,也叫做輾轉相除法。是偉大的歐幾裡得在《幾何原本》中描述的一種求兩個整數最大公約數的高效算法。是最古老的算法之一。相對應的,中國古代《九章算術》中記載的更相減損術也是求兩個整數最大公約數的方法。但是更相減損術的效率卻沒有歐幾裡得算法的高。

1、歐幾裡得算法

假如要求{234, 78}的最大公約數,只需要如下幾個步驟:

第一步:234/78 = 4(餘數42)

第二步:78/42 = 1(餘數是36)

第三步:42/36 = 1(餘數是6)

第四步:36/6= 6(餘數是0)

此時6就是{234, 78}的最大公約數。因為兩個整數相除後的餘數,在計算機科學中也叫做模,英文mod。上面的步驟就是歐幾裡得算法求最大公約數的過程,用數學語言描述求任意兩個整數{m, n},約定|m| ≥|n|的最公約數,可以描述為gcd(m, n) = gcd(n,m mod n)。gcd是最大公約數的意思,下面我們用兩種方法來證明歐幾裡得算法。

方法一:代數法

我們要求整數{m, n},約定|m| ≥ |n|的最大公約數,就是gcd(m, n) = gcd(n, m mod n),下面開始證明。

{m, n}中有一個數字為0,因為約定了|m| ≥ |n|,所以假設n是0吧。此時gcd(m, n) = m,這一步很好理解。{m, n}中m剛好能被n整除時,gcd(m, n) = n,這個也很好理解。除去上面兩種情況的話,剩下的就是gcd(m, n) = gcd(n, m mod n)直觀來看,有|m mod n| < |n|;設a 是{m, n}的一個公約數,此時令m = ax, n = ay, m mod n = z;m/n 的商為b, 此時m = bn + z;因為a是{m, n}的公約數,m = bn +z;可以推導出z必然能被a整除,否則a是{m, n}的公約數就不成立;因此可以得出{m, n}的公約數必然是{n, m mod n}的公約數,也就是gcd(m, n) = gcd(n, m mod n);依次類推就得到gcd(n, m mod n) = gcd(m mod n, n mod (m mod n)),直到餘數是0為止;然後根據上面第二種情況的出的結論可知輾轉相除到餘數為0時,較小的那個數就是{m, n}的最大公約數,證明完畢。

方法二:圖像法

其實{m, n}兩個數可以看作長方形的兩條邊,m是長, n是寬;AB = n, BC = m,為了直觀,圖中的長方形由若干個邊長為1的正方形組成;為了簡單起見,上圖中m =21, n = 14;只需要用邊長為n的正方形ABFE去覆蓋長方形ABCD,此時FC的長就是m mod n,且 FC一定小於BF;設a是{m, n}的一個公約數,則以a為邊長的正方形必然能夠完全的覆蓋以m和n為長和寬的長方形;如上圖所示,藍色區域的正方形就是邊長為n的正方形,覆蓋完之後,FC就是m mod n;此時再用邊長為 m mod n的正方形去覆蓋長方形EFCD,也就是圖中的綠色區域和黃色區域,本示例中剛好被邊長為FC = 7的正方形完全覆蓋完,因此本示例中的gcd(m, n) = gcd(n, m mod n) = 7;任意兩個數都可以以此類推,在本示例中輾轉第二次剛好覆蓋完,所以輾轉相除法也確實形象;經過上面的直觀說明可以看出,當最後一次輾轉後的整數個正方形剛好能夠完全覆蓋長方形面積的時候,此時該正方形的邊長就是gcd(m, n),,也就是說gcd(m, n) = gcd(n, m mod n) = gcd(m mod n, n mod (m mod n)), 直到兩數相除餘數為0,此時較小的那個數就是{m, n}的最大公約數,這樣說明不夠直觀地話,看看下圖中相對較複雜的示例。

上圖中的過程用數學語言描述就是gcd(38,16) = gcd(16, 38 mod 16) = gcd(16, 6) = gcd(6, 4) = gcd(4, 2) = 2,證明結束。

2、中華更相減損術

更相減損術也叫做中華更相減損術,是出自《九章算術》的一種求最大公約數的算法。其實理解了歐幾裡得算法的話,它非常簡單。而且就效率而言,歐幾裡得算法的效率更高。但這裡也說明一下更相減損術是怎麼一回事,更相減損術就是任意給定兩個正整數以大的數減小的數,接著把所得的差與較小的數比較,並以其中的大數減小數。繼續這個操作,直到所得的減數和差相等為止。此時減數就是最大公約數。

假設我要求{128,60}的最大公約數,執行如下步驟:

第一步:128 - 60 = 68;

第二步:68 - 60 = 8;

第三步:60 - 8 = 52;

第四步:52 - 8 = 44;

第五步:44 - 8 = 36;

第六步:36 - 8 = 28;

第七步:28 - 8 = 20;

第八步:20 - 8 = 12;

第九步:12- 8 = 4;

第十步:8 - 4 = 4;

此時128和60的最大公約數就是4 。

下面用歐幾裡得算法來求一下128和60的最大公約數:

128/60 = 2 餘數8;

60/8 = 7 餘數4;

8/ 4 = 2餘數0;

此時4就是最大公約數。

對比上面兩種算法發現什麼沒?沒錯,更相減損術多步減法相當於歐幾裡得算法的一部除法。因此歐幾裡得算法效率更高,理解了歐幾裡得算法,更相減損術無需證明即可直觀理解。

3、兩個算法的編程實現

約定m≥n,歐幾裡得算法C語言版:

unsignedintgcd(unsignedint m, unsignedint n){unsignedint rem;while(n > 0){ rem = m % n; m = n; n = rem; }return m;}

如果使用遞歸的話代碼更精簡:

unsignedintgcd(unsignedint m, unsignedint n){n == 0 ? m : gcd(n, m % n)}

歐幾裡得算法python 3版:

defgcd(m, n):return m if n == 0else gcd(n, m % n)

約定m≥n, 更相減損術C語言版:

unsignedintgcd(unsignedint m, unsignedint n){unsignedint rem;while(!(m == n)){if(m > n) { rem = m; m = n; n = rem - n; }else { n = n -m; }return m; }

更相減損術python 3版:

defgcd(m, n):while(m - n != n):a = m - nif a > n: m = aelse: m = n n = a print(n)

相關焦點

  • 漫畫算法:輾轉相除法是什麼鬼?
    輾轉相除法, 又名歐幾裡得算法(Euclidean algorithm),目的是求出兩個正整數的最大公約數。它是已知最古老的算法, 其可追溯至公元前300年前。更相減損術, 出自於中國古代的《九章算術》,也是一種求最大公約數的算法。
  • 偉大的數學家歐幾裡得
    2.人物故事懂幾何者歐幾裡得(Euclid)是古希臘著名數學家、歐氏幾何學開創者。歐幾裡得出生於雅典,當時雅典就是古希臘文明的中心。濃鬱的文化氣氛深深地感染了歐幾裡得,當他還是個十幾歲的少年時,就迫不及待地想進入柏拉圖學園學習。
  • 10.裴蜀定理和歐幾裡得算法快速求解倒水問題
    怎麼求倒水的步驟,在介紹BFS(廣度優先搜索)算法的時候再講。雖然水杯沒有刻度, 但我們總是可以倒入整杯的水 +a,+b,或者倒出整杯的水 -a,-b。 那麼我們可以把問題簡化為一個表達式。x * a + y * b = c也就是說,倒入或倒出x次a杯,倒入或倒出y次b杯,是否可以得到c升水。我們要求解的是,是否存在這樣的整數 x, y 使得等式成立。
  • 什麼是「歐幾裡得距離」(ED)?| 群體遺傳專題
    要理解歐幾裡得距離,我們先要了解歐幾裡得空間。我們通常所在的空間是三維空間,三維空間任意的點可以被一個三維的坐標定義。而將三維拓展為更高的n維,即得到了n維歐幾裡得空間。而在n維空間中兩個點之間的距離,我們就稱之為歐幾裡得距離。在具體的應用中,如果一組數據擁有n個相互獨立的變量,我們就可以將其置於n維的歐幾裡得空間中,並應用歐幾裡得距離來量化兩組數據之間的差異。
  • 歐幾裡得幾何方法:用直覺思維證明圓的面積
    對直覺思考者來說,用文字來證明是一件乏味的事情。這就是為什麼著名的數學家經常強調直覺的重要性。我們都知道圓的面積是πr^2,但是我們如何證明這個公式對每個圓都是正確的呢?有一種優美的方法:作為最偉大的數學家之一,歐幾裡得以一種美麗的方式證明了圓的面積,這可以幫助我們更早地理解微積分的概念歐幾裡得就是把一個圓切成4個、6個、8個、16個,或者無窮多個相等的像橘子一樣的小塊,然後把它們重新排列成一個矩形。
  • 著寫流傳2300年數學經典,被世人稱為「幾何學之父」——歐幾裡得
    歐幾裡得,有時被稱為亞歷山大裡亞的歐幾裡得,以便區別於墨伽拉的歐幾裡得,希臘化時代的數學家,被稱為「幾何學之父」。他活躍於託勒密一世時期的亞歷山大裡亞,也是亞歷山太學派的成員。他在著作《幾何原本》中提出五大公設,成為歐洲數學的基礎。歐幾裡得也寫過一些關於透視、圓錐曲線、球面幾何學及數論的作品。歐幾裡得幾何被廣泛地認為是數學領域的經典之作。
  • 數學名人 | 歐幾裡得
    直到現在,我們都無法得知歐幾裡得的生卒日期、地點和細節。 直到現在,我們還沒有找到任何歐幾裡得在世時期所畫的畫像,所以現存的歐幾裡得畫像都是出於畫家的想像。此外,一些中世紀時期的作家經常把歐幾裡得與麥加拉的歐幾裡得(一位受蘇格拉底影響的哲學家)弄混。
  • 10 個用圖形證明數學定律的例子,直觀領略數學公式的簡潔優雅
    證明數學定律不一定非要用枯燥的數學公式,如果用能用簡單的圖形表示公式中的項目(例如某個數的平方可以用一個正方形表示,立方則可以用立方體代替),證明過程將會變得更加直觀易懂,更加簡單和優雅。以下就是幾個經典的例子。
  • 算法是個什麼鬼?其實很簡單!
    對於某些這樣的計算過程,必須嚴格定義算法:以它在所有可能出現的情況下應用的方式指定。也就是說,任何有條件的步驟都必須系統地逐個處理;每種情況的標準必須是明確的(並且是可計算的)。由於算法是精確步驟的精確列表,因此計算順序對算法的運行始終至關重要。通常假定指令被明確地列出,並且被描述為「從上到下」的開始,這是一種更正式地由控制流描述的思想。
  • 歐幾裡得與《幾何原本》(上篇)
    1847年出版的Oliver Byrne彩圖版《幾何原本》中的第1卷命題47:勾股定理(畢達哥拉斯定理)的證明。這或許是數學史上最著名的證明之一。但彼時的歐洲正處於基督教統治下的中世紀,「夜正長,路也正長」,《幾何原本》被剝去證明,以所謂「簡寫本」為主的形式,如沒有血肉的骷髏般地流傳著,歐幾裡得則幾乎被「忘卻」。直到16世紀,才終於有了直接譯自希臘文的拉丁文版和英文版。但直到18世紀,所有版本都直接間接地源自「賽翁版」,其中包含了賽翁所作的許多修改。在賽翁所作的修改中,關鍵性的一個出現在第6卷的命題33。
  • 細數那些改變計算技術的偉大算法
    這種方法被證明,是最有效的編碼方法。由於這種方法簡單、高效,這種方法被用在很多的壓縮方法中比如:DEFLATE(PKZIP壓縮軟體中的算法),以及很多的多媒體編碼包括JPEG和MP3中。密碼學公共秘鑰加密
  • 鄒平人劉徽可與歐幾裡得相提並論
    □王紅軍 李 偉 董乃德 報導  本報鄒平訊 6月22日至23日,紀念劉徽注《九章算術》1750周年國際學術研討會在鄒平舉行,來自國內外長期研究劉徽思想的40多位專家對劉徽的數學思想、率的古今運用等內容進行了研討,認為劉徽應該與歐幾裡得、阿基米德等相提並論。
  • 愛因斯坦的偶像歐幾裡得
    提供了智慧的源泉,但關於他自己本身,世人卻知之甚少,他就像一粒碎沙,悄無聲息地在歷史輪迴中,逐漸失去蹤跡,至今關於他的記載,也只有廖廖幾語,但我們仍能從,那隻字片語間,看到一份高深莫測的智慧,看到一位驚豔世俗的天才學者,走進他的幾何王國,公元前330年,歐幾裡得在雅典出生,當時的雅典,正是古希臘文明的中心,濃鬱的文化氣息素繞在。
  • 理解高維的數學——一個4維以上歐幾裡德距離的直觀證明
    在一個每一個新特性都是另一個維度的世界裡,很容易失去對更高維度的真正理解,以及它們是如何工作的,這對設計算法和數據分析很有幫助。幾乎所有的機器學習算法都要求在多維空間中找到兩點之間的歐幾裡得距離——一條直線。在本文中,您將了解如何在4+維中計算歐式距離。最初的勾股定理指出,在一個二維直角三角形中三條邊a,b,c滿足: a+ b= c。
  • 歐幾裡得和他的《幾何原本》
    但不可否認的是,每一次對數域的擴充,都使得人類對宇宙的認識更近了一步。畢達哥拉斯派對古希臘的數學研究影響巨大,因為教義的狹隘性,使得古希臘人對數學基礎的研究小心翼翼,就連三四百年後的阿基米德在論證或描述定理時都會優先考慮選用幾何方式,而不是數學公式。也正是如此,幾何圖形成了古希臘數學家們的主要研究對象。
  • 數學巨人——歐幾裡得,是如何影響世界幾千年的?
    在耶穌之前,幾何學比數字更重要。例如,當西方世界上第一所高等教育機構的創始人柏拉圖回到雅典時,他決定成立「學院」,在那裡它將成為世界的知識中心。為此,他刻上了「ΑΓΕΩΜΕΤΡΗΤΟΣΜΗΔΕΙΣΕΙΣΙΤΩ」的字樣(希臘語譯為「不要讓任何不懂幾何的人進入」)。柏拉圖關於理想世界的觀點與美和智慧有很強的聯繫,這兩者都在數學中被很好地體現。