📜  在Modulo p下找到平方根|集合1(当p的形式为4 * i + 3时)(1)

📅  最后修改于: 2023-12-03 15:23:25.163000             🧑  作者: Mango

在 Modulo p 下找到平方根(集合1,当 p 的形式为4 * i + 3时)

在数论中,Modulo p 下找到平方根是一个重要的问题。尤其当 p 的形式为 4 * i + 3 时,这个问题变得更加有趣和复杂。本文将为程序员讲解如何在这种情况下找到 Modulo p 下的平方根。

什么是 Modulo p?

Modulo p(也称“取模 p”)是对给定的整数 p 取余数的一种运算。例如,如果我们有一个整数 x,那么 x mod p 将返回 x 除以 p 的余数。例如,17 mod 5 返回 2,因为 17 除以 5 余 2。

Modulo p 在密码学、计算机科学和数学中有广泛的应用。在这些领域中,我们通常会面对一个非常大的 p(例如一个大质数),并且需要进行高效的 Modulo p 运算。

什么是平方根?

在数学中,平方根是一个数的二次方等于它的平方根。例如,2的平方根是2,因为2 * 2 = 4。

当我们在 Modulo p 下考虑平方根时,我们想要找到一个数 x,它的平方 mod p 等于另外一个给定的数 y mod p。也就是说,我们要找到一个数 x,使得 (x^2) mod p = y mod p。

如何找到 Modulo p 下的平方根?
前置条件

我们假设 p 是一个质数,且 p 的形式为 4 * i + 3,其中 i 是一个整数。我们还假设 y 是一个在 Modulo p 下的完全平方数(即 y 的平方根存在)。

步骤
  1. 首先,我们可以使用费马小定理来检查 y 是否为模 p 下的平方数。费马小定理告诉我们,如果 p 是质数,那么对于任意整数 a, a^p mod p = a mod p。因此,如果我们有 y^((p-1)/2) mod p = 1,那么 y 是模 p 下的完全平方数。如果 y^((p-1)/2) mod p = p-1,那么 y 不是模 p 下的完全平方数。

  2. 接下来,我们可以使用欧拉准则来计算 y 的平方根。欧拉准则告诉我们,如果 a 是整数且 p 是质数,那么 a^((p-1)/2) mod p 的值只有可能是 1 或 -1。因此,我们可以计算:

    z = a^((p+1)/4) mod p

    然后,如果 (z^2) mod p = a mod p,那么 z 是 a 的平方根。否则,我们可以计算

    z = (2 * a * (p+1)/4)^((p-1)/2) mod p

    然后,如果 (z^2) mod p = a mod p,那么 z 是 a 的平方根。

代码示例

下面是一个 Python 代码示例,用于找到 Modulo p 下的平方根(集合1,当 p 的形式为 4 * i + 3 时):

def mod_sqrt(y, p):
    if pow(y, (p-1)//2, p) != 1:
        return "y is not a square mod p"
    elif p % 4 == 3:
        z = pow(y, (p+1)//4, p)
        return z, p-z
    else:
        for z in range(2, p):
            if pow(z, (p-1)//2, p) == p-1:
                break
        w = pow(y, (p-1)//4, p)
        x = pow(y, (p+3)//8, p)
        for i in range(1, (p-3)//4 + 1):
            r = pow(z, 2*i, p)
            t = (w * pow(r+z, (p-1)//2, p)) % p
            u = (w * r) % p
            if pow(t, 2, p) == y:
                return t, p-t
            elif pow(u, 2, p) == y:
                return u, p-u

注意,上述代码只处理集合1的情况。当 p 的形式为 4 * i + 1 时,我们需要使用不同的算法(例如 Tonelli-Shanks 算法)来找到模 p下的平方根。

总结

在 Modulo p 下找到平方根是一个重要且有趣的问题,尤其是当 p 的形式为 4 * i + 3 时。在这种情况下,我们可以使用欧拉准则来找到模 p 下的平方根。程序员可以利用本文所述的方法,快速而准确地找到模 p下的平方根,以满足他们的计算需求。