Advertisement
slash0t

rho factorization + miller-rabin prime test

Jul 22nd, 2024 (edited)
43
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.45 KB | None | 0 0
  1. struct factorization {
  2.     mt19937_64 rnd;
  3.     map<int, int> mp;
  4.  
  5.     factorization() {
  6.         rnd = mt19937_64((chrono::high_resolution_clock::now().time_since_epoch().count()));
  7.     }
  8.  
  9.     int mult(int a, int b, int mod) {
  10.         return ((__int128)a * b) % mod;
  11.     }
  12.  
  13.     int bitPow(int num, int pow, int mod) {
  14.         if (pow == 0) return 1;
  15.         if (pow % 2 == 0) {
  16.             int res = bitPow(num, pow / 2, mod);
  17.             return mult(res, res, mod) % mod;
  18.         }
  19.         return mult(num % mod, bitPow(num, pow - 1, mod), mod);
  20.     }
  21.  
  22.     bool prime(int num) {
  23.         for (int i : {2, 3, 7, 11, 13, 17}) {
  24.             if (num == i) return 1;
  25.             if (num % i == 0) return 0;
  26.         }
  27.  
  28.         for (int i = 0; i < 30; i++) {
  29.             int a = rnd() % (num - 3) + 2;
  30.  
  31.             int n = num - 1;
  32.             int s = 0;
  33.             while (n % 2 == 0) {
  34.                 n /= 2;
  35.                 s++;
  36.             }
  37.  
  38.             int x = bitPow(a, n, num);
  39.             if (x == 1 || x == num - 1) continue;
  40.             bool ok = 0;
  41.             for (int i = 0; i < s - 1; i++) {
  42.                 x = mult(x, x, num);
  43.                 if (x == 1) return 0;
  44.                 if (x == num - 1) {
  45.                     ok = 1;
  46.                     break;
  47.                 }
  48.             }
  49.             if (!ok) return 0;
  50.         }
  51.         return 1;
  52.     }
  53.  
  54.  
  55.     void div_simple(int n) {
  56.         for (int i = 2; i * i <= n; i++) {
  57.             while (n % i == 0) {
  58.                 mp[i]++;
  59.                 n /= i;
  60.             }
  61.         }
  62.         if (n > 1) mp[n]++;
  63.     }
  64.  
  65.     int f(int x, int mod) {
  66.         return (mult(x, x, mod) + 1) % mod;
  67.     }
  68.  
  69.     int gcd(int a, int b) {
  70.         if (b == 0) return a;
  71.         return gcd(b, a % b);
  72.     }
  73.  
  74.     int rho(int n) {
  75.         for (int i : {2, 3, 5, 7, 11, 13, 17, 19}) {
  76.             if (n % i == 0) return i;
  77.         }
  78.  
  79.         int x = rnd() % (n - 2) + 2;
  80.         int y = x;
  81.         int d = 1;
  82.  
  83.         while (d == 1) {
  84.             x = f(x, n);
  85.             y = f(f(y, n), n);
  86.             d = gcd(abs(x - y), n);
  87.         }
  88.  
  89.         return d;
  90.     }
  91.  
  92.     void div(int n, int flag = 1) {
  93.         if (flag) mp.clear();
  94.  
  95.         if (n < 1e10) {
  96.             div_simple(n);
  97.             return;
  98.         }
  99.         if (prime(n))mp[n]++;
  100.         else {
  101.             int temp = rho(n);
  102.             div(n / temp, 0);
  103.             div(temp, 0);
  104.         }
  105.     }
  106. };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement