Exercises_MarkusSchmidt/sheet1/F/main.cpp
Markus Schmidt d3aa42a3e0 Solutions
2025-10-21 19:36:38 +02:00

130 lines
No EOL
3.1 KiB
C++

#include <iostream>
#include "mayer_primes.h"
#include <vector>
#include <algorithm>
#include "timing.h"
using namespace std;
unsigned int single_goldbach(unsigned int k)
{
unsigned int decomp = 0;
unsigned int p,q;
vector<unsigned int> primes = get_primes(k);
for(unsigned i=0; i< primes.size(); i++)
{
p = primes.at(i);
if(p > k/2)
{
break;
}
q = k-p;
vector<unsigned int>::iterator it = lower_bound(primes.begin(), primes.end(), q);
if (it != primes.end() && *it == q)
{
decomp++;
}
}
return decomp;
}
//one can call single_goldbach but this way it is faster cause you dont have to regenerate primes and search in list
vector<unsigned int> count_goldbach(unsigned int n)
{
vector<unsigned int> counts(n+1,0);
unsigned int p,q;
vector<unsigned int> primes = get_primes(n);
for(unsigned int j=0; j<primes.size(); j++)
{
for(unsigned i=j; i< primes.size(); i++) //start a j elsewise double counting of pairs
{
p = primes.at(j);
q = primes.at(i);
if(p+q > n)
{
continue;
}
counts[p+q] += 1;
}
}
return counts;
}
vector<vector<vector<unsigned int>>> count_goldbach_all(unsigned int n)
{
vector<vector<vector<unsigned int>>> counts(n+1,{{0,0}});
unsigned int p,q;
vector<unsigned int> primes = get_primes(n);
for(unsigned int j=0; j<primes.size(); j++)
{
for(unsigned i=j; i< primes.size(); i++)
{
p = primes.at(j);
q = primes.at(i);
if(p+q > n)
{
continue;
}
if (counts[p+q].at(0).at(0) == 0) //first pair found
{
counts[p+q]={{p,q}};
}
else{
counts[p+q].push_back({p,q});
}
}
}
return counts;
}
int main()
{
//2
cout << single_goldbach(694) << endl;
//3
vector<unsigned int> counts = count_goldbach(100000);
cout << (max_element(counts.begin(), counts.end()) - counts.begin()) << endl;
//4
vector<unsigned int> nvalues = {10000, 100000, 400000, 1000000, 2000000, 10000000};
double time;
unsigned int n;
for(unsigned int i = 0; i< nvalues.size(); i++)
{
n = nvalues.at(i);
tic();
count_goldbach(n);
time = toc();
cout << "Time for n=" << n << ": " << time << endl;
}
/*Time for n=10000: 0.0006853
Time for n=100000: 0.0371858
Time for n=400000: 0.505129
Time for n=1000000: 2.85873
Time for n=2000000: 15.0026
Time for n=10000000: 549.658*/
//*)
unsigned int n2 = 694;
vector<vector<vector<unsigned int>>> counts2 = count_goldbach_all(n2);
for(unsigned int i=4; i<n2; i+=2)
{
cout << "Decomp for " << i << ":"<<endl;
for(unsigned int j=0; j<counts2.at(i).size(); j++)
{
//cout << counts2.at(i).at(j).at(0) << "+" << counts2.at(i).at(j).at(1) << "=" << i << endl;
}
}
return 0;
}