// file:    Primes.C
// author:  Robert Keller
// purpose: defining infinite list of primes

#include "Primes.H"

// Prime generator class

// initialize static variables, which are generated on demand

Polylist Primes::oddPrimes = cons(3, Seed(Primes::primesGen, 5));
Polylist Primes::primes = cons(2, oddPrimes);


// primesGen finds next prime >= Candidate and returns list beginning with it
// as first element.  It uses the list oddPrimes, which is being constructed,
// as trial divisors.

Poly Primes::primesGen(Poly Candidate)
  {
  for( integer candidate = Candidate; ; candidate += 2 ) // consider only odds
    {
    for( Polylist trials = oddPrimes; ; trials = trials.rest() )
      {
      integer trial = trials.first();
      if( candidate % trial == 0 )
        break;                                 // not prime, try next candidate
      if( trial*trial > candidate )
        return cons(candidate, Seed(primesGen, candidate+2)); // prime
      }
    }
  }
