为什么在随机分配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。完全避免在这里遍历doubleBigDecimal值。

编辑:实际上,这正是you've been told on this other question of yours 4 hours ago的内容。

第二:大多数数字都不是质数。如果您随机选择数字(甚至不排除偶数),那么绝大多数将不是质数。

我不知道Sophie Germain primes的质数是多少,但是显然不是全部。

因此,您的代码经过多次尝试(平均肯定超过20次)来找到这样的素数对并不奇怪。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...