diff options
| author | kittobi92 <Tobias.Heuer@gmx.net> | 2016-01-12 11:33:32 +0100 |
|---|---|---|
| committer | kittobi92 <Tobias.Heuer@gmx.net> | 2016-01-12 11:33:32 +0100 |
| commit | b5bac6bb92abbf57f1fe4fd425842aad3a435b5d (patch) | |
| tree | e1c0833a37cfddfc401ad31e9df0aa6c5db3f19a /math/primeSieve.cpp | |
| parent | 47358081470c723dd27db55cf6499d775b805203 (diff) | |
correct primeSieve and improve prime factorization
Diffstat (limited to 'math/primeSieve.cpp')
| -rw-r--r-- | math/primeSieve.cpp | 28 |
1 files changed, 15 insertions, 13 deletions
diff --git a/math/primeSieve.cpp b/math/primeSieve.cpp index db96e5b..183d742 100644 --- a/math/primeSieve.cpp +++ b/math/primeSieve.cpp @@ -1,13 +1,15 @@ -vector<int> primes; -void primeSieve(ll n) { //berechnet die Primzahlen kleiner n - vector<int> isPrime(n,true); - for(ll i = 2; i < n; i+=2) { - if(isPrime[i]) { - primes.push_back(i); - if(i*i <= n) { - for(ll j = i; i*j < n; j+=2) isPrime[i*j] = false; - } - } - if(i == 2) i--; - } -} +#define N 10000001 +vector<ll> primes; +//Finds all prime numbers between 0..N +//Use this method for N < 10000000 to avoid memory access errors +void primeSieve() { + bitset<N> isPrime; isPrime.set(); + isPrime[0] = isPrime[1] = 0; + for(ll i = 2; i < N+1; i+=2) { + if(isPrime[i]) { + for(ll j = i*i; j >= 0 && j < N+1; j+=i) isPrime[j] = 0; + primes.push_back(i); + } + if(i == 2) i--; + } +}
\ No newline at end of file |
