求解关于 x 的 \(a^x\equiv b\pmod p\) 同余方程的算法。
用途
用于求这样的问题:
给出 \(a, b, p\) \[ a^x\equiv b\pmod p \] 求 \(x\) 的最小非负整数解
思想
先把 \(x\) 拆分成 \(i*t-j\) 的形式(\(t=\lceil\sqrt{p}\rceil\)) \[ a^{i*t-j}\equiv b\pmod p\\ a^{i*t}\equiv b*a^j\pmod p \] 枚举 \(j\in [0,t]\) ,将 \(b*a^j\) 放进哈希表(我这么懒肯定用 \(map\) 水)
再枚举 \(i\in [0,t]\) ,从哈希表中查找 \(a^{i\ast t}\) ,找到即答案为 \(i\ast t-j\)
枚举 \(i,j\) 都是 \(O(\sqrt{p})\) 的
是不是很 easy
code
这里只好放 P2485 的代码了
1 | map<LL, LL> m; |
对于 p 不为质数的情况,我们需要 exBSGS 算法 求解。