| 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)). |
| |