📅  最后修改于: 2023-12-03 15:37:04.887000             🧑  作者: Mango
原始性测试是用来确定一个数是否为质数的检验方法。在编写算法时,我们需要考虑速度和准确性。
套装2是一组基于Fermat方法的原始性测试算法,它们是快速而准确的算法,适用于需要高速执行的应用程序。该算法依赖于Fermat小定理,该定理指出,如果p是质数,a是不为p的倍数的证明,那么a^(p-1) ≡ 1 (mod p)。
这是最基本的实现,它通过循环检查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
这是使用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
该算法在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
这些算法可以很好地用于测试一个数是否为质数,具有高速和准确性的特点,我们可以根据实际情况选择最适合我们的算法,以便在实际应用中获取最优结果。