【发布时间】:2016-08-30 18:13:51
【问题描述】:
好的,所以我明白了埃拉托色尼筛背后的原理。我尝试自己编写一个,但基本上失败了(我编写了一个功能素数生成器,它只是效率不高或筛子)。我认为我在理解数学方面遇到了更多问题,但是编程也让我感到困惑。
import numpy as np
def primesfrom2to(n):
sieve = np.ones(n/3 + (n%6==2), dtype=np.bool)
# print(sieve) for n = 10 returns [True, True, True]
好吧,算了,我有点糊涂了。它正在生成一个真值列表,当它们被确定为复合时,这些值将逐渐被标记为假。我认为这是说小于 n 的值中不超过 1/3 将是素数,但是添加模数运算可以实现什么?
sieve[0] = False
将 1 标记为假?
for i in range(int(n**0.5)//3+1):
# print(i) for n = 10 returns 0 and 1 on separate lines
这是设置要检查的范围。没有数字的乘积大于其平方根。除以3+1 是怎么回事?
if sieve[i]:
k=3*i+1|1
#print(k) for n = 10 returns '5' doesn't change till it adds 7 at n = 50
好的,如果sieve[i] 为真(所以素数/尚未标记为复合数?)那么3*i + 1 or 1?这究竟是如何工作的?似乎正在生成素数,稍后将相乘以删除所有后续产品,但我不知道如何。
sieve[ ((k*k)/3) ::2*k] = False
sieve[(k*k+4*k-2*k*(i&1))/3::2*k] = False
好的,所以这两个都取素数k 并标记它们的所有进一步倍数?如果n=5 不是sieve[8.33::10] = False?另一个像sieve[41.3::10]?我只是不明白。
print(np.r_[2,3,((3*np.nonzero(sieve)[0]+1)|1)])
好的,最后实际生成素数列表。再一次,将它乘以三是怎么回事?显然,这段代码中有一些关于 3 的基本内容,我只是不明白。我也无法再次掌握|1 的概念。
哦,只是为了好玩,这是我有效且低效的尝试。
import numpy
def sieve(num):
master = numpy.array([i for i in range(2, num+1)])
run = []
y=2
while y <= ((num+1)**(1/2)):
thing = [x for x in range(y, num+1, y) if x > 5 or x == 4]
run = run + thing
y = y+1
alist = numpy.in1d(master, run, invert = True)
blist = (master[alist])
print(blist)
计算素数到 500,000 需要 57 秒。我正在做 2,000,000 以内的欧拉素数和问题。
【问题讨论】:
标签: python python-3.x primes