日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

python实现GCD算法

發布時間:2023/12/18 python 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python实现GCD算法 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

GCD算法

采用Python實現四種最大公約數(greatest common divisor)算法,并比較評估性能。

1 算法原理

  • 1 輾轉相除法

已知a,b,c為正整數,若a除以b余c,則GCD(a,b)=GCD (b,c)。

  • 2 更相減損術

任意給定兩個正整數,若是偶數,則用2約簡。

以較大的數減較小的數,接著把所得的差與較小的數比較,并以大數減小數。

繼續這個操作,直到所得的減數和差相等為止。

  • 3 除窮舉法

將小數依次除N(N為從1開始的自然數,結果不為整數則跳過),對得到的數判斷其是否可被大數整除。

  • 4 減窮舉法

將小數依次減1,對得到的數判斷其是否可被兩數整除。

2 實現方式

#! usr/bin/env pythonimport random, time#最大公約數(輾轉相除法) def gcd1 (num1, num2):t = time.time()if num1 < num2: #調整大小順序num1, num2 = num2, num1else:passcount = 1while num2 != 0: #輾轉相除num1, num2 = num2, num1 % num2count += 1return [num1, count, time.time() - t]#最大公約數(更相減損術) def gcd2 (num1, num2):t = time.time()a = 1while (num1 % 2 ==0) and (num2 % 2 ==0): #均為偶數除2num1, num2 = num1 / 2, num2 / 2a *= 2 count = 1while num2 != 0: #更相減損術if num1 < num2: #調整大小順序num1, num2 = num2, num1num1, num2 = num2, num1-num2count += 1return [num1 * a, count, time.time() - t]#最大公約數(除窮舉法) def gcd3 (num1, num2):t = time.time()if num1 > num2: #取初始值a = num2b = num1else:a = num1b = num2count = 1a_0 = awhile (b % a != 0): #窮舉if a_0 % (count +1) == 0:a = a_0 / (count +1)count += 1return [a, count, time.time() - t]#最大公約數(減窮舉法) def gcd4 (num1, num2):t = time.time()if num1 > num2: #取初始值a = num2else:a = num1count = 1while (num1 % a != 0) | (num2 % a != 0): #窮舉a -= 1count += 1 # if count >= 1e6: # a = 0 # breakreturn [a, count, time.time() - t]def main():rg = 1E8a = random.randrange(rg)b = random.randrange(rg)g1 = gcd1(a, b)g2 = gcd2(a, b)g3 = gcd3(a, b)g4 = gcd4(a, b)print('GCD of (%d, %d):' % (a, b))print('輾轉相除法: %d (%d次, %.3fs)' % (g1[0], g1[1], g1[2]))print('更相減損術: %d (%d次, %.3fs)' % (g2[0], g2[1], g2[2])) print('除窮舉法: %d (%d次, %.3fs)' % (g3[0], g3[1], g3[2]))print('減窮舉法: %d (%d次, %.3fs)' % (g4[0], g4[1], g4[2])) if __name__ == '__main__':main()

3 評估結果

計算兩個隨機數的最大公約數,比較四種算法的循環次數、耗時。

輾轉相除法、更相減損術的效率遠高于窮舉法,且這兩個方法的計算規模幾乎不受計算對象量級的影響。

輾轉相除法的效率最高,更相減損術次之。除窮舉法的效率高于減窮舉法。

結果1:(百萬級)

GCD of (4456836, 6457982):

輾轉相除法: 2 (15次, 0.000s)

更相減損術: 2 (52次, 0.001s)

除窮舉法: 2 (2228418次, 2.023s)

減窮舉法: 2 (4456835次, 4.093s)

結果2:(千萬級)

GCD of (12689792, 12690312):

輾轉相除法: 8 (6次, 0.000s)

更相減損術: 8 (24418次, 0.022s)

除窮舉法: 8 (1586224次, 1.471s)

減窮舉法: 8 (12689785次, 12.072s)

結果3:(億級)

GCD of (135034734, 749274957):

輾轉相除法: 3 (19次, 0.000s)

更相減損術: 3 (112次, 0.000s)

除窮舉法: 3 (45011578次, 41.658s)

減窮舉法: 3 (135034732次, 129.202s)

總結

以上是生活随笔為你收集整理的python实现GCD算法的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。