【问题标题】:Fastest primality test最快的素数测试
【发布时间】:2011-05-28 11:26:37
【问题描述】:

您能否建议一种可在实践中使用的快速、确定性方法来测试大量数是否为素数?

另外,我想知道如何正确使用非确定性素性测试。例如,如果我使用这种方法,如果输出为“否”,我可以确定一个数字不是素数,但另一种情况是,当输出为“可能”时呢?在这种情况下,我是否必须手动测试素数?

提前致谢。

【问题讨论】:

标签: algorithm math probability primes


【解决方案1】:

我所知道的用于素数测试的唯一确定性多项式时间算法是 AKS 素数测试 (http://en.wikipedia.org/wiki/AKS_primality_test)。但是,有很多非常好的随机素数测试,它们速度快并且成功概率极高。他们通常通过查找数字是否以指数好的概率复合来工作,因此他们会报告该数字是复合的,或者会要求您非常自信地说“也许”。

【讨论】:

  • 当我们说“非常有信心”时,是否意味着由于系统故障而得到错误输出的概率高于算法产生错误答案的概率? :-)
  • @Grigory 这取决于您使用的算法。有些甚至可以让你指定你的机会。测试 ~50%、75%、90% 等。假设其编码正确,他指定的 AKS 将在 100% 的时间内正确回答。
  • @Grigory:“系统故障”?涉及概率是因为“正确”算法会很慢,因此您可以检查一组更小的值,这些值会给您 99.9% 的正确答案概率。您认为您使用的非确定性术语是什么意思?
  • @ruslik:Grigory 基本上是正确的,您可以设置概率素性测试的“置信度”级别,以便误报的概率——当它实际上是复合时声明一个素数—— - 如此之低,以至于您更有可能从系统故障(例如内存位或寄存器位故障)中获得误报,而不是从素性测试中获得。
  • 该问题要求最有效的算法可在实践中使用 - the AKS test is not usable in practice.
【解决方案2】:

如果您希望找到用于 RSA 密钥的随机素数,则应首先使用概率测试。如果概率足够高以满足您的需求,那么就停在那里。如果你必须确定,那么一旦你找到一个大的随机概率素数,就用 AKS 或其他非概率测试来验证它。这使您可以快速检查大量非素数,同时确定您认为自己找到了一个。

如果您要验证特定的现有数字是否为质数,那么您应该使用可以肯定回答的测试之一。还有其他非多项式时间测试,请使用实践中最快的测试。

【讨论】:

    【解决方案3】:

    “可能”实际上是指 1-ε,而 ε 可以随心所欲地变小。

    例如,大多数应用程序都有一些小但非零的失败概率,这与素数测试无关

    • 在加密应用程序中,攻击者幸运地猜到了秘密,例如, 2^(-100)的概率

    • 硬件故障(辐射引起)随机翻转计算机内存的某些位(可能保存“确定性”素性测试输出的内存)

    • 错误(确实,比其他类型的故障更有可能)

    所以在实践中将 ε 压到那个数量级就足够了。

    例如,OpenSSL、GnuPG 仅使用非确定性素数测试。 “可能”你真的不想要确定性测试。但是请检查您可以使用哪些库:如果您手头有任何库,并且它们的性能足够好,请继续使用它们。

    【讨论】:

      猜你喜欢
      • 2011-02-04
      • 1970-01-01
      • 2011-04-14
      • 2011-01-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多