summaryrefslogtreecommitdiff
path: root/math/primeSieve.cpp
diff options
context:
space:
mode:
authorkittobi92 <Tobias.Heuer@gmx.net>2016-01-12 11:33:32 +0100
committerkittobi92 <Tobias.Heuer@gmx.net>2016-01-12 11:33:32 +0100
commitb5bac6bb92abbf57f1fe4fd425842aad3a435b5d (patch)
treee1c0833a37cfddfc401ad31e9df0aa6c5db3f19a /math/primeSieve.cpp
parent47358081470c723dd27db55cf6499d775b805203 (diff)
correct primeSieve and improve prime factorization
Diffstat (limited to 'math/primeSieve.cpp')
-rw-r--r--math/primeSieve.cpp28
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