Skip to content

Commit 525fff8

Browse files
committed
Fix discrete_log
1 parent 8d89424 commit 525fff8

File tree

2 files changed

+10
-15
lines changed

2 files changed

+10
-15
lines changed

cp-algo/number_theory/discrete_log.hpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
#include <optional>
55
namespace cp_algo::math {
66
// Find min non-negative x s.t. a*b^x = c (mod m)
7-
std::optional<uint64_t> discrete_log(int64_t b, int64_t c, uint64_t m, int64_t a = 1) {
7+
std::optional<int64_t> discrete_log(int64_t b, int64_t c, int64_t m, int64_t a = 1) {
88
if(std::abs(a - c) % m == 0) {
99
return 0;
1010
}
@@ -24,7 +24,7 @@ namespace cp_algo::math {
2424
}
2525
base step = bpow(base(b), sqrtmod);
2626
cur = 1;
27-
for(size_t k = 0; k < m; k += sqrtmod) {
27+
for(ptrdiff_t k = 0; k < m; k += sqrtmod) {
2828
auto it = small.find((base(c) * cur).getr());
2929
if(it != end(small)) {
3030
auto cand = base::with_mod(period(base(b)), [&]() {

cp-algo/number_theory/factorize.hpp

Lines changed: 8 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -4,15 +4,14 @@
44
#include "../random/rng.hpp"
55
namespace cp_algo::math {
66
// https://en.wikipedia.org/wiki/Pollard%27s_rho_algorithm
7-
void factorize(uint64_t m, std::vector<int64_t> &res) {
7+
std::basic_string<uint64_t> factorize(uint64_t m) {
88
if(m % 2 == 0) {
9-
factorize(m / 2, res);
10-
res.push_back(2);
9+
return factorize(m / 2) + (uint64_t)2;
1110
} else if(is_prime(m)) {
12-
res.push_back(m);
11+
return {m};
1312
} else if(m > 1) {
14-
using base = dynamic_modint<>;
15-
base::with_mod(m, [&]() {
13+
using base = dynamic_modint<int64_t>;
14+
return base::with_mod(m, [&]() {
1615
base t = random::rng();
1716
auto f = [&](auto x) {
1817
return x * x + t;
@@ -33,15 +32,11 @@ namespace cp_algo::math {
3332
}
3433
g = std::gcd(g.getr(), m);
3534
}
36-
factorize(g.getr(), res);
37-
factorize(m / g.getr(), res);
35+
return factorize(g.getr()) + factorize(m / g.getr());
3836
});
37+
} else {
38+
return {};
3939
}
4040
}
41-
std::vector<int64_t> factorize(int64_t m) {
42-
std::vector<int64_t> res;
43-
factorize(m, res);
44-
return res;
45-
}
4641
}
4742
#endif // CP_ALGO_MATH_FACTORIZE_HPP

0 commit comments

Comments
 (0)