класс 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.new устарело. Теперь Prime содержит экземпляр по умолчанию, к которому можно обратиться как Prime.instance.
Для удобства каждый метод экземпляра Prime.instance может быть вызван как метод класса Prime.
Например:
Prime.instance.prime?(2) #=> true Prime.prime?(2) #=> true
Генераторы
«Генератор» предоставляет реализацию перечисления псевдопростых чисел и запоминает позицию перечисления и верхнюю границу. Кроме того, это внешний итератор перечисления простых чисел, совместимый с Enumerator.
Prime::PseudoPrimeGenerator — базовый класс для генераторов. Существует несколько реализаций генератора.
-
Prime::EratosthenesGenerator -
Использует решето Эратосфена.
-
Prime::TrialDivisionGenerator -
Использует метод пробного деления.
-
Prime::Generator23 -
Генерирует все положительные целые числа, которые не делятся ни на 2, ни на 3. Эта последовательность является очень плохим представлением последовательности псевдопростых чисел. Однако она быстрее и использует меньше памяти, чем другие генераторы. Поэтому она подходит для факторизации целого числа, которое не слишком велико, но имеет много простых множителей. Например, для #prime?.
Общедоступные методы класса
# File lib/prime.rb, line 106 def instance; @the_instance end
Возвращает экземпляр Prime по умолчанию.
# File lib/prime.rb, line 96 def initialize @generator = EratosthenesGenerator.new extend OldCompatibility warn "Prime::new is obsolete. use Prime::instance or class methods of Prime." end
устарело. Используйте Prime::instance или методы класса Prime.
Общедоступные методы экземпляра
# File lib/prime.rb, line 147 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.
Примечание
Prime.new возвращает объект, расширенный Prime::OldCompatibility для совместимости с Ruby 1.8, а Prime#each перезаписывается Prime::OldCompatibility#each.
Prime.new теперь устарело. Используйте Prime.instance.each или просто Prime.each.
# File lib/prime.rb, line 181
def int_from_prime_division(pd)
pd.inject(1){|value, (prime, index)|
value * prime**index
}
end Восстанавливает факторизацию по простым числам и возвращает произведение.
Параметры
-
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. Prime.int_from_prime_division([[2,2], [3,1]]) #=> 12
# File lib/prime.rb, line 159
def prime?(value, generator = Prime::Generator23.new)
return false if value < 2
for num in generator
q,r = value.divmod num
return true if q < num
return false if r == 0
end
end Возвращает true, если value является простым числом, иначе возвращает false.
Параметры
-
value -
Произвольное целое число для проверки.
-
generator -
Необязательно. Генератор псевдопростых чисел.
# File lib/prime.rb, line 211
def prime_division(value, generator = Prime::Generator23.new)
raise ZeroDivisionError if value == 0
if value < 0
value = -value
pv = [[-1, 1]]
else
pv = []
end
for prime in generator
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
return pv
end Возвращает факторизацию value.
Параметры
-
value -
Произвольное целое число.
-
generator -
Необязательно. Генератор псевдопростых чисел.
generator.succ должен возвращать следующее псевдопростое число в порядке возрастания. Он должен генерировать все простые числа, но также может генерировать и не простые.
Исключения
-
ZeroDivisionError -
если
valueравно нулю.
Пример
Для произвольного целого числа:
n = p_1**e_1 * p_2**e_2 * .... * p_n**e_n,
#prime_division(n) возвращает:
[[p_1, e_1], [p_2, e_2], ...., [p_n, e_n]]. Prime.prime_division(12) #=> [[2,2], [3,1]]
Ruby Core © 1993–2017 Yukihiro Matsumoto
Licensed under the Ruby License.
Ruby Standard Library © contributors
Licensed under their own licenses.