-1

Sundaram のふるい ( wiki )について説明してくれる人が必要です。配列に整数(41,43,47,49,51,53,59)のリストがあるとします。

上記のウィキペディアの説明では、次のことが言及されています。

奇数の整数は、それが 2(i+j+2ij)+1 の形式である場合にのみ、最終的なリストから除外されます。

*。プログラム(できればVBA)でこれを達成する方法を理解しようとしています。出力が(41,43,47,53,59)になるようにします。

説明をよろしくお願いします。

よろしく、

4

2 に答える 2

1

サンダラムのふるいについてはブログで話し合っています。アルゴリズムは、次の擬似コードによって与えられます。

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
于 2013-01-10T17:42:23.917 に答える
0

WP の記事によると、 range からいくつかの数値を削除した後k=1...n、結果は として得られm=2k+1ます。つまり、すべてmの s が奇数です。

ここで、奇数合成は 2 つの奇数の積でなければなりません2k+1 = (2i+1)(2j+1) = 4ij+2i+2j+1(そのうちの 1 つが偶数の場合、積も偶数になります)。しかし、それはそれを意味しk = 2ij + i + jます。したがって、ふるいの操作。

ここでうまく説明されているように。

于 2013-01-11T18:07:12.557 に答える