素数计算乐趣

2022-09-03 04:07:31

我们在工作中玩得很开心。这一切都始于其中一个人设置了Hackintosh,我们想知道它是否比我们拥有的(几乎)相同规格的Windows Box更快。所以我们决定为它写一个小测试。只是一个简单的素数计算器。它是用Java编写的,告诉我们计算前n个质数所需的时间。

下面的优化版本 - 现在需要约6.6秒

public class Primes {

    public static void main(String[] args) {
        int topPrime = 150000;
        int current = 2;
        int count = 0;
        int lastPrime = 2;

        long start = System.currentTimeMillis();

        while (count < topPrime) {

            boolean prime = true;

            int top = (int)Math.sqrt(current) + 1;

            for (int i = 2; i < top; i++) {
                if (current % i == 0) {
                    prime = false;
                    break;
                }
            }

            if (prime) {
                count++;
                lastPrime = current;
            }
            if (current == 2) {
             current++;
            } else {
                current = current + 2;
            }
        }

        System.out.println("Last prime = " + lastPrime);
        System.out.println("Total time = " + (double)(System.currentTimeMillis() - start) / 1000);
    } 
}

我们几乎已经失去了整个Hackintosh vs PC的情节,只是在优化它时玩得开心。第一次没有优化的尝试(上面的代码有几个)运行了大约52.6分钟,以找到前150000个素数。此优化运行时间约为 47.2 分钟。

如果你想尝试并发布你的结果,那就坚持下去。

我正在运行的PC的规格是奔腾D 2.8GHz,2GB RAM,运行Ubuntu 8.04。

到目前为止,最佳优化一直是电流的平方根,由Jason Z首次提及。


答案 1

这比我在1986年左右的涡轮增压帕斯卡8 Mhz 8088上的筛子更糟糕。但那是在优化之后:)


答案 2

由于您正在按升序搜索它们,因此您可以保留已找到的素数的列表,并且仅检查它们的可除性,因为所有非素数都可以简化为较小素因数的列表。将其与前面关于不检查当前数字平方根的因子的提示相结合,您将拥有一个非常高效的实现。


推荐