๐Ÿ“ฆ gopikrishna000 / templates-latest

๐Ÿ“„ not_working__poladrho.cpp ยท 55 lines
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55<snippet>
	<content><![CDATA[

typedef unsigned long long ull;
typedef long long ll;
ull modmul(ull a, ull b, ull M) {
   ll ret = a * b - M * ull(1.L / M * a * b);
   return ret + M * (ret < 0) - M * (ret >= (ll)M);
}
ull modpow(ull b, ull e, ull mod) {
   ull ans = 1;
   for (; e; b = modmul(b, b, mod), e /= 2)
      if (e & 1) ans = modmul(ans, b, mod);
   return ans;
}
 
bool isPrime(ull n) {
   if (n < 2 || n % 6 % 4 != 1) return (n | 1) == 3;
   ull A[] = {2, 325, 9375, 28178, 450775, 9780504, 1795265022},
       s = __builtin_ctzll(n-1), d = n >> s;
   for (ull a : A) {   // ^ count trailing zeroes
      ull p = modpow(a%n, d, n), i = s;
      while (p != 1 && p != n - 1 && a % n && i--)
         p = modmul(p, p, n);
      if (p != n-1 && i != s) return 0;
   }
   return 1;
}
 
ull pollard(ull n) {
   auto f = [n](ull x) { return modmul(x, x, n) + 1; };
   ull x = 0, y = 0, t = 30, prd = 2, i = 1, q;
   while (t++ % 40 || __gcd(prd, n) == 1) {
      if (x == y) x = ++i, y = f(x);
      if ((q = modmul(prd, max(x,y) - min(x,y), n))) prd = q;
      x = f(x), y = f(f(y));
   }
   return __gcd(prd, n);
}
vector<ull> factor(ull n) {
   if (n == 1) return {};
   if (isPrime(n)) return {n};
   ull x = pollard(n);
   auto l = factor(x), r = factor(n / x);
   l.insert(l.end(), r.begin(), r.end());
   return l;
}

]]></content>
	<!-- Optional: Set a tabTrigger to define how to trigger the snippet -->
	<tabTrigger>polad rho not working?</tabTrigger>
	<!-- Optional: Set a scope to limit where the snippet will trigger -->
	<scope>source.c++</scope>
</snippet>