home *** CD-ROM | disk | FTP | other *** search
/ NetNews Usenet Archive 1992 #31 / NN_1992_31.iso / spool / comp / lang / c / 18799 < prev    next >
Encoding:
Text File  |  1992-12-22  |  2.2 KB  |  96 lines

  1. Path: sparky!uunet!olivea!hal.com!darkstar.UCSC.EDU!cats.ucsc.edu!banshee
  2. From: banshee@cats.ucsc.edu (Wailer at the Gates of Dawn)
  3. Newsgroups: comp.lang.c
  4. Subject: Finding Big Primes
  5. Message-ID: <1h85v1INNmv4@darkstar.UCSC.EDU>
  6. Date: 22 Dec 92 22:48:01 GMT
  7. Organization: University of California, Santa Cruz
  8. Lines: 85
  9. NNTP-Posting-Host: am.ucsc.edu
  10.  
  11.  
  12. Here is some code using the gmp 2.1 library to find BIG primes.
  13. Mersenne Primes.
  14.  
  15.  
  16. /*
  17.  * Pfinder.c -- Mersenne Prime Locator
  18.  * J. Vinopal banshee@cats.UCSC.EDU
  19.  * 1/12/91
  20.  */
  21. #include <stdio.h>
  22. #include "gmp.h"
  23.  
  24. #define mout(x) (mpz_out_str(stdout, 10, (x)))
  25.  
  26. main(int argc, char **argv)
  27. {
  28.     MP_INT    Temp_Var, Temp_Var2, Mprime;
  29.     MP_INT    Zero, One, Two, Four;
  30.     MP_INT    startNum;
  31.     long    i, TestPrime, Time1, startPos;
  32.     int    savePos;
  33.     FILE    *primeFile, *compareFile;
  34.  
  35.  
  36.     if (((primeFile = fopen(argv[1], "r")) == NULL) || (argc < 2)) {
  37.         printf("Can't read data file.\n");
  38.         exit(0);
  39.     }
  40.  
  41. /* Initialize MINT Constants */
  42.     mpz_init(&Zero);
  43.     mpz_init_set_si(&One, 1L);
  44.     mpz_init_set_si(&Two, 2L);
  45.     mpz_init_set_si(&Four, 4L);
  46.  
  47.     mpz_init(&startNum);
  48.     mpz_init(&Temp_Var);
  49.     mpz_init(&Temp_Var2);
  50.     mpz_init(&Mprime);
  51.  
  52. /* Read a prime number out of the data file */
  53.     while (fscanf(primeFile, " %ld", &TestPrime) != EOF) {
  54.  
  55.         time(&Time1);    /* Get the starting time */
  56.  
  57.         /*
  58.          * Compute Mersenne number
  59.          * Mp = 2 ** P  - 1
  60.          */
  61.         mpz_pow_ui(&Temp_Var, &Two, TestPrime);
  62.         mpz_sub(&Mprime, &Temp_Var, &One);
  63.  
  64.         /*
  65.          * Starting Conditions.
  66.          */
  67.             mpz_set(&Temp_Var, &Four);
  68.             i = 2;
  69.  
  70.         /*
  71.          * Calculate Mersenne Prime sequence 
  72.          * Temp_Var = (Temp_Var**2 - 2) % Mprime
  73.          */
  74.         for (; i < TestPrime; i++) {
  75.             mpz_powm_ui(&Temp_Var2, &Temp_Var, 2L, &Mprime);
  76.             mpz_sub_ui(&Temp_Var, &Temp_Var2, 2L);
  77.         }
  78.  
  79. /* Produce Results */
  80.         if (mpz_cmp_ui(&Temp_Var, 0L) == 0) {
  81.             printf("Mersenne prime ");
  82.             printf("%d: ", TestPrime);
  83.             mout(&Mprime);
  84.             printf("\n");
  85.         }
  86.         printf("%ld %ld\n", TestPrime, (time(0) - Time1));
  87.         fflush(stdout);
  88.     }
  89. }
  90.  
  91. -- 
  92. The Wailer at the Gates of Dawn              | banshee@cats.UCSC.EDU       |
  93. Just who ARE you calling a FROOFROO Head?    |                             |
  94. DoD#0667  "Just a friend of the beast."      | banshee@ucscb.UCSC.EDU      |
  95. 2,3,5,7,13,17,19,31,61,89,107,127,521,607....| banshee@ucscb.BITNET        |
  96.