Java 中 BigInteger.probablePrime() 与其他素数算法的区别
Posted
技术标签:
【中文标题】Java 中 BigInteger.probablePrime() 与其他素数算法的区别【英文标题】:Difference between BigInteger.probablePrime() and other primality algorithms in java 【发布时间】:2012-02-03 08:54:01 【问题描述】:我正在使用 Java 实现一个 RSA 加密程序。现在我正在使用BigInteger.probablePrime(1024, rnd)
来获取素数。这里 rnd
是由 Random rnd = new Random()
生成的随机数。
我需要测试各种加密速度。
我的问题是:
BigInteger.probablePrime(1024, rnd)
使用什么算法?
上述算法与其他算法有什么区别:如 Rabin-Miller、Fermats、Lucas-Lehmer?
谢谢。
【问题讨论】:
您能指定语言吗?我假设 Java,但假设......在发布之前阅读您的帖子并删除错误不会有任何伤害。 抱歉,是的 java。我认为错误的意思是我陈述bigint的方式。我试图简写它我确实明白这不是如何在 java 中使用该方法 我知道不是每个人都能写出相同水平的英语,但即使方法拼写错误,也很难从中查找任何内容。另外,请使用代码标签作为方法。如果您无法拼写“BigInteger.probablePrime()”,您可以恢复为从在线 JavaDoc 复制/粘贴它。现在它看起来您没有花任何时间在问题上,我们将回报不花任何时间在答案上的青睐。 再次为没有回应和关怀的方式道歉。这是我的第一篇文章,我不熟悉写问题的语法和方式。已注明以供将来参考。 这需要一些时间来适应,到目前为止我所有的链接都写得很糟糕。 Meta *** 有很多关于标记的有用技巧。您可以在您的问题上点击edit 并检查来自 mikej 的更改。 【参考方案1】:BigInteger
的可能素数方法使用 Miller-Rabin 和 Lucas-Lehmer 算法来测试素数。
见内部方法BigInteger.primeToCertainty
。
【讨论】:
这似乎是正确的答案。我们知道算法的名称在用于素数 > 95 位的位筛后面吗?BitSieve
回调到BigInteger.primeToCertainty
。
啊,这可能(请原谅双关语)是意料之中的,谢谢迈克尔,还没有发现。
非常感谢您的帮助!并感谢您提供源代码的链接。非常感谢您的所有帮助。祝您有美好的一天。【参考方案2】:
Java 源代码可供下载,您可以自己查看。
这是BigInteger.probablePrime(int, Random)
的代码:
public static BigInteger probablePrime(int bitLength, Random rnd)
if (bitLength < 2)
throw new ArithmeticException("bitLength < 2");
// The cutoff of 95 was chosen empirically for best performance
return (bitLength < SMALL_PRIME_THRESHOLD ?
smallPrime(bitLength, DEFAULT_PRIME_CERTAINTY, rnd) :
largePrime(bitLength, DEFAULT_PRIME_CERTAINTY, rnd));
实际测试包含在smallPrime()
和largePrime()
方法中,直接在源代码中。
【讨论】:
这两个方法都通过 primeToCertainty() 方法调用 passMillerRabin() 和 passLucasLehmer(),至少在 Michael 链接的 OpenJDK 1.7 源代码中。对于大素数(> 95 位),使用 BitSieve。 非常感谢您的帮助!并感谢您提供源代码的链接。非常感谢您的所有帮助。祝您有美好的一天。以上是关于Java 中 BigInteger.probablePrime() 与其他素数算法的区别的主要内容,如果未能解决你的问题,请参考以下文章