def quadratic_residue_and_square_root(a, p):
"""
计算模 p 下的平方剩余和平方根
返回一个元组 (是否为平方剩余, 平方根1, 平方根2)
"""
if not is_quadratic_residue(a, p):
return (False, None, None)
# 计算平方根
x = pow(a, (p + 1) // 4, p)
return (True, x, p - x)
def is_quadratic_residue(a, p):
"""
判断 a 是否是模 p 的平方剩余
"""
return pow(a, (p - 1) // 2, p) == 1
# 例子:计算模 17 下的平方剩余和平方根
p = 17
for a in range(p):
result, root1, root2 = quadratic_residue_and_square_root(a, p)
if result:
print(f"模 {p} 下 {a} 的平方剩余是 True,平方根为 {root1} 和 {root2}")
else:
print(f"模 {p} 下 {a} 的平方剩余是 False")
运行结果
模 17 下 0 的平方剩余是 False
模 17 下 1 的平方剩余是 True,平方根为 1 和 16
模 17 下 2 的平方剩余是 True,平方根为 16 和 1
模 17 下 3 的平方剩余是 False
模 17 下 4 的平方剩余是 True,平方根为 1 和 16
模 17 下 5 的平方剩余是 False
模 17 下 7 的平方剩余是 False
模 17 下 8 的平方剩余是 True,平方根为 16 和 1
模 17 下 9 的平方剩余是 True,平方根为 16 和 1
模 17 下 10 的平方剩余是 False
模 17 下 11 的平方剩余是 False
模 17 下 12 的平方剩余是 False
模 17 下 13 的平方剩余是 True,平方根为 1 和 16
模 17 下 14 的平方剩余是 False
模 17 下 15 的平方剩余是 True,平方根为 16 和 1
模 17 下 16 的平方剩余是 True,平方根为 1 和 16
标签:剩余,平方,False,17,代码,平方根,True
From: https://www.cnblogs.com/u5bf/p/17944996