偽從零開始學算法 - 2.2 求最大公約數

2021-01-12 銀蛇蠟象

簡介

兩個或多個正整數數的公約數是,對於這些數,存在一個正整數,可以整除它們。公約數可能有若干個,而其中最大的就是最大公約數。

也就是:

A: card(A) ≥ 2, (66 a ∈ A, a ∈ N*) ;B = {n ∈ N*| 66 x ∈ A, x mod n = 0};k = max{B};k即為A中各數的最大公約數。

從人類的做法推導

我們計算最大公約數的時候,通常用短除法來計算。具體的方法是:同時讓這些數除以一個比較小的公約數,得到的結果再這樣操作,直到找不到大於等於2的公約數;將除數相乘即得到最大公約數。比如:

短除法計算最大公約數

通過經驗,人是可以快速找到一些較小的公約數,寫在除數上的。但是,計算機卻無法這麼做。但是計算機可以從1開始,判斷某個整數是否能整除所有給定的數。如果能,即為公約數,記下來;否則,除數加1,再試。

但是,算法是有限的,到什麼時候停止呢?根據常理,一組數的最大公約數一定不大於這組數的最小的數。因此,如果算到這組數的最小值的話,就不用再算下去了。

由此可以推導出流程圖如下:

計算最大公約數流程圖(1)

鑑於1能夠整除所有正整數,我們可以讓循環從2開始。這樣,流程圖如下:

計算最大公約數流程圖(2)

如果我們把「66 a ∈ A, a mod i = 0?」的判斷展開,則如下:

計算最大公約數流程圖(3)

已經非常複雜了。

實際應用中,我們更多的是計算兩個數之間的最大公約數。這樣,流程圖可以簡化如下:

計算兩個數的最大公約數流程圖

不過這個方法在計算的時候,如果是小的數字還可以,遇到大數的時候,計算時間就非常長。

這時候還可以使用更加簡便的算法。

輾轉相除法

輾轉相除法又稱歐幾裡得算法,首次出現於《幾何原本》中,被人們認為是史上第一個算法。它可以用於求兩數的最大公約數。

首先,用兩數中較大數除以較小數,求得數;再用較小數和餘數按上述操作進行相除;直到餘數為0。此時的除數即為最大公約數。

流程圖表示如下:

輾轉相除法(1)

考慮到許多程式語言使用的是DO-WHILE型的直到型循環結構,還有一些語言沒有直到型循環結構,流程圖改寫為如下:

輾轉相除法(2)

其中當型的流程圖在循環結構前有一個定義變量r的操作。這裡的r的賦值只要不等於0就可以了。

此外,還有遞歸型的流程圖:

輾轉相除法(遞歸)

更相減損術

更相減損術是《九章算術》中給出的求兩個數的最大公約數的方法:

可半者半之,不可半者,副置分母、子之數,以少減多,更相減損,求其等也。以等數約之。

算法描述為:

第一步:任意給兩個正整數;判斷它們是否都是偶數,如果是,用2約簡,並記下次數;否則,進行下一步;

第二步:以較大的數減去較小的數,把差與較小的數相比,並用大數減小數。繼續此操作,使所得數相等為止。記下這個數。

第三步:如果第一步有約簡,第二步所得的數乘上2乘約簡次數就是最大公約數。否則,第二步所得的數就是最大公約數。

(人教版的教科書上對這個的解釋有問題……粗體字表示增加的內容)

流程圖如下:

更相減損術(1)

標準化後如下:

更相減損術(2)

看起來非常麻煩。

不過,還有一個簡單的算法:

更相減損術(3)

實際上這和輾轉相除法很相似了。在維基百科上,它們是在一個詞條內的,而且上面的算法被稱為歐幾裡得算法的減法形式。

三者的比較

在現代,算法之間的比較主要體現在效率上。在下面,我將使用IPython的工具來測試它們的運行速度(使用語言為Python,在安裝Windows 10 專業版和Python 3.6的華碩N551ZU上進行,結果僅供參考)。

各種算法的執行時間測試

從這裡就能看出來,雖然現在電腦硬體水平的發展相當成熟,但是各個算法之間的運行速度還是有比較明顯的差別的。

