summaryrefslogtreecommitdiff
path: root/math/primeSieve.cpp
blob: 5e8d6f877639aa032a17872d5fe06467042d8df2 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
// Laufzeit: O(n * log log n)
#define N 100000001 // Bis 10^8 in unter 64MB Speicher.
bitset<N / 2> isPrime;

inline bool check(int x) { // Diese Methode zum Lookup verwenden.
  if (x < 2) return false;
  else if (x == 2) return true;
  else if (!(x & 1)) return false;
  else return !isPrime[x / 2];
}

inline int primeSieve(int n) { // Gibt die Anzahl der Primzahlen <= n zurück.
  int counter = 1;
  for (int i = 3; i <= min(N, n); i += 2) {
    if (!isPrime[i / 2]) {
      for (int j = 3 * i; j <= min(N, n); j+= 2 * i) isPrime[j / 2] = 1;
      counter++;
    }
  }
  return counter;
}