From 60d585fb517b423d9ef4aacb3e6160f1ff8a8177 Mon Sep 17 00:00:00 2001 From: Kim Walisch Date: Mon, 1 Jul 2024 15:53:14 +0200 Subject: [PATCH] Move code from generate.hpp to generate.cpp (#75) --- include/generate.hpp | 71 ++++++++++++++++++++++++---------- src/generate.cpp | 69 +++++++++++++++++++++++++++++++-- test/generate_lpf.cpp | 2 +- test/lmo/BinaryIndexedTree.cpp | 2 +- test/phi_tiny.cpp | 2 +- test/sieve1.cpp | 2 +- test/sieve2.cpp | 2 +- 7 files changed, 121 insertions(+), 29 deletions(-) diff --git a/include/generate.hpp b/include/generate.hpp index 15e435b78..b2b092cfa 100644 --- a/include/generate.hpp +++ b/include/generate.hpp @@ -1,7 +1,7 @@ /// /// @file generate.hpp /// -/// Copyright (C) 2023 Kim Walisch, +/// Copyright (C) 2024 Kim Walisch, /// /// This file is distributed under the BSD License. See the COPYING /// file in the top level directory. @@ -10,53 +10,84 @@ #ifndef GENERATE_HPP #define GENERATE_HPP -#include #include +#include #include namespace primecount { -/// Generate a vector with the primes <= max. +/// defined in generate.cpp +Vector generate_primes_i32(int64_t max); +Vector generate_primes_u32(int64_t max); +Vector generate_primes_i64(int64_t max); +Vector generate_primes_u64(int64_t max); +Vector generate_n_primes_i32(int64_t n); + +/// Returns a vector with the primes <= max. +/// The primes vector uses 1-indexing i.e. primes[1] = 2. +/// +template +typename std::enable_if::value, Vector>::type +generate_primes(int64_t max) +{ + return generate_primes_i32(max); +} + +/// Returns a vector with the primes <= max. +/// The primes vector uses 1-indexing i.e. primes[1] = 2. +/// +template +typename std::enable_if::value, Vector>::type +generate_primes(int64_t max) +{ + return generate_primes_u32(max); +} + +/// Returns a vector with the primes <= max. +/// The primes vector uses 1-indexing i.e. primes[1] = 2. +/// +template +typename std::enable_if::value, Vector>::type +generate_primes(int64_t max) +{ + return generate_primes_i64(max); +} + +/// Returns a vector with the primes <= max. /// The primes vector uses 1-indexing i.e. primes[1] = 2. /// template -Vector generate_primes(int64_t max) +typename std::enable_if::value, Vector>::type +generate_primes(int64_t max) { - Vector primes; - primes.resize(1); - primes[0] = 0; - primesieve::generate_primes(max, &primes); - return primes; + return generate_primes_u64(max); } -/// Generate a vector with the first n primes. +/// Returns a vector with the first n primes. /// The primes vector uses 1-indexing i.e. primes[1] = 2. // template -Vector generate_n_primes(int64_t n) +typename std::enable_if::value, Vector>::type +generate_n_primes(int64_t n) { - Vector primes; - primes.reserve(n + 1); - primes.push_back(0); - primesieve::generate_n_primes(n, &primes); - return primes; + return generate_n_primes_i32(n); } -/// Generate a vector with Möbius function values +/// Returns a vector with Möbius function values Vector generate_moebius(int64_t max); -/// Generate a vector with the least prime +/// Returns a vector with the least prime /// factors of the integers <= max. /// Vector generate_lpf(int64_t max); -/// Generate a vector with the largest prime +/// Returns a vector with the largest prime /// factors of the integers <= max. /// Vector generate_mpf(int64_t max); -/// Generate a vector with the prime counts <= max +/// Returns a vector with the prime counts <= max /// using the sieve of Eratosthenes. /// Vector generate_pi(int64_t max); diff --git a/src/generate.cpp b/src/generate.cpp index a829d2c1d..1735866c1 100644 --- a/src/generate.cpp +++ b/src/generate.cpp @@ -10,13 +10,74 @@ #include #include #include +#include #include #include namespace primecount { -/// Generate a vector with the prime counts <= max +/// Returns a vector with the primes <= max. +/// The primes vector uses 1-indexing i.e. primes[1] = 2. +/// +Vector generate_primes_i32(int64_t max) +{ + Vector primes; + primes.resize(1); + primes[0] = 0; + primesieve::generate_primes(max, &primes); + return primes; +} + +/// Returns a vector with the primes <= max. +/// The primes vector uses 1-indexing i.e. primes[1] = 2. +/// +Vector generate_primes_u32(int64_t max) +{ + Vector primes; + primes.resize(1); + primes[0] = 0; + primesieve::generate_primes(max, &primes); + return primes; +} + +/// Returns a vector with the primes <= max. +/// The primes vector uses 1-indexing i.e. primes[1] = 2. +/// +Vector generate_primes_i64(int64_t max) +{ + Vector primes; + primes.resize(1); + primes[0] = 0; + primesieve::generate_primes(max, &primes); + return primes; +} + +/// Returns a vector with the primes <= max. +/// The primes vector uses 1-indexing i.e. primes[1] = 2. +/// +Vector generate_primes_u64(int64_t max) +{ + Vector primes; + primes.resize(1); + primes[0] = 0; + primesieve::generate_primes(max, &primes); + return primes; +} + +/// Returns a vector with the first n primes. +/// The primes vector uses 1-indexing i.e. primes[1] = 2. +// +Vector generate_n_primes_i32(int64_t n) +{ + Vector primes; + primes.reserve(n + 1); + primes.push_back(0); + primesieve::generate_n_primes(n, &primes); + return primes; +} + +/// Returns a vector with the prime counts <= max /// using the sieve of Eratosthenes /// Vector generate_pi(int64_t max) @@ -44,7 +105,7 @@ Vector generate_pi(int64_t max) return pi; } -/// Generate a vector with Möbius function values. +/// Returns a vector with Möbius function values. /// This implementation is based on code by Rick Sladkey: /// https://mathoverflow.net/q/99545 /// @@ -81,7 +142,7 @@ Vector generate_moebius(int64_t max) return mu; } -/// Generate a vector with the least prime factors +/// Returns a vector with the least prime factors /// of the integers <= max. /// @Examples: lfp(2) = 2, lpf(15) = 3 /// @@ -116,7 +177,7 @@ Vector generate_lpf(int64_t max) return lpf; } -/// Generate a vector with the largest prime factors +/// Returns a vector with the largest prime factors /// of the integers <= max. /// @Examples: mfp(2) = 2, mpf(15) = 5 /// diff --git a/test/generate_lpf.cpp b/test/generate_lpf.cpp index e7f4ccb74..eabe7ffdd 100644 --- a/test/generate_lpf.cpp +++ b/test/generate_lpf.cpp @@ -34,7 +34,7 @@ int main() auto max = dist(gen); auto lpf = generate_lpf(max); - auto primes = generate_primes(max); + auto primes = generate_primes(max); for (int i = 2; i <= max; i++) { diff --git a/test/lmo/BinaryIndexedTree.cpp b/test/lmo/BinaryIndexedTree.cpp index fb994e5e0..4d827b1bc 100644 --- a/test/lmo/BinaryIndexedTree.cpp +++ b/test/lmo/BinaryIndexedTree.cpp @@ -41,7 +41,7 @@ int main() int size = dist(gen); size = next_power_of_2(size); - auto primes = generate_primes(isqrt(size)); + auto primes = generate_primes(isqrt(size)); std::vector sieve(size, 1); BinaryIndexedTree tree; diff --git a/test/phi_tiny.cpp b/test/phi_tiny.cpp index 9decf05a4..fcb3f3e39 100644 --- a/test/phi_tiny.cpp +++ b/test/phi_tiny.cpp @@ -50,7 +50,7 @@ int main() int64_t size = dist(gen); int64_t x = size - 1; - auto primes = generate_n_primes(max_a); + auto primes = generate_n_primes(max_a); std::vector sieve(size, 1); for (int a = 1; a <= max_a; a++) diff --git a/test/sieve1.cpp b/test/sieve1.cpp index c23b64519..f230cd96b 100644 --- a/test/sieve1.cpp +++ b/test/sieve1.cpp @@ -39,7 +39,7 @@ int main() int low = 0; int high = dist(gen); - auto primes = generate_primes(isqrt(high)); + auto primes = generate_primes(isqrt(high)); auto segment_size = Sieve::get_segment_size(high - low); Sieve sieve(low, segment_size, primes.size()); diff --git a/test/sieve2.cpp b/test/sieve2.cpp index 396585091..d3b5448d3 100644 --- a/test/sieve2.cpp +++ b/test/sieve2.cpp @@ -40,7 +40,7 @@ int main() int low = 0; int high = dist(gen); - auto primes = generate_primes(isqrt(high)); + auto primes = generate_primes(isqrt(high)); auto segment_size = Sieve::get_segment_size(high - low); Sieve sieve(low, segment_size, primes.size());