二次剩余-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的主要内容,如果未能解决你的问题,请参考以下文章

二次剩余(Cipolla)

二次剩余定理及Cipolla算法入门到自闭

二次剩余-Cipolla

二次剩余&&Cipolla

二次剩余从csdn

二次剩余