Both sides previous revision
Previous revision
Next revision
|
Previous revision
|
algorithms:sieve:eratosthenes [2018/08/09 15:41] jguerin |
algorithms:sieve:eratosthenes [2018/08/20 13:58] (current) jguerin Minor wording tweak. |
====== Prime Number Generator: Sieve of Eratosthenes ====== | ====== Prime Number Generator: Sieve of Eratosthenes ====== |
| |
Prime sieves are common devices for generating prime numbers in a given range. These lists can be used for quick verification of relatively small prime numbers (typically ranging up to 10<sup>6</sup> or greater), in particular when many such verifications may be necessary. | Prime sieves((A sieve (Pronounced like "give" not "sleeve".) is a physical metaphor (i.e., a mesh bowl in a kitchen) for an algorithmic technique used in number theory to "sift out" a class of numbers in a given set or range.)) are common devices for generating prime numbers in a given range. These lists can be used for quick verification of relatively small prime numbers (typically no larger than 10<sup>8</sup>) when many such verifications may be necessary. |
| |
== Etymology == | |
A sieve((Pronounced like "give" not "sleeve".)) is a physical metaphor (i.e., a mesh bowl in a kitchen) for an algorithmic technique used in number theory to "sift out" a class of numbers in a given set or range. | |
| |
===== Source ===== | ===== Source ===== |
#include <bitset> | #include <bitset> |
#include <cmath> | #include <cmath> |
#include <iostream> | |
#include <vector> | #include <vector> |
| |
using namespace std; | using namespace std; |
| |
| const int MAX_PRIMES=100000000; |
| |
const int MAX_PRIMES=10000000; | bitset<MAX_PRIMES+1> nums; // true for each prime |
| vector<int> primes; // list of primes |
| |
vector<int>sieve(int n) { | void sieve(int n) { |
bitset<MAX_PRIMES+1> nums; // generate a list of potential primes | |
nums.set(); // set all values to true | nums.set(); // set all values to true |
nums[0] = nums[1] = false; | nums[0] = nums[1] = false; |
for(int i=2; i<=sqrt(n)+1; i++) // filter out non-primes | for(int i=2; i<=sqrt(n)+1; i++) // filter out non-primes |
for(int j=i*i; j<n+2; j+=i) | if(nums[i]) |
nums[j] = false; | for(int j=i*i; j<n+2; j+=i) |
| nums[j] = false; |
vector<int> primes; // generate primes from true values | |
for(int i=0; i<nums.size(); i++) | for(int i=0; i<nums.size(); i++) |
if(nums[i] == true) | if(nums[i] == true) |
primes.push_back(i); | primes.push_back(i); |
| |
return primes; | |
} | } |
| |
int main() { | int main() { |
vector<int> primes = sieve(MAX_PRIMES); | sieve(MAX_PRIMES); |
| |
return 0; | return 0; |
} | } |
</file> | </file> |
| |
=== Implementation Notes === | ==== Implementation Notes ==== |
A C++ [[cpp_std_bitset|bitset]](([[http://www.cplusplus.com/reference/bitset/bitset/]])) is used for additional time/space efficiency to store true/false values. A [[cpp_std_vector|vector]] would also work, but at an increased cost of time and space. | A C++ [[cpp_std_bitset|bitset]](([[http://www.cplusplus.com/reference/bitset/bitset/]])) is used for additional time/space efficiency to store true/false values. A [[cpp_std_vector|vector]] would also work, but at an increased cost of time and space. |
| |
| |
==== Benchmarks ==== | ==== Benchmarks ==== |
The Python3 implementation should work reliably for primes up to 10<sup>6</sup> in competition settings. The C++ implementation should work reliably for primes up to 10<sup>7</sup> in contest settings.((All tests ran on an Intel(R) Xeon(R) X5550 CPU running at 2.67GHz.\\ Results are reported as user time in seconds using the bash builtin ''time'' command.)) | This sieve should work reliably for primes up to 10<sup>6</sup> (Python3) or 10<sup>7</sup> (C++) in traditional contest settings.((All tests ran on an Intel(R) Xeon(R) X5550 CPU running at 2.67GHz.\\ Results are reported as user time in seconds using the bash builtin ''time'' command.)) |
| |
^ %%n%% ^ Python3((Python 3.5.2)) ^ C++((c++ -g -O2 -static -std=gnu++14 {files})) ^ | ^ %%n%% ^ Python3((Python 3.5.2)) ^ C++((c++ -g -O2 -static -std=gnu++14 {files})) ^ |
^ 10<sup>5</sup> | .054s | .000s | | ^ 10<sup>5</sup> | .038s | .000s | |
^ 10<sup>6</sup> | .562s | .011s | | ^ 10<sup>6</sup> | .238s | .008s | |
^ 10<sup>7</sup> | - | .167s | | ^ 10<sup>7</sup> | - | .060s | |
| ^ 10<sup>8</sup> | - | .963 | |
| |
| ==== Example Problems ==== |
| | Source | Problem | Difficulty((Difficulty rounded to the nearest 0.5.)) | Solutions (Spoilers) | |
| | Kattis | [[https://open.kattis.com/problems/happyprime| Happy Happy Prime Prime]] | 2.5/10 | [[http://cs1.utm.edu/icpc/doku.php?id=files:py:happyprime|happyprime.py]] | |
| | Kattis | [[https://open.kattis.com/problems/goldbach2| Goldbach's Conjecture]] | 3.5/10 | [[http://cs1.utm.edu/icpc/doku.php?id=files:py:goldbach2|goldbach2.py]] | |
| | Kattis | [[https://open.kattis.com/problems/primesieve|Prime Sieve]] | 5.0/10 | [[http://cs1.utm.edu/icpc/doku.php?id=files:cpp:primesieve|primesieve.cpp]] | |
| |
==== Source ==== | ==== Source ==== |
Implementations are from the pseudocode provided in the Wikipedia article on the [[https://en.wikipedia.org/wiki/Sieve_of_Eratosthenes|Sieve of Eratosthenes]]((Retrieved 08/08/2018)). | Implementations are from the pseudocode provided in the Wikipedia article on the [[https://en.wikipedia.org/wiki/Sieve_of_Eratosthenes|Sieve of Eratosthenes]]((Retrieved 08/08/2018)). |
| |