平方剩余代码实现

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
posted @ 2024-01-04 12:35  markgo  阅读(82)  评论(0)    收藏  举报