93

所以我的家庭作业有这两个问题,我被困在第二个问题上。

  1. 使用 Python Set Comprehension(Python 相当于 Set Builder 表示法)生成一组小于 100 的所有素数。回想一下,素数是一个大于 1 且不能被除本身和 1. 将您的素数集存储在一个变量中(您将需要它来获取其他部分)。输出您的素数集(例如,使用打印功能)。

  2. 使用 Python Set Comprehension 生成一组有序对(长度为 2 的元组),其中包含由小于 100 的素数组成的所有素数对。素数对是一对连续的奇数,它们都是素数。将您的 Prime Pairs 集合存储在一个变量中。您的 1 号套装将非常有帮助。输出你的 Prime Pairs 集合。

对于第一个,这非常有效:

r= {x for x in range(2, 101) 
if not any(x % y == 0 for y in range(2, x))} 

但是,我对第二个感到很困惑。我想我可能不得不用一些东西来获取集合 r 的笛卡尔积,但我只是不确定。

这让我有点接近,但我只想要连续的对。

cart = { (x, y) for x in r for y in r
     if x < y }
4

3 回答 3

79
primes = {x for x in range(2, 101) if all(x%y for y in range(2, min(x, 11)))}

我稍微简化了测试 -if all(x%y而不是if not any(not x%y

我也限制了 y 的范围;测试除数 > sqrt(x) 没有意义。所以 max(x) == 100 意味着 max(y) == 10。对于 x <= 10,y 也必须 < x。

pairs = {(x, x+2) for x in primes if x+2 in primes}

与其生成一对素数并测试它们,不如得到一个并查看相应的更高素数是否存在。

于 2014-02-14T04:52:22.617 回答
16

您可以通过将适当的谓词构建为辅助函数来获得清晰明了的解决方案。换句话说,使用 Python 集合构建器符号的方式与使用常规数学集合符号编写答案的方式相同。

集合推导背后的整个想法是让我们在代码中编写和推理,就像我们用手做数学一样。

有了适当的谓词,问题 1 简化为:

 low_primes = {x for x in range(1, 100) if is_prime(x)}

问题 2 简化为:

 low_prime_pairs = {(x, x+2) for x in range(1,100,2) if is_prime(x) and is_prime(x+2)}

请注意此代码如何直接翻译问题规范,“素数对是一对连续的奇数,它们都是素数。”

PS我试图给你正确的解决问题的技巧,而不是真正给出家庭作业问题的答案。

于 2014-02-14T05:05:09.837 回答
6

您可以像这样生成对:

{(x, x + 2) for x in r if x + 2 in r}

然后剩下要做的就是获得使它们成为素数的条件,这在第一个示例中已经完成。

一种不同的方法:(虽然对于大量素数来说速度较慢)

{(x, y) for x in r for y in r if x + 2 == y}
于 2014-02-14T04:37:52.367 回答