Cipolla 二次剩余算法和简要证明
二次剩余的判定
在模奇素数 \(p\) 意义下:
\[a^{\frac{p-1}{2}} = \begin{cases}
1, &a \text{是二次剩余}\\
-1, &a \text{不是二次剩余}
\end{cases}
\]
在 \(1\dots p-1\) 这些数中,恰好有二分之一(\(\frac{p-1}{2}\) 个)是二次剩余,二分之一不是。
一个同余式
在模奇素数 \(p\) 意义下:
\[\begin{aligned}
(a+b)^p &= a^p+\binom{p}{1}a^{p-1}b+\dots+\binom{p}{p-1}ab^{p-1} + b^p\\
&= a^p+b^p
\end{aligned}
\]
这是因为对于奇素数 \(p\) 和 \(i\in[1, p-1]\),\(p\mid\binom{p}{i}\)。
Cipolla 算法
断言对于奇素数 \(p\) 和 \((a,p) = 1\),方程 \(x^2\equiv a\pmod p\) 的一个解可以用如下方式寻找:找到 \(r\) 使得 \(r^2-a\) 为二次非剩余,扩域令 \(j^2 = r^2-a\),则 \(x \equiv (a+j)^\frac{p+1}{2} \pmod {p}\)。注意到这还表明 \((a+j)^\frac{p+1}{2}\) 虚部为 \(0\)。证明如下。
\[\begin{aligned}
x^2 &\equiv (r+j)^p(r+j) \pmod p\\
&\equiv (r^p+j^p)(r+j) \pmod p\\
&\equiv (r+(j^2)^{\frac{p-1}{2}}\cdot j)(r+j) \pmod p\\
&\equiv (r+(r^2-a)^{\frac{p-1}{2}}\cdot j)(r+j) \pmod p\\
&\equiv (r-j)(r+j) \pmod p\\
&\equiv r^2-j^2 \pmod p\\
&\equiv r^2-(r^2-a) \pmod p\\
&\equiv a \pmod p\\
\end{aligned}
\]
通过随机化寻找 \(r\),期望 \(\Theta(1)\) 次即可找到。时间复杂度为快速幂的复杂度,即一般的 \(\Theta(\log p)\)。