尝试大值时的Integeroverflow - 分解算法

时间:2016-03-09 15:48:09

标签: python python-3.x rsa integer-overflow

我尝试实施Fermat的分解方法(参见https://en.wikipedia.org/wiki/Fermat%27s_factorization_method),这里是代码:

import math
def is_square(apositiveint):
  x = apositiveint // 2
  seen = set([x])
  while x * x != apositiveint:
    x = (x + (apositiveint // x)) // 2
    if x in seen: return False
    seen.add(x)
  return True

def fermat(n):
    a = math.ceil(math.sqrt(int(n)))
    b2 = a*a - n
    while not is_square(b2):
        a = a+1
        b2 = a*a - n
    return (a-math.sqrt(b2))

所以我的目标是将整数n分解。为此,我定义了另外两个变量: a被定义为n的向上舍入的平方根,b是平方和我想要分解的数字之间的差。

while循环表示,如果b2不是正方形,则增加a并将b2定义为新a的平方与我想要分解的数字之间的差。如果b2是正方形,则b2的a平方根将是一个因子。

当我调用像print(fermat(133))这样的函数时,问题工作得很好,这给了我答案7,因为它是最低的素数因子,然后我只需将133除以7得到19.到目前为止这么好

但是我想用这个代码打破一个Rsa密码系统,我需要考虑因素

n = 507204827540547635003188460612372848602900324231921153214257357007181658245923199433998982097775501221867848469443624920597607769543938674944505236183262115817470130367565835690961161034764686003873284004530093885216278169686899261491680377671371989819332490227245364291020052993400797298847667351869225677060848581769823704347697557065010283805595504356259635995676212493990051132738242918342267376701

但由于n太大,我得到一个溢出错误,当然,它表示" int太大而无法转换为浮动"。

这个错误让我做了一些研究,我找到了from decimal import Decimal。由于我对编程很陌生,所以我尝试在函数fermat(n)中的任何地方实现它,如下所示:

def fermat(n):
        a = Decimal(math.ceil(math.sqrt(int(n))))
        b2 = Decimal(a*a - n)
        while not is_square(b2):
            a = Decimal(a+1)
            b2 = Decimal(a*a - n)
        return (Decimal(a-math.sqrt(b2)))

但是,在那之后,我仍然遇到了完全相同的问题。我真的不明白" Decimal"应该这样做,虽然读了之后的evern。知道我可以做些什么来使这个代码适用于大n?

我确定忘记分享一些我认为重要的信息。但是不记得现在的情况。如果我忘记了,我会稍后更新。希望有人可以帮助我,谢谢:)。

1 个答案:

答案 0 :(得分:1)

您需要重新定义运行计算的最大值。看看

import sys
sys.maxsize 

你会发现这个数字远小于你的n值。在您的情况下,我建议不要使用数学库,并使用您自己的实现。

math.ceil()返回一个浮点值,它不适合你的长整数。