Advertisement
tien_noob

Miller - Rabin

Jun 23rd, 2021
116
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.91 KB | None | 0 0
  1. //Make CSP great again
  2. #include <bits/stdc++.h>
  3. #define TASK "TESTCODE"
  4. using namespace std;
  5. vector<int> Prime = {2, 3, 5, 7, 11, 13, 17, 23};
  6. long long Mul(long long a, long long b, long long mod)
  7. {
  8.     a %= mod;
  9.     b %= mod;
  10.     long long q = (long double)a * b/mod;
  11.     long long r = a * b - q * mod;
  12.     return (r % mod + mod) % mod;
  13. }
  14. long long Pow(long long a, long long b, long long mod)
  15. {
  16.     if (b == 0)
  17.     {
  18.         return 1 % mod;
  19.     }
  20.     long long t = Pow(a, b/2, mod);
  21.     if (b % 2 == 0)
  22.     {
  23.         return Mul(t , t, mod);
  24.     }
  25.     else
  26.     {
  27.         return Mul(Mul(t, t, mod), a, mod);
  28.     }
  29. }
  30. pair<long long, long long> factor(long long a)
  31. {
  32.     long long s = 0;
  33.     while ((a & 1) == 0)
  34.     {
  35.         a >>= 1;
  36.         ++s;
  37.     }
  38.     return {s, a};
  39. }
  40. bool Test(long long s, long long d, long long n, long long witness)
  41. {
  42.     if (n == witness)
  43.     {
  44.         return true;
  45.     }
  46.     long long p = Pow(witness, d, n);
  47.     if (p == 1)
  48.     {
  49.         return true;
  50.     }
  51.     for (; s > 0; -- s)
  52.     {
  53.         if (p == n - 1)
  54.         {
  55.             return true;
  56.         }
  57.         p = Mul(p, p, n);
  58.     }
  59.     return false;
  60. }
  61. bool MillerRabin(long long n)
  62. {
  63.     if (n < 2)
  64.     {
  65.         return false;
  66.     }
  67.     if ((n & 1) == 0)
  68.     {
  69.         return n == 2;
  70.     }
  71.     long long s, d;
  72.     tie(s, d) = factor(n - 1);
  73.     for (int i : Prime)
  74.     {
  75.         if (!Test(s, d, n, i))
  76.         {
  77.             return false;
  78.         }
  79.     }
  80.     return true;
  81. }
  82. void read()
  83. {
  84.  
  85. }
  86. void solve()
  87. {
  88.  
  89. }
  90. int main()
  91. {
  92.    ios_base::sync_with_stdio(false);
  93.    cin.tie(nullptr);
  94.    //freopen(TASK".INP", "r", stdin);
  95.    //freopen(TASK".OUT", "w", stdout);
  96.    int t = 1;
  97.    bool typetest = false;
  98.    if (typetest)
  99.    {
  100.       cin >> t;
  101.    }
  102.    for (int __ = 1; __ <= t; ++ __)
  103.    {
  104.       cerr << "Case " << __ << ":" << '\n';
  105.       read();
  106.       solve();
  107.    }
  108. }
  109.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement