1  #include <stdio.h>
       2  
       3  /* Convert a decimal string to a long long unsigned.  No error check is
       4     performed.  */
       5  
       6  long long unsigned
       7  str2llu (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  
      27  long unsigned
      28  sqrtllu (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  
      52  int 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  
      79  main (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  }