13195的主要因素是5,7,13和29。 600851475143的最大主要因素是什么? @ http://projecteuler.net/problem=3
我与自己达成协议,如果我无法解决项目欧拉问题,我会理解我能找到的最佳解决方案。我确实编写了一个算法,该算法适用于较小的数字,但效率太低,不能用于较大的数字。所以我用Google搜索了Zach Denton's并开始研究它。
这是他的代码:
#!/usr/bin/env python
import math
def factorize(n):
res = []
# iterate over all even numbers first.
while n % 2 == 0:
res.append(2)
n //= 2
# try odd numbers up to sqrt(n)
limit = math.sqrt(n+1)
i = 3
while i <= limit:
if n % i == 0:
res.append(i)
n //= i
limit = math.sqrt(n+i)
else:
i += 2
if n != 1:
res.append(n)
return res
print max(factorize(600851475143))
以下是我自己无法理解的内容:
sqrt(n + 1)
而不只是sqrt(n)
? sqrt(n + 1)
? 答案 0 :(得分:2)
我怀疑+1
与float
的不精确有关(我不确定它是否真的需要,或者只是对作者的防御性举动&# 39;部分)。
第一个while
循环因子n
中的所有两个因子。我不知道sqrt(n + 1)
如何适合那里。
如果您从小因素到大因素工作,您将自动消除所有复合候选者。考虑一下:一旦你考虑了5
,你就会自动将10
,15
,20
等因素排除在外。无需检查是否他们是否为素数:到那时n
将无法被他们整除。
我怀疑检查素性是否会扼杀原始算法的性能。