/// <summary> /// Gets the enumerator for the primes. /// </summary> /// <returns>The enumerator of the primes.</returns> public IEnumerator <PrimeType> GetEnumerator() { // Two always prime. yield return(2); // Start at first block, second MSB. int liBlock = 0; byte lbBit = 1; BitArrayType lbaCurrent = mbaOddNotPrime[0] >> 1; // For each value in range stepping in incrments of two for odd values. for (PrimeType lpN = 3; lpN <= mpLimit; lpN += 2) { // If current bit not set then value is prime. if ((lbaCurrent & 1) == 0) { yield return(lpN); } // Move to NSB. lbaCurrent >>= 1; // Increment bit value. lbBit++; // If block is finished. if (lbBit == cbBitsPerBlock) { // Move to first bit of next block. lbBit = 0; liBlock++; lbaCurrent = mbaOddNotPrime[liBlock]; } } }
/// <summary> /// Gets the enumerator for the primes. /// </summary> /// <returns>The enumerator of the primes.</returns> public IEnumerator <PrimeType> GetEnumerator() { // return [2,3] + filter(primes.__getitem__, xrange(5,limit,2)) // Two & Three always prime. yield return(2); yield return(3); // Start at first block, third MSB (5). int liBlock = 0; byte lbBit = 2; BitArrayType lbaCurrent = mbaOddPrime[0] >> lbBit; // For each value in range stepping in incrments of two for odd values. for (PrimeType lpN = 5; lpN <= mpLimit; lpN += 2) { // If current bit not set then value is prime. if ((lbaCurrent & 1) == 1) { yield return(lpN); } // Move to NSB. lbaCurrent >>= 1; // Increment bit value. lbBit++; // If block is finished. if (lbBit == cbBitsPerBlock) { lbBit = 0; lbaCurrent = mbaOddPrime[++liBlock]; //// Move to first bit of next block skipping full blocks. while (lbaCurrent == 0) { lpN += ((PrimeType)cbBitsPerBlock) << 1; if (lpN <= mpLimit) { lbaCurrent = mbaOddPrime[++liBlock]; } else { break; } } } } }