Java Can';t生成大素数

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("

我试图用Java生成大素数。我用大整数来表示。下面是我在数组中生成和存储10个素数的代码

    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
    传递给了method
    foo()
    并且永远卡在了while循环中”或者“我将
    y
    传递给了method
    bar()
    并返回
    null
    ”。此操作的快捷方式可能是使用
    biginger.nextProbablePrime()
    。它根本不打印任何东西。如果它找不到素数,它需要为每个项目打印空值,但它没有。我离开计算机30分钟,它看起来像卡在一个循环中或是什么我不知道的东西。你可以通过在其中放入一些打印语句来确定它是卡在一个循环中,还是需要花很长时间来计算看看数字是否会聚。
    powo2len()
    的目的是什么?它在功能上等同于
    (n>1)?1:0
    。我不能使用nextProbablePrime函数,因为它是一个家庭作业任务:(啊……我怀疑是这样的。亲爱的downvoter,你不应该在这里留下评论吗?
    BigInteger b= new BigInteger(20, 1, new Random());