解答例:練習問題_3_14(最大公約数② 素因数分解を参考に)
import time
a, b = 46670393, 29699341
t_start = time.time()
counter = 0
x_start = 2
g = 1
while True:
for x in range(x_start, min(a, b) + 1):
counter += 1
if (a%x == 0) and (b%x == 0):
a, b, x_start = a//x, b//x, x
g *= x
break # for文のbreak
else: # 公約数を持たない整数同士が残った場合
break # while文のbreak
print('g:', g)
print('run time:', time.time() - t_start, 's')
print('counter: ', counter)
g: 4242763
run time: 0.017847061157226562 s
counter: 86588
確認はこちらもgが一致していればOKです。
カウンター(counter)の回数は①に比べ 86588/29699341 = 約0.29% となり実行時間も0.017847/2.3955 = 約0.75% とかなり減っています。
但し、これは a と b に入力する値によって減り方が変わります。例えば大きさが同じくらいの
a, b = 46670399, 29699507 (共に素数)
を入力してみると、最大公約数(g)は1で、カウンターはほぼ同じですが、実行時間は筆者のPC上で①の場合 3.68秒 ②では 3.83秒と若干②が多くなっています。だからと言って今回の②のコード改良が無意味と言うことはできませんが、それぞれの特徴は把握しておくべきかと思います。