何以求根
问题
求$x^b\equiv a\pmod n$的所有根,其中$\gcd(a,n)=1$且根的数目合适,$n$的分解$\prod\nolimits_i p_i^{e_i}$已知/能在合适时间内给出。
思路
对所有$p_i\ne 2$,令:
那么:
若$r\ne 1$,接着用AMM算法求$x^r\equiv \delta\pmod {p_i}$的根。
最后lift一下;
对于$p_i=2$,我将在后面单独讨论。
最最后用CRT合并。
AMM
接下来讨论$p\ne 2$的情形。AMM算法可用于求有限域中的平方根(即$r=2$),这里给出了对$r$的拓展。
论文只讨论了$p-1=r^ts,\gcd(r,s)=1$的情形,而实际上只要分解$r=\prod\nolimits_i p_i^{e_i}$,再对所有$p_i$使用$e_i$次该算法,就可以让算法适用于所有大小合适的$r$(不过这是效率最低的办法,每次都要重新算幂)。
那么下面假定$r$为素数,$p-1=r^ts,\gcd(r,s)=1$,我们有:
只要求出:
就有:
其中$\omega_r$为任意一个$r$次单位根,而$\delta^{1-r(r^{-1}\bmod s)}$为某个$r^{t-1}$次单位根。
接着读论文里的算法,我突然发现如下事实:
任选$r$次非剩余$\rho$,$g\equiv \rho^{(p-1)/{r^{t-1}}}\pmod p$在乘法作用下生成一个阶为$r^{t-1}$的子群$G$,$G$的元素就是所有$r^{t-1}$次单位根。搁$G$上求离散对数不就完事儿了吗:
令:
则:
随机选取$\rho$,$\rho$为$r$次非剩余,即$\rho^{(p-1)/r}\not\equiv 1\pmod p$的概率为$1-\frac{1}{r}$,这意味着期望在常数次内能选出一个$r$次非剩余$\rho$。
然后调各种解DLP的算法就好了。
为啥我要$r$是素数?论文中没有要求$r$为素数,从而产生了一个bug:
$r$非素时,虽然$\rho$为非$r$次剩余,但$\rho^{(p-1)/r}$生成的群的阶并不一定为$r$,这导致算法Step 4可能无法继续。一个办法是分解$r$,对所有素因子$p_i$检查$\rho^{(p-1)/{p_i}}$。不过我这里就直接要求$r$是素数了。
如果直接调Pohlig-Hellman+BSGS和最慢的整数乘法,且$r=\prod\nolimits_i p_i^{e_i}$,那么时间复杂度为(没包括选$\rho$):
Hensel Lifting
设:
令:
那么:
从而:
实际上不需要计算$(rx_k^{r-1})^{-1}\bmod {p^{2^{k+1}}}$,因为:
算出$x_{\lceil\log_2 e\rceil}\bmod p^e$就完事了。
然后算逆元也能说道说道,设:
如法炮制,可以得到:
用lift的话,总的来说就只是给复杂度后边加上个(假定用最慢的整数乘法)$\mathcal O(e^2\log r\log^2 p+\log^3 p)$,不然得给前面那部分乘个$e^2$,就有点难受了。
“Even” Hard
关于$p=2$该咋整,我除了在Hensel基础上加点搜索以外真想不到别的法子。
不过Sage这里有一个没搜索的实现,注释说是”a variant of Hensel lifting”,不过我暂时没找到这个”variant”出处在哪,这源代码那个for也没能看懂。
等我懂了再补完吧。