【问题标题】:fastest calculation of largest prime factor of 512 bit number in python在python中最快计算512位数的最大素数
【发布时间】:2010-03-08 18:12:27
【问题描述】:

我正在用 python 模拟我的加密方案,我是它的新用户。

p = 512 位数,我需要为其计算最大素数,我正在寻找两件事:

  1. 处理这种大型素数分解的最快代码
  2. 可以将 512 位数字作为输入并可以处理的代码。

我在其他语言中看到了不同的实现,我的整个代码都在 python 中,这是我卡住的最后一点。所以让我知道python中是否有任何实现。

请简单解释一下,因为我是python的新用户

抱歉英语不好。

编辑(取自以下 OP 的回答):

#!/usr/bin/env python
def highest_prime_factor(n):
   if isprime(n):
      return n
   for x in xrange(2,n ** 0.5 + 1):
      if not n % x:
         return highest_prime_factor(n/x)

def isprime(n):
   for x in xrange(2,n ** 0.5 + 1):
      if not n % x:
         return False
   return True

if  __name__ == "__main__":
   import time
   start = time.time()
   print highest_prime_factor(1238162376372637826)
   print time.time() - start

上面的代码对“1238162376372637826”有效(有一点延迟)但是 将其扩展到

10902610991329142436630551158108608965062811746392 57767545600484549911304430471090261099132914243663 05511581086089650628117463925776754560048454991130443047

让 python 发疯。有什么办法可以像上面一样,我可以拥有它 很快就计算出来了?

【问题讨论】:

  • 512 位数字是 155 位数字,这只是一个 Python long。不需要特殊代码。这真的没什么。当然,分解大素数的实际算法除外。你需要算法吗?到目前为止你有什么?
  • 嗯。您知道分解一个通用的 512 位数字是目前在合理时间内可以在单台机器上完成的工作的极限吗?以下是维基百科的引述:“截至 2007 年底,[...] 一个没有任何特殊数学经验的人可以在几个月内在几台 PC 上计算高达约 520 位的一般形式的数字。 "见:en.wikipedia.org/wiki/Integer_factorization_records
  • -1: "有什么办法可以像上面一样,让我马上计算出来吗?"问这样的问题表明你真的不清楚自己在做什么。

标签: python primes factorization


【解决方案1】:

对于基于 Python 的解决方案,您可能需要查看 pyecm 在还安装了 gmpy 的系统上,pyecm 发现以下因素:

101、521、3121、9901、36479、300623、53397071018461、1900381976777332243781

还有一个 98 位未分解的复合:

60252507174568243758911151187828438446814447653986842279796823262165159406500174226172705680274911

使用 ECM 分解剩余的复合材料可能不切实际。

编辑:几个小时后,剩下的因素是

6060517860310398033985611921721

9941808367425935774306988776021629111399536914790551022447994642391

【讨论】:

    【解决方案2】:

    这应该比处理大数的简单方法更合适(尽管处理这种数字,每个纯 Python 实现都需要一段时间):Pollard Rho prime factorization

    【讨论】:

    • Pollard 测试通常不会在实际时间内处理那么大的输入。 Rho 寻找相对较小的因素。 P-1 和 P+1 算法寻找比因子都小的数大或小一的素数。除非你有一个特殊的数字,否则今天没有一个足够 512 位。
    • @phkahler:感谢您的评论;不知道。我一直发现 Pollard 对于(相对)大的数字非常快,但当然我从来没有扔过 512 位。
    【解决方案3】:

    如果您可以安装扩展程序,gmpy 会有所帮助 - 请参阅我对 SO question 的回答,特别是我在那里显示的代码中的 def prime_factors(x) 函数。

    在纯 Python 中(不允许任何扩展),它有点难,而且慢得多,例如,参见代码 here(但不要屏住呼吸,因为它运行在你的大量数字上;-)。

    【讨论】:

      【解决方案4】:
      ('''==============================================================================='''
      >        '''              CALCULATE  HIGHEST PRIME
      > FACTOR                                  '''
      >
      > '''===============================================================================''')
      >
      > #!/usr/bin/env python
      > def highest_prime_factor(n):
      >    if isprime(n):
      >       return n
      >    for x in xrange(2,n ** 0.5 + 1):
      >       if not n % x:
      >          return highest_prime_factor(n/x)
      > def isprime(n):
      >    for x in xrange(2,n ** 0.5 + 1):
      >       if not n % x:
      >          return False
      >    return True
      > if  __name__ == "__main__":
      >    import time
      >    start = time.time()
      >    print highest_prime_factor(1238162376372637826)
      >    print time.time() - start
      

      代码在数字上会有一点延迟:“1238162376372637826”但是 将其扩展到 (10902610991329142424242421515151581086086089650628117463925776767545600454545454999913334443304330477190266102610991429142914242455555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555太理值 让蟒蛇发疯。有没有像上面这样的方法,我可以拥有 很快就计算出来了。

      【讨论】:

      • 你应该把它放在你的问题中(Stackoverflow 不遵循传统的论坛流程,而是基于问答的)。我会为您提供的,如果您删除此“答案”,那将是最好的......
      • 如果我不用“没有时间”来分解大素数,我会成为一个非常富有的人。
      猜你喜欢
      • 1970-01-01
      • 2010-09-07
      • 2011-09-13
      • 2013-02-13
      • 2019-09-11
      • 1970-01-01
      • 2017-03-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多