Alternative Tip

# Find Prime Numbers in C# Using the Sieve of Eratosthenes

By , 20 Sep 2011
 Rate this:

This solution uses half the space by simply ignoring all even numbers. It will require a little index calculation. Also, primes are generated one by one instead of returning a list.

Another optimization can be made by starting the crossing out of multiples of a prime p at p2. Any smaller number will already have been crossed out. For the same reason, we can stop looking for non-primes at `Sqrt(bound)`. (Any number greater than that will have been crossed out as a multiple of a smaller number.)

```public static IEnumerable<int> Primes(int bound)
{
if (bound < 2) yield break;
//The first prime number is 2
yield return 2;

//Create a sieve of 'half size' starting at 3
BitArray notPrime = new BitArray((bound - 1) >> 1);
int limit = ((int)(Math.Sqrt(bound)) - 1) >> 1;
for (int i = 0; i < limit; i++) {
if (notPrime[i]) continue;
//The first number not crossed out is prime
int prime = 2 * i + 3;
yield return prime;
//cross out all multiples of this prime, starting at the prime squared
for (int j = (prime * prime - 2) >> 1; j < notPrime.Count; j += prime) {
notPrime[j] = true;
}
}
//The remaining numbers not crossed out are also prime
for (int i = limit; i < notPrime.Count; i++) {
if (!notPrime[i]) yield return 2 * i + 3;
}
}```

Software Developer (Junior)
Netherlands
Junior software developer for a few years now. Really into C#, but work usually involves Java.

 First Prev Next
 so simple and compact very nice .. dineshkummarc 17-Nov-11 23:32
 Last Visit: 31-Dec-99 18:00     Last Update: 11-Mar-14 6:05 Refresh 1