📜  检查数字是否为Euler Pseudoprime(1)

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

检查数字是否为 Euler Pseudoprime

欧拉伪素数是一种特殊的合数,其可以通过费马小定理判断是否为伪素数。在数学上,一个正整数 $n$ 如果满足条件:对于所有 $a$ ,$1 \leq a < n$ 且 $a$ 与 $n$ 互质 , $a^{n-1} \equiv 1 \pmod{n}$ ,则 $n$ 被称为是伪素数。但是,并不是所有的伪素数都是欧拉伪素数。

费马小定理

费马小定理是欧拉定理的一个特例。欧拉定理:若 $a$ 和 $m$ 互质,则 $a^{\phi(m)}\equiv1\pmod{m}$,其中 $\phi(m)$ 表示小于等于 $m$ 的正整数中与 m 互质的数的数目。费马小定理可以理解为欧拉定理 $\phi(m)=m-1$ 的特例,即,当 $m$ 为素数时,$\phi(m)$ 只等于 $m-1$,就可以得到费马小定理:若 $p$ 是素数,则 $a^{p-1}\equiv1\pmod{p}$。

我们可以利用费马小定理来判断一个数是否为素数,也可以利用费马小定理来判断一个数是否为伪素数。

代码实现

下面是 Python 语言的一段判断欧拉伪素数的代码实现。

def is_euler_pseudoprime(a, n):
    if pow(a, n-1, n) != 1:
        return False
    else:
        m = n - 1
        while m % 2 == 0:
            m //= 2
            b = pow(a, m, n)
            if b in (1, n-1):
                return True
            elif b == 1:
                return False
        return False

代码中的 pow(a, n-1, n) 表示计算 $a^{n-1} \pmod{n}$ 的值。如果不等于 $1$,则不是欧拉伪素数。

测试示例

我们可以撰写测试用例对方法进行验证。

def test_is_euler_pseudoprime():
    assert is_euler_pseudoprime(2, 341) == False
    assert is_euler_pseudoprime(3, 341) == True
    assert is_euler_pseudoprime(4, 341) == False
    assert is_euler_pseudoprime(5, 341) == False
    assert is_euler_pseudoprime(6, 341) == False
    assert is_euler_pseudoprime(7, 341) == False
    assert is_euler_pseudoprime(11, 341) == False

test_is_euler_pseudoprime()

通过用例的测试,我们可以看到,当 $a = 3$ 时,$n=341$ 是欧拉伪素数,而 $a = 2$ 和 $a = 4 \sim 7, 11$ 的时候,$n=341$ 不是欧拉伪素数。

结论

判断一个数是否为欧拉伪素数的时间复杂度与算法执行速度强相关,最坏情况是 $O(k\log^3n)$(假设 $n$ 为 $k$ 位长度)。实际上,欧拉伪素数的出现频率非常低,并且通常会通过计算若干个值进行验证。