
#include <primegen.h>




void largePrimeGenerator::ensurenbits( ZZ & n, uintc nbits ) const
{
  ZZ n2;
  ZZ x;
  conv(x,"2"); 
  power(n2,x,nbits);
  if (n<n2)
    n += n2;
 
  if ((n%2)==0)
    ++n;
}

void largePrimeGenerator::findprime_randomly
( 
  ZZ & n, 
  uintc nbits 
) const
{
  for ( ; ; )
  {
    RandomBits(n,nbits);
    ensurenbits(n,nbits);
    if (isprime(n))
      return;
  }
}


void largePrimeGenerator::findprime_sequentially
( 
  ZZ & n, 
  uintc nbits 
) const
{
  RandomBits(n,nbits);
  ensurenbits(n,nbits);

  for ( ; ; )
  {
    if (isprime(n))
      return;

    n += 2;
  }
}

bool const largePrimeGenerator::isprime( ZZ const & n ) const
{
  for (uint i=0; i<vmax; ++i)
    if ((n%v[i])==0)
      return false;

  return ProbPrime(n,15);
}


largePrimeGenerator::largePrimeGenerator()
  : v(0), vmax(1000)
{
  PrimeSeq s;

  v = new long int [vmax];

  for (uint i=0; i<vmax; ++i)
    v[i] = s.next();
}

largePrimeGenerator::~largePrimeGenerator()
{
  delete[] v;
  v=0;
}




