首先我们要弄清楚什么叫二次剩余,其实就是对于给定的和,如果有满足,那么在模意义下就是二次剩余。说白了就是模意义下能否开根号。
我们只讨论为奇素数的情况。
我们先定义,这是一个数域,其实就是到这个数与模意义下加减乘除运算构成的集合。
- 定理1:对于,总共有个的能使该方程有解(将情况除去,由于该情况显然有)。
- 证明:我们只用考虑所有。如果存在不同的两个数、,它们的平方在模意义下同余,那么显然有。由平方差公式。显然不可能整除,因此整除,因此。这个结论反过来也是成立的,因此共有种互不相同的平方,显然对应了所有有解的,而且同一个还一定存在两个互为相反数的解。
然后我们还要知道一个神奇的东西叫做勒让德符号()。
它是这样定义的
那我们怎么求该符号的值呢?
- 定理2:
- 证明:
- 当在模意义下是二次剩余时,令,那么就有,由费马小定理,显然存在。
- 当在模意义下不是二次剩余时,依旧令,那么就有,由费马小定理,显然不存在。
- 当时显然满足。
那么我们就可以通过快速幂计算勒让德符号来判定一个数在模意义下是否是二次剩余了。
有了这些理论基础,我们可以开始算法了。
首先我们要明确我们要求的解(假定在模意义下是二次剩余,由定理1有两个互为相反数的可行解)。
算法一开始的时候我们首先要通过不断地随机(你没有听错,就是随机)出一个数,使得为,也就是不能开根号。先不要管为什么是,我们来算算随机次数的期望。还是由定理1,一共有个数满足勒让德记号值为,因此一次随机得到结果的概率为。当够大的时候,这个概率是趋近于的。那么列一下期望的树状图,就可以得到期望次数为。
那么我们得到这个不能开根号的数之后要干什么呢?我们要干一件丧心病狂的事情,那个数不能开根号,我们非要给它一个域让它可以开根号(类比所在的复数域)。我们将定义为这个域的“虚数单位元”(类比),设它为,那么这个“复数域”的数就一定可以表达为(类比复数域,相当于虚部)。
那么我们将复数域的四则运算法则全部类比到上面,显然它依然满足封闭性、交换律、结合律以及分配律的,还存在加法零元和乘法逆元(貌似符合环的定义)。具体看下图。
那么它就是一个合法的数域。
然后我们定义这个数域有什么用呢?
啊?就这么简单???
我们首先来证明一些东西:
- 定理3:
- 证明:
- 定理4:
- 证明:使用二项式定理我们能得到
由于是质数,因此当不等于且不等于的时候,组合数阶乘公式中的是没有办法被消掉的,就会被模成,因此这些项都是对答案没有贡献的。而或时,我们就分别可以得到和,定理得证。
有了这些定理,我们就可以嘿嘿嘿。
然后取相反数也是一个解。这时可能有人会问,我们得到的解会在域上的,但是我们要求的是域的解,也就是说我们所谓的“虚部”系数是否可能不为。
其实我们不需要担心这个问题,由拉格朗日定理,我们知道在任意一个模的数域里面,任意一个多项式最多有个根(的解称为在下的根),表示多项式的度数,即最大指数。由于是对域的扩充,域的两根一定在内也有效,并且我们知道在数域下的根有两个(),那么一定也是域下的根,也就是“虚部”系数为。
由此问题完美解决,算法时间复杂度貌似是的。