【发布时间】:2015-03-15 11:31:10
【问题描述】:
我正在研究一种 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;
}
它只是检查一个数字 N 是否可以被一个较小的数字整除,从 2 开始到 sqrt(N) 结束。
现在新方法是仅将 N 除以算法之前发现的更小的素数。我认为它会大大加快这个过程,因为它需要做的计算要少得多。
public static int[] generatePrimes(int num)
{
int[] primes = new int[num];
int p = 3;
primes[0] = 2;
primes[1] = 3;
primes[2] = 5;
boolean prime;
for (int i=7;i<num;i+=2)
{
prime = true;
for (int j=0;primes[j+1]<(Math.sqrt(i)+1);j++)
{
if (i%primes[j]==0)
{
prime = false;
break;
}
}
if (prime)
{
primes[p]=i;
p++;
}
}
return primes;
}
但是,对于 Nmax = 10^7,速度似乎几乎没有差异。 对于 Nmax = 10^8,新的快了 20%,但我的电脑在计算旧的时更活跃,我只尝试了 10^8 一次。
谁能告诉我为什么这种新方法没有那么快?或者我可以做些什么来进一步改进算法?
提前致谢!
【问题讨论】:
-
你想知道为什么你的第二个例子没有更快,或者你想知道生成素数的快速方法吗?如果是前者,请考虑更改您的标题。
-
你为什么要测试 primes[j+1]
标签: performance algorithm comparison