试图理解项目Euler#3的解决方案

时间:2013-11-12 11:29:07

标签: python python-3.x

  

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))

以下是我自己无法理解的内容:

  1. 在第二个while循环中,为什​​么他使用的是sqrt(n + 1)而不只是sqrt(n)
  2. 在第一个while循环中迭代偶数时,为什么不使用sqrt(n + 1)
  3. 算法如何设法只找到素因子?在我第一次写的算法中,我有一个单独的测试,用于检查一个因子是否是素数,但他没有打扰。

1 个答案:

答案 0 :(得分:2)

  1. 我怀疑+1float的不精确有关(我不确定它是否真的需要,或者只是对作者的防御性举动&# 39;部分)。

  2. 第一个while循环因子n中的所有两个因子。我不知道sqrt(n + 1)如何适合那里。

  3. 如果您从小因素到大因素工作,您将自动消除所有复合候选者。考虑一下:一旦你考虑了5,你就会自动将101520等因素排除在外。无需检查是否他们是否为素数:到那时n将无法被他们整除。

  4. 我怀疑检查素性是否会扼杀原始算法的性能。