この関数は、入力の連続する要素を見つけることによって機能します。それが見つける最初の要因は必然的に素数になります。素因数が見つかった後、それは元の数から除算され、プロセスが続行されます。それらをすべて分割するまでに(1、または現在の係数(i)を残す)、最後の(最大の)ものが得られます。
ここにトレースコードを追加しましょう:
def Euler3(n=600851475143):
for i in range(2,100000):
while n % i == 0:
n //= i
print("Yay, %d is a factor, now we should test %d" % (i, n))
if n == 1 or n == i:
return i
Euler3()
これの出力は次のとおりです。
$ python factor.py
Yay, 71 is a factor, now we should test 8462696833
Yay, 839 is a factor, now we should test 10086647
Yay, 1471 is a factor, now we should test 6857
Yay, 6857 is a factor, now we should test 1
確かに、一般的な解決策では、範囲の上限はnの平方根であるはずですが、Pythonの場合、呼び出しmath.sqrt
は浮動小数点数を返すため、元のプログラマーは怠惰なショートカットを使用していたと思います。このソリューションは一般的には機能しませんが、オイラープロジェクトには十分でした。
しかし、アルゴリズムの残りの部分は健全です。