使用Python求解最大公約數的實現方法

2022-10-04 03:54:10 字數 2469 閱讀 7549

1. 歐幾里德演算法

歐幾里德演算法又稱輾轉相除法, 用於計算兩個整數a, b的最大公約數。其計算原理依賴於下面的定理:

定理: gcd(a, b) = gcd(b, a mod b)

證明:  a可以表示成a = kb + r, 則r = a mod b

假設d是a, b的乙個公約數, 則有  d|a, d|b, 而r = a - kb, 因此d|r。

因此,d是(b, a mod b)的公約數。

加上d是(b,a mod b)的公約數,則d|b, d|r, 但是a = kb + r,因此d也是(a, b)的公約數。

因此,(a, b) 和(a, a mod b)的公約數是一樣的,其最大公約數也必然相等,得證。

歐幾里德的python語言描述為:

def gcd(a, b):

if a < b:

a, b = b, a

while b != 0:

temp = a % b

a = b

b = temp

return a

2. stein演算法

歐幾里德演算法是計算兩個數最大公約數的傳統演算法,無論是理論,還是從效率上都是很好的。但是他有乙個致命的缺陷,這個缺陷只有在很大的素數時才會顯現出來。

考慮現在的硬體平台,一般整數最多也就是64位, 對於這樣的整數,計算兩個數值就的模很簡單的。對於字長為32位的平台,計算兩個不超過32位的整數的模,只需要乙個指令週期,而計算64位以下的整數模,也不過幾個週期而已。但是對於更大的素數,這樣的計算過程就不得不由使用者來設計,為了計算兩個超過64位的整數的模,使用者也許不得不採用類似於多位除法手算過程中的試商法,這個過程不但複雜,而且消耗了很多cpu時buobyng間。對於現代密碼演算法,要求計算128位以上的素數的情況比比皆是,設計這樣的程式迫切希望能夠拋棄除法和取模。

stein演算法由j.stein 2023年提出,這個方法也是計算兩個數的最大公約數。和歐幾里德演算法不同的是,steinwww.cppcns.com演算法只有整數的移位和加減法,這對於程式設計者是乙個福音。

為了說明stein演算法的正確性,首先必須注意到以下結論:

gcd(a, a) = a, 也就是乙個數和他自己的公約數是其自身。

gcd(ka, kb) = k * gcd(a, b),也就是最大公約數運算和倍乘運算可以交換,特殊的,當k=2時,說明兩個偶數的最大公約數比如能被2整除。

stein演算法的python實現如下:

def gcd_stein(a, b):

if a < b:

a, b = b, a

if (0 == b):

return a

if a % 2 == 0 and b % 2 == 程式設計客棧0:

return 2 * gcd_stein(a/2, b/2)

if a % 2 == 0:

return gcd_stein(a / 2, b)

if b % 2 == 0:

return gcd_stein(a, b / 2)

return gcd_stein((a + b) / 2, (a - b) / 2)

3. 一般求解實現

核心**很簡單:

def gcd(a, b):

if b == 0:return a

return gcd(b, a % b)

附上乙個用python實現求最大公約數同時判斷是否是素數的一般方法:

程式如下:

#!/usr/bin/env python

def showmaxfactor(num):

count = num / 2

while count > 1:

if num % count == 0:

print 'largest factor of %d is %d' % (num, count)

break #break跳出時會跳出下面的else語句

count -= 1

else:

print num, "is prime"

for eachnum in range(10,21):

showmaxfactor(eachnum)

輸出如下:

largest factor of 10 is 5

11 is prime

largest factor of 12 is 6

13 is prime

largest factor of 14 is 7

largest factor of 15 is 5

largest factor of 16 is 8

17 is prime

largest factor of 18 is 9

19 is prime

largest factor of 20 is 10

本文標題: 使用python求解最大公約數的實現方法

本文位址: /jiaoben/python/129954.html

求解最大公約數問題

最大公因數,又稱最大公約數。是指 n 2 個自然數 a1,a2,an 的最大公因數。通常有兩種表示方式 它們的所有公因數中最大的那乙個 如果自然數 m 是這 n 個自然數的公因數,且這 n 個數的任意公因數都是 m 的因數,就稱 m 是這 n 個數的最大用因數。通常國內的記述方式為 a1,a2,an...

最大公約數

1.執行最大公約數的常用演算法,並新增異常處理模組 如輸入非法等 在基礎程式的基礎上,可以考慮手動輸入所有數字或者利用隨機數產生數字,分別加入異常處理模組。注 隨機數的產生方法 srand 的作用是提供乙個種子。然後呼叫rand 其格式為int rand void 它會根據提供給srand 的種子值...

最大公約數

最大公因數 greatest common divisor 也稱最大公約數 最大公因子,指兩個或多個整數共有約數中最大的乙個。a,b的最大公約數記為 a,b 同樣的,a,b,c的最大公約數記為 a,b,c 多個整數的最大公約數也有同樣的記號。求最大公約數有多種方法,常見的有質因數分解法 短除法 輾轉...