我们检查了Eratostenes筛用于计算小于n个在我们的第二个运动大约一年前。在今天的练习中,我们更新了该算法以计算范围内的素数L(左)到对,其中范围不是从零开始的,并且太大,无法一次全部放入内存。具体来说,我们讨论了一个接受参数的函数L(左),对于范围的左端,以及对,表示范围的右端,以及一个参数B类这就分裂了对–L(左); 我们还假设素数小于对已知。实际上,L(左)和对会很大,可能10个16或1018、和B类会稍微小一些,可能是108或1010。
我们将通过计算100到200范围内的素数来解释算法B类= 10; 由于我们不看偶数,该算法将进行五次筛选,每次筛选20个数字。
有六个素数小于200的平方根:2、3、5、7、11和13;我们将忽略2,因为它是偶数。与每个素数相关P(P)k个是我们要打的号码问k个这是其中的偏移量B类当前筛分块中第一个素数的整数P(P)k个例如,当从100到120进行筛分时,底漆为3、5、7、11和13,以及相关的问s是2、2、2,10和8。每个问k个可以通过计算进行初始化问k个=(-1/2×(L(左)+ 1 +P(P)k个))模块P(P)k个并为下一个2重新初始化B类按计算分块问k个= (问k个–B类)模块P(P)k个; 例如问从120到140的第二个筛分块处的s为1、2、6、0和11。
在每个筛选块中,我们创建一个布尔数组(实际上,通常使用位),初始化为真的
然后,从问k个抵消。在我们的例子中,素数3与问=2使我们将位2、5和8重置为虚假的
同样,素数5使我们重置位2和7,素数7使我们重置比特2和9,素数11在当前筛选块中没有奇数倍数,素数13使我们重置位元8。筛分后真的
是0、1、3、4和6,对应于素数101、103、107、109和113。
用五分钟的时间手工制作示例筛是有益的。
您的任务是编写一个函数,执行上文所述的Eratostenes分段筛选。完成后,欢迎您阅读或运行建议的解决方案,或在下面的评论中发布自己的解决方案或讨论练习。
页:1 2