二次剩余
二次剩余
在数论中,一个整数x对于p的二次剩余是指x2(modp),如果一个数y可以表示x2(modp),那么称y是模p的二次剩余,否则称y是模p的二次非剩余。
如果p是素数,考虑到a2=b2⇒(a−b)(a+b)=0,因此可以认为在模p的剩余类环中有p−12个二次剩余(不考虑0),同时也有p−12个二次非剩余。
欧拉准则
当p是素数时,要判断一个数y是否是模p的二次剩余,可以借助欧拉准则。
一个数y是模p的二次剩余,当且仅当yp−12=1(modp)。
Toneli-Shanks算法
Toneli-Shanks算法可以用于求解x2=y(modp),这里p是素数,y已知,求x。算法流程如下:
如果p=2,则一定有y=x。
否则我们需要先通过欧拉准则确定有解。假如有解,我们随机一个a,满足w=a2−y是二次非剩余。之后我们证明x=(a+√w)p+12。
证明:
由于费马小定理知道对于任意数t≠0(modp)都有tp−1=1。因此可以继而推出tp−12=±1。
(a+√w)p+1=(a+√w)p(a+√w)其中
(a+√w)p=p∑i=0(pi)ai√wp−i由于(pi)(modp)非0仅在i=0和i=p的情况下会发生,因此(a+√w)p=ap+√wp,其中ap=ap−1a=a,而√wp=√wp−1√w=wp−12√w=−√w(注意w不是二次剩余)。
(a+√w)p=(a+√w)(a−√w)=a2−w=y因此x=(a+√w)p+12。
注意上面的√w不存在,但是满足√w2=w。我们可以用类似复数虚部的方式来表示它。可以证明当x存在的时候,这时候一定有(a+√w)p+12只包含实部。
这个算法的时间复杂度取决于a选择的次数,考虑到我们在二次剩余那节说过[1,p−1]之间的二次剩余和二次非剩余是相同数量的,这里可以简单认为取到w为非二次剩余的概率为12,因此期望次数为2,故时间复杂度应该为O(log2p)。