class Prime

所有素数的集合。

示例

Prime.each(100) do |prime|
  p prime  #=> 2, 3, 5, 7, 11, ...., 97
end

Prime 是 Enumerable

Prime.first 5 # => [2, 3, 5, 7, 11]

获取实例

为方便起见,Prime.instance 的每个实例方法都可以作为 Prime 的类方法访问。

例如:

Prime.instance.prime?(2)  #=> true
Prime.prime?(2)           #=> true

生成器

“生成器”提供了枚举伪素数的实现,并记录了枚举的位置和上限。此外,它是一个与 Enumerator 兼容的素数枚举的外部迭代器。

Prime::PseudoPrimeGenerator 是生成器的基类。生成器的实现很少。

Prime::EratosthenesGenerator

使用埃拉托斯特尼筛法。

Prime::TrialDivisionGenerator

使用试除法。

Prime::Generator23

生成所有不能被 2 或 3 整除的正整数。作为伪素数序列,这个序列非常糟糕。但是它比其他生成器更快,并且使用的内存更少。因此,它适合分解不大但具有许多素数因子的整数。例如,用于 Prime#prime?

常量

VERSION

公共实例方法

each(ubound = nil, generator = EratosthenesGenerator.new, &block) 点击以切换源代码

对所有素数迭代给定的块。

参数

ubound

可选。任意正数。枚举的上限。如果 ubound 为 nil,则该方法无限枚举素数。

generator

可选。伪素数生成器的实现。

返回值

给定块最后一次的求值结果。如果未给定块,则为与 Enumerator 兼容的枚举器。

描述

为每个素数调用一次 block,并将素数作为参数传递。

ubound

素数的上限。迭代器在产生所有素数 p <= ubound 后停止。

# File prime-0.1.3/lib/prime.rb, line 212
def each(ubound = nil, generator = EratosthenesGenerator.new, &block)
  generator.upper_bound = ubound
  generator.each(&block)
end
include?(obj) 点击以切换源代码

如果 objInteger 且是素数,则返回 true。如果 objPrime 的祖先的模块,则也返回 true。否则返回 false。

# File prime-0.1.3/lib/prime.rb, line 220
def include?(obj)
  case obj
  when Integer
    prime?(obj)
  when Module
    Module.instance_method(:include?).bind(Prime).call(obj)
  else
    false
  end
end
int_from_prime_division(pd) 点击以切换源代码

重新组合素数分解并返回乘积。

对于分解

[[p_1, e_1], [p_2, e_2], ..., [p_n, e_n]],

它返回

p_1**e_1 * p_2**e_2 * ... * p_n**e_n.

参数

pd

整数对数组。每对由一个素数 - 一个素因子 - 和一个自然数 - 它的指数(重数)组成。

示例

Prime.int_from_prime_division([[3, 2], [5, 1]])  #=> 45
3**2 * 5                                         #=> 45
# File prime-0.1.3/lib/prime.rb, line 268
def int_from_prime_division(pd)
  pd.inject(1){|value, (prime, index)|
    value * prime**index
  }
end
prime?(value, generator = Prime::Generator23.new) 点击以切换源代码

如果 value 是素数,则返回 true,否则返回 false。Integer#prime? 的性能更高。

参数

value

要检查的任意整数。

generator

可选。伪素数生成器。

# File prime-0.1.3/lib/prime.rb, line 238
def prime?(value, generator = Prime::Generator23.new)
  raise ArgumentError, "Expected a prime generator, got #{generator}" unless generator.respond_to? :each
  raise ArgumentError, "Expected an integer, got #{value}" unless value.respond_to?(:integer?) && value.integer?
  return false if value < 2
  generator.each do |num|
    q,r = value.divmod num
    return true if q < num
    return false if r == 0
  end
end
prime_division(value, generator = Prime::Generator23.new) 点击以切换源代码

返回 value 的分解。

对于任意整数

p_1**e_1 * p_2**e_2 * ... * p_n**e_n,

prime_division 返回整数对的数组

[[p_1, e_1], [p_2, e_2], ..., [p_n, e_n]].

每对由一个素数 - 一个素因子 - 和一个自然数 - 它的指数(重数)组成。

参数

value

任意整数。

generator

可选。伪素数生成器。generator.succ 必须按升序返回下一个伪素数。它必须生成所有素数,但也可能生成非素数。

异常

ZeroDivisionError

value 为零时。

示例

Prime.prime_division(45)  #=> [[3, 2], [5, 1]]
3**2 * 5                  #=> 45
# File prime-0.1.3/lib/prime.rb, line 303
def prime_division(value, generator = Prime::Generator23.new)
  raise ZeroDivisionError if value == 0
  if value < 0
    value = -value
    pv = [[-1, 1]]
  else
    pv = []
  end
  generator.each do |prime|
    count = 0
    while (value1, mod = value.divmod(prime)
           mod) == 0
      value = value1
      count += 1
    end
    if count != 0
      pv.push [prime, count]
    end
    break if value1 <= prime
  end
  if value > 1
    pv.push [value, 1]
  end
  pv
end