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