| #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); |
| } |