在Ruby中提高我的Eratosthenes筛子的效率?

时间:2013-09-24 23:59:17

标签: ruby sieve

以下是我对Eratosthenes筛选的实现,以找到上限参数的素数。

目前,当我的参数为2,000,000时,我的代码在大约2秒内完成。我看到我通过将数字设置为nil再做一个额外的步骤,然后压缩而不是仅仅在一步中删除这些数字。

我将如何实施此功能?您是否还有其他建议可以提高我的代码速度?

def sieve(upper)
  i = 0
  list = (2..upper).to_a

  (2..Math.sqrt(upper)).each do |mult|
    init = mult + i
    (init..upper-1).step(mult) do |index|
      list[index] = nil
    end
    i += 1
  end
  list.compact
end

1 个答案:

答案 0 :(得分:1)

您可以跳过mult不是素数的循环。

def sieve(upper)
  i = 0
  list = (2..upper).to_a
  (2..Math.sqrt(upper)).each do |mult|
    if list[i] #proceed only when mult is prime
      init = mult + i
      (init..upper-1).step(mult) do |index|
        list[index] = nil
      end
    end
    i += 1
  end
  list.compact
end

在我的机器上将运行时间从1.9秒减少到0.7秒。不过,我确信还有很多工作要做。