线性筛选素数--python

来源:互联网 发布:机械师软件 编辑:程序博客网 时间:2024/06/08 15:20

首先知道:合数一定可以分解为几个素数的积,既然是几个素数,就一定有最小的一个。我们将这个最小素数因子叫最小素因子,

那么是我们可以知道任何一个合数都有唯一的一个最小素因子。我们要做的事就是用素因子筛选出其对应的合数,然后标注为合数。

筛选出所有的合数,那么剩下的当然是素数。

代码如下:

# -*-coding:utf-8-*-maxl = 1000000  # 筛选范围count = 0       ss = []    # 素数check = [] # 0代表素数,1代表合数。全部初始化为素数。for x in range(0, maxl+1):check.append(0)# 筛选出 2~10^6 所有素数for i in range(2, maxl):# 如果是素数就存起来if check[i] == 0:ss.append(i)count += 1# 循环存起来的素数for j in range(0, count):# 素数的i倍,肯定是一个合数if ss[j]*i > maxl:break# 将素数的i倍标注为合数,这儿将所有素数视为最小素数,那么最小素数对应的所有合数都会被标注。check[ss[j]*i] = 1# 循环素数列表,如果被筛选的数能被列表中某个数整除,由于列表中的素数是有序的,所以该素数就是被筛选数的最小素因子。# 我们知道上一句代码就是用来筛选出素因子对应合数的,既然合数 i 对应的最小素因子已经在素数列表中了,那么合数 i 肯定# 会被改素数给筛选出,所以结束当前循环,没必要用其他素数去筛选 i if i%ss[j] == 0:breakprint(ss[:100])
保证一遍循环,干掉所有合数且每个合数只被干掉一次,便是节省时间的做法。

每个合数只有一个最小素因子,将当前知道的素数分别作为最小素因子找出他所有的倍数,那就是找出了最小素因子对应的

所有合数,这确保了干掉筛选范围内所有的合数。

那么怎么保证合数只被干掉一次呢?

例如:合数24,循环素数列表时,2*12=24 被干掉一次。3*8=24,又被干掉一次。

那么我们怎么确保24只被干掉一次呢,合数24的最小素因子是素数2。既然是因子,自然有:24%2 == 0

就是说当我们循环当前的有序的(从小到大)素数列表,只要有一个素数能整除合数那么这个素数就是该合数的最小素因子,就有:合数%最小素因子 == 0, 当这个条件成立时,说明素数列表中已经有合数的最小素因子,该合数被干掉是迟早的事。

所以这个条件成立时,就应该结束循环素数列表。


原创粉丝点击