Performance 哪一种是最快的素数生成算法?

Performance 哪一种是最快的素数生成算法?,performance,algorithm,comparison,Performance,Algorithm,Comparison,我正在用Java开发一个算法,以找到所有达到某个数字的素数。这应该是对早期方法的改进,即: public static int[] generatePrimesUpTo(int max) { int[] primes = new int[max]; primes[0]=2; int p = 1; for (int i=3;i<max;i+=2) { if (isPrime(i)) { prime

我正在用Java开发一个算法,以找到所有达到某个数字的素数。这应该是对早期方法的改进,即:

public static int[] generatePrimesUpTo(int max)
{
    int[] primes = new int[max];
    primes[0]=2;
    int p = 1;
    for (int i=3;i<max;i+=2)
    {
        if (isPrime(i))
        {
            primes[p]=i;
            p+=1;
        }
    }
    return primes;  
}

public static boolean isPrime(int a)
{
    for (int i=3;i<((int)Math.sqrt(a)+1);i+=2)
    {
        if (a%i==0)
            return false;
    }
    return true;
}
public static int[]generatePrimesUpTo(int max)
{
int[]素数=新的int[max];
素数[0]=2;
int p=1;

对于(int i=3;i,您应该考虑是否有一种方法可以找到一个范围内的所有素数,这比单独检查每个素数要快得多。例如,您将检查许多数字是否可被73整除。但事实是,您可以更快地确定所有可被73整除的数字(它们是73、2*73、3*73、4*73等)


顺便说一句:您在循环的每次迭代中计算Math.sqrt(j)。将该计算移到循环之外可能会使您的代码更快。

您的第二个算法更快。我不知道为什么您只看到了20%的改进。以下是我的测试结果,以及单独的实现:

10^6:
First:  00:00:01.0553813   67240405 steps
Second: 00:00:00.2416291   13927398 steps
Sieve:  00:00:00.0269685    3122044 steps

10^7:
First:  00:00:26.4524301 1741210134 steps
Second: 00:00:04.6647486  286144934 steps
Sieve:  00:00:00.3011046   32850047 steps

10^8:
First:  00:12:00.8986644 46474124250 steps
Second: 00:01:43.1543445  6320928466 steps
Sieve:  00:00:03.6146328   342570200 steps

最后一个算法是,这是一个更好的算法。我用C#为一个处理器实现了所有这些,前两个基于您的代码,并做了一些小的更改,如测试
primes[j]*primes[j]你想知道为什么你的第二个例子不快,或者你想知道一个快速生成素数的方法吗?考虑一下如果你是前一个就改变你的标题。为什么你要测试Primes [j+1 ]?谢谢你的回答,道格拉斯!很高兴听到我的第二个算法快得多。我将研究如何使用Erasthones筛。我以前听过它,但它一开始似乎太原始了,以至于我没有想到使用它。@Mart Last:Eratosthenes筛作为素性测试出现时是不好的,但是我它擅长于找出某个数以内的所有素数。
10^6:
First:  00:00:01.0553813   67240405 steps
Second: 00:00:00.2416291   13927398 steps
Sieve:  00:00:00.0269685    3122044 steps

10^7:
First:  00:00:26.4524301 1741210134 steps
Second: 00:00:04.6647486  286144934 steps
Sieve:  00:00:00.3011046   32850047 steps

10^8:
First:  00:12:00.8986644 46474124250 steps
Second: 00:01:43.1543445  6320928466 steps
Sieve:  00:00:03.6146328   342570200 steps
Boolean[] definitelyComposite = new Boolean[max]; // initialized automatically to false
int p = 0;
for (long i = 2; i < max; i++)
{
    numSteps++;
    if (!definitelyComposite[i])
    {
        primes[p] = i;
        p++;
        for (long j = i * i; j < max; j += i)
        {
            numSteps++;
            definitelyComposite[j] = true;
        }
    }
}