整个算法可谓是神奇!!!!
算法流程:
1.判断当前是否是一个二次剩余用 n^(p-1)/2=p-1(mod p)来判如果等于那就不是直接返回无解
2.循环选取一个随机数并且计算它的w=a^2-n
3.判断w^(p-1)/2=p-1 (mod p)是否正确,如果对的话那么我们跳出
4.计算拓展数域上的 (a+w)^(p+1)/2 即可
拓展数域就是同余的拓展出来一个类似复数的数域,所以我们重载乘法 (a+iw) x (b+jw) = (ab+ijw^2)+(aj+bi)w
5.计算出来之后我们需要判断几个解如果p-拓展域实数位上的数=拓展域实数位上的数 也就是说ans.x=p-ans.x那么总共有一个解
6.否则那就两个解分别输出即可
证明看网上大佬吧…..
1 |
|