Trial division
试除法求最小N个素数是一个经典的算法。
可以使用素数分类的性质来加快计算的速度。
除了2以外,素数只能是2n+1,n>=1。
除了2、3和5以外,素数只能是6n+1或6n+5,n>=1
/*
* 试除法计算最小的N个素数
*
* 素数中除了2以外,均为奇数。
* 可以用试除法从奇数中挑选出最小的N个素数。
*
* 另外,<span style="color: rgb(0, 128, 0);">除了2、3和5之外,</span>素数只可能是6n+1或6n+5,n>=1。
* 所有有另外一种计算方法,会稍微快一些。
*/
#include <stdio.h>
#include <math.h>
#define N 25
int prime[N] = {2, 3, 5};
void output_result(void);
void primes()
{
int n = 3;
int i = 2;
for(;;) {
n += 2;
int j, q =sqrt(n);
for(j=1; prime[j]<=q; j++)
if(n % prime[j] == 0)
break;
if(prime[j] > q)
prime[i++] = n;
if(i == N)
break;
}
}
void primes2()
{
int n1=1, n2 = 5;
int i = 3;
for(;;) {
n1 += 6;
int j, q =sqrt(n1);
for(j=1; prime[j]<=q; j++)
if(n1 % prime[j] == 0)
break;
if(prime[j] > q)
prime[i++] = n1;
if(i == N)
break;
n2 += 6;
q =sqrt(n2);
for(j=1; prime[j]<=q; j++)
if(n2 % prime[j] == 0)
break;
if(prime[j] > q)
prime[i++] = n2;
if(i == N)
break;
}
}
int main(void)
{
primes();
output_result();
primes2();
output_result();
return 0;
}
void output_result()
{
int i;
for(i=0; i<N; i++)
printf("%d:%d\n", i+1, prime[i]);
}