73 lines
1.7 KiB
C++
73 lines
1.7 KiB
C++
#include "task_3.h"
|
|
#include "mayer_primes.h"
|
|
#include "timing.h"
|
|
|
|
#include <algorithm>
|
|
#include <cassert>
|
|
#include <iostream>
|
|
#include <omp.h>
|
|
#include <vector>
|
|
using namespace std;
|
|
|
|
|
|
int single_goldbach_par(int k) {
|
|
const vector<int> primes = get_primes(k);
|
|
int count = 0;
|
|
|
|
#pragma omp parallel for reduction(+:count)
|
|
for (size_t i = 0; i < primes.size(); i++) {
|
|
for (size_t j = i; j < primes.size(); j++) {
|
|
if (primes[i] + primes[j] == k) {
|
|
count++;
|
|
}
|
|
}
|
|
}
|
|
|
|
return count;
|
|
}
|
|
|
|
|
|
vector<int> count_goldbach_par(int n) {
|
|
const vector<int> primes = get_primes(n);
|
|
vector<int> counts(n+1);
|
|
|
|
#pragma omp parallel reduction(VecAdd:counts)
|
|
// #pragma omp parallel
|
|
{
|
|
vector<int> local_counts(n+1, 0);
|
|
|
|
#pragma omp for
|
|
for (size_t i = 1; i < primes.size(); i++) {
|
|
for (size_t j = i; j < primes.size(); j++) {
|
|
int sum = primes[i] + primes[j];
|
|
if (sum <= n) {
|
|
local_counts[sum]++;
|
|
}
|
|
}
|
|
}
|
|
|
|
counts += local_counts;
|
|
// #pragma omp critical
|
|
// {
|
|
// for(int k=0; k<n+1; k++){
|
|
// counts[k] += local_counts[k];
|
|
// }
|
|
// }
|
|
}
|
|
return counts;
|
|
}
|
|
|
|
|
|
void print_decomps(int k) {
|
|
const vector<int> primes = get_primes(k);
|
|
cout << "\nDecompositions for k = " << k << ": ";
|
|
|
|
for (size_t i = 0; i < primes.size(); i++) {
|
|
for (size_t j = i; j < primes.size(); j++) {
|
|
if (primes[i] + primes[j] == k) {
|
|
cout << primes[i] << " + " << primes[j] << ", ";
|
|
}
|
|
}
|
|
}
|
|
cout << endl;
|
|
}
|