|
|
1.1 root 1: static double big = 7.20575940379e16;
2: #define ptsiz 50
3: #define tabsiz 1000
4: #define tsiz8 8000
5: #define whsiz 48
6: double nn;
7: char table[tabsiz];
8: int pt[] = {
9: 2, 3, 5, 7, 11, 13, 17, 19, 23, 29,
10: 31, 37, 41, 43, 47, 53, 59, 61, 67, 71,
11: 73, 79, 83, 89, 97,101,103,107,109,113,
12: 127,131,137,139,149,151,157,163,167,173,
13: 179,181,191,193,197,199,211,223,227,229,
14: };
15: double wheel[] = {
16: 10, 2, 4, 2, 4, 6, 2, 6, 4, 2,
17: 4, 6, 6, 2, 6, 4, 2, 6, 4, 6,
18: 8, 4, 2, 4, 2, 4, 8, 6, 4, 6,
19: 2, 4, 6, 2, 6, 6, 4, 2, 4, 6,
20: 2, 6, 4, 2, 4, 2,10, 2,
21: };
22: char bittab[] = {
23: 1, 2, 4, 8, 16, 32, 64, 128,
24: };
25:
26: main(argc, argp)
27: int argc;
28: char *argp[];
29: {
30: register i;
31: double k, temp, v;
32: double limit = big;
33: double atof(), sqrt();
34:
35: if(argc > 1){
36: nn = atof(argp[1]);
37: }else{
38: scanf("%lf", &nn);
39: }
40: if(argc > 2){
41: limit = atof(argp[2]);
42: if(limit < nn) exit(0);
43: if(limit > big) ouch();
44: }
45: if((nn<0) || (nn>big)) ouch();
46: if(nn == 0) exit();
47:
48: if(nn < 230.){
49: for(i=0; i<ptsiz; i++){
50: if(pt[i] < nn) continue;
51: if(pt[i] > limit) exit(0);
52: printf("%d\n", pt[i]);
53: }
54: nn = 230.;
55: }
56:
57: modf(nn/2, &temp);
58: nn = 2.*temp + 1;
59: /*
60: * clear the sieve table.
61: */
62: while(1){
63: for(i=0;i<tabsiz;i++)
64: table[i] = 0;
65: /*
66: * run the sieve.
67: */
68: v = sqrt(nn+tsiz8);
69: mark(nn,(double)3);
70: mark(nn,(double)5);
71: mark(nn,(double)7);
72: for(i=0,k=11;k<=v;k=k+wheel[i]){
73: mark(nn,k);
74: if(++i == whsiz) i = 0;
75: }
76: /*
77: * now get the primes from the table
78: * and print them.
79: */
80: for(i=0; i<tsiz8; i += 2){
81: if(table[i>>3] & bittab[i&07]) continue;
82: temp = nn + i;
83: if(temp > limit) exit(0);
84: printf("%.0f\n", temp);
85: }
86: nn += tsiz8;
87: }
88: }
89:
90: mark(nn,k)
91: double nn,k;
92: {
93: double t1;
94: register j;
95: register k1 = k;
96:
97: modf(nn/k, &t1);
98: j = k*t1 - nn;
99: if(j < 0)
100: j += k1;
101: for( ; j < tsiz8; j += k1){
102: table[j>>3] |= bittab[j&07];
103: }
104: }
105:
106: ouch()
107: {
108: printf("OUCH!\n");
109: exit(1);
110: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.