python求最大公因數函式 最大公因數的前世今生

2021-10-12 19:49:16 字數 2933 閱讀 3484

作者 |大小吳

** |大小吳的數學課堂

今天大小吳來和大家聊一聊最大公因數的前世今生。

最大公因數(greatest common divisor),也稱最大公約數、最大公因子,指兩個或多個整數共有因數中最大的乙個。,的最大公因數可記為或,多個整數的最大公因數也有同樣的記號。求最大公因數有多種方法,比如我們小學就學過的質因數分解法、短除法。

而歐幾里得在《幾何原本》第ⅶ卷中正是運用了線段及其長度解釋了最大公因數問題,並凝練出了世界上最早的演算法——輾轉相除法(也稱歐幾里得演算法),具體可見定義ⅶ.12、命題ⅶ.1和命題ⅶ.2.

定義ⅶ.12:只能被作為公約的乙個單位量所測盡(整除)的幾個數稱為互質數。

命題ⅶ.1:設有不等兩數,從大數中連續減去小數直到餘數小於小數,再從小數中連續減去餘數直到小於餘數,這樣一直下去,如果餘數測不盡其前乙個數,直到最後的餘數為乙個單位,那麼該二數互質。

求證:和互質,即只有乙個單位能測盡和.

證明:如果和不互質,那麼總有某個數測盡它們,令其為(這裡).

令:測量得,餘下小於. 令:測量得,餘下小於. 令:測量得,餘下單位量.

因為測盡,測盡,所以:測盡.

又因為測盡,所以:它測盡餘值.

同理可得也可以測盡餘值.

最終可得可以測盡單位量,這是不可能的,因為而。

因此:和只能被作為公約的乙個單位量所測盡,即:和互質(定義ⅶ.12)。

命題ⅶ.2:給定兩個不互質的數,可以(用輾轉相除法)找到它們的最大公因數。

這裡需分類討論:

①如果能測盡,則必然是和的最大公因數。

②如果測不盡,那麼:就用餘數去量,如果量不盡,又用後邊的餘數去量前邊的餘數,直到後邊的餘數測盡前邊的餘數。

這最後的餘數不是乙個單位,否則和互質,這與假設矛盾。所以:某數可以測盡它前面數的餘數。

這裡和命題ⅶ.1的操作類似,測得,測得,設最後測盡.同樣地,可推得同時測盡和,即是和的乙個公因數。

以下進一步說明它一定是最大的。

如果不是和的最大公因數,那麼必有乙個大於的某數同時測盡和.

那麼,因為測盡,測盡,所以也測盡,又它測盡整個,所以它測盡餘值.同理,測盡餘值,但這是不可能的,因為較大數不可能測盡較小數,矛盾。

所以沒有大於測盡和的數,即是和的最大公因數。

在這一命題中,再次使用了輾轉相除法求兩個不互質的數的最大公因數,大數反覆減小數,直到餘數小於小數。比如要求,首先,從104中反覆減去40,直到餘數(24)小於40,即再從40中反覆減去24得餘數16,即再從24中反覆減去16得餘數8,即最後停止,因為8可以整除16.於是我們找到了這裡其實也可以用圖形來解釋這一過程:如圖是邊長為40和104的矩形,求就等價於這樣乙個問題:找乙個最大的,邊長為的正方形使它能夠填滿整個矩形,那麼即有

歐幾里得在《幾何原本》中對輾轉相除法的討論一直可以延申到對無理量和不可公度量的分析中去(同樣也是用幾何作圖的方法),十分有趣,之後我們會再另寫一篇加以討論。

輾轉相除法用現代數學語言可以描述為

設兩數,,則

(不妨設 且,不為0,指求餘運算,為除以的餘數)

即兩個正整數的最大公約數等於其中較小的那個數和兩數相除餘數的最大公因數。

因此輾轉相除法就是以除數和餘數反覆做除法運算,當餘數為0時,取當前算式除數即為最大公因數。

除了西方,其實在古老的東方,我國古代聰明的數學家們也早已揭示了最大公因數的秘密——運用更相減損術求最大公因數。

更相減損術是《九章算術》中一種求最大公因數的演算法,它原本是為約分而設計的,但它同時也適用於求兩個數的最大公因數。《九章算術》原文記載:

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

這句古文的意思是:

舉個例子,用更相減損術求104和40的最大公因數.

得到最後減數和差都是1,則停止輾轉相減。

所以,104和40的最大公因數等於1乘以第

一、二、三步中約掉的3個2,即

可以發現,輾轉相除法和更相減損術乙個用除法,乙個用減法,但細想其原理則是異曲同工的,其作為求最大公因數的演算法,其結果也是殊途同歸的。不管是東方還是西方,都蘊藏著燦爛輝煌的數學成就,凝結了人類智慧型的結晶。

參考文獻[1]歐幾里得.幾何原本[2]九章算術

求最大公因數的三種演算法

include using namespace std intfun int a,int b else fun b,a intmain 在這裡插入 片 include using namespace std intfun2 int a,int b return c int main include ...

求最大公因數和最小公倍數

利用更相減損術與輾轉相除法來實現求最大公因數與最小公倍數的功能。如下 博主入門不久,還請神犇們多指教 include include using namespace std int number1,number2,number3,number4,answer void change 自定義函式,用於...

前端JS演算法之最大公因數

概念 最大公因數 也稱最大公約數 最大公因子,指兩個或多個整數共有約數中最大的乙個。約數 又稱因數。整數a除以整數b b 0 除得的商正好是整數而沒有餘數,我們就說a能被b整除,或b能整除a。a稱為b的倍數,b稱為a的約數。邏輯步驟 第一種演算法邏輯 1 最大公因數,就是兩個數都能整除的最大除數。2...