部分电离层的基本想法是选择低于n的平方根的微粒体,选择一个相当庞大的面积,但适于记忆,然后从最小的开始,将每一部分推向上。 在第一部分中,每一微量元素中最小的数倍是按部分计算的,然后以正常方式将微量元素的多面标记为复合物;当使用所有微粒时,该部分的其余未加说明的数字是首要的。 接着,就下部分而言,就每一 灭的主言而言,你已经知道本部分的头几个方面(这是在上部分结束该主人的 的多面),因此,你会逐个si升,直到你完成。
n 确实如此,但更大的n将比较小的n>更需要更长时间;其规模是该部分的大小,而该部分的大小应与方便程度一样大(例如,机器上的主要记忆层的大小)。
您可以简单地看到一个分部分的电离层here。 请注意,分部分的电离层速度将大大快于另一个答复中提到的O Neill s priority-queue sieve;如果你有兴趣的话,将执行here。
<>光线> 我是出于不同目的撰写的,但我在此表示,这或许是有用的:
尽管埃托斯群岛的Sieve非常快,但它需要O(n)空间。 这可以通过在连续几段进行si蒸,降低到O(sqrt(n))和O(1)的双射线。 在第一部分,每一微粒体内的微粒体积最小,然后按正常方式计算出多粒体;当使用所有微粒时,该部分的其余未加标数是主要数字。 接着,在下半部分,每一 灭 prime素中最小的多半是结束前几段 灭的多面,因此 积持续到尾声。
Consider the example of sieve from 100 to 200 in segments of 20. The five sieving primes are 3, 5, 7, 11 and 13. In the first segment from 100 to 120, the bitarray has ten slots, with slot 0 corresponding to 101, slot k corresponding to 100+2k+1, and slot 9 corresponding to 119. The smallest multiple of 3 in the segment is 105, corresponding to slot 2; slots 2+3=5 and 5+3=8 are also multiples of 3. The smallest multiple of 5 is 105 at slot 2, and slot 2+5=7 is also a multiple of 5. The smallest multiple of 7 is 105 at slot 2, and slot 2+7=9 is also a multiple of 7. And so on.
职衔 范围包括争辩、hi和 del; lo和hi必须等到处;hi和 lo必须大于rt。 部分面积为两倍。 Ps是一份相关清单,其中含有比rt(hi)低的微粒,其中2个被删除,因为甚至数字被忽略。 Q是一份相关清单,其中载列在相应微粒的目前部分中最小的多环线中的害虫。 在每一部分之后,预支款为两倍,因此与单列单指数一相对应的数字为+2i+1。
function primesRange(lo, hi, delta)
function qInit(p)
return (-1/2 * (lo + p + 1)) % p
function qReset(p, q)
return (q - delta) % p
sieve := makeArray(0..delta-1)
ps := tail(primes(sqrt(hi)))
qs := map(qInit, ps)
while lo < hi
for i from 0 to delta-1
sieve[i] := True
for p,q in ps,qs
for i from q to delta step p
sieve[i] := False
qs := map(qReset, ps, qs)
for i,t from 0,lo+1 to delta-1,hi step 1,2
if sieve[i]
output t
lo := lo + 2 * delta
当称为MastersRange(100、200、10)时, prime的素材为[3、5、7、11、13];qs最初为[2、2、3、2、10、8],相当于最小的多重体105、105、105、121和117,其第二段重新编号为[1、2、6、0、11],相当于最小的多重体123、125、133、121和143。
可在上看到这一方案。 http://ideone.com/iHYr1f。 除上述链接外,如果你有兴趣按主要数字编制方案,我会在我的博客上提出这一建议:essay。