离散对数
给定 \(a,b,p\),求出最小的 \(x\),使 \(a^x\equiv b\pmod p,p\le10^9\)
a 和 p 互质的情况
令 \(s=\lceil\sqrt p\rceil,x=rs-c\)
则 \(a^{rs-c}\equiv b\pmod p\)
即 \((a^s)^r\equiv b^c\pmod p\)
将所有 \(b^c\bmod p\;(0\le c<s)\) 保存到 map 或 unordered_map 中,枚举 \(r\) 查询即可
时间复杂度 \(O(s\log s)=O(\sqrt p\log p)\) 或 \(O(s)=O(\sqrt p)\)
一般情况
方法 1
令 \(d_1=\gcd(a,p)\),若 \(d_1\nmid b\) 则无解,否则方程变为 \(\frac{a}{d_1}a^{x-1}\equiv\frac b{d_1}\pmod {\frac p{d_1}}\)
重复上述操作直到 \(a\) 和 \(\frac pd\) 互质(其中 \(d\) 为每次的 \(d\) 的积)
此时方程变为 \(\frac{a^k}da^{x-k}\equiv \frac bd\pmod {\frac p{d}}\)
转化为 \(a^{x-k}\equiv \frac bd{\left(\frac{a^k}d\right)}^{-1}\pmod {\frac p{d}}\),用 \(a\) 和 \(p\) 互质时的方法求解即可
需要特判 \(x\le k\) 的情况
方法 2
可证答案上界为 \(2\varphi(p)\),因此类似一般情况根号平衡,令 \(t=\left\lceil\sqrt{2\varphi(p)}\right\rceil\)
将 \(a^{pt}\bmod p\;(0\le p\le t)\) 存入哈希表,值相同的保留 \(p\) 最小的两个,枚举 \(ba^q\) 并检验两值,若合法则 \(pt-q\) 为一合法解
可证这样一定不会漏最小解
时间复杂度 \(O(\sqrt p)\)
参考
- \(\text{12.11 math1.pdf \; \;by Tx\_Lcy}\)

浙公网安备 33010602011771号