离散对数(BSGS)
离散对数问题,即已知 \(a,b,p\),求方程 \(a^x \equiv b \pmod p\) 最小非负整数解。
BSGS 算法
原理
思考暴力做法,即枚举 \(x\) 直到满足方程,复杂度 \(\operatorname{O}(p)\)
BSGS 类似一种分块思想,也有点像折半搜索(
首先把 \(x\) 拆开,拆成 \(km - r\) ,然后进行变换: \[ \begin{aligned} a^x &\equiv b \pmod p \newline a^{km-r} &\equiv b \pmod p \newline \frac {a^{km}}{a^r} & \equiv b \pmod p \newline a^{km} & \equiv ba^r \pmod p \end{aligned} \] 这里的 \(m\) 我们设为一个固定值,然后分别枚举等式两边的 \(k,r\),存哈希表(映射),然后匹配即可,其中 \(k \in [0, \cfrac pm], r \in [0,m]\) ,复杂度 \(\operatorname{O}(\max(m,\cfrac pm))\) ,则 \(m=\sqrt p\) 时最优,复杂度是一个根号。
实现
1 | read(n, p); |