如何生成大于10 ^ 25的两个素数p1,p2

时间:2018-08-20 14:17:10

标签: java random primes

我需要生成两个质数p1,大于10 ^ 25的p2及其乘积n。 并且数字“ a”小于n。

为什么我使用下面的代码,4个数字的结果全为0。

public static void main(String args[]) {

        long min = (long) Math.pow(10, 25);
        long max = Long.MAX_VALUE;
        long p1 = (long)((Math.random()+1)*(max-min));
        long p2 = (long)((Math.random()+1)*(max-min));
        long n = p1 * p2 ;
        long a = (long)((Math.random())* n) ;
        System.out.println("p1= " + p1 + ", p2= " + p2 + ", n= " + n +",a= " + a);
}

谢谢。

3 个答案:

答案 0 :(得分:4)

您获得0的原因是代表Long.MAX_VALUE需要 63 位,但是代表10^25您需要 84 位。

BigInteger maxLong = new BigInteger(String.valueOf(Long.MAX_VALUE));        
BigInteger pow_10_25 = BigInteger.TEN.pow(25);
System.out.println(maxLong.bitLength()); // 63
System.out.println(pow_10_25.bitLength()); // 84

可能的解决方案是使用BigInteger:

  • 确定要使用的最小位长
  • 生成两个可能的素数
  • 将两个生成的素数相乘
  

通过使用BigInteger.probablePrime(int, Random)“此方法返回的BigInteger合成概率不超过2-100。”

示例

Random r = new Random();
BigInteger pow_10_25 = BigInteger.TEN.pow(25);
int minBitLength = pow_10_25.bitLength();

BigInteger p1 = BigInteger.probablePrime(minBitLength, r);
BigInteger p2 = BigInteger.probablePrime(minBitLength, r);  
BigInteger n = p1.multiply(p2);

答案 1 :(得分:3)

您遇到以下问题: long 可以容纳的最大值为 9223372036854775807 ,并且您的计算Math.pow(10, 25)超过了该限制。 因此,您的 min max 都将具有 9223372036854775807807 值,并且 max-min 变为零。问题还在继续。尝试使用大于类型的类型,例如 BigInteger

答案 2 :(得分:1)

Math.SE question引用了多个位置以获取素数列表:

不是随机生成这些数字,而是获得满足您的问题条件的质数的列表。将该文件作为数组或列表加载到Java应用程序中。然后随机生成一个数字以选择该列表中的索引。您还可以计算文件中的行数,并从文件中读取一行。

这种方法用CPU时间(可能是bug?)来交换I / O和内存以读取列表。

您还应该考虑设置一个上限,该上限小于您的数字类型可以存储的最大值。最大的素数是over twenty million digitsBigInteger应该能够存储它,但是您可能会开始遇到数量如此之大的内存限制。