/* $Id: Sieve.c $ */
/* Sieve of Eratosthenes algorithm
* Ref: http://www.math.utah.edu/~alfeld/Eratosthenes.html
* This implementation by David Ireland <www.di-mgt.com.au>
* $Date: 2012/12/14 11:02Z $
* $Author: dai $
*/
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
/* Usage: Sieve n
* where n = largest integer to test for prime
* (default = 1000)
*/
/* For first 10,000 primes use
Sieve 104729
because 104729 is the 10,000th prime
Ref: http://www.utm.edu/research/primes
*/
main(int argc, char *argv[])
{
int i, m, k;
int klimit, nlimit;
int *mark;
if (argc > 1)
nlimit = atoi(argv[1]);
else
nlimit = 1000;
mark = calloc(nlimit, sizeof(int));
/* Calculate limit for k */
klimit = (int)sqrt((double)nlimit) + 1;
/* Mark the composites */
/* Special case */
mark[1] = -1;
/* Set k=1. Loop until k >= sqrt(n) */
for (k = 1; k <= klimit; k = m)
{
/* Find first non-composite in list > k */
for (m = k + 1; m < nlimit; m++)
if (!mark[m])
break;
/* Mark the numbers 2m, 3m, 4m, ... */
for (i = m * 2; i < nlimit; i += m)
mark[i] = -1;
}
/* Now display results - all unmarked numbers are prime */
for (k = 0, i = 1; i < nlimit; i++)
{
if (!mark[i])
{
if (k % 10 == 0)
printf("%d: ", k);
printf("%d ", i);
k++;
if (k % 10 == 0 && k > 0)
printf("\n");
}
}
printf("\n");
free(mark);
return 0;
}