【发布时间】:2011-01-24 01:29:04
【问题描述】:
我正在尝试找到检查给定数字是否为素数的最快方法(在 Java 中)。以下是我想出的几种素性测试方法。有没有比第二种实现(isPrime2)更好的方法?
public class Prime {
public static boolean isPrime1(int n) {
if (n <= 1) {
return false;
}
if (n == 2) {
return true;
}
for (int i = 2; i <= Math.sqrt(n) + 1; i++) {
if (n % i == 0) {
return false;
}
}
return true;
}
public static boolean isPrime2(int n) {
if (n <= 1) {
return false;
}
if (n == 2) {
return true;
}
if (n % 2 == 0) {
return false;
}
for (int i = 3; i <= Math.sqrt(n) + 1; i = i + 2) {
if (n % i == 0) {
return false;
}
}
return true;
}
}
public class PrimeTest {
public PrimeTest() {
}
@Test
public void testIsPrime() throws IllegalArgumentException, IllegalAccessException, InvocationTargetException {
Prime prime = new Prime();
TreeMap<Long, String> methodMap = new TreeMap<Long, String>();
for (Method method : Prime.class.getDeclaredMethods()) {
long startTime = System.currentTimeMillis();
int primeCount = 0;
for (int i = 0; i < 1000000; i++) {
if ((Boolean) method.invoke(prime, i)) {
primeCount++;
}
}
long endTime = System.currentTimeMillis();
Assert.assertEquals(method.getName() + " failed ", 78498, primeCount);
methodMap.put(endTime - startTime, method.getName());
}
for (Entry<Long, String> entry : methodMap.entrySet()) {
System.out.println(entry.getValue() + " " + entry.getKey() + " Milli seconds ");
}
}
}
【问题讨论】:
-
如果您需要知道这个数字是 100% 质数,那么您的解决方案是最好的。
-
我认为您的解决方案会很好。您可能会散列结果,因此您只需要“计算”一次。为什么要使用反射来执行测试?
-
@Stefan Hendriks 向类添加一个方法,触发测试,你会得到排序结果(我很懒)。
-
JUnit @Test 注解 FTW ;)
-
@SimonT:问题在于
a/4与a>>2不同,因为负数向上取整而不是向下取整。除非编译器可以证明a>=0,否则它必须生成一个相当复杂的表达式以避免除法(仍然是一个改进,但类似于 3 个周期而不是单个指令)。
标签: java performance algorithm primes