在Python中查找带模素数

在Python中查找带模素数,python,lambda,primes,modulus,sieve-of-eratosthenes,Python,Lambda,Primes,Modulus,Sieve Of Eratosthenes,我一直在为这段代码而焦头烂额——它返回列表中的所有素数: primes = range(2, 20) for i in range(2, 8): primes = filter(lambda x: x == i or x % i, primes) print primes 它是有效的。。。但我不明白“x==I或x%I”在整个事件中扮演的角色 我也不明白为什么第二个范围只有2到7 我甚至创建了一个Eratosthenes筛的Python实现,希望这能给我一些启示,但它没有 当我删

我一直在为这段代码而焦头烂额——它返回列表中的所有素数:

primes = range(2, 20) 
for i in range(2, 8): 
     primes = filter(lambda x: x == i or x % i, primes)

print primes
它是有效的。。。但我不明白“
x==I或x%I
”在整个事件中扮演的角色

我也不明白为什么第二个范围只有2到7

我甚至创建了一个Eratosthenes筛的Python实现,希望这能给我一些启示,但它没有

当我删除
x%I
组件时,我希望该代码能给出两组通用的数字,但它不能:

nums = [2, 20] 
for i in range(2, 8): 
     nums = filter(lambda x: x == i, nums)

print nums
为什么会这样

同样,当我删除
x==I
组件时,它返回11到19之间的素数

nums = range(2, 20) 

for i in range(2, 8): 
     nums = filter(lambda x: x % i, nums)

print nums
同样,我不明白为什么它忽略了11以下的所有素数

接下来,我尝试了这个:

nums = [13] 

for i in range(2, 8): 
     nums = filter(lambda x: x % i, nums)

print nums
再说一次,这对我来说毫无意义。lambda在
nums
中迭代
x
,对吗?而
i
在2到7的范围内迭代。那么,我们是不是拿了13%i。。。2点到7点?这怎么会导致“13”

使用与上面相同的逻辑,我对“13”做了同样的事情,但在lambda中使用了
x==I

for i in range(2, 8): 
     nums = filter(lambda x: x == i, nums)

print nums
正如我所料,它返回了一个空列表——这在我看来是有道理的,因为13从来没有出现在2到7的范围内

对于任何试图提供帮助的人,这是我在使用
filter()
和lambdas时的心态:

a = range (1, 11)
b = range (9, 20) 

for i in filter(lambda x: x in a, b):
    print i,
当然,这给了我们“9 10”。我知道循环的结构不同,但希望它能帮助您了解我的困惑所在


我已经广泛地使用了
filter()
和lambdas,所以我想我可以找到答案,但是我被难住了!我只是希望答案不要太明显,让我觉得自己像个白痴……

我认为答案相当简单。将你的素数集从范围(2,20)增加到范围(2,30),然后再次尝试你的思维实验。这将使我更加清楚

filter函数将返回所选范围(2,20)的值

filter(lambda x: x == i or x % i, primes)
返回true

除了将素数从范围(2,20)增加到范围(2,30)之外,使用内部筛选条件,您将开始看到您正在寻找的差异

#!/usr/bin/python

primes = range(2, 30) 
for i in range(2, 3): 
    primes = filter(lambda x: x == i or x % i, primes)

print primes
其结果是:

[2, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29]

导致

[2, 3, 5, 7, 11, 13, 17, 19, 23, 25, 29]

您发布的第一个代码块是我解释这一点最简单的示例:

primes=范围(2,20)
对于范围(2,8)内的i:
素数=过滤器(λx:x==i或x%i,素数)
打印素数
使用该方法时,需要注意的重要一点是,您只需删除最大值的平方根以内的数的乘积。上述
范围(2,8)
的使用实现了这一点(从2到7,这是超出必要的)。19的平方根(检查的外部范围中的最高数字)介于4和5之间。所以在这个范围内应该检查的最大数字是4(我们只需要检查整数)

利用这些知识,您可以将代码改进如下(这发现primes它看起来像是Eratosthenes筛的一个紧凑(但有些模糊)实现[编辑:正如评论中指出的,这实际上是一个“不忠实的筛”,因为试算师比Eratosthenes筛的实际原因更重要]

第一行只是要筛选素数的连续整数的任意搜索范围:

primes = range(2, 20)
接下来,我们使用范围(2,n)中的整数i进行迭代,其中n是搜索范围中的最大数字(尽管在本例中,7是所选的上界,下面将对此进行详细介绍)

该算法声明我们包括i并排除i
的倍数

  • 包括i:
    x==1
  • 排除i的倍数:
    x%i
    ——这是
    x%i!=0
    的缩写。换句话说,x不能被i整除,或者,x不是i的倍数
8的上界似乎有些随意——至少,我们只需要搜索
sqrt(n)
,因为
sqrt(n)*sqrt(n)=n
意味着
sqrt(n)
是搜索空间的上界

19的平方根约为4.4,在本例中,您可以看到在i=3后,素数列表不会改变

In [18]: primes = range(2, 20)

In [19]: for i in range(2, 8):
   ....:     primes = filter(lambda x: x == i or x % i, primes)
   ....:     print i, primes
   ....:
2 [2, 3, 5, 7, 9, 11, 13, 15, 17, 19]
3 [2, 3, 5, 7, 11, 13, 17, 19]
4 [2, 3, 5, 7, 11, 13, 17, 19]
5 [2, 3, 5, 7, 11, 13, 17, 19]
6 [2, 3, 5, 7, 11, 13, 17, 19]
7 [2, 3, 5, 7, 11, 13, 17, 19]

我已经写了一个简单的列表理解来生成素数。当然,核心思想是在堆栈溢出中复制的。老实说,我花了一些时间来理解它,因为我是python的初学者。我在 单独调用lambda函数。首先我将讨论lambda函数

lambda函数: is_prime=lambda x:all(x%y!=0表示范围内的y(2,int(math.sqrt(x))+1))

现在,使用上面的lambda进行列表理解


primes=[x表示范围(30)内的x,如果是_prime(x)==True]

此代码段将打印1到15之间的素数:

lst=filter(lambda x:len(列表(filter(lambda n:x%n!=0,范围(2,x)))==x-2,范围(15))
打印(列表(lst))
试试这个:

ip_list = [100, 200, 300, 17, 19, 23, 21]

is_prime = list(filter(lambda i: all(i%j!=0 for j in range(2, i//2)), ip_list))

print(is_prime)

下面是从2-100中获取素数的代码

代码:

l=list(filter(lambda x: not list(filter(lambda y : x%y==0, range(2,x))),range(2,100)))

你从哪里得到的原始代码片段?非常糟糕。我不会把它作为如何在列表中查找素数的示例。我在堆栈溢出的某个地方遇到了它。我只想知道它是如何工作的。
x==I或x%I
等于说
x%I==0和x!=I
。当
x==I
时,
x%I
永远不会为零。而且,
范围
函数不包含在内。它只搜索到
19
。感谢您修复了它。虽然不是对埃拉托什的,而是通过尝试除法进行的筛选。埃拉托什的筛选根本不测试可除性,它只是通过以恒定的步长相加来枚举每个找到的素数的倍数,so它生成合成
ip_list = [100, 200, 300, 17, 19, 23, 21]

is_prime = list(filter(lambda i: all(i%j!=0 for j in range(2, i//2)), ip_list))

print(is_prime)
l=list(filter(lambda x: not list(filter(lambda y : x%y==0, range(2,x))),range(2,100)))