File tree Expand file tree Collapse file tree 1 file changed +19
-12
lines changed Expand file tree Collapse file tree 1 file changed +19
-12
lines changed Original file line number Diff line number Diff line change @@ -58,29 +58,36 @@ namespace cp_algo::algebra {
58
58
// https://en.wikipedia.org/wiki/Pollard%27s_rho_algorithm
59
59
void factorize (uint64_t m, std::vector<int64_t > &res) {
60
60
if (m % 2 == 0 ) {
61
- res.push_back (2 );
62
61
factorize (m / 2 , res);
62
+ res.push_back (2 );
63
63
} else if (is_prime (m)) {
64
64
res.push_back (m);
65
65
} else if (m > 1 ) {
66
- uint64_t g = 1 ;
67
66
using base = dynamic_modint;
68
67
base::with_switched_mod (m, [&]() {
69
- while (g == 1 || g == m) {
70
- auto f = [t = random::rng ()](auto x) {
71
- return x * x + t;
72
- };
73
- g = 1 ;
74
- base x, y;
75
- while (g == 1 ) {
68
+ base t = random::rng ();
69
+ auto f = [&](auto x) {
70
+ return x * x + t;
71
+ };
72
+ base x, y;
73
+ base g = 1 ;
74
+ while (g == 1 ) {
75
+ for (int i = 0 ; i < 64 ; i++) {
76
76
x = f (x);
77
77
y = f (f (y));
78
- g = std::gcd (m, (x - y).getr ());
78
+ if (x == y) [[unlikely]] {
79
+ t = random::rng ();
80
+ x = y = 0 ;
81
+ } else {
82
+ base t = g * (x - y);
83
+ g = t == 0 ? g : t;
84
+ }
79
85
}
86
+ g = std::gcd (g.getr (), m);
80
87
}
88
+ factorize (g.getr (), res);
89
+ factorize (m / g.getr (), res);
81
90
});
82
- factorize (g, res);
83
- factorize (m / g, res);
84
91
}
85
92
}
86
93
auto factorize (int64_t m) {
You can’t perform that action at this time.
0 commit comments