解决一类形如 x^2==n(mod p) 的问题。
给定奇素数p和正整数x(1<=x<=p-1), 如果存在一个整数y,1<=y<=p-1, 使得x ≡ y * y (mod p) ,则称y是x的模p平方根。 举例说明: 63是55的模103平方根,因为有:63 * 63 ≡ 3969 ≡ 55 (mod 103)。
托内利-尚克斯算法(Tonelli–Shanks algorithm)可以解决这一类问题。算法流程如下:
输入: 奇素数p和正整数x(1<=x<=p-1)
输出:
设 , Q 为奇数。如果 S = 1 ,那么结果就为 ; 随机选取 z 使得
z对p的勒让德符号
等于-1,那么设 ; 设 , , ; Loop如果 t = 1 ,返回结果 R ; 否则 找一个i , 0<i<M ,使得 ; 让 , , , , ; End Loop
托内利-尚克斯算法是概率算法,返回正确解的概率为1/2。算法的渐进时间复杂度为O((log p)^4)。
给出一个代码加深一下理解。ural1132
勒让德符号 是一个形如这样的分段函数:
若 a 是 p 的二次剩余,则返回 1 ; a 是模 p 的二次非剩余,返回 -1 ; a 是 p 的公约数,返回 0 。
对于二次剩余,有一个欧拉判别法:
欧拉(Euler)判别法: 若 a 是模 p 的平方剩余, 则 若 a 是模 p 的平方非剩余, 则