素数的经典求法-python实现

本文详细解析了一种高效的素数生成算法,通过去除已知素数的倍数,逐步筛选出自然数序列中的所有素数。算法利用生成器和过滤器实现,能够连续生成任意数量的素数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

任意个数的素数求解

解析

  1. 给定一个自然数序列 1 ~ N
  2. 去掉自然数序列中2的倍数(不包含2) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 ~ N
  3. 去掉剩余序列中3的倍数(不包含3)1 2 3 5 7 9 ~ 11 13 15 16 N
  4. 去掉剩余序列中5的倍数(不包含5)。。。

如此循环下去我们不难发现规律:每遇到一个素数,则删除该素数在自然数序列中的倍数的数,那么序列的下一个数字,必然是下一个素数。

实现

1. 创建自然数列

# 使用生成器直接取一个无限的奇数列(即去掉素数2的倍数的剩余数列)
# 需要注意的是这个奇数列中不包含素数2,需要在取素数的时候特殊添加
def odd_generator():
	n = 1
	while True:
		n += 2
		yield n

2. 需要去掉剩余数列当前素数的倍数的通用方法

# 这个方法返回的是一个函数的引用,需要传入x参数
# 需要注意 我们使用内置filter()方法来出入参数
def remove_multiple_n(n):
	return lambda x: x % n > 0

3. 生成器来逐个生成素数

# 别忘了补充弹出素数2
def prime():
	yield 2
	# 获取自然数列
	odd_iter = odd_generator()
	while True:
		# 获取自然数列的下一个值(即为素数)并弹出
		n = next(odd_iter)
		yield n
		# 去掉当前素数倍数--刷新自然序列
		odd_iter = filter(remove_multiple_n(n), odd_iter)

程序

def odd_generate():
	n = 1
	while True:
		n += 2
		yield n
	
def remove_multiple_n(n):
	return x: x % n > 0

def prime():
	yield 2
	odd_iter = odd_generate()
	while True:
		n = next(odd_iter)
		yield n
		odd_iter = filter(remove_mutiple_n(n), odd_iter)

if __name__ == '__main__':
	# 前十位素数
	pr = prime()
	for i in range(10):
		print(next(pr)

# 输出
3
5
7
11
13
17
19
23
29

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值