【问题标题】:Fermat Factorization not work (python)费马分解不起作用(python)
【发布时间】:2014-12-29 20:47:15
【问题描述】:

我已经编写了这段代码(在 python 中)用于分解素数中的整数(费马定理)。

#!/usr/bin/python2

import random,math


n=590632926550117049 

a=math.ceil(math.sqrt(n))
b2=a*a-n

while math.sqrt(b2)!=math.floor(math.sqrt(b2)): 
    a=a+1
    b2=a*a-n

b=math.sqrt(b2)

p=a+b
q=a-b

print("p =",p)
print("q =",q)

数字 n=59063292655011704957848543*10209987943 的乘积,但 我的程序 返回:1156469901*510720535。为什么 ?

编辑: 即 187 或 15 或其他数字可以正常工作。

【问题讨论】:

标签: python factorization


【解决方案1】:

math.sqrt() 使用标准 IEEE 64 位值。它只能准确计算小于 ~2**53 的参数。你的 n 值大于那个值。

如果您想要大数的精确整数平方根,我推荐gmpy2

免责声明:我维护 gmpy2。

编辑:这是您的程序的更新版本。

import gmpy2

n = 590632926550117049

a = gmpy2.isqrt(n) + 1
b2 = a * a - n

while not gmpy2.is_square(b2):
    a = a + 1
    b2 = a * a - n

b = gmpy2.isqrt(b2)

p = a + b
q = a - b

print("p =", p)
print("q =", q)

【讨论】:

  • 我将代码中的所有“math.sqrt”替换为“gmpy2.sqrt”,但结果不正确。 p 和 q 是错误的。
  • 请使用“gmpy2.isqrt”获取精确的整数结果。 "gmpy2.sqrt" 以 53 位的默认精度计算浮点结果。您可以提高精度,但使用“gmpy2.isqrt”是更好的选择。
  • 如果我使用 gmpy2.isqrt 我在计算 b2=aa-n 时会出错,因为 aa 小于 n(现在我的 b2 是负数!)。
  • gmpy2.isqrt 等价于 floor(sqrt)。由于您需要 ceil(sqrt),因此您需要添加 1。(您应该首先检查 n 不是一个完美的正方形。)我已将修改后的程序版本添加到我的答案中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多