Java Can';t生成大素数
我试图用Java生成大素数。我用大整数来表示。下面是我在数组中生成和存储10个素数的代码Java Can';t生成大素数,java,biginteger,Java,Biginteger,我试图用Java生成大素数。我用大整数来表示。下面是我在数组中生成和存储10个素数的代码 public static void primeGenerator() { BigInteger[] primeList = new BigInteger[10]; BigInteger startLine = new BigInteger("10"); int startPower = 6; BigInteger endLine = new BigInteger("
public static void primeGenerator() {
BigInteger[] primeList = new BigInteger[10];
BigInteger startLine = new BigInteger("10");
int startPower = 6;
BigInteger endLine = new BigInteger("10");
int endPower = 9;
int j = 0;
for (BigInteger i = fastExp(startLine,startPower);
i.compareTo(fastExp(endLine,endPower)) <= 0;
i = i.add(BigInteger.ONE)) {
if (checkPrimeFermat(i) == true && j < 10) {
primeList[j] = i;
j++;
}
}
System.out.println(primeList[0]);
System.out.println(primeList[1]);
System.out.println(primeList[2]);
System.out.println(primeList[3]);
System.out.println(primeList[4]);
System.out.println(primeList[5]);
System.out.println(primeList[6]);
System.out.println(primeList[7]);
System.out.println(primeList[8]);
System.out.println(primeList[9]);
}
publicstaticvoidprimegenerator(){
BigInteger[]primeList=新的BigInteger[10];
BigInteger startLine=新的BigInteger(“10”);
intstartpower=6;
BigInteger端点=新的BigInteger(“10”);
int-endPower=9;
int j=0;
for(BigInteger i=fastExp(startLine,startPower);
i、 与(fastExp(endLine,endPower))相比,这里有一个查找大素数的更简单的解决方案-
BigInteger big = new BigInteger("9001");//or whatever big number you want to start with
BigInteger[] primes = new BigInteger[10];
for(int i=0;i<10;i++){
primes[i]=big=big.nextProbablePrime();
}
BigInteger big=new BigInteger(“9001”);//或任何您想要开始的大数字
BigInteger[]素数=新的BigInteger[10];
对于(int i=0;i您可以使用biginger(int位长度、int确定性、随机rnd)
构造函数
BigInteger b= new BigInteger(20, 1, new Random());
它将为您生成一个素数。bitLength
指定您想要的BigInteger中的位数,certainity
指定您想要的BigInteger应为素数的肯定量。首先,我想指出,您没有编写此代码。您偷了它,并声称您死记硬背,这是非常不道德的
代码是正确的。只是速度很慢。随着功率的增加,代码花费的时间越来越长。出现这种情况的原因有两个:
费马测试的应用时间越来越长
BigInteger操作执行的时间越来越长
Fermat测试的增长类似于O(k×log2n×log n×log n)。BigInteger的加法和减法的增长类似于O(n)。显然,BigInteger是让你慢下来的东西
下面是您的代码配置文件,电源设置为5到7
如果你想让你的代码产生越来越大的素数,你应该专注于减少你对大整数的运算次数。这里有一个这样的改进:
- 将
n.subtract(biginger.ONE)
置于for
循环之外。结果不需要多次计算
进一步的建议必须来自数学界的人。你能比“它不生成任何东西”更具体一点吗?比如“我将x
传递给了methodfoo()
并且永远卡在了while循环中”或者“我将y
传递给了methodbar()
并返回null
”。此操作的快捷方式可能是使用biginger.nextProbablePrime()
。它根本不打印任何东西。如果它找不到素数,它需要为每个项目打印空值,但它没有。我离开计算机30分钟,它看起来像卡在一个循环中或是什么我不知道的东西。你可以通过在其中放入一些打印语句来确定它是卡在一个循环中,还是需要花很长时间来计算看看数字是否会聚。powo2len()
的目的是什么?它在功能上等同于(n>1)?1:0
。我不能使用nextProbablePrime函数,因为它是一个家庭作业任务:(啊……我怀疑是这样的。亲爱的downvoter,你不应该在这里留下评论吗?
BigInteger b= new BigInteger(20, 1, new Random());