941b1165c2
From-SVN: r15955
92 lines
1.4 KiB
C
92 lines
1.4 KiB
C
#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);
|
|
}
|