进一步优化填充for循环的Java代码

进一步优化填充for循环的Java代码,java,performance,for-loop,Java,Performance,For Loop,我写了一个代码,返回两个素数,它们的间隔等于给定的long,并且它们之间没有其他素数 以下是我到目前为止所采用的方法: public static long[] firstGap(int gap, long lLimit, long uLimit) { for(long i=lLimit; i<=uLimit; i++) { for(long j=i+1; j<=uLimit; j++) { if(isPrime(i) &&am

我写了一个代码,返回两个素数,它们的间隔等于给定的
long
,并且它们之间没有其他素数

以下是我到目前为止所采用的方法:

public static long[] firstGap(int gap, long lLimit, long uLimit) {
    for(long i=lLimit; i<=uLimit; i++) {
        for(long j=i+1; j<=uLimit; j++) {
            if(isPrime(i) && isPrime(j) && j-i==gap && !repeatedIsPrime(i+1,j-1)) {
                return new long[]{i,j};
            }
        }
    }
return null;
}
public static long[]firstGap(int-gap、long-lLimit、long-uLimit){

对于(long i=lLimit;i您可以使用以下代码:

public static long[] firstGap(int gap, long lLimit, long uLimit) {
    for(long i=lLimit; i<=uLimit; i++) {
        if(isPrime(i)) {
            long j = gap + i;
            if (isPrime(j) && !repeatedIsPrime(i + 1, j - 1)) {
                return new long[]{i, j};
            }
        }
    }
    return null;
}
public static long[]firstGap(int-gap、long-lLimit、long-uLimit){
(长i=lLimit;i)
  • 移除内部循环:`if(isPrime(i)&&isPrime(i+gap)&&!repeatedIsPrime(i+2,i+gap-2)返回新的long[]{i,j}
  • 确保lLimit和uLimit是奇数并递增2,因为检查偶数没有意义
  • 检查素数时,运行到n的平方根
  • 可以使用HashMap确保只检查同一个数字一次,但在移动时必须删除最小的数字
  • 使用更智能的素性测试,例如Fermat测试以获得更快的iPrime(i)

  • 通过首先改进算法,您可以大大加快该程序的运行速度。减少方法调用并不会加快代码的运行速度。
    public static boolean repeatedIsPrime(long x, long y) {
        for(long i=x; i<=y; i++) {
            if(isPrime(i)) {
                return true;
            }
        }
    return false;   
    }
    
    public static long[] firstGap(int gap, long lLimit, long uLimit) {
        for(long i=lLimit; i<=uLimit; i++) {
            if(isPrime(i)) {
                long j = gap + i;
                if (isPrime(j) && !repeatedIsPrime(i + 1, j - 1)) {
                    return new long[]{i, j};
                }
            }
        }
        return null;
    }