u64 pollard_rho(u64 n){ if (n % 2 == 0) return2; while (true) { u64 c = rng() % (n - 1) + 1; u64 x = rng() % n, y = x, d = 1; while (d == 1) { x = f(x, c, n); y = f(f(y, c, n), c, n); u64 diff = x > y ? x - y : y - x; d = std::gcd(diff, n); } if (d != n) return d; } }
voidfactor(u64 n, std::map<u64, int>& result){ if (n == 1) return; if (is_prime(n)) { ++result[n]; return; } u64 d = pollard_rho(n); factor(d, result); factor(n / d, result); }