Guest User

Untitled

a guest
Jan 9th, 2016
224
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.45 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. typedef long long ll;
  4. ll pows[70];
  5. void fil() {
  6.     pows[0] = 1ll;
  7.     for (int i = 1; i <= 63; ++i)
  8.         pows[i] = pows[i - 1] * 2ll;
  9. }
  10. ll powm(ll p, ll n, ll mod) {
  11.     if (n == 0)
  12.         return 1ll;
  13.     if (n == 1)
  14.         return p % mod;
  15.     if (!(n & 1)) {
  16.         ll step = powm(p, n / 2, mod);
  17.         return (step * step) % mod;
  18.     }
  19.     else {
  20.         ll step = powm(p, (n - 1) / 2, mod);
  21.         return (((step * step) % mod) * p) % mod;
  22.     }
  23. }
  24. bool mrt(ll p) {
  25.     if (p == 1)
  26.         return false;
  27.     ll s = 0, d = p - 1;
  28.     while (!(d & 1)) {
  29.         d = d / 2;
  30.         s++;
  31.     }
  32.     srand(time(NULL)); /// Генерируем действительно случайные и разные a
  33.     for (int i = 1; i <= 5; ++i) { /// Те самые 5 проверок
  34.         ll a = rand() % p;
  35.         if (a == 0)
  36.             a++;
  37.         bool flag1 = false, flag2 = false;
  38.         if (powm(a % p, d, p) == 1) /// Первая проверка
  39.             flag1 = true;
  40.         if (!flag1)
  41.             for (int r = 0; r < s; ++r) /// Вторая проверка
  42.                 if (powm(a % p, pows[r] * d, p) == p - 1)
  43.                     flag2 = true;
  44.         if (!flag1 && !flag2)
  45.             return false;
  46.     }
  47.     return true;
  48. }
  49.  
  50. int main() {
  51.     ll p;
  52.     fil();
  53.     cin >> p;
  54.     if (mrt(p))
  55.         cout << "True";
  56.     else
  57.         cout << "False";
  58. }
Advertisement
Add Comment
Please, Sign In to add comment