bool IsPrime(const Integer &p) { if (p <= s_lastSmallPrime) return IsSmallPrime(p); else if (p <= Singleton<Integer, NewLastSmallPrimeSquared>().Ref()) return SmallDivisorsTest(p); else return SmallDivisorsTest(p) && IsStrongProbablePrime(p, 3) && IsStrongLucasProbablePrime(p); }
bool IsPrime(const Integer &p) { static const Integer lastSmallPrimeSquared = Integer(lastSmallPrime).Squared(); if (p <= lastSmallPrime) return IsSmallPrime(p); else if (p <= lastSmallPrimeSquared) return SmallDivisorsTest(p); else return SmallDivisorsTest(p) && IsStrongProbablePrime(p, 3) && IsStrongLucasProbablePrime(p); }
bool RabinMillerTest(RandomNumberGenerator &rng, const Integer &n, unsigned int rounds) { if (n <= 3) return n==2 || n==3; assert(n>3); Integer b; for (unsigned int i=0; i<rounds; i++) { b.Randomize(rng, 2, n-2); if (!IsStrongProbablePrime(n, b)) return false; } return true; }
static inline bool FastProbablePrimeTest(const Integer &n) { return IsStrongProbablePrime(n,2); }