我需要生成两个质数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);
}
谢谢。
答案 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 digits。 BigInteger
应该能够存储它,但是您可能会开始遇到数量如此之大的内存限制。