Ruby - 生成素数的方法

时间:2015-05-25 11:44:36

标签: ruby math primes

我正在编写一个方法 - prime_numbers - 当传递一个数字n时,会返回n个素数。它不应该依赖Ruby的Prime类。它的行为应该是这样的:

prime_numbers 3
=> [2, 3, 5]
prime_numbers 5
=> [2, 3, 5, 7, 11]

我对此方法的第一次尝试如下:

def prime_numbers(n)
  primes = []
  i = 2

  while primes.length < n do
    divisors = (2..9).to_a.select { |x| x != i }
    primes << i if divisors.all? { |x| i % x != 0 }
    i += 1
  end
  primes
end
  

编辑:正如所指出的那样,当前的方法是错误的,仅限于考虑除数最多为9的除数。因此,任何由两个大于9的相等素数组成的完美正方形被视为素数。

如果有人提供了输入或提示,他们可以分享更好的方法来解决这个问题,我们将不胜感激。

3 个答案:

答案 0 :(得分:2)

请注意,如果数字是复合数,则它必须具有小于或等于$ \ sqrt {n} $的除数。所以你真的只需要检查$ sqrt {n} $就可以找到一个除数。

答案 1 :(得分:1)

对您的实施有个好主意:

@primes = []
def prime_numbers(n)
  i = 2
  while @primes.size < n do
    @primes << i if is_prime?(i)
    i += 1
  end
  @primes
end

def is_prime?(n)
  @primes.each { |prime| return false if n % prime == 0 }
  true
end

这是基于非素数具有素数因素的观点:)

答案 2 :(得分:0)

在Ruby 1.9中,有一个Prime类可用于生成素数,或测试数字是否为素数:

require 'prime'

Prime.take(10) #=> [2, 3, 5, 7, 11, 13, 17, 19, 23, 29]
Prime.take_while {|p| p < 10 } #=> [2, 3, 5, 7]
Prime.prime?(19) #=> true

Prime实现了每个方法并包含了Enumerable模块,因此您可以执行各种有趣的操作,如过滤,映射等。