Successive prime differences: Difference between revisions

Content deleted Content added
Thundergnat (talk | contribs)
Rename Perl 6 -> Raku, alphabetize, minor clean-up
Added C++ solution
Line 138: Line 138:
(7, 11, 13), (997807, 997811, 997813), 1444
(7, 11, 13), (997807, 997811, 997813), 1444
(31, 37, 41, 43), (997141, 997147, 997151, 997153), 306
(31, 37, 41, 43), (997141, 997147, 997151, 997153), 306
</pre>

=={{header|C++}}==
<lang cpp>#include <iostream>
#include <cstdint>
#include <vector>

using integer = uint32_t;
using vector = std::vector<integer>;

class sieve_of_eratosthenes {
public:
explicit sieve_of_eratosthenes(size_t);
bool is_prime(integer n) const {
return is_prime_[n];
}
private:
std::vector<bool> is_prime_;
};

sieve_of_eratosthenes::sieve_of_eratosthenes(size_t max)
: is_prime_(max, true) {
is_prime_[0] = is_prime_[1] = false;
for (integer p = 2; p * p < max; ++p) {
if (is_prime_[p]) {
for (integer q = p * p; q < max; q +=p)
is_prime_[q] = false;
}
}
}

void print_vector(const vector& vec) {
if (!vec.empty()) {
auto i = vec.begin();
std::cout << '(' << *i;
for (++i; i != vec.end(); ++i)
std::cout << ", " << *i;
std::cout << ')';
}
}

class diffs {
public:
diffs(std::initializer_list<integer> list) : diffs_(list) {}
diffs(const vector& vec) : diffs_(vec) {}
void test_group(const vector&);
size_t size() const {
return diffs_.size();
}
void print(std::ostream&);
private:
vector diffs_;
vector first_;
vector last_;
integer count_ = 0;
};

void diffs::test_group(const vector& vec) {
if (vec.size() < size() + 1)
return;
size_t start = vec.size() - size() - 1;
for (size_t i = 0, j = start + 1; i < size(); ++i, ++j) {
if (vec[j] - vec[j - 1] != diffs_[i])
return;
}
vector group(vec.begin() + start, vec.end());
if (count_ == 0)
first_ = group;
last_ = group;
++count_;
}

void diffs::print(std::ostream& out) {
print_vector(diffs_);
out << ": first group = ";
print_vector(first_);
out << ", last group = ";
print_vector(last_);
out << ", count = " << count_ << '\n';
}

int main() {
const integer limit = 1000000;
const size_t max_group_size = 4;
sieve_of_eratosthenes sieve(limit);
diffs d[] = { {2}, {1}, {2, 2}, {2, 4}, {4, 2}, {6, 4, 2} };
vector group;
for (integer p = 0; p < limit; ++p) {
if (!sieve.is_prime(p))
continue;
if (group.size() >= max_group_size)
group.erase(group.begin());
group.push_back(p);
for (auto&& diff : d) {
diff.test_group(group);
}
}
for (auto&& diff : d) {
diff.print(std::cout);
}
return 0;
}</lang>

{{out}}
<pre>
(2): first group = (3, 5), last group = (999959, 999961), count = 8169
(1): first group = (2, 3), last group = (2, 3), count = 1
(2, 2): first group = (3, 5, 7), last group = (3, 5, 7), count = 1
(2, 4): first group = (5, 7, 11), last group = (999431, 999433, 999437), count = 1393
(4, 2): first group = (7, 11, 13), last group = (997807, 997811, 997813), count = 1444
(6, 4, 2): first group = (31, 37, 41, 43), last group = (997141, 997147, 997151, 997153), count = 306
</pre>
</pre>