之前的那個直接求最大公約數的方法,運算速度相對於其他的算法都比較慢,尤其是在兩個數都非常大的情況下。相比之下,其他算法的運算速度和它的運算速度相差懸殊。

另外,更相減損術在兩數相差懸殊的時候,運算速度也會減慢。

從這裡我們可以看出優化算法的意義——可以顯著減少運行時間,提高效率,節能。這個測試還是在比較好的機器上進行的,如果是在簡單的單片機上,差別就更加明顯了。

參考資料

如果大家想了解關於這兩個算法的更多內容,也可以看看。

輾轉相除法 - 維基百科,自由的百科全書普通高中課程標準實驗教科書(必修) 數學(A版) 必修3. 人民教育出版社輾轉相除法、更相減損法、Stein算法 - CSDN博客

相關焦點

  • 偽·從零開始學算法 - 2.3 求圓周率
    與阿基米德相似,劉徽也是從正六邊形開始計算的。不同的是,劉徽以面積來計算。他自己通過分割圓為192邊形,計算出圓周率在3.141024與3.142704之間,取其近似值157/50。則有:S2 < S < S2 + (S2 - S1)或S2 < S < S2 + 2 * (S2 - S1)
  • 梳理使用Python實現求兩數最大公約數(四種方法) - python高手養成
    今天,我們梳理下使用Python求兩數最大公約數的方法。好了,廢話不說,我們直接梳理四種方法:分別為輾轉相除法、輾轉相減法、枚舉法和歐幾裡得算法。我們逐個進行分析。在分析之前,先欣賞一幅美景緩解下心情。。。
  • 怎樣可以很快算出最大公約數和最小公倍數?後悔知道得太晚了!
    怎樣可以很快算出最大公約數和最小公倍數?後悔知道的太晚了!求最小公倍數的基礎是求最大公約數。求最大公約數的算法是「更相減損法」或「輾轉相除法」。「更相減損法」是最早記錄於《九章算術》中的中國古法,與古希臘歐幾裡得發現的「輾轉相除法」只是形式略有不同,但其實還是一回事。
  • 如何計算兩個數的最大公約數?用世界上一個很古老的算法就可以
    不管是在學習或者生活中,我們經常會遇到要求兩個數的最大公約數的問題。最大公約數那麼,什麼是公約數?什麼是最大公約數?那麼96=2x2x2x2x2x3, 50=2x5x5然後,找出質因式中二者共同的質數。對比上面兩個式子,我們發現二者共同的只有2.因此,96和50的最大公約數就是2.如果兩個數相同的質因數多於1個呢?那麼最大公約數就是這些質因數的乘積。
  • 最大公約數:統一戰線的實質與功能
    內容提要:最大公約數是習近平在中央統戰工作會議上著重闡釋的概念之一。最大公約數這一概念概括和提升了新時期統一戰線的實質、功能及鞏固和發展統一戰線的最佳途徑。找到最大公約數是實現大團結大聯合、鞏固和發展統一戰線的根本舉措。  關 鍵 詞:最大公約數/統一戰線/大團結大聯合  人心是最大的政治,團結是永恆的主題。
  • 以最大公約數畫出最大同心圓 ——學習習近平關於正確處理一致性與...
    (二)統一戰線各個層面、各個領域的最大公約數  最大公約數本是一個數學術語,可引申為「求大同」。尋求最大公約數的過程就是求大同的過程。在政治社會領域,最大公約數理念要求在面對利益格局多元、價值取向多樣的複雜局面時,最大限度地尋求利益共同點和共同價值觀。黨的十八大以來,習近平多次指出:「凝聚共識很重要,思想認識不統一時要找最大公約數。」習近平關於最大公約數的論述是一個立意深遠、內涵豐富、博大精深的有機整體。
  • 五年級求最大公約數四年級就會做 濟南機器人編程_山東機器人編程
    五年級的求最大公約數,我們速雲少兒編程四年級的小同學就會做,你說牛不牛呢!好啦!接下來我們就切入整體,如果不會的可以也跟著我們老師的講解再學習一遍吧!求最大公約數:最大公因數,也稱最大公約數、最大公因子,指兩個或多個整數共有約數中最大的一個。
  • 「最大公約數」開闢出一條神秘通道
    透過「官評」與「民評」的高度一致,可以看出,邵陽管理處探尋到了高速公路文明創建的「最大公約數」。什麼是最大公約數?兩個或兩個以上的自然數中,能夠共同被一些數整除,其中一個最大的整除數,就是這些自然數的最大公約數。比如8、12,能同時被2和4整除,4才是8和12的最大公約數。這個小學數學常識,引申到社會實踐中,指各方面都能同時最大限度地契合相容的事物或因素,就是最大公約數。
  • 事業單位考試技巧:巧用公約數與公倍數求解計算問題
    靈活應用公約數與公倍數是解決其中一部分計算問題的關鍵所在。那麼今天中公教育就為廣大考生介紹如何巧用公約數與公倍數。一、公約數與公倍數的含義公約數:如果一個整數同時是其它幾個整數的約數,我們稱這個整數為其它幾個整數的公約數。公約數中最大的即為這幾個整數的最大公約數。
  • 治理「小飯桌」要尋求最大公約數
    應該找到教育、學校、家庭與市場之間的契合點,合理地分攤責任,制定好分攤的方式和組織管理的辦法,求得各方的最大公約數。
  • 去「偽」求「原」,2020年的輸入法市場競爭到底有多激烈?
    因為從時代的進展來看,盜竊、抄襲等偽原創還是時有發生,這無論是對於原創作者還是活動組辦方,都是很不公平的。畢竟現有原創存在的意義,已然是超越了單一的金錢衡量。只有去「偽」求「原」,才能遞補持久的創新力。特別是對於目前的一些第三方輸入法,它們無法具體到實物去存在,只能以數碼等設備為載體,通過各方面的功能體驗,來贏得穩定的客戶群體。
  • 一項尋求最大公約數的全球新興公共產品
    摘要 【一項尋求最大公約數的全球新興公共產品】「一帶一路」倡議提出近六年來,通過構建高質量融資政策框架高標準開展「一帶一路」項目,以及參與主體的廣泛國際化,已成廣受歡迎的國際公共產品。
  • 富陽「請你來協商」 找到 「最大公約數」
    富陽「請你來協商」 找到「最大公約數眾人的事情由眾人商量,找到全社會意願和要求的「最大公約數」——協商民主在基層迸發出無限生機。在富春街道後周社區,通過「請你來協商·後周協商議事廳」平臺協商解決了困擾群眾多年的「馬路停車場」「背街小巷整治難」問題,不僅提升了群眾的獲得感,也大大激發了居民自治活力。
  • 從零開始學成本管理—產品成本計算的定額法
    2.缺點定額法的缺點主要是:必須制定定額成本,單獨核算脫離定額差異,在定額變動時還要修訂定額成本,計算定額變動差異,因而要增加一些核算工作量。(五)產品定額成本的計算程序和計算方法產品的定額成本包括零、部件定額成本和產成品定額成本,通常由計劃、會計等部門共同制定。在零、部件不多的情況下,一般先制定零件定額成本,然後再匯總計算部件和產成品的定額成本。零、部件定額成本還可以作為在產品和報廢零、部件計價的根據。
  • 釐清《狼圖騰》價值的最大公約數
    既然無人有權喝止「亂花漸欲迷人眼」的爭議,也許我們能做當做的只能是:一方面,突圍詭辯、絕對、狹隘、嫉妒思維的迷霧,去粗取精、去偽存真、由此及彼、由表及裡地找到《狼圖騰》價值的最大公約數;再一方面,化複雜為簡單,像央視《焦點訪談》那樣「用事實說話」。換言之,用事實和常識臧否判斷,而非偏信輕信。    恐怕沒有人否認,在中國當代小說史上,《狼圖騰》創造的奇蹟至今乏人撼動。
  • Re從零開始的異世界生活2,結局竟然是這樣的!
    《Re:從零開始的異世界生活》(日語:Re:ゼロから始める異世界生活)是長月達平所作的日本輕小說作品,簡稱《Re:Zero》(日語:リゼロ),插圖由大冢真一郎繪畫。現已出版本篇20冊、短篇集4冊和外傳3冊。