Multi-base primes: Difference between revisions

m
C++ performance improvement
(Added another Rust solution)
m (C++ performance improvement)
Line 56:
#include <vector>
 
std::vector<bool>class prime_sieve(uint64_t limit) {
public:
std::vector<bool> sieve(limit, true);
explicit prime_sieve(uint64_t limit);
bool is_prime(uint64_t n) const {
return n == 2 || ((n & 1) == 1 && sieve[n >> 1]);
}
 
private:
std::vector<bool> sieve(limit, true);
};
 
prime_sieve::prime_sieve(uint64_t limit) : sieve((limit + 1) / 2, true) {
if (limit > 0)
sieve[0] = false;
if (limit > 1)
sieve[1] = false;
for (uint64_t i = 4; i < limit; i += 2)
sieve[i] = false;
for (uint64_t p = 3;; p += 2) {
uint64_t q = p * p;
if (q >= limit)
break;
if (sieve[p >> 1]) {
uint64_t inc = 2 * p;
for (; q < limit; q += inc)
sieve[q >> 1] = false;
}
}
return sieve;
}
 
Line 108 ⟶ 113:
 
void multi_base_primes(unsigned int max_base, unsigned int max_length) {
prime_sieve prime_sievesieve(static_cast<uint64_t>(std::pow(max_base, max_length)));
auto sieve =
prime_sieve(static_cast<uint64_t>(std::pow(max_base, max_length)));
for (unsigned int length = 1; length <= max_length; ++length) {
std::cout << length
Line 134 ⟶ 138:
for (auto d : digits)
n = n * b + d;
if (sieve[.is_prime(n]))
bases.push_back(b);
}
Line 176 ⟶ 180:
 
{{out}}
Maximum base 36 and maximum length 6. This takes 0.65 seconds to process up to 5 character strings and 2723 seconds to process up to 6 characters (3.2GHz Intel Core i5-4570).
<pre>
1-character strings which are prime in most bases: 34
Line 201 ⟶ 205:
</pre>
 
Maximum base 62 and maximum length 5. This takes 0.16 seconds to process up to 4 character strings and 1110 seconds to process up to 5 characters (3.2GHz Intel Core i5-4570).
<pre>
1-character strings which are prime in most bases: 60
1,777

edits