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
公共实例方法
对所有素数迭代给定的块。
参数¶ ↑
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
如果 obj
是 Integer
且是素数,则返回 true。如果 obj
是 Prime
的祖先的模块,则也返回 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
重新组合素数分解并返回乘积。
对于分解
[[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
如果 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
返回 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