【发布时间】:2020-08-12 15:53:16
【问题描述】:
我无法对 p 和 q 都为真,大多数结果都是假的,或者很少 p 为真但 q 为假,为什么这个测试对 p 和 q 都不是真的?
BigInteger bitSize100 = new BigInteger("1").setBit(99);
for(int i = 0; i < 20; i++) {
BigDecimal randomizer = new BigDecimal(Math.random()).multiply(new BigDecimal(bitSize100)); // get random 99 bit number
BigInteger q = randomizer.toBigInteger().setBit(99); // must be 100 bits
BigInteger p = q.add(q).add(BigInteger.ONE);
System.out.println(p.isProbablePrime(100) + " " + q.isProbablePrime(100));
}
output:
false false
false false
false false
false false
true false
false false
false false
false false
false false
false false
false false
false false
false false
false false
false false
false false
false false
false false
false false
false false
【问题讨论】:
-
看起来你得到质数的概率很低。另外,您在测试的两个数字之间存在这种奇怪的数学关系。
-
即使你正确地生成了它们,
Prime Number Theorem表示质数的渐近密度随着质数变大而变小。因此,对于较大的n值,人们会期望它们发生的频率较低。
标签: java biginteger bigdecimal