Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //35 Число называется циркулярно простым, если любая круговая перестановка его цифр
- //есть простое число (например – 197 или 31 или 17). Найти количество циркулярно простых чисел в диапазоне от N до M
- #define _CRT_SECURE_NO_WARNINGS
- #include <cstdlib>
- #include <ctime>
- #include <mpi.h>
- #include <iostream>
- #include <stdio.h>
- #include <cmath>
- #include <vector>
- #define TAG_SUCCESS 97
- #define TAG_CUR 96
- #define TAG_PREV 95
- #define TAG_INITIATIVE 94
- #define TAG_STAND 93
- using namespace std;
- typedef unsigned long long big;
- #define PRINTS(x) fprintf(stdout, x); fflush(stdout);
- #define PRINT(x, y) fprintf(stdout, x, y); fflush(stdout);
- int cmpfunc(const void * a, const void * b)
- {
- return (*(big*)a - *(big*)b);
- }
- //функция проверяет, четное ли число
- big isEven(big number)
- {
- if (number % 2 == 0) return number / 2;
- else return 0;
- }
- //быстрое умножение по модулю
- big mul(big a, big b, big m)
- {
- if (b == 1) return a;
- if (b % 2 == 0)
- {
- big t = mul(a, b / 2, m);
- return (2 * t) % m;
- }
- return (mul(a, b - 1, m) + a) % m;
- }
- //быстрое возведение в степень по модулю
- big pows(big a, big b, big m)
- {
- if (b == 0) return 1;
- if (b % 2 == 0)
- {
- big t = pows(a, b / 2, m);
- return mul(t, t, m) % m;
- }
- return (mul(pows(a, b - 1, m), a, m)) % m;
- }
- //поиск наибольшего общего делителя
- big gcd(big a, big b)
- {
- if (b == 0) return a;
- return gcd(b, a%b);
- }
- //вероятностный тест Ферма
- bool ferma(big x, int rank, int total)
- {
- if (rank == 0)
- MPI_Bcast(&rank, 1, MPI_UNSIGNED_LONG_LONG, 0, MPI_COMM_WORLD);
- if (x == 2) return true;
- srand(time(NULL));
- int res = 0;
- big a;
- for (int i = rank; i < 100; i+=total)
- {
- a = (rand() % (x - 2)) + 2;
- if (gcd(a, x) != 1) res++;
- if (pows(a, x - 1, x) != 1) res++;
- }
- if (rank == 0)
- {
- int reduced = 0;
- MPI_Reduce(&res, &reduced, 1, MPI_INT, MPI_SUM, 0, MPI_COMM_WORLD);
- if (reduced == 0) return true;
- else return false;
- }
- if (res == 0) return true;
- else return false;
- }
- //////////////////////////////////////////////////////////////////
- int main(int argc, char* argv[])
- {
- int myid;
- int numprocs;
- big n;
- auto startwtime = 0.0;
- auto endwtime = 0.0;
- MPI_Init(&argc, &argv);
- MPI_Comm_size(MPI_COMM_WORLD, &numprocs);
- MPI_Comm_rank(MPI_COMM_WORLD, &myid);
- if (myid == 0)
- {
- cout << "vvedite chislo\nhint: try 8789451874165\n";
- cin >>n;
- startwtime = MPI_Wtime();
- }
- MPI_Bcast(&n, 1, MPI_UNSIGNED_LONG_LONG, 0, MPI_COMM_WORLD);
- vector<big> nums;
- auto start_n = n;
- big k = sqrt(n);
- for (big i = 2 + myid; i <= k; i+=numprocs) {
- while (n % i == 0) {
- PRINT("%llu\n", i);
- nums.push_back(i);
- n /= i;
- }
- }
- if (n != 1 && n!=start_n) {
- PRINT("%llu\n", n);
- nums.push_back(n);
- }
- int local_nums = nums.size();
- int total_nums;
- MPI_Allreduce(&local_nums, &total_nums, 1, MPI_UNSIGNED_LONG_LONG, MPI_SUM, MPI_COMM_WORLD);
- //vector<big> all_nums(total_nums);
- big* all_nums = new big[total_nums];
- while (nums.size() != total_nums) nums.push_back(0);
- if (myid == 0) PRINT("Total nums : %d\n", total_nums);
- MPI_Gather(nums.data(), total_nums, MPI_UNSIGNED_LONG_LONG, all_nums, total_nums, MPI_UNSIGNED_LONG_LONG, 0, MPI_COMM_WORLD);
- if (myid == 0)
- {
- qsort(all_nums, total_nums*numprocs, sizeof(big), cmpfunc);
- for (int i = 0; i < total_nums*numprocs; i++)
- {
- cout << all_nums[i] << ", ";
- }
- PRINTS("\nFINAL NUMBERS\n");
- big a = 1;
- for (int i = 0; i < total_nums*numprocs; i++)
- {
- if (all_nums[i] != 0)
- {
- a *= all_nums[i];
- if (a <= n) { PRINT("%llu\n", all_nums[i]); }
- else break;
- }
- }
- endwtime = MPI_Wtime();
- clog << endl << "Total: " << (endwtime - startwtime) * 1000 << " ms" << endl;
- }
- delete all_nums;
- MPI_Finalize();
- //system("PAUSE");
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement