【问题标题】:Sieve Of Sundaram [closed]Sundaram筛子[关闭]
【发布时间】:2013-01-10 17:07:40
【问题描述】:

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

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

当且仅当奇数是 形式 2(i+j+2ij)+1

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

真诚感谢您的解释。

问候,

【问题讨论】:

  • 自己做作业。如果您有一些实际代码并且需要特定部分的帮助,请随时在此处发布代码并提出特定问题。但现在你只是在找人帮你做作业
  • 我同意 Marc 的观点。一个简单的谷歌搜索Sieve of Sundaram in vba会给你很多例子;)
  • 感谢 Marc B 和 Siddharth Rout。最后一行是“解释”而不是“实际代码”。 :(关于简单的谷歌搜索,它并没有给我“这么多例子”。:(

标签: vba excel primes prime-factoring


【解决方案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

【讨论】:

  • 感谢 user448810 的回复。你能解释一下筛子本身(用普通英语),以便我可以设计自己的实现吗?同时,我一定会研究你分享的代码并访问你的博客。问候
【解决方案2】:

根据 WP 文章,从范围 k=1...n 中删除一些数字后,我们得到的结果为 m=2k+1。这意味着所有ms 都是奇数。

现在,奇数复合必须是两个奇数的乘积:2k+1 = (2i+1)(2j+1) = 4ij+2i+2j+1(如果其中一个是偶数,则乘积也将是偶数)。但这意味着k = 2ij + i + j。因此筛子的操作。

正如here 很好解释的那样。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-26
    • 2010-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-27
    相关资源
    最近更新 更多