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
выполняет разложение на простые множители. Результат возвращается в виде массива массивов, в котором каждый вложенный массив содержит простое число и показатель степени, с которым оно входит в произведение.