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

时间:2017-09-02 17:42:53

标签: 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) && isPrime(j) && j-i==gap && !repeatedIsPrime(i+1,j-1)) {
                return new long[]{i,j};
            }
        }
    }
return null;
}

用于检查数字是否为素数

public static boolean isPrime(long n) {
    for(int i=2;i<n;i++) {
        if(n%i==0) {
            return false;
        } 
    }
return true;
}

检查两个数字之间是否有素数

public static boolean repeatedIsPrime(long x, long y) {
    for(long i=x; i<=y; i++) {
        if(isPrime(i)) {
            return true;
        }
    }
return false;   
}

我到目前为止所做的是将循环索引设为int但后来我有一个有损转换,接下来是减少方法调用但是我找不到办法来做到这一点。到目前为止,我所取得的唯一改进是,除了没有得到任何东西之外,我已经删除了一些不必要的存储和赋值。那么如何进一步优化我的代码?

2 个答案:

答案 0 :(得分:1)

您可以使用以下代码:

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;
}

首先,如果isPrime(i)== false,其他检查没有任何意义。其次,for(long j=i+1; j<=uLimit; j++)可以删除,因为你只使用一个j(当j-i == gap)时

答案 1 :(得分:1)

  1. 删除内循环:`if(isPrime(i)&amp;&amp; isPrime(i + gap)&amp;&amp;!repeatedIsPrime(i + 2,i + gap-2)返回new long [] {i, Ĵ}
  2. 确保lLimit和uLimit是奇数并且递增2,因为无法检查偶数
  3. 检查素数时,运行到n
  4. 的平方根
  5. 可以使用HashMap&lt; Long,Boolean&gt;确保您只检查一次相同的号码 - 但在移动时必须删除最小的号码
  6. 使用更智能的素性测试,例如费马测试https://en.wikipedia.org/wiki/Primality_test#Fermat_primality_test以获得更快的isPrime(i)