📜  欧拉准则(检查模p下的平方根是否存在)(1)

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

欧拉准则(Euler's Criterion)

欧拉准则是用来判断一个整数是否为模 p 下的二次剩余的公式。一个数 a 在模 p 下是二次剩余,当且仅当 a^((p - 1) // 2) ≡ 1 (mod p),其中 (p - 1) // 2 是整数除法。

推导

欧拉准则的推导基于费马小定理。首先,根据费马小定理,a^(p - 1) ≡ 1 (mod p) 成立当且仅当 p 是质数且 a 不是 p 的倍数。接下来,我们将 p - 1 分解成 2 的幂次的和,即

p - 1 = 2^k * m

其中 m 是奇数。因此,a^(p - 1) = a^(2^k * m) = (a^m)^2^k。

现在假设 a 是一个二次剩余,即存在一个整数 x 满足 x^2 ≡ a (mod p)。因此,我们可以将上式写成

(x^2)^m * 2^k ≡ a^m (mod p)

然后再根据费马小定理将 2^k 与 p 分解:

2^k ≡ 1 (mod 2)
2^k ≡ -1 (mod p)

因此,我们得到

(x^2)^m ≡ a^m (mod p)
x^(2^(k-1)) ≡ ±1 (mod p)

如果 x^(2^(k-1)) ≡ 1 (mod p),则 a 是模 p 下的二次剩余,否则不是。

但是注意到,如果 a 不是模 p 下的二次剩余,那么我们只能得到 x^(2^(k-1)) ≡ -1 (mod p),而不是“不等于 1”。这里我们需要用到勒让德符号,它是一个数学函数,定义为

(a/p) = a^((p-1)/2) (mod p)

然后我们可以得到欧拉准则的表述:

a 是模 p 下的二次剩余,当且仅当 (a/p) ≡ 1 (mod p)

这个结论还可以进一步推广到 Jacobi 符号,让质数 p 变为奇合数。

代码实现

欧拉准则可以用 Python 代码实现如下:

def euler_criterion(a, p):
    """
    Returns True if `a` is a quadratic residue modulo `p`.
    """
    res = pow(a, (p-1)//2, p)
    return res == 1

这个函数使用了 Python 的内置函数 pow 来计算 a^((p - 1) // 2)。pow 函数接受三个参数,分别是底数、指数和模数。当指数为正整数时,它可以快速计算幂运算,并且可以使用模运算来防止溢出。此外,对于质数 p,我们还可以使用费马小定理来加速计算,即:

pow(a, p-1, p)

注意到,当 a 是 p 的倍数时,结果永远是 0。对于其他情况,euler_criterion 函数会返回结果 True 或 False,表示 a 是否为模 p 下的二次剩余。