Python 尝试计算埃拉托斯烯的筛
我是python的绝对新手,但我正在尝试计算一些类似于Eratosthenes筛的东西 我将从简单的开始,创建一个包含从2到100的所有整数的集合。让我们称之为集合s 然后我想创建一个包含所有整数n的集合,使得2n包含在该集合中,我们称之为P1。换句话说,一组整数2,4,6,8等等 然后我想做同样的事情,但是P2=3n,然后P3=5n 最后,我想返回集合S中的所有整数,但忽略P1、P2和P3中的整数 我该怎么做呢 我的尝试:Python 尝试计算埃拉托斯烯的筛,python,Python,我是python的绝对新手,但我正在尝试计算一些类似于Eratosthenes筛的东西 我将从简单的开始,创建一个包含从2到100的所有整数的集合。让我们称之为集合s 然后我想创建一个包含所有整数n的集合,使得2n包含在该集合中,我们称之为P1。换句话说,一组整数2,4,6,8等等 然后我想做同样的事情,但是P2=3n,然后P3=5n 最后,我想返回集合S中的所有整数,但忽略P1、P2和P3中的整数 我该怎么做呢 我的尝试: numbers=set(range(2,100)) 但我一直在创
numbers=set(range(2,100))
但我一直在创造其他的场景,而忽略了它们
谢谢
到目前为止,我的想法是:
def sieve(n):
S = set(range(2, 100))
P1 = set(range(0, 100, 2))
P2 = set(range(0, 100, 3))
P3 = set(range(0, 100, 5))
P5 = set(range(0, 100, 7))
return S-P1-P2-P3-P5
print (sieve(100))
以下是回答您特定问题的片段(而不是整个问题): 显然,您不想硬编码Px集,您需要通过查看下一个未查看的数字来识别下一个引物。该函数接受第三个参数:步骤。例如,
范围(2,10,3)
是[2,5,8]
。您可以使用它来构建一些数字的倍数集,例如范围(3100,3)
用于小于100的3的倍数,包括3本身
将这些与集合上的-
运算符组合,以构建筛选的第一个原始版本:
p = set(range(2, 100))
for i in range(2, 10):
p = p - set(range(i, 100, i))
print sorted(p)
但是,这也将删除测试的i
s本身,因此缺少前几个素数:
[11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, ...]
修复此算法将留给读者作为练习。;-) 可以尝试以下方法:
def filter_primes(alist, newlist):
for x in alist[1:]:
if x%alist[0] != 0:
newlist.append(x)
return newlist
alist = range(2, 100)
sieve_list = []
primes = [2]
while len(alist) > 1:
a = filter_primes(alist, sieve_list)
primes.append(a[0])
alist = sieve_list
sieve_list = []
print primes
Out[1]: [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61,
67, 71, 73, 79, 83, 89, 97]
应该适用于任何数字,而不仅仅是100。尝试
范围(21000,2)
,范围(31000,3)
,等等。第三个参数是步骤。如何丢弃这些集合?@user320098尝试在解释器中键入帮助(范围)
。这将为您提供以下信息:“按步骤返回从开始到停止的虚拟数字序列。”。也就是说,它一次按2步进行,这样您就可以得到数字2、4、6、…、96、98。问题是您使用的是一个未排序的集合。在您删除P5
之前,我不知道为什么要对这些数字进行排序,但这是集合
查看的“自然”方式。如果要对它们进行排序,请使用排序(筛(100))
,这将从集合
中创建一个有序的列表。最简单的方法是在减去的集合中不包含它们。不要使用范围(0100,x)
而使用范围(x*x,100,x)
。否则,您可以在集合([2,3,5,7])
中重新添加。请看一下我的代码,直到我做了一个P4=设置(范围(0,100,7)),然后整个序列就完成了。怎么会?它不是应该删除7,14,21等等吗?它应该是范围(7100,7),而不是范围(01000,7)。
def filter_primes(alist, newlist):
for x in alist[1:]:
if x%alist[0] != 0:
newlist.append(x)
return newlist
alist = range(2, 100)
sieve_list = []
primes = [2]
while len(alist) > 1:
a = filter_primes(alist, sieve_list)
primes.append(a[0])
alist = sieve_list
sieve_list = []
print primes
Out[1]: [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61,
67, 71, 73, 79, 83, 89, 97]