From cf26418e28d82ed3bf8f66d76f2ab8e33c6fc060 Mon Sep 17 00:00:00 2001 From: Henrique Bucher Date: Wed, 6 Mar 2024 13:46:18 -0600 Subject: [PATCH 1/2] Make nsieve fair. Solves #419 --- bench/algorithm/nsieve/3.cpp | 46 ++++++++++++++++++++++++++++++++++++ bench/bench_cpp.yaml | 1 + 2 files changed, 47 insertions(+) create mode 100644 bench/algorithm/nsieve/3.cpp diff --git a/bench/algorithm/nsieve/3.cpp b/bench/algorithm/nsieve/3.cpp new file mode 100644 index 00000000..6eb45b56 --- /dev/null +++ b/bench/algorithm/nsieve/3.cpp @@ -0,0 +1,46 @@ + +// The Computer Language Shootout +// http://shootout.alioth.debian.org/ +// Precedent C entry modified by bearophile for speed and size, 31 Jan 2006 +// Converted to C++ by Paul Kitchin + +#include +#include +#include +#include + +void nsieve(std::size_t max) { + std::vector flags(max,false); + std::size_t count = 0; + for (std::size_t value = 2; value < max; ++value) { + if (!flags[value]) { + ++count; + for (std::size_t multiple = value * 2; multiple < max; + multiple += value) { + flags[multiple] = true; + } + } + } + std::cout << "Primes up to " << std::setw(8) << max << ' ' << std::setw(8) + << count << '\n'; +} + +int main(int argc, char **argv) { + if (argc != 2) { + std::cerr << "usage: " << argv[0] << " \n"; + return 1; + } + unsigned int count; + { + std::istringstream convertor(argv[1]); + if (!(convertor >> count) || !convertor.eof()) { + std::cerr << "usage: " << argv[0] << " \n"; + std::cerr << "\tn must be an integer\n"; + return 1; + } + } + for (std::size_t i = 0; i < 3; ++i) { + nsieve(10000 << (count - i)); + } +} + diff --git a/bench/bench_cpp.yaml b/bench/bench_cpp.yaml index e17d7c0a..424195b5 100644 --- a/bench/bench_cpp.yaml +++ b/bench/bench_cpp.yaml @@ -18,6 +18,7 @@ problems: - name: nsieve source: - 1.cpp + - 3.cpp compiler_version_command: compiler_version_regex: runtime_version_parameter: From 4ff8324be85c9597f4e2f518570023d92d1c9367 Mon Sep 17 00:00:00 2001 From: Henrique Bucher Date: Wed, 6 Mar 2024 13:48:23 -0600 Subject: [PATCH 2/2] Replaced wrong version. --- bench/algorithm/nsieve/3.cpp | 50 +++++++++++++++--------------------- 1 file changed, 20 insertions(+), 30 deletions(-) diff --git a/bench/algorithm/nsieve/3.cpp b/bench/algorithm/nsieve/3.cpp index 6eb45b56..910e1064 100644 --- a/bench/algorithm/nsieve/3.cpp +++ b/bench/algorithm/nsieve/3.cpp @@ -1,4 +1,3 @@ - // The Computer Language Shootout // http://shootout.alioth.debian.org/ // Precedent C entry modified by bearophile for speed and size, 31 Jan 2006 @@ -9,38 +8,29 @@ #include #include -void nsieve(std::size_t max) { - std::vector flags(max,false); - std::size_t count = 0; - for (std::size_t value = 2; value < max; ++value) { - if (!flags[value]) { - ++count; - for (std::size_t multiple = value * 2; multiple < max; - multiple += value) { - flags[multiple] = true; - } +#include +#include +#include +#include + +inline void nsieve(unsigned int limit) { + std::vector primes(limit + 1, true); + primes[1] = false; + unsigned int p = 2; + while (p <= static_cast(std::sqrt(limit))) { + for (unsigned int i = p * p; i <= limit; i += p) { + primes[i] = false; + } + p = std::find(primes.begin() + p + 1, primes.end(), true) - primes.begin(); } - } - std::cout << "Primes up to " << std::setw(8) << max << ' ' << std::setw(8) - << count << '\n'; + unsigned int primeCount = std::count(primes.begin(), primes.end(), true); + std::cout << "Primes up to " << std::setw(8) << limit << std::setw(9) << primeCount << '\n'; } int main(int argc, char **argv) { - if (argc != 2) { - std::cerr << "usage: " << argv[0] << " \n"; - return 1; - } - unsigned int count; - { - std::istringstream convertor(argv[1]); - if (!(convertor >> count) || !convertor.eof()) { - std::cerr << "usage: " << argv[0] << " \n"; - std::cerr << "\tn must be an integer\n"; - return 1; + unsigned int n = (argc <= 1) ? 4 : std::atoi(argv[1]); + for (unsigned int i = n; i >= n - 2; --i) { + nsieve(10000 << i); } - } - for (std::size_t i = 0; i < 3; ++i) { - nsieve(10000 << (count - i)); - } + return 0; } -