Guest User

Millen-Rabin BPSW Test

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