|  | #include	<u.h> | 
|  | #include	<libc.h> | 
|  | #include	<bio.h> | 
|  |  | 
|  | #define	ptsiz	(sizeof(pt)/sizeof(pt[0])) | 
|  | #define	whsiz	(sizeof(wheel)/sizeof(wheel[0])) | 
|  | #define	tabsiz	(sizeof(table)/sizeof(table[0])) | 
|  | #define	tsiz8	(tabsiz*8) | 
|  |  | 
|  | double	big = 9.007199254740992e15; | 
|  |  | 
|  | int	pt[] = | 
|  | { | 
|  | 2,  3,  5,  7, 11, 13, 17, 19, 23, 29, | 
|  | 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, | 
|  | 73, 79, 83, 89, 97,101,103,107,109,113, | 
|  | 127,131,137,139,149,151,157,163,167,173, | 
|  | 179,181,191,193,197,199,211,223,227,229, | 
|  | }; | 
|  | double	wheel[] = | 
|  | { | 
|  | 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, | 
|  | }; | 
|  | uchar	table[1000]; | 
|  | uchar	bittab[] = | 
|  | { | 
|  | 1, 2, 4, 8, 16, 32, 64, 128, | 
|  | }; | 
|  |  | 
|  | void	mark(double nn, long k); | 
|  | void	ouch(void); | 
|  | Biobuf bout; | 
|  |  | 
|  | void | 
|  | main(int argc, char *argp[]) | 
|  | { | 
|  | int i; | 
|  | double k, temp, v, limit, nn; | 
|  |  | 
|  | Binit(&bout, 1, OWRITE); | 
|  |  | 
|  | if(argc <= 1) { | 
|  | fprint(2, "usage: primes starting [ending]\n"); | 
|  | exits("usage"); | 
|  | } | 
|  | nn = atof(argp[1]); | 
|  | limit = big; | 
|  | if(argc > 2) { | 
|  | limit = atof(argp[2]); | 
|  | if(limit < nn) | 
|  | exits(0); | 
|  | if(limit > big) | 
|  | ouch(); | 
|  | } | 
|  | if(nn < 0 || nn > big) | 
|  | ouch(); | 
|  | if(nn == 0) | 
|  | nn = 1; | 
|  |  | 
|  | if(nn < 230) { | 
|  | for(i=0; i<ptsiz; i++) { | 
|  | if(pt[i] < nn) | 
|  | continue; | 
|  | if(pt[i] > limit) | 
|  | exits(0); | 
|  | print("%d\n", pt[i]); | 
|  | if(limit >= big) | 
|  | exits(0); | 
|  | } | 
|  | nn = 230; | 
|  | } | 
|  |  | 
|  | modf(nn/2, &temp); | 
|  | nn = 2.*temp + 1; | 
|  | /* | 
|  | *	clear the sieve table. | 
|  | */ | 
|  | for(;;) { | 
|  | for(i=0; i<tabsiz; i++) | 
|  | table[i] = 0; | 
|  | /* | 
|  | *	run the sieve. | 
|  | */ | 
|  | v = sqrt(nn+tsiz8); | 
|  | mark(nn, 3); | 
|  | mark(nn, 5); | 
|  | mark(nn, 7); | 
|  | for(i=0,k=11; k<=v; k+=wheel[i]) { | 
|  | mark(nn, k); | 
|  | i++; | 
|  | if(i >= whsiz) | 
|  | i = 0; | 
|  | } | 
|  | /* | 
|  | *	now get the primes from the table | 
|  | *	and print them. | 
|  | */ | 
|  | for(i=0; i<tsiz8; i+=2) { | 
|  | if(table[i>>3] & bittab[i&07]) | 
|  | continue; | 
|  | temp = nn + i; | 
|  | if(temp > limit) | 
|  | exits(0); | 
|  | Bprint(&bout, "%lld\n", (long long)temp); | 
|  | if(limit >= big) | 
|  | exits(0); | 
|  | } | 
|  | nn += tsiz8; | 
|  | } | 
|  | } | 
|  |  | 
|  | void | 
|  | mark(double nn, long k) | 
|  | { | 
|  | double t1; | 
|  | long j; | 
|  |  | 
|  | modf(nn/k, &t1); | 
|  | j = k*t1 - nn; | 
|  | if(j < 0) | 
|  | j += k; | 
|  | for(; j<tsiz8; j+=k) | 
|  | table[j>>3] |= bittab[j&07]; | 
|  | } | 
|  |  | 
|  | void | 
|  | ouch(void) | 
|  | { | 
|  | fprint(2, "limits exceeded\n"); | 
|  | exits("limits"); | 
|  | } |