int TestBits(unsigned char *tbl,unsigned int bit)
{ return tbl[bit>>3] & (1 << (bit &7));
}
void SetBit(unsigned char *tbl,unsigned int bit)
{ tbl[bit>>3] |= (1 << (bit &7));
}
unsigned char * MakePrime32bit( void )
{
const MAX3=0x55555555;
unsigned char * tbl = malloc(0x20010000/3);
unsigned int n=5;
 memset(tbl,0,0x20010000/3);

 while (n<0x10000){
  if(! TestBits(tbl, n / 3) ){
   unsigned x =(n*n)/ 3;
   unsigned n2= 2*n  ;
   unsigned n1=(n/6)*4+3; printf("%5d\n",n);
   while( x<MAX3){SetBit(tbl,x);SetBit(tbl,x+n1);x+=n2;}
  }n+=2;
  if(! TestBits(tbl, n / 3) ){
   unsigned x =(n*n)/ 3;
   unsigned n2= 2*n  ;
   unsigned n1=(n/6)*8+1; printf("%5d\n",n);
   while( x<MAX3){SetBit(tbl,x);SetBit(tbl,x+n1);x+=n2;}
  }n+=4;
 }

 return tbl;
}