#include <stdio.h>

void print(int n)
{
	printf("%d ", n);
}

void primes_1000()
{
   // the 2-3-5-7 wheel
   int wh[48] = {10,2,4,2,4,6,2,6,4,2,4,6,6,2,6,4,2,6,4,6,8,4,2,4,
                  2,4,8,6,4,6,2,4,6,2,6,6,4,2,4,6,2,6,4,2,4,2,10,2};

   // core primes' multiples each with its pointer into the wheel
   int m[7][4] = { {1,11,11,11*11}, {2,13,13,13*13}, {3,17,17,17*17},
                   {4,19,19,19*19}, {5,23,23,23*23}, {6,29,29,29*29},
                   {7,31,31,31*31} };    // 23*23 = 529 
   int i=1, p=11, k=0;

   print(2); print(3); print(5); print(7);
   do {
      // the smallest duplicate multiple is 121*13, ==> no dups below 1000!
      for( k=0; k < 7; ++k) {
         if ( p == m[k][3] ) {
            m[k][2] += wh[ m[k][0]++ ];  m[k][3] = m[k][1] * m[k][2];
            m[k][0] %= 48;   break;
         }
      }
      if (k == 7) print(p);  
      p += wh[i++];   i %= 48;
   } while ( p < 1000 );
}

int main(void) {
    primes_1000();
	return 0;
}