首页 > 技术文章 > 使用列表实现筛选法求素数(利用python的内置函数,快速求素数)

mmimo 2020-09-29 11:30 原文

代码如下: (具体内置函数可以自行搜索,我主要记录这样求素数的原理即好处,帮助大家和自己体验一下这种高级的感觉【来自小白的乐趣】)

 

 1 maxNumber = int(input("请输入一个大于2的自然数"))
 2 lst = list(range(2, maxNumber))
 3 print(lst)
 4 # 最大整数的平方根
 5 m = int(maxNumber ** 0.5)
 6 for index, value in enumerate(lst):
 7 
 8     # 如果当前数字已大于最大整数的平方根,结束判断(素数判断方法:用一个数分别去除2到sqrt(这个数),如果能被整除,则表明此数不是素数,反之是素数。)
 9     if value > m:
10         break
11     # 对该位置之后的元素进行过滤,每次除以value,若余数为0,则淘汰它
12     lst[index + 1:] = filter(lambda x: x % value != 0, lst[index + 1:])
13     print("lst:",lst)
14 print(lst)

 

原理:

前提须知:
素数判断方法:用一个数分别去除2到sqrt(这个数),如果能被整除,则表明此数不是素数,反之是素数。

举例 使用36来跑跑上面的代码

lst = [2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35]

m = 6

进入循环

① index = 0 value = 2(对应lst中的第一个元素)
从lst[1]开始进行过滤 找出lst里不能被2整除的数
lst = [2, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29, 31, 33, 35]

② index =1 value = 3(对应lst中的第二个元素)
从lst[2]开始进行过滤 找出lst里不能被3整除的数
lst = [2, 3, 5, 7, 11, 13, 17, 19, 23, 25, 29, 31, 35]

③ index = 2 value = 5 (对应lst中的第三个元素)
从lst[3]开始进行过滤 找出lst里不能被5整除的数
lst = [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31]

④ index = 3 value = 7
此时已经大于6(36的平方根),所以结束判断

相比从2到所求数的平方根进行遍历,通过是否能被整除来求素数,这个的循环次数更少,譬如从上述②到③,就已经省去了对是否能整除4的判断,若我们所求的数越大,那这个体现的效率就越高(因为能减少更多的运算次数),为什么可以这样呢?如果一个数不能被2整除,那它肯定不能被4整除(即不能被n整除的数,肯定不能被n的倍数整除),因此就可用这规律减少运算次数

推荐阅读