为什么这是费马因式分解的错误实现?

Why is this an incorrect implementation of Fermat's Factorization?

我目前正在通过 Project Euler 工作,这是我在 Python 中对问题 3 的尝试。我 运行 这个并让它持续大约 30 分钟。之后,我查看了"sum"下的数字。我发现了几个问题:其中一些数字是偶数,因此不是素数,而其中一些数字甚至不是 n 的真因数。 G运行ted,它们仅相差 0.000001(通常除法产生 x.99999230984 或其他)。我最终停在的数字是 3145819243.0。

谁能解释为什么会出现这些错误?

编辑:我对这个定理的解释基本上是,通过变量的后运行ging,你可以用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)。