📜  原始性测试|套装2(Fermat方法)(1)

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

原始性测试|套装2(Fermat方法)

简介

原始性测试是用来确定一个数是否为质数的检验方法。在编写算法时,我们需要考虑速度和准确性。

套装2是一组基于Fermat方法的原始性测试算法,它们是快速而准确的算法,适用于需要高速执行的应用程序。该算法依赖于Fermat小定理,该定理指出,如果p是质数,a是不为p的倍数的证明,那么a^(p-1) ≡ 1 (mod p)。

算法1 - 暴力循环

这是最基本的实现,它通过循环检查n是否能被2到n-1之间的任何整数整除来测试原始性。该算法简单易用,但当n非常大时,它的速度很慢。

def is_prime(n):
    if n <= 1:
        return False
    for i in range(2, n):
        if n % i == 0:
            return False
    return True
算法2 - Fermat方法

这是使用Fermat小定理的一种更快速且更准确的测试方法,它基于以下观察结果:如果n不是质数,则a^(n-1)≠1。根据Fermat小定理,如果n是质数,则a^(n-1)≡1 mod n,并且在大多数情况下,即使n不是质数,只有不到一千万分之一的机会使测试失败。以下是Fermat原始性测试的Python实现。

def is_prime(n, k=5):
    if n <= 1 or (n % 2 == 0 and n != 2):
        return False

    def check(a, x, mod):
        res = 1
        while x:
            if x % 2 == 1:
                res = res * a % mod
            a = a * a % mod
            x //= 2
        return res
    for i in range(k):
        a = random.randint(2, n-2)
        if check(a, n-1, n) != 1:
            return False
    return True
算法3 - 改进版Fermat方法

该算法在Fermat方法的基础上进行了优化,它使用更多的随机测试器,并使用Miller-Rabin测试进行确认。这使得该算法更加准确。以下是改进版Fermat原始性测试的Python实现。

def is_prime(n, k=10):
    if n <= 1:
        return False

    def check(a, s, d, n):
        x = pow(a, d, n)
        if x == 1 or x == n - 1:
            return True
        for i in range(1, s):
            x = pow(x, 2, n)
            if x == n - 1:
                return True
        return False

    s = 0
    d = n - 1
    while d % 2 == 0:
        s += 1
        d //= 2

    for i in range(k):
        a = random.randint(2, n-2)
        if not check(a, s, d, n):
            return False

    return True
结论

这些算法可以很好地用于测试一个数是否为质数,具有高速和准确性的特点,我们可以根据实际情况选择最适合我们的算法,以便在实际应用中获取最优结果。