我需要有人带我穿过Sundaram的筛子(wiki)。假设我有一个整数列表,(41,43,47,49,51,53,59)在一个数组中。
现在上面提到的维基百科解释提到:*
当且仅当它是的时,从最终列表中排除奇数 形式2(i + j + 2ij)+1
*。我试图了解如何在程序(最好是VBA)中实现这一点。这样输出将是(41,43,47,53,59)。
解释真诚地感谢。
问候,
答案 0 :(得分:1)
我在my blog讨论了Sundaram的筛子。该算法由以下伪代码给出:
function sundaram(n)
m := n // 2
sieve := makeArray(m+1, True)
for i from 1 to m // 4
for j from i to (m-i) // (2*i+1)
sieve[i+j+2*i*j] := False
ps := [2]
for i from 1 to m
if sieve[i]
append 2*i+1 to ps
return ps
答案 1 :(得分:0)
根据WP文章,在从k=1...n
范围内删除某些数字后,我们会将结果显示为m=2k+1
。这意味着所有m
都是奇数。
现在,一个奇怪的复合必须是两个奇数的乘积:2k+1 = (2i+1)(2j+1) = 4ij+2i+2j+1
(如果其中一个是偶数,产品也会是偶数)。但这意味着k = 2ij + i + j
。因此,筛子的操作。
很好地解释here。