问题描述
p和q都不能成立,大多数结果都为假,或者p很少为真,但是q为假,为什么这个测试对p和q都不成立? / p>
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
解决方法
首先BigDecimal randomizer = new BigDecimal(Math.random()).multiply(new BigDecimal(bitSize100))
不导致100位随机性。
Math.random
返回一个double
值,该值是64位大,因此这是可以创建的最大随机量(并且由于该值限制为0到1之间的值,因此实际的随机量甚至更小)。
您应该结合使用Random.nextBytes()
to fill a byte[]
和随机数据和the BigInteger
constructor that takes such a byte[]
来构建BigInteger
。完全避免在这里遍历double
和BigDecimal
值。
编辑:实际上,这正是you've been told on this other question of yours 4 hours ago的内容。
第二:大多数数字都不是质数。如果您随机选择数字(甚至不排除偶数),那么绝大多数将不是质数。
我不知道Sophie Germain primes的质数是多少,但是显然不是全部。
因此,您的代码经过多次尝试(平均肯定超过20次)来找到这样的素数对并不奇怪。