如何更快或更好地实现这一目标?我做了它来解决项目欧拉问题然后优化它,但我敢肯定它不是最好的方法
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;
}
}
答案 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)
看看Eratosthenes的Sieve http://en.wikipedia.org/wiki/Sieve_of_Eratosthenes