我目前正在通过 Project Euler,这是我在问题 3 中的尝试(在 Python 中)。我运行了它并让它运行了大约 30 分钟。在此之后,我查看了“sum”下的数字。我发现了几个问题:其中一些数字是偶数,因此不是质数,其中一些数字甚至不是 n 的适当因数。当然,它们仅相差 0.000001(通常除法产生 x.99999230984 或其他)。我最终停下来的号码是 3145819243.0。

谁能解释为什么会发生这些错误?

编辑:我对定理的解释基本上是,通过重新排列变量,您可以用 n + y^2 的平方根求解 x,并且 y 将被强制执行直到它是一个整数。在此之后,实际的质因数将是 x+y。

这是我的代码。

import math
n = int(600851475143)
y = int(1)
while y >= 1:
    if math.sqrt(n + (y**2)).is_integer():
        x = math.sqrt(n + (y**2))
        print "x"
        print x
        print "sum"
        print x + y
        if x + y > (600851475142/2):
            print "dead"
        else:
            print "nvm"
    y = y + 1

最佳答案

大数和浮点精度的典型问题。

当您到达 y = 323734167 时,您计算 math.sqrt(n + y**2) ,即 math.sqrt(104804411734659032)

这是根据 wolfram alpha 的 3.23735095000000010811308548429078847808587868214170702... × 10^8,即不是整数,而是根据 python 的 323735095.0

如您所见,python 没有看到 .00000001... 的精度。

您可以测试结果的平方,而不是测试 is_integer :

 > 323735095 ** 2
=> 104804411734659025

并查看它是否与输入匹配(它不匹配,输入是 104804411734659032 ,关闭 7)。

关于python - 为什么这是费马因式分解的错误实现?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43815847/

10-13 00:58