为什么Ruby中的Nth Prime数字效率不高?

时间:2013-12-26 08:51:54

标签: ruby iteration primes

我在Coderbyte上做了以下挑战,它没有计算一些更大的数字,所以我假设我的功能很慢。在我的计算机上,计算第1000个素数需要0.045秒。

提示符是:

让PrimeMover(num)函数返回numth素数。范围从1到10 ^ 4。例如:如果num为16,则输出应为53,因为53是第16个素数。

使用下面的框中的参数测试功能,使用不同的参数测试您的代码。

这是我的代码:

def PrimeMover(num)
  start = Time.now
  return 2 if num == 1
  return 3 if num == 2
  return 5 if num == 3  
  counter = 3
  7.upto(10**4).each do |n|
    next if n % 2 == 0 || n % 3 == 0 || n % 5 == 0
    (2..((n**0.5).to_i)).each do |m|
      break if n % m == 0
      counter += 1 if m == (n**0.5).to_i
    end
    p Time.now - start if counter == num
    return n if counter == num
  end
end

1 个答案:

答案 0 :(得分:0)

我不知道红宝石,但看起来你正在使用试验分区找到素数,即,对于每个数字(计数器),你正在检查它是否可被任何数字整除,直到该数字的平方根

请改用Sieve of Erastothenes。基本上,当您找到素数时,向前看并将每个素数的所有倍数标记为复合。未标记为复合的下一个数字是素数。

如果您选择将倍数标记为极限n,则只需将素数的倍数标记为sqrt(n)。

我之前在项目euler的python中解决了this same problem,其中问题语句需要10,001个素数。和你一样,我从试验部门开始,发现我的程序难以忍受。