我知道函数BigInteger.probablePrime(int bitLength,Random rnd)可能输出任何位长度的素数。我想在Java中使用真正的素数。有没有可以接受性能的FOSS库?提前谢谢!
我正在看1024& 2048位素数。
答案 0 :(得分:10)
编辑或者,如果您不相信isProbablePrime足够确定,请使用BigInteger构造函数BigInteger(int bitLength, int certainty, Random rnd)
来调整您的确定性阈值:
确定性 - 衡量呼叫者愿意容忍的不确定性的指标。新BigInteger表示素数的概率将超过(1 - 1/2 确定性)。此构造函数的执行时间与此参数的值成比例。
用于加密目的的概率测试保证限制误报的可能性 - 它不像存在一些潜在的陷阱数,这只是你想要概率有多低的问题。如果您不相信Java BigInteger类使用它们(如果它们记录了使用的测试会很好),请使用Rabin-Miller测试。
答案 1 :(得分:4)
有一些方法可以生成具有可接受性能的非常大的素数,但除了进入Guiness Book of Records之外,还没有足够的密度用于大多数目的。
这样看:probablePrime()
返回的数字不是素数的可能性低于你和你认识的每个人被光照击中的可能性。两次。在一天。
不要担心。
答案 2 :(得分:2)
您还可以使用BigInteger
的构造函数生成真正的素数:
BigInteger(int bitLength, int certainty, Random rnd)
执行时间与确定性成正比,但在我的Core i7上这不是问题。
答案 3 :(得分:1)
创建一个方法并将其包装。
BigInteger definitePrime(int bits, Random rnd) {
BigInteger prime = new BigInteger("4");
while(!isPrime(prime)) prime = BigInteger.probablePrime(bits,rnd);
return prime;
}
答案 4 :(得分:0)
Random rnd = new SecureRandom();
System.out.println(BigInteger.probablePrime(bitLength, rnd));
方法BigInteger
返回的probablePrime()
合成的概率不超过2 ^ -100。