线性筛选素数--python

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

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

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

代码如下:

# -*-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:
			break
print(ss[:100])
保证一遍循环,干掉所有合数且每个合数只被干掉一次,便是节省时间的做法。

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

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

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

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

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

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

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


  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
孪生素数是指两个素数之间的差值为2的素数对。通过筛法可以找出给定素数范围内的所有孪生素数的组数。 在引用的代码中,使用了递归筛法来解决孪生素数问题。该程序首先使用循环将素数的倍数标记为非素数,然后再遍历素数数组,找出相邻素数之间差值为2的素数对,并统总数。 具体实现过程如下: 1. 定义一个数组a[N,用来标记数字是否为素数,其中N为素数范围的上限。 2. 初始化数组a,将0和1标记为非素数。 3. 输入要查询的孪生素数的个数n。 4. 循环n次,每次读入一个要查询的素数范围num。 5. 使用两层循环,外层循环从2遍历到num/2,内层循环从i的平方开始,将素数的倍数标记为非素数。 6. 再次循环遍历素数数组,找出相邻素数之间差值为2的素数对,并统总数。 7. 输出总数。 至此,我们可以使用这个筛法的程序来解决孪生素数问题。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [python用递归筛法求N以内的孪生质数(孪生素数)](https://blog.csdn.net/weixin_39734646/article/details/110990629)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [NYOJ-26 孪生素数问题](https://blog.csdn.net/memoryofyck/article/details/52059096)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值