Python函数示例:如何判断一个数是否是素数?
素数(Prime Number)是指除了1和本身以外没有其他因数的自然数,例如2、3、5、7、11、13等。在算法和数学学科中,素数拥有重要的应用场景,因此如何判断一个数是否是素数是一个基本的算法问题。
下面我们将介绍如何使用Python编写一个判断一个数是否是素数的函数。
方法一:试除法
试除法是最基本的判断素数的方法。如果一个数n不是素数,那么它一定可以表示为两个数的乘积即$n=x\times y$。其中$x$和$y$可能都不等于$n$。如果$n$是素数,那么$x$和$y$都必须大于$\sqrt{n}$才能相乘等于$n$。所以我们只需要枚举2到$\sqrt{n}$之间的所有数,判断是否能整除n即可。
首先定义一个函数is_prime(n),接受一个参数n表示要判断的数。
def is_prime(n):
???if n < 2: # 小于2不是素数
???????return False
???for i in range(2, int(n**0.5) + 1):
???????if n % i == 0:
???????????return False
???return True
运行上面的代码,得到一个判断素数的函数is_prime(n)。下面我们来测试一下这个函数:
print(is_prime(2)) # True
print(is_prime(3)) # True
print(is_prime(4)) # False
print(is_prime(5)) # True
print(is_prime(6)) # False
输出结果如下:
True
True
False
True
False
可以看到,对于2、3、5这些素数,函数都判断为True,而对于4、6这些非素数,函数则判断为False。
方法二:Sieve of Eratosthenes
Sieve of Eratosthenes是一种高效的筛法算法,用于求解一定范围内的素数。其原理是从2开始,将每个素数的倍数都标记成合数,直到筛子的末端。
例如,要求100以内的素数,我们可以从2开始,将2的倍数标记成合数,然后推算下一个素数3,将3的倍数标记成合数。依次类推,直到100以内的所有数都经过处理。最后,未被标记的数就都是素数。
首先定义一个函数prime_sieve(n),接受一个参数n表示要求解的素数范围。
def prime_sieve(n):
???prime_list = [] # 保存素数的列表
???is_prime = [True] * (n+1) # 标记所有数为素数
???for i in range(2, n+1):
???????if is_prime[i]:
???????????prime_list.append(i)
???????????for j in range(i*i, n+1, i): # i的倍数都不是素数
???????????????is_prime[j] = False
???return prime_list
运行上面的代码,得到一个求解素数范围内素数的函数prime_sieve(n)。下面我们来测试一下这个函数:
print(prime_sieve(10)) # [2, 3, 5, 7]
print(prime_sieve(20)) # [2, 3, 5, 7, 11, 13, 17, 19]
print(prime_sieve(50)) # [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47]
可以看到,函数可以高效地求解素数范围内的素数。
总结:
本文介绍了两种Python函数示例,分别使用试除法和Sieve of Eratosthenes来判断一个数是否为素数。其中,试除法是最基本的判断素数方法,而Sieve of Eratosthenes则可以高效地求解一定范围内的素数。
