我知道埃拉托色尼筛法可以被实现为无上限的连续寻找质数(分段筛法)。
我的问题是,阿特金/伯恩斯坦筛法能否以同样的方式实现?
相关问题:C#:如何使阿特金筛法增量
然而相关问题只有一个回答,它说“所有筛法都不可能”,这显然是不正确的。
我知道埃拉托色尼筛法可以被实现为无上限的连续寻找质数(分段筛法)。
我的问题是,阿特金/伯恩斯坦筛法能否以同样的方式实现?
相关问题:C#:如何使阿特金筛法增量
然而相关问题只有一个回答,它说“所有筛法都不可能”,这显然是不正确的。
我也没有包括可以应用于素数“无平方因子筛法”的众所周知的优化,例如使用轮式分解和计算起始段地址的计算,这些在我的分段筛法实现中使用。
因此,为了计算“4x”、“3x+”和“3x-”(或者像我在F#代码中做的那样将“3x+”和“3x-”组合起来)的序列起始段地址,并根据上面的内容计算每个x的范围,伪代码如下:
计算范围LOW - FIRST_ELEMENT,其中FIRST_ELEMENT是每个给定的x值或y = x-1的最低适用的y值。
对于计算在此范围内有多少元素的任务,这归结为一个问题:有多少个(y1)^2 + (y2)^2 + (y3)^2...,其中每个y数字相差两个,以产生所需的偶数或奇数'y'。通常在平方序列分析中,我们观察到平方之间的差异具有恒定的增量,例如delta(9-1)为8,delta(25-9)为16,增加了8,delta(49-25)为24,进一步增加了8,等等。因此,对于n个元素,对于此示例,最后一个增量为8 * n。使用这个表达式来表示元素的序列,我们得到它是一个(或者选择作为第一个元素的任何一个)加上八倍于类似于(1 + 2 + 3 + ...+ n)的东西的序列。现在标准的线性序列约简适用于这个和为(n + 1) * n / 2或n^2/2 + n/2。我们可以通过解二次方程n^2/2 + n/2 - range = 0或n = (SQRT(8 * range + 1) - 1) / 2来解决在范围内有多少个n元素。
现在,如果FIRST_ELEMENT + 4 * (n + 1) * n不等于LOW作为起始地址,则将n加1,并使用FIRST_ELEMENT + 4 * (n + 2) * (n + 1)作为起始地址。如果使用进一步的优化将轮因子分解消除应用于序列模式,则可以使用查找表数组来查找满足条件的最接近的n值。
可以直接计算起始元素的模12或60,也可以通过基于模重复性质的查找表来产生。
然后,每个序列都用于切换到HIGH限制的组合状态。如果添加了额外的逻辑以在每个序列中仅跳转到适用的元素之间的值,则无需再使用模条件。
上述操作针对每个“4x”序列,接着是“3x+”和“3x-”序列(或者将“3x+”和“3x-”组合成一个“3x”序列),直到先前计算的x限制或循环测试的限制。