为什么这是费马因式分解的错误实现?
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)。
我目前正在通过 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)。