【问题标题】:ruby 1.8 prime succ algorithmruby 1.8 prime succ算法
【发布时间】:2012-11-26 07:34:36
【问题描述】:

我已经搜索了我能想象到的每个站点,但无法确定 ruby​​ 1.8 用于在 mathn 下的 Prime 类中创建素数列表的基本算法。以下是 succ 方法的可运行版本,调用 100 次(为了找到第 100 个素数)。有谁知道这是怎么回事?

number_of_primes = 100

seed = 1
primes = Array.new
counts = Array.new


while primes.size < number_of_primes
  i = -1
  size = primes.size
  while i < size
    if i == -1
      seed += 1
      i += 1
    else
      while seed > counts[i]
        counts[i] += primes[i]
      end
      if seed != counts[i]
        i += 1
      else
        i = -1
      end
    end
  end
  primes.push seed
  counts.push (seed + seed)
end

puts seed

实际代码当然是:http://ruby-doc.org/stdlib-1.8.7/libdoc/mathn/rdoc/Prime.html

它看起来不像筛算法,因为没有预定义的列表可供筛选,它不是试验除法算法,因为没有除法或模运算。我完全被难住了。

【问题讨论】:

  • 我认为这个问题很清楚,不知道为什么你得到了反对票和接近票。
  • 如果我做了一些愚蠢的事情/发布了一些不清楚的东西,我不介意被否决。但是,如果投反对票的人告诉我原因以便我修复它,那就太好了。

标签: ruby algorithm primes


【解决方案1】:

该算法基于埃拉托色尼筛法。

seed 是被测试素数的整数。 primes 是小于seed 的素数列表,counts 包含大于seed 的相应最小倍数。

counts 视为“下一个”被划掉的数字列表,但每个素数只有一个,并且不断更新。当找到下一个最大的倍数时,如果我们正好得到seed,那么它就不是素数,所以它会重置外循环(使用i=-1)。

只有当我们更新了更大倍数的列表,而不是恰好遇到seed时,我们才能推断seed是素数。

这里是稍微简化和注释的代码:

number_of_primes = 100

seed = 1
primes = []
counts = []

while primes.size < number_of_primes
  seed += 1
  i = 0
  while i < primes.size      # For each known prime
    while seed > counts[i]   # Update counts to hold the next multiple >= seed
      counts[i] += primes[i] # by adding the current prime enough times
    end
    if seed != counts[i]
      i += 1    # Go update next prime
    else
      i = 0     # seed is a multiple, so start over...
      seed += 1 # with the next integer
    end
  end
  # The current seed is not a multiple of any of the previously found primes, so...
  primes.push seed
  counts.push (seed + seed)
end

puts seed

【讨论】:

  • 谢谢!感谢您的帮助和清晰的解释。我仍然花了一秒钟才完全理解发生了什么,但我现在明白了。
  • 非常感谢!多年来我一直在想这个算法——有了你的解释,它终于有意义了。
猜你喜欢
  • 2013-05-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-30
  • 1970-01-01
  • 1970-01-01
  • 2018-12-10
相关资源
最近更新 更多