scf_celebic/ex5/code/task_2-5/task_3.cpp
dino.celebic 3d054f8ae7 ex5 task5
2025-12-09 23:23:51 +01:00

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;
}