Advertisement
Guest User

Untitled

a guest
Mar 31st, 2020
106
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.47 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <math.h>
  4. #include <mpi.h>
  5.  
  6. #define N 100000
  7.  
  8. int is_prime(int n) {
  9. if (n < 2) return 0;
  10.  
  11. int m = 2;
  12. while (m <= n / 2) {
  13. if (n % m == 0) return 0;
  14. ++m;
  15. }
  16.  
  17. return 1;
  18. }
  19.  
  20. int is_sum_of_primes(int n, int *is_prime_arr) {
  21. if (n == 4) return 1;
  22.  
  23. for (int i = 3; i <= n / 2; i += 2) {
  24. if (is_prime_arr[n - i] && is_prime_arr[i]) {
  25. return 1;
  26. }
  27. }
  28. return 0;
  29. }
  30.  
  31. int main(int argc, char** argv) {
  32. MPI_Status status;
  33. int rank, size;
  34.  
  35. MPI_Init(&argc, &argv);
  36.  
  37. MPI_Comm_rank(MPI_COMM_WORLD, &rank);
  38. MPI_Comm_size(MPI_COMM_WORLD, &size);
  39.  
  40. int arr_size = (int) ceil((double) N / (double) size);
  41. int *local_is_prime_arr = (int *) calloc(arr_size, sizeof(int));
  42. int from = arr_size * rank;
  43.  
  44. for (int i = 0; i < arr_size; ++i) {
  45. local_is_prime_arr[i] = is_prime(from + i);
  46. }
  47.  
  48. int *is_prime_arr = (int *) calloc(arr_size * size, sizeof(int));
  49.  
  50. MPI_Allgather(local_is_prime_arr, arr_size, MPI_INT, is_prime_arr, arr_size, MPI_INT, MPI_COMM_WORLD);
  51.  
  52. int gb_conj = -1;
  53. for (int i = rank * 2 + 4; i <= N; i += size * 2) {
  54. if (!is_sum_of_primes(i, is_prime_arr)) {
  55. gb_conj = i;
  56. break;
  57. }
  58. }
  59.  
  60. int result;
  61. MPI_Reduce(&gb_conj, &result, 1, MPI_INT, MPI_MAX, 0, MPI_COMM_WORLD);
  62.  
  63. if (rank == 0) {
  64. if (result == -1) printf("Goldbach's conjecture vazi za brojeve do %d\n", N);
  65. else printf("Goldbach's conjecture ne vazi za broj %d\n", result);
  66. }
  67.  
  68. MPI_Finalize();
  69. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement