如何解决为什么在随机分配BigInteger时我的素数测试经常失败?
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次)来找到这样的素数对并不奇怪。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。