我做了这个主要功能。有更快或更好的方法吗?

时间:2012-12-16 20:35:10

标签: java primes

  

可能重复:
  Most Elegant Way to write isPrime in java

如何更快或更好地实现这一目标?我做了它来解决项目欧拉问题然后优化它,但我敢肯定它不是最好的方法

public static boolean prime(int number){
    int limit = (int) (1 + Math.sqrt(number) );
    if (number < 1) return false;
    if (number == 2) return true;
    if (number % 2 == 0) return false;

    for(int i= 3; i < limit; i+=2)
        if(number % i == 0)
            return false;
    return true;
}
}

4 个答案:

答案 0 :(得分:4)

除了处理数字1外,该功能看起来还不错。可以做的一个改进是利用所有大于3的素数都是6k ± 1形式的事实。

您可以选择go even further,但是您必须在提高性能和增加代码复杂性之间取得平衡。

答案 1 :(得分:3)

取决于你想得到多么花哨。

一个简单的改进是使用wheel factorization - 而不是仅仅尝试每个奇数(例如,不能被2整除的数字),只尝试不能被2整除的数字几个小素数。例如,这是一个用2或3来检查可分性的实现:

for (int i = 6; i < limit; i += 6) {
    if (number % (i + 1) == 0) return false;
    if (number % (i + 5) == 0) return false;
}

这只需要对每六个数字进行两次测试,而不是代码的1/2。您可以通过添加额外的素数来进一步改进它(维基百科上的文章测试中有8个中有8个),但代价是快速增加代码大小。

如果你不介意用一些严肃的数学来弄脏你的话,那就有像Miller-Rabin test这样疯狂的数论理论方法。请注意,使用正确的证人集合,这些方法对于合理范围内的所有数字都是可证明的正确(参见“测试的确定性变体”)。

答案 2 :(得分:1)

BigInteger.valueOf(x).isProbablePrime(50)

假设你愿意忍受1/1000000000000错误的机会,这可能会非常快。

答案 3 :(得分:0)