/// <summary> /// Initializes a collection consisting out of a single value. /// An integer cand is prime iff there is a prime number /// in the range (cand-1, cand]. /// </summary> /// <param name="sieve">The sieve to be used.</param> /// <param name="cand">The prime number candidate.</param> public PrimeCollection(PrimeSieve sieve, int cand) { // Note, that this PrimeCollection is not made public // via PrimeSieve. It is used only to test primality. // It is a private constructor only for PrimeSieve. this.sieve = sieve; this.primeRange = this.enumRange = null; this.start = this.IndexOf(cand - 1, 0, sieve.numberOfPrimes); this.end = sieve.primes[this.start] == cand ? this.start + 1 : this.start; this.isPrime = this.start < this.end; if (this.isPrime) { this.start = this.IndexOf(cand, this.start, sieve.numberOfPrimes); } this.nextPrime = sieve.primes[this.start]; this.increment = 0; }
/// <summary /> /// <param name="sieve"></param> /// <param name="enumRange"></param> /// <param name="increment"></param> public PrimeCollection(PrimeSieve sieve, PositiveRange enumRange, int increment) { sieve.sieveRange.ContainsOrFail(enumRange); this.sieve = sieve; this.enumRange = enumRange; int nops = sieve.numberOfPrimes; this.start = this.IndexOf(enumRange.Min - 1, 0, nops - 1); this.end = this.IndexOf(enumRange.Max, this.start, nops) - 1; if (this.end < this.start) //-- PrimeRange is empty. { this.end = -1; this.primeRange = new PositiveRange(0, 0); } else { this.primeRange = new PositiveRange(this.start + 1, this.end + 1); } this.increment = increment; }