筛选Sundaram

时间:2013-01-10 17:07:41

标签: vba excel-vba primes prime-factoring excel

我需要有人带我穿过Sundaram的筛子(wiki)。假设我有一个整数列表,(41,43,47,49,51,53,59)在一个数组中。

现在上面提到的维基百科解释提到:*

  

当且仅当它是的时,从最终列表中排除奇数   形式2(i + j + 2ij)+1

*。我试图了解如何在程序(最好是VBA)中实现这一点。这样输出将是(41,43,47,53,59)

解释真诚地感谢。

问候,

2 个答案:

答案 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