注意:
-
本文讨论的是模奇素数的二次剩余
-
目前不打算写二次互反律,不易写明白
什么是二次剩余
求解模小素数的二次同余方程
求解模小素数的二次方程,只需要遍历 Z p ⋆ \mathbb{Z}_p^{\star} Zp⋆ 中的数,验证每个数的平方模 p p p 结果是否为 a a a 即可。
原因:在同余的意义下,只有 0 , 1 , 2 , . . . , p − 1 {0, 1, 2, ... , p-1} 0,1,2,...,p−1这些数,而 x = 0 x=0 x=0 只可能是 x 2 ≡ 0 ( m o d p ) x^2\equiv0\ (mod \ p) x2≡0 (mod p) 的解。这个方程很普通,解永远是 x ≡ 0 ( m o d p ) x\equiv0\ (mod\ p) x≡0 (mod p) ,我们不需要特别地去考虑它。
sage实现求解 x 2 ≡ a ( m o d 7 ) x^2\equiv a\ (mod \ 7) x2≡a (mod 7) 的代码:
for a in range(1,7):
print("Solving x^2 = {} mod 7".format(a))
solNum = 0
for x in range(1,7):
if mod(x*x,7) == a:
print("x =",x)
solNum += 1
if solNum == 0:
print("No solution ...")
else:
print("Number of solution is {}".format(solNum))
二次剩余个数、解的结构
下图中指的是模奇素数二次方程的解的结构
模 p p p二次剩余的个数为什么是 p − 1 2 \frac{p-1}{2} 2p−1
将 Z p ∗ Z_p^* Zp∗ 中的所有数(即 1 , 2 , . . . , p − 1 {1, 2, ... , p-1 } 1,2,...,p−1)平方后,出现了重复结果。且两个一对,两数同余。例如:
1
2
≡
(
p
−
1
)
2
≡
(
−
1
)
2
(
m
o
d
p
)
1^2\equiv(p-1)^2\equiv(-1)^2\ (mod \ p)
12≡(p−1)2≡(−1)2 (mod p)
2
2
≡
(
p
−
2
)
2
≡
(
−
2
)
2
(
m
o
d
p
)
2^2\equiv(p-2)^2\equiv(-2)^2\ (mod \ p)
22≡(p−2)2≡(−2)2 (mod p)
因此将 Z p ⋆ \mathbb{Z}_p^{\star} Zp⋆ 中的元素平方后,元素的个数变成原来的一半
如何判断是否有解
编程中,我们可以使用gmpy2的legendre()