класс 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
Открытые методы экземпляров
# File lib/prime.rb, line 212 def each(ubound = nil, generator = EratosthenesGenerator.new, &block) generator.upper_bound = ubound generator.each(&block) end
Итерирует заданный блок по всем простым числам.
Параметры
-
ubound -
Необязательно. Произвольное положительное число. Верхняя граница перечисления. Метод перечисляет простые числа бесконечно, если
uboundравно nil. -
generator -
Необязательно. Реализация генератора псевдопростых чисел.
Возвращаемое значение
Вычисленное значение заданного блока в последний раз. Или перечислитель, совместимый с Enumerator, если блок не задан.
Описание
Вызывает block один раз для каждого простого числа, передавая простое число в качестве параметра.
-
ubound -
Верхняя граница простых чисел. Итератор останавливается после того, как он сгенерирует все простые числа p ≤
ubound.
# File 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 Возвращает true, если obj является Integer и является простым. Также возвращает true, если obj — Module, который является предком Prime. В противном случае возвращает false.
# File lib/prime.rb, line 268
def int_from_prime_division(pd)
pd.inject(1){|value, (prime, index)|
value * prime**index
}
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 -
Arrayпар целых чисел. Каждая пара состоит из простого числа — простого множителя — и натурального числа — его показателя (кратности).
Пример
Prime.int_from_prime_division([[3, 2], [5, 1]]) #=> 45 3**2 * 5 #=> 45
# File 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 Возвращает true, если value — простое число, иначе возвращает false. Integer#prime? намного производительнее.
Параметры
-
value -
произвольное целое число для проверки.
-
generator -
необязательно. Генератор псевдопростых чисел.
# File 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 Возвращает разложение на простые множители 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
Ruby Core © 1993–2020 Yukihiro Matsumoto
Licensed under the Ruby License.
Ruby Standard Library © contributors
Licensed under their own licenses.