можно найти в любом справочном руководстве, например воспользовавшись командной утилитой
ri
, или на сайте ruby-doc.org.
5.11. Комплексные числа
Стандартная библиотека
complex
предназначена для работы с комплексными числами в Ruby. Большая ее часть не требует пояснений.
Для создания комплексного числа применяется следующая несколько необычная нотация:
z = Complex(3,5) # 3+5i
Необычно в ней то, что имя метода совпадает с именем класса. В данном случае наличие скобок указывает на то, что это вызов метода, а не ссылка на константу. Вообще говоря, имена методов не похожи на константы, и я не рекомендую начинать имена методов с прописной буквы, разве что в подобных специальных случаях. (Отметим, что имеются также методы
Integer
и
Float
; вообще, имена, начинающиеся с прописной буквы, зарезервированы для методов, которые выполняют преобразование данных и аналогичные действия.)
Метод
im
преобразует вещественное число в мнимое (по существу, умножая его на i). Поэтому представлять комплексные числа можно и с помощью более привычной нотации:
а = 3.im # 3i
b = 5 - 2.im # 5-2i
Если вас больше интересуют полярные координаты, то можно обратиться к методу
polar
:
2 - Complex.polar(5,Math::PI/2.0) # Радиус, угол.
В классе
Complex
имеется также константа
I
, которая представляет число i — квадратный корень из минус единицы:
z1 = Complex(3,5)
z2 = 3 + 5*Complex::I # z2 == z1
После загрузки библиотеки
complex
некоторые стандартные математические функции изменяют свое поведение. Тригонометрические функции —
sin
,
sinh
,
tan
и
tanh
(а также некоторые другие, например,
ехр
и
log
) начинают принимать еще и комплексные аргументы. Некоторые функции, например
sqrt
, даже возвращают комплексные числа в качестве результата.
x = Math.sqrt(Complex(3,5)) # Приближенно Complex(2.1013, 1.1897)
y = Math.sqrt(-1) # Complex(0,1)
Дополнительную
информацию ищите в любой полной документации, в частности на сайте ruby-doc.org.
5.12. Библиотека mathn
В программах, выполняющих большой объем математических вычислений, очень пригодится замечательная библиотека
mathn
, которую написал Кейдзу Исидзука (Keiju Ishitsuka). В ней есть целый ряд удобных методов и классов; кроме того, она унифицирует все классы Ruby для работы с числами так, что они начинают хорошо работать совместно.
Простейший способ воспользоваться этой библиотекой — включить ее с помощью директивы
require
и забыть. Поскольку она сама включает библиотеки
complex
,
rational
и
matrix
(в таком порядке), то вы можете этого не делать.
В общем случае библиотека
mathn
пытается вернуть «разумные» результаты вычислений. Например, при извлечении квадратного корня из
Rational
будет возвращен новый объект
Rational
, если это возможно; в противном случае
Float
. В таблице 5.1 приведены некоторые последствия загрузки этой библиотеки.
Таблица 5.1. Результаты вычислений в случае отсутствия и наличия библиотеки mathn
Выражение
Без mathn
С mathn
Math.sqrt(Rational(9,16))
0.75
Rational(3,4)
1/2
0
Rational(1,2)
Matrix.identity(3)/3
Matrix[[0,0,0], [0,0,0],[0,0,0]]
Matrix[[1/3,0,0], [0,1/3,0],[0,0,1/3]]
Math.sqrt(64/25)
1.4142…
Rational(8,5)
Rational(1,10).inspect
Rational(1,10)
1/10
Библиотека
mathn
добавляет методы
**
и
power2
в класс
Rational
. Она изменяет поведение метода
Math.sqrt
и добавляет метод
Math.rsqrt
, умеющий работать с рациональными числами.
Дополнительная информация приводится в разделах 5.13 и 5.14.
5.13. Разложение на простые множители, вычисление НОД и НОК
В библиотеке
mathn
определены также некоторые новые методы в классе
Integer
. Так, метод
gcd2
служит для нахождения наибольшего общего делителя (НОД) объекта, от имени которого он вызван, и другого числа.
n = 36.gcd2(120) # 12 k = 237.gcd2(79) # 79
Метод
prime_division
выполняет разложение на простые множители. Результат возвращается в виде массива массивов, в котором каждый вложенный массив содержит простое число и показатель степени, с которым оно входит в произведение.