Prime.new已过时 - 如何重写此代码?

时间:2014-03-28 19:17:11

标签: ruby algorithm enumerator

此代码查找具有500个除数的第一个素数。当我运行它时,它工作,但我被告知“Prime :: new已经过时了。使用Prime的Prime :: instance或类方法。”

我认为这意味着我可以用'Prime.instance'替换'Prime.new',但是当我这样做时,我被告知'接下来是一种未定义的方法'。由于素数应该是一个枚举器,为什么我会收到这个错误?这个正确的答案是76576500。

require 'mathn'

primer  = Prime.new
primes  = [ primer.next ]
seed    = 500
n       = (seed * (seed + 1)) / 2
i       = seed + 1

def count_prime_factors primer, primes, n
  total = 1
  max   = Math.sqrt(n).to_i

  while primes.last < max
    primes << primer.next
  end

  primes.each do |i|
    count = 0
    while n % i == 0
      n = n / i
      count += 1
    end
    if count > 0
      total *= count + 1
    end
  end

  total
end

while(count_prime_factors(primer, primes, n) < seed)
  n += i
  i += 1
end

puts n

2 个答案:

答案 0 :(得分:3)

尝试将Prime.new替换为Prime.instance,将primes.next的每个实例替换为primes.succ


the source code for the Prime class。您会发现Prime.next别名为Prime.succ,但Prime.next本身没有实现。根据您创建Prime实例的方式,行为会发生一些变化,这就是您在上面遇到不同错误的原因。

答案 1 :(得分:2)

目前,您应该使用Prime::EratosthenesGenerator.new代替Prime.new(红宝石2.2 +)