二次剩余-Cipolla
Posted jklover
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了二次剩余-Cipolla相关的知识,希望对你有一定的参考价值。
二次剩余 (Cipolla) 算法
概述
- 大概就是在模 (p) 意义下开根号,如求解方程(x^2equiv n(mod p)).
- 这里只考虑 (p) 为素数的情况.若 (p=2) ,则(x=0 when n=0,x=1 when n=1).
- 若 (p?) 为奇素数,定义勒让德符号:
[ lgroupfrac{n}{p} group =n^{frac{p-1}{2}} ]
- 则根据欧拉准则,
[ lgroup frac{n}{p} group equiv left{ egin{array}{lr} 1, n是p的二次剩余, -1, n不是p的二次剩余, 0, xequiv 0. end{array} (mod p) ight. ]
- 对于 (lgroup frac{n}{p} group equiv 1) 的情况,我们随机取一个 (a) 使得 (a^2-n) 不为 (p) 的二次剩余,可证期望步数为 (2) .
- 记 (omega=sqrt{a^2-n}?) ,定义一个新数域(x+ycdot omega?),类似于复数,只是单位复数为(omega?).
- 那么 (xequiv pm (a+omega)^{frac{p+1}{2}} (mod p)),据拉格朗日定理可知虚数部分系数为 (0) .
- 简要论证,尝试倒推变形,
[ xequiv pm (a+omega)^{frac{p+1}{2}}x^2equiv (a+omega)^{p+1}x^2equiv (a+omega)^p(a+omega) ]
- 注意到 ((a+omega)^p) 可用二项式定理展开,((a+omega)^pequiv sum_{i=0}^{p}C_p^i a_i omega ^{a-i} (mod p)).
- (p) 是个质数,.使用 (Lucas) 定理处理组合数,发现仅当(i=0,i=n)时组合数在模意义下才为非 (0) 的,仅计算(i=0,i=n),可得到((a+omega)^pequiv a^p+omega ^p (mod p)).
- 得到这个式子后,继续对上面的式子变形,
[ x^2equiv (a+omega)^p(a+omega)x^2equiv (a^p+omega^p)(a+omega) ]
- 注意到(a^pequiv a) (费马小定理),而(omega ^pequiv omega * omega^{p-1} equiv omega*(omega ^2)^{frac{p-1}{2}}equiv omega*(a^2-n)^{frac{p-1}{2}}equiv -omega).
- 继续变形,
[ x^2equiv (a^p+omega^p)(a+omega)x^2equiv(a-omega)(a+omega)x^2equiv a^2-omega^2x^2equiv a^2-(a^2-n)x^2equiv n (mod p). ]
- 这里的变形操作容易验证都是可逆的,可以一步一步推回去,就说明了有两个解,(xequiv pm (a+omega)^{frac{p+1}{2}} (mod p)).
- 时间复杂度为(O(log^2p)).
以上是关于二次剩余-Cipolla的主要内容,如果未能解决你的问题,请参考以下文章