#include #include "mayer_primes.h" #include #include #include "timing.h" using namespace std; unsigned int single_goldbach(unsigned int k) { unsigned int decomp = 0; unsigned int p,q; vector 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::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 count_goldbach(unsigned int n) { vector counts(n+1,0); unsigned int p,q; vector primes = get_primes(n); for(unsigned int j=0; j n) { continue; } counts[p+q] += 1; } } return counts; } vector>> count_goldbach_all(unsigned int n) { vector>> counts(n+1,{{0,0}}); unsigned int p,q; vector primes = get_primes(n); for(unsigned int j=0; j 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 counts = count_goldbach(100000); cout << (max_element(counts.begin(), counts.end()) - counts.begin()) << endl; //4 vector 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>> counts2 = count_goldbach_all(n2); for(unsigned int i=4; i