我会尽力解释。该
sieve数组具有不同寻常的索引方案;它为每个
6*k + 1等于1或5 mod
6的数字存储一个位。因此,一个数字将存储在position
2*k并将
k*6 + 5存储在position
2*k +1。在
3*i+1|1*** 作中,该逆:其形式的数字
2*n并将它们转换成
6*n + 1,并采取
2*n + 1并将其转换成
6*n +5(的
+1|1东西转换
0到
1和
3到
5)。主循环遍历
k具有该属性的所有数字,从
5(when
i为1)开始;
i是对应的索引
sieve为号
k。第一个分片更新为
sieve然后用形式
k*k/3+2*m*k为
m自然数的索引清除筛子中的所有位;这些索引的相应数字从处开始
k^2并
6*k在每一步处增加。第二切片更新开始于索引
k*(k-2*(i&1)+4)/3(号码
k* (k+4)为
k全等到
1MOD
6和
k * (k+2)其他),并通过数同样增加
6*k在每个步骤。
这是另一种解释的尝试:让
candidates所有数字的集合至少为5,并且等于
1或
5mod
6。如果您将该集合中的两个元素相乘,则会在该集合中获得另一个元素。让
succ(k)一些
k在
candidates在成为下一个元素(以数字顺序)
candidates是大于
k。在这种情况下,筛网的内部循环基本上是(使用的常规索引
sieve):
for k in candidates: for (l = k; ; l += 6) sieve[k * l] = False for (l = succ(k); ; l += 6) sieve[k * l] = False
由于存储在中的元素的限制,因此
sieve与:
for k in candidates: for l in candidates where l >= k: sieve[k * l] = False
它将在某个点(无论是以前使用电流还是现在使用电流)从筛子中除去
kin的所有倍数
candidates(
k本身除外)。
k``l``k
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)