📅  最后修改于: 2023-12-03 15:40:34.083000             🧑  作者: Mango
在计算机科学中,素数是一个重要的概念,通常用于加密、哈希表和其他数学应用程序中。在此介绍一些常用的检查数字是否为素数的方法。
一个大于 1 的整数,如果除了 1 和它本身之外,没有其他因数,那么它就是一个素数。例如,2,3,5,7,11,13等数字都是素数。
要检查数字n是否为素数,通过从2到n-1的所有整数尝试将n除以它们并检查余数是否为 0,可以确定n是否为素数。
def is_prime(n):
if n < 2:
return False
for i in range(2, n):
if n % i == 0:
return False
return True
在这个函数中,我们将数字从2到n-1遍历,并通过检查n是否能被它们整除来确定数字是否为素数。如果数字不能被它们整除,则它是一个素数。
试除法虽然是一个简单有效的方法,但对于大数(n>10^18),会非常慢。优化的试除法是遍历从2到sqrt(n)的整数,因为如果n有一个因数大于sqrt(n),则它必定有另一个因数小于sqrt(n),也就是说将sqrt(n)以下的数排除掉就可以了。
import math
def is_prime(n):
if n < 2:
return False
for i in range(2, int(math.sqrt(n))+1):
if n % i == 0:
return False
return True
在这个函数中,我们只在2到sqrt(n)之间进行遍历,并且使用math.sqrt()函数求出sqrt(n)。如果数字n不能被这些数整除,则它是一个素数。
Miller-Rabin素性测试是一种快速检查一个数字是否为素数的算法。由于它可以处理非常大的数字,因此在实际应用中,它被广泛使用。
Miller-Rabin算法的基本思想是:如果n为一个素数,则存在一个整数a使得a^(n-1) mod n=1。如果这条规则不成立,那么数字n就不是一个素数。重复这个测试k次,可以获得非常高的精度。
import random
def is_prime(n, k=5):
if n < 2:
return False
if n == 2 or n == 3:
return True
if n % 2 == 0:
return False
d = n - 1
s = 0
while d % 2 == 0:
s += 1
d //= 2
for i in range(k):
a = random.randint(2, n-2)
x = pow(a, d, n)
if x == 1 or x == n-1:
continue
for j in range(s-1):
x = pow(x, 2, n)
if x == n-1:
break
else:
return False
return True
在这个函数中,我们首先检查数字是否为2或3,或是否为偶数。然后我们找到数字n-1 = 2^s * d。然后我们在k次测试中随机选择一个整数a,检查它的幂是否为1或n-1,如果不是,则进行循环检查幂。如果其中任何一次检查失败,则数字n不是一个素数。如果所有测试都通过,则数字n是一个素数。
我们介绍了3种常用的检查数字是否为素数的方法:试除法、优化的试除法和Miller-Rabin算法。在实际应用中,我们通常使用优化的试除法或Miller-Rabin素性测试,因为它们可以处理非常大的数字,并且具有非常高的精度。