📅  最后修改于: 2023-12-03 15:04:37.100000             🧑  作者: Mango
在数学中,素数指的是仅能被1和自身整除的正整数。在编程中,我们经常需要用到素数,比如用于密码学、算法设计等领域。
那么在Python中,如何判断一个数是不是素数呢?有以下几种方法:
trial_division(n) 函数可以实现试除法。即从2开始,依次用每个小于等于n的正整数去除n,如果有能整除的数,则n不是质数。否则n是质数。这种方法的时间复杂度为O(n),效率较低。
def trial_division(n):
for i in range(2, n):
if n % i == 0:
return False
return True
Eratosthenes(n) 函数可以实现埃拉托斯特尼筛法。这种方法的思路是先用2筛去所有能被2整除的数,再用3筛去剩下能被3整除的数,以此类推,直至筛去完所有小于等于n的质数。这种方法的时间复杂度为O(n log log n),效率较高。
def eratosthenes(n):
is_prime = [True] * (n + 1)
is_prime[0] = False
is_prime[1] = False
for i in range(2, int(n ** 0.5) + 1):
if is_prime[i]:
for j in range(i * i, n + 1, i):
is_prime[j] = False
return [i for i in range(n + 1) if is_prime[i]]
miller_rabin(n, k) 函数可以实现Miller-Rabin算法。该算法是一种基于费马小定理和二次探测定理的随机算法。在判断之前,需要选择一定的随机整数k,判断n是否为k次检验都为素数。这种方法的时间复杂度为O(k log^3 n),效率很高。
def miller_rabin(n, k):
if n == 2 or n == 3:
return True
if n < 2 or n % 2 == 0:
return False
r, s = 0, n - 1
while s % 2 == 0:
r += 1
s //= 2
for i in range(k):
a = random.randint(2, n - 2)
x = pow(a, s, n)
if x == 1 or x == n - 1:
continue
for j in range(r - 1):
x = pow(x, 2, n)
if x == n - 1:
break
else:
return False
return True
需要注意的是,该算法可能会出现误判,但可以通过选择一个足够大的k值来把概率降低到非常小。
以上是Python中判断素数的几种方法。大家可以根据自己的需要选择不同的算法来实现。