home *** CD-ROM | disk | FTP | other *** search
/ The C Users' Group Library 1994 August / wc-cdrom-cusersgrouplibrary-1994-08.iso / listings / v_10_02 / 1002044a < prev    next >
Text File  |  1991-12-09  |  3KB  |  142 lines

  1. /*
  2. (C) Copyright 1990 Ron Burk
  3. All Rights Reserved
  4.  
  5. mkprm.c - Generate htabp.c, a list of prime numbers.
  6.  
  7.     This program generates a logarithmic table of prime numbers.  The
  8. table is stored as source code that can be compiled into another program.
  9.  
  10.  */
  11.  
  12. #include <stdio.h>
  13. #include <stdlib.h>
  14. #include <limits.h>
  15.  
  16. typedef unsigned long   ulong;
  17.  
  18. class outfile
  19.     {
  20.     FILE    *fout;      // handle to output file
  21.     int     nprimes;
  22.     void    printhead();
  23.     void    printtail();
  24. public:
  25.     outfile() : fout(NULL), nprimes(0) { };
  26.    ~outfile()                   { close(); }
  27.     void    open(const char *fname);
  28.     void    close()             { printtail(); fclose(fout); }
  29.     void    prime(ulong);       // format prime # into C initialized array
  30.     };
  31.  
  32.  
  33. //      PERCENTAGE specifies the allowable percentage discrepancy between
  34. //  the desired table size and the nearest prime number in the table. 
  35.  
  36. const PERCENTAGE = 20;
  37.  
  38.  
  39. //      MAX_PRIME limits the range of numbers which will be searched for
  40. //  primes.  Note that USHRT_MAX is guaranteed to be >= 65,535
  41.  
  42. const unsigned MAX_PRIME = USHRT_MAX;
  43.  
  44.  
  45. const MAX_NPRIMES = 100 + MAX_PRIME / 10;
  46.  
  47. const char OUTFILE[] = "htabp.c";
  48.  
  49. int     main(int /*argc*/, char /***argv*/)
  50.     {
  51.     unsigned previous = 0, log = 10;
  52.     static unsigned primes[MAX_NPRIMES];
  53.     int     nprimes = 1;
  54.     int     nprint  = 0;
  55.     outfile fout;
  56.  
  57.     fout.open(OUTFILE);
  58.     primes[0]   = 2;
  59.     for(unsigned num = 3; num < MAX_PRIME-log && nprimes < MAX_NPRIMES; num+=2)
  60.         {
  61.         for(int i = 0; i < nprimes; ++i)
  62.             if(!(num%primes[i]))
  63.                 break;
  64.             else if(num/primes[i] <= primes[i])
  65.                 {
  66.                 primes[nprimes++]   = num;
  67.                 if(num > previous + log)
  68.                     {
  69.                     ++nprint;
  70.                     previous    = num;
  71.                     log     = num / (100 / PERCENTAGE);
  72.                     fout.prime(num);
  73.                     printf( "%u\n", num );
  74.                     }
  75.                 break;
  76.                 }
  77.         }
  78.     num     = primes[nprimes-1];
  79.     if(num != previous)
  80.         {
  81.         fout.prime(num);
  82.         printf( "%u\n", num );
  83.         ++nprint;
  84.         }
  85.     printf( "nprimes = %d, nprint = %d\n", nprimes, nprint );
  86.     }
  87.  
  88. void    outfile::open(const char * fname)
  89.     {
  90.     fout   = fopen(fname, "w");
  91.  
  92.     if(fout == NULL)
  93.         {
  94.         fprintf(stderr, "Can't open output file '%s' for writing.\n",
  95.             fname);
  96.         exit(EXIT_FAILURE);
  97.         }
  98.     }
  99.  
  100. void    outfile::prime(ulong p)
  101.     {
  102.     int boundary = !(nprimes%4);
  103.  
  104.     if(nprimes == 0)
  105.         printhead();
  106.     if(nprimes)
  107.         {
  108.         fprintf(fout, ",");
  109.         if(boundary)
  110.             fprintf(fout, "\n");
  111.         }
  112.     if(boundary)
  113.         fprintf(fout, "    ");
  114.     fprintf(fout, "%12lu", p);
  115.     ++nprimes;
  116.     }
  117.  
  118. void    outfile::printhead()
  119.     {
  120.     char    *type;
  121.  
  122.     fprintf(fout,
  123.  
  124. "// machine generated; DO NOT EDIT\n"
  125. "static unsigned short Primes [] = \n"
  126. "    {\n"
  127.  
  128.     );
  129.     }
  130.  
  131. void    outfile::printtail()
  132.     {
  133.     fprintf(fout,
  134.  
  135. "\n"
  136. "    };\n"
  137. "const NPRIMES = %d;\n",
  138.  
  139.         nprimes
  140.         );
  141.     }
  142.