Mertens function: Difference between revisions

C++ - simplified code
(Added Swift solution)
(C++ - simplified code)
Line 571:
<lang cpp>#include <iomanip>
#include <iostream>
#include <mapvector>
 
std::vector<int> mertens_numbers(int max) {
class mertens_calculator {
std::vector<int> m(max + 1, 1);
public:
for (int kn = 2; kn <= nmax; ++kn) {
int mertens_number(int);
for (int ik = 02; ik <= countn; ++ik) {
private:
if ( m[n] -== 0)m[n / {k];
std::map<int, int> cache_;
}
};
 
int mertens_calculator::mertens_number(int n) {
auto i = cache_.find(n);
if (i != cache_.end())
return i->second;
int m = 1;
for (int k = 2; k <= n; ++k)
m -= mertens_number(n/k);
cache_.emplace(n, m);
return m;
}
 
int main() {
void print_mertens_numbers(mertens_calculator& mc, int count) {
const int columnmax = 01000;
auto m(mertens_numbers(max));
for (int i = 0; i < count; ++i) {
std::cout << "First 199 Mertens numbers:\n";
for (int i = 0, column = 0; i < 200; ++i) {
if (column > 0)
std::cout << ' ';
Line 599 ⟶ 592:
std::cout << " ";
else
std::cout << std::setw(2) << mc.mertens_number(m[i)];
++column;
if (column == 20) {
Line 606 ⟶ 599:
}
}
}
 
int main() {
mertens_calculator mc;
std::cout << "First 199 Mertens numbers:\n";
print_mertens_numbers(mc, 200);
int zero = 0, cross = 0, previous = 0;
for (int i = 1; i <= 1000max; ++i) {
intif (m[i] == mc.mertens_number(i0); {
if (m == 0) {
++zero;
if (previous != 0)
++cross;
}
previous = m[i];
}
std::cout << "M(n) is zero " << zero << " times for 1 <= n <= 1000.\n";
1,777

edits