二次剩余Cipolla算法

参照jklover的博客。

概述

大概就是在模\(p\)意义下开根号,如求解方程\(x^2\equiv n\ (\bmod p)\).
这里只考虑\(p\)为素数的情况.若\(p=2\) ,则\(x=0\ when\ n=0,x=1\ when\ n=1\).
\(p​\)为奇素数,定义勒让德符号:
\[\lgroup\frac{n}{p}\rgroup =n^{\frac{p-1}{2}}\]

则根据欧拉准则,
\[\lgroup \frac{n}{p} \rgroup \equiv \left\{ \begin{array}{lr} 1,\ n是p的二次剩余,\\ -1,\ n不是p的二次剩余,\\ 0,\ x\equiv 0. \end{array}\right.\qquad(\bmod p)\]

对于\(\lgroup \frac{n}{p} \rgroup \equiv 1\)的情况,我们随机取一个\(a\)使得\(a^2-n\)不为\(p\)的二次剩余,可证期望步数为\(2\).
\(\omega=\sqrt{a^2-n}\),定义一个新数域\(x+y\cdot\ \omega​\),类似于复数,只是单位复数为\(\omega\).
那么\(x\equiv \pm (a+\omega)^{\frac{p+1}{2}}\ (\bmod\ p)\),据拉格朗日定理可知虚数部分系数为\(0\) .
简要论证,尝试倒推变形,
\[x\equiv \pm (a+\omega)^{\frac{p+1}{2}}\\ x^2\equiv (a+\omega)^{p+1}\\ x^2\equiv (a+\omega)^p(a+\omega)\]

注意到\((a+\omega)^p\) 可用二项式定理展开,\((a+\omega)^p\equiv \sum_{i=0}^{p}C_p^i a_i \omega ^{a-i}\ (\bmod\ p)\).
\(p\)是个质数,.使用Lucas定理处理组合数,发现仅当\(i=0,i=n\)时组合数在模意义下才为非\(0\)的,仅计算\(i=0,i=n\),可得到\((a+\omega)^p\equiv a^p+\omega ^p\ (\bmod\ p)\).
得到这个式子后,继续对上面的式子变形,
\[x^2\equiv (a+\omega)^p(a+\omega)\\ x^2\equiv (a^p+\omega^p)(a+\omega)\]

注意到\(a^p\equiv a\)(费马小定理),而\(\omega ^p\equiv \omega * \omega^{p-1} \equiv \omega*(\omega ^2)^{\frac{p-1}{2}}\equiv \omega*(a^2-n)^{\frac{p-1}{2}}\equiv -\omega\).
继续变形,
\[x^2\equiv (a^p+\omega^p)(a+\omega)\\ x^2\equiv(a-\omega)(a+\omega)\\ x^2\equiv a^2-\omega^2\\ x^2\equiv a^2-(a^2-n)\\ x^2\equiv n\ (\bmod\ p)\]

这里的变形操作容易验证都是可逆的,可以一步一步推回去,就说明了有两个解,\(x\equiv \pm (a+\omega)^{\frac{p+1}{2}}\ (\bmod\ p)\).
时间复杂度为\(O(log^2p)\).

猜你喜欢

转载自www.cnblogs.com/autoint/p/10515948.html