Algorithm

boolean[] sieve(int n) {
  boolean[] isPrime = new boolean[n + 1];
  Arrays.fill(isPrime, true);
  isPrime[0] = isPrime[1] = false;
  for (int i = 2; (long)i * i <= n; i++)
    if (isPrime[i])
      for (int j = i * i; j <= n; j += i) isPrime[j] = false;
  return isPrime;
}
Advertisement

Start at i²

Smaller multiples already marked by smaller primes. Saves time.

Advertisement

Linear sieve

Each composite marked exactly once by its smallest prime factor. Slightly faster, O(N).