【问题标题】:Java probablePrime performanceJava probablePrime 性能
【发布时间】:2013-10-11 23:57:16
【问题描述】:

probablePrime 上的 Javadoc:

返回一个可能是素数的正 BigInteger,其中 指定的位长度。 BigInteger 返回的概率 此方法复合不超过2-100。

我的问题是,通过不保证质数,但几乎可以肯定,这可以获得多少性能?此外,这种性能差异真的值得在未来某个时间发生错误的微小机会吗?特别是如果加密的有效性取决于这个数字是素数。

【问题讨论】:

    标签: java performance biginteger


    【解决方案1】:

    probablePrime() 的核心是一系列Miller-Rabin 测试(执行的轮数取决于数字的位大小)以及Lucas-Lehmer primality test。这些的时间复杂度在很大程度上取决于BigInteger 实现的其余部分。从维基百科获取“慢”估计值分别为 O(k log(n)^3) 和 O(log(n)^3)。

    另一方面,AKS-primality test,没有未经证实的猜想,可以在 Õ(log(n)^6) 中运行。

    因此,假设您的数字足够大,概率测试可能比确定性测试快很多。对于任何足够大的密码学来说,渐近行为很可能是可观察到的。当然,唯一确定的方法是实施修改后的 AKS 并对结果进行计时。

    k 是 Mille-Rabin 中的循环数)。

    【讨论】:

      【解决方案2】:

      如果你有这个:

      特别是如果加密的有效性取决于这个数字 素数

      那种约束,那么我认为你不应该使用probablePrime。因为你无法保证算法的正确性。

      但是如果获得非素数的概率非常低,例如可以与SHA-1 collision probability 相媲美,那么您可以接受。 (如果 git 对它没问题,那么你就是)

      如果您在给定范围内使用质数池,那么您可以预先生成质数列表并将它们放入查找表中。这会给你O(1) 时间复杂度。

      【讨论】:

      • 那是一个很好的编辑,我猜如果假设质数破解加密的机会比我们产生一个合数的机会要好,那么我们在一天结束时真的没有损失任何东西。此外,加密可能是这种方法甚至存在的原因,生成大素数是 almost 专用于加密
      • 我仍然想知道这实际上提高了多少性能。你对此有什么见解吗?
      • 另外证明 BigInteger 有一个构造函数,你可以在其中指定确定性:docs.oracle.com/javase/6/docs/api/java/math/… 所以如果你有一个更高位的加密算法,你可以阻止这个方法成为你最弱的列表。相反,当与算法的其余部分相比,这是一个“过于强大的链接”时,您也可以使用它来增加复合的概率以提高性能。
      • 当您不想寻找非常大的数字时,我认为您可以使用基于筛子的算法摆脱O(n log n) 复杂性。否则你在O(n^2) 周围有一些东西。我不知道probablePrime 的渐近时间复杂度,但我基于api 的猜测介于O(n log n)O(n) 之间。不要认为这是理所当然的。你有很多方法来计算素数。查看this 和维基百科页面了解素数。
      • "如果您在给定范围内使用质数池,那么您可以预先生成质数列表并将它们放入查找表中。这将为您提供 O(1)时间复杂度。”我不确定这是否足以加密,考虑到数字的巨大大小,它只会占用太多内存。此外,我认为您无法计算人一生中所需范围的查找表
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-02-22
      • 2010-09-17
      • 2012-02-13
      • 2014-06-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多