Computer Chess Club Archives


Search

Terms

Messages

Subject: Re: Corrected pseudo C code

Author: Tord Romstad

Date: 03:28:46 05/28/05

Go up one level in this thread


On May 28, 2005 at 05:24:51, Joseph Tadeusz wrote:

>On May 27, 2005 at 11:12:52, Vincent Diepeveen wrote:
>
>>A retry :
>>
>>// Diepeveen test to find mersenne primes
>>// test whether p is prime p = 2^n - 1
>>// when given n is prime
>>
>>t = 3;
>>for( j = 1 ; j < n ; j++ )
>>  t = t*t; // mod p
>>  if( t == p-3 )  printf("prime\n"); else printf("composite\n");
>>
>>3
>>9
>>19
>>20
>>28 <==> p-3 = 31 - 3 = 28
>>
>>Vincent
>
>Does this also work for primes larger than 31?

Yes, it works until the numbers get so big that you get an
integer overflow (which happens very quickly if you use
C with 32-bit or 64-bit ints).  The algorithm in itself is
correct.

If you want to test with bigger numbers, try to find some
bignum artithmetics library for C (the GMP library is supposed
to be good, I think) or use a programming language with
built-in support for arbitrary-precision integer arithmetic,
like Common Lisp.  Below you will find Common Lisp code
for the classical Lucas-Lehmer test as well as Vincent's variant:

(defun prime-p (n)
  "Tests whether N is a prime number."
  (when (>= n 2)
    (loop for i from 2 to (floor (sqrt n))
          when (= 0 (mod n i)) return nil
          finally (return t))))

(defun mersenne-prime-p (p)
  "Tests whether 2^P - 1 is a prime, assuming that P is prime."
  (loop with n = (- (expt 2 p) 1)
        for i from 2 to p
        for s = 4 then (mod (- (* s s) 2) n)
        finally (return (= 0 s))))

(defun vincent-mersenne-prime-p (p)
  "Tests whether 2^P - 1 is a prime, assuming that P is prime."
  (loop with n = (- (expt 2 p) 1)
        for j from 1 to p
        for s = 3 then (mod (* s s) n)
        finally (return (= (- n 3) s))))

Finding all Mersenne primes below 2^1000 - 1 can now be done like this:

CL-USER> (loop for x from 3 to 1000
	       when (and (prime-p x) (mersenne-prime-p x))
	       collect x)
(3 5 7 13 17 19 31 61 89 107 127 521 607)

Let's have a look at the biggest number, 2^607 - 1:

CL-USER> (- (expt 2 607) 1)
531137992816767098689588206552468627329593117727031923199444138200403559860852242739162502265229285668889329486246501015346579337652707239409519978766587351943831270835393219031728127

Tord



This page took 0 seconds to execute

Last modified: Thu, 15 Apr 21 08:11:13 -0700

Current Computer Chess Club Forums at Talkchess. This site by Sean Mintz.