Advertisement
tien_noob

Pollard - Rho (PTTNST)

Jun 23rd, 2021
134
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.27 KB | None | 0 0
  1. //Make CSP great again
  2. #include <bits/stdc++.h>
  3. #define TASK "TESTCODE"
  4. using namespace std;
  5. mt19937 rd(chrono::steady_clock::now().time_since_epoch().count());
  6. long long Rand(long long l, long long r)
  7. {
  8.     return l + (abs(rd() *1LL * rd()) % (r - l + 1));
  9. }
  10. vector<int> Prime = {2, 3, 5, 7, 11, 13, 17, 23};
  11. map<long long, int> Element;
  12. long long Mul(long long a, long long b, long long mod)
  13. {
  14.     a %= mod;
  15.     b %= mod;
  16.     long long q = (long double)a * b/mod;
  17.     long long r = a * b - q * mod;
  18.     return (r % mod + mod) % mod;
  19. }
  20. long long Pow(long long a, long long b, long long mod)
  21. {
  22.     if (b == 0)
  23.     {
  24.         return 1 % mod;
  25.     }
  26.     long long t = Pow(a, b/2, mod);
  27.     if (b & 1)
  28.     {
  29.         return Mul(Mul(t, t, mod), a, mod);
  30.     }
  31.     else
  32.     {
  33.         return Mul(t, t, mod);
  34.     }
  35. }
  36. pair<long long, long long> factor(long long n)
  37. {
  38.     long long s = 0;
  39.     while((n & 1) == 0)
  40.     {
  41.         n >>= 1;
  42.         ++s;
  43.     }
  44.     return {s, n};
  45. }
  46. bool Test(long long s, long long d, long long n, long long witness)
  47. {
  48.     if (n == witness)
  49.     {
  50.         return true;
  51.     }
  52.     long long p = Pow(witness, d, n);
  53.     if (p == 1)
  54.     {
  55.         return true;
  56.     }
  57.     for (; s > 0; -- s)
  58.     {
  59.         if (p == n - 1)
  60.         {
  61.             return true;
  62.         }
  63.         p = Mul(p, p, n);
  64.     }
  65.     return false;
  66. }
  67. void FastFact(long long n)
  68. {
  69.     long long p = 2;
  70.     while (p * p <= n)
  71.     {
  72.         if (n % p == 0)
  73.         {
  74.             while (n % p == 0)
  75.             {
  76.                 n /= p;
  77.                 ++Element[p];
  78.             }
  79.         }
  80.         ++p;
  81.     }
  82.     if (n != 1)
  83.     {
  84.         ++Element[n];
  85.     }
  86. }
  87. bool MillerRabin(long long n)
  88. {
  89.     if (n < 2)
  90.     {
  91.         return false;
  92.     }
  93.     if ((n & 1) == 0)
  94.     {
  95.         return n == 2;
  96.     }
  97.     long long s, d;
  98.     tie(s, d) = factor(n - 1);
  99.     for (int i : Prime)
  100.     {
  101.         if (!Test(s, d, n, i))
  102.         {
  103.             return false;
  104.         }
  105.     }
  106.     return true;
  107. }
  108. long long f(long long x, long long mod)
  109. {
  110.     return (x * x + 1) % mod;
  111. }
  112. long long FindFactor(long long n)
  113. {
  114.     long long x = Rand(2, n);
  115.     long long y = x, p = 1;
  116.     do
  117.     {
  118.         x = f(x, n);
  119.         y = f(f(y, n), n);
  120.         p = __gcd( abs(x - y), n);
  121.     }
  122.     while (p == 1);
  123.     return p;
  124. }
  125. void PollardRho(long long n)
  126. {
  127.     if (n == 1)
  128.     {
  129.         return ;
  130.     }
  131.     if (n <= 10000)
  132.     {
  133.         FastFact(n);
  134.         return ;
  135.     }
  136.     if (MillerRabin(n))
  137.     {
  138.         ++Element[n];
  139.         return ;
  140.     }
  141.     long long p = 0;
  142.     while(p == 0 || p == n)
  143.     {
  144.         p = FindFactor(n);
  145.         PollardRho(p);
  146.         PollardRho(n/p);
  147.     }
  148. }
  149. void read()
  150. {
  151.     long long n;
  152.     cin >> n;
  153.     PollardRho(n);
  154. }
  155. void solve()
  156. {
  157.     for (auto it : Element)
  158.     {
  159.         cout << it.first << ' '<< it.second << '\n';
  160.     }
  161. }
  162. int main()
  163. {
  164.     ios_base::sync_with_stdio(false);
  165.     cin.tie(nullptr);
  166.     //freopen(TASK".INP", "r", stdin);
  167.     //freopen(TASK".OUT", "w", stdout);
  168.     int t = 1;
  169.     bool typetest = false;
  170.     if (typetest)
  171.     {
  172.         cin >> t;
  173.     }
  174.     for (int __ = 1; __ <= t; ++ __)
  175.     {
  176.         cerr << "Case " << __ << ":" << '\n';
  177.         read();
  178.         solve();
  179.     }
  180. }
  181.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement