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 多個整數的最大公約數也有同樣的記號。求最大公約數有多種方法,常見的有質因數分解法 短除法 輾轉...