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算法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 拥有百万粉丝的大牛讲述学Android的
- 下一篇: gcd算法以及exgcd