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

How to generate two primes p1, p2 bigger than 10^25

我需要生成两个大于 10^25 的素数 p1、p2,以及它们的乘积 n。 和一个小于 n.

的数字 "a"

为什么我用下面的代码,结果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);
}

谢谢。

这个 Math.SE question 引用了几个位置来获取素数列表:

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

这种方法用 CPU 时间(也许还有错误?)换取 I/O 和读取列表的内存。

您还应该考虑设置一个上限,该上限小于您的数字类型可以存储的最大值。最大素数是over twenty million digitsBigInteger 应该能够存储它,但是您可能会 运行 开始使用那么大的数字进入内存限制。

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

你得到 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:

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

By using BigInteger.probablePrime(int, Random): "The probability that a BigInteger returned by this method is composite does not exceed 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);