https://thesobersobber.github.io/CP-Snippets/log
// Computes x which a ^ x = b mod n.
long long d_log(long long a, long long b, long long n) {
long long m = ceil(sqrt(n));
long long aj = 1;
map<long long, long long> M;
for (int i = 0; i < m; ++i) {
if (!M.count(aj))
M[aj] = i;
aj = (aj * a) % n;
}
long long coef = mod_pow(a, n - 2, n);
coef = mod_pow(coef, m, n);
// coef = a ^ (-m)
long long gamma = b;
for (int i = 0; i < m; ++i) {
if (M.count(gamma)) {
return i * m + M[gamma];
} else {
gamma = (gamma * coef) % n;
}
}
return -1;
}