二次剩余
解 \(x^q\equiv p\pmod p\) 其中 \(q\bot p\).如果知道了 \(a^t\equiv a\pmod p\),那么 \(x=a^{t/q}\),想要让 \(t\) 是 \(q\) 的倍数,现在已经有了 \(a^{p-1}\equiv 1\pmod p\),那么就有 \(a^{(p-1)t+1}\equiv a\pmod p\),由于 \(k\bot (p-1)\),所以一定有这样一个 \(t\),那么 \(x=a^{\frac{(p-1)t+1}{q}}=a^{\frac{1}{q}}\)(注意指数是在 \(\bmod (p-1)\) 意义下的)
现在想求 \(k\) 的二次剩余,\(x^2=a\pmod p\),假如我们知道 \(a^t\equiv 1\pmod p\) 其中 \(t\) 是奇数,那么 \(x=a^{\frac{t+1}{2}}\).
现在有 \(a^{p-1}\equiv 1\pmod p\),如果将 \(p-1\) 分解为 \(2^Kt\),我们想要不断除掉 \(2\),最终得到 \(t\).
如果现在 \(a^{2^{k-1}t}\equiv -1\pmod p\) 了,现在想要凑一个新的 \(a'\),使得 \(a'^{2^{k-1}t}=1\) 并且解出来的 \(x'\) 能够得到 \(x\).那么这里就考虑一个 \(v^2=-1\),那么 \((v^2a)^{2^{k-1}t}=1\),那么 \(x=x'/v\).
然后考虑任意一个无二次剩余的 \(w\) 其满足 \(w^{(p-1)/2}=-1=w^{2^{K-1}t}=(w^{2^{K-k}})^{2^{k-1}t}\),所以这里就知道想要的是 \(w^{2^{K-k-1}}\).
注记:Euler 判定:\(a^{\frac{p-1}{2}}\) 为 \(1\) 则存在二次剩余,为 \(-1\) 则不存在二次剩余。这同时也告诉我们 check 失败时候的 \(k\) 一定 \(<K\),这也是最后一步中 \(K-k-1\geq 0\) 从而 \(w^{2^{K-k-1}}\) 能算的原因。
处理细节:
- 求 \(w\) 可以不断随机然后用 Euler 判定(二次剩余数量和二次非剩余数量相同)。
- 不断平方预处理出 \(a^t,a^{2t},a^{4t},\cdots a^{2^Kt}\),以及 \(w^1,w^2,w^{4}\cdots,w^{2^K}\).
127 说的好,当我们想要记住一个算法过程时,可以去记算法过程中的关键步骤,中间的直接推就好了,现在尝试提炼出这个算法的思路:
- \(a^t\equiv 1\pmod p\Rightarrow x=a^{\frac{t+1}{2}}\);
- 从 \(a^{(p-1)}\equiv 1\pmod p\) 开始不断尝试将指数除以 2 来得到一个奇数 \(t\),但是不断开根的过程中可能从 1 变成 -1,此是要凑出一个 \(a'\) 满足 \(a'^{2^{k-1}t}\equiv 1\pmod p\) 并且其截出的 \(x'\) 能简单得得到 \(x\);
- \(a'=v^2a\),欲求 \(v^2\equiv -1\pmod p\),利用二次非剩余 \(w^{\frac{p-1}{2}}\equiv -1\pmod p\) 并将指数分解,来凑出满足条件的 \(v\).