Python 尝试计算埃拉托斯烯的筛

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)) 但我一直在创

我是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))
但我一直在创造其他的场景,而忽略了它们

谢谢

到目前为止,我的想法是:

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]