blob: 833624ff3f78563b0dc86c2fbfc67d0464ac5d06 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
|
#include <stdio.h>
/* Convert a decimal string to a long long unsigned. No error check is
performed. */
long long unsigned
str2llu (str)
char *str;
{
long long unsigned acc;
int d;
acc = *str++ - '0';
for (;;)
{
d = *str++;
if (d == '\0')
break;
d -= '0';
acc = acc * 10 + d;
}
return acc;
}
/* isqrt(t) - computes the square root of t. (tege 86-10-27) */
long unsigned
sqrtllu (long long unsigned t)
{
long long unsigned s;
long long unsigned b;
for (b = 0, s = t; b++, (s >>= 1) != 0; )
;
s = 1LL << (b >> 1);
if (b & 1)
s += s >> 1;
do
{
b = t / s;
s = (s + b) >> 1;
}
while (b < s);
return s;
}
int plist (p0, p1, tab)
long long unsigned p0, p1;
long long unsigned *tab;
{
long long unsigned p;
long unsigned d;
long unsigned s;
long long unsigned *xp = tab;
for (p = p0; p <= p1; p += 2)
{
s = sqrtllu (p);
for (d = 3; d <= s; d += 2)
{
long long unsigned q = p % d;
if (q == 0)
goto not_prime;
}
*xp++ = p;
not_prime:;
}
*xp = 0;
return xp - tab;
}
main (argc, argv)
int argc;
char *argv[];
{
long long tab[10];
int nprimes;
nprimes = plist (str2llu ("1234111111"), str2llu ("1234111127"), tab);
if(tab[0]!=1234111117LL||tab[1]!=1234111121LL||tab[2]!=1234111127LL||tab[3]!=0)
abort();
exit(0);
}
|