Чтение онлайн

ЖАНРЫ

Программирование на языке Ruby
Шрифт:

arr = [2,3,4,5]

v1 = Vector[*arr] # Vector[2,3,4,5]

v2 = Vector.elements(arr) # Vector[2,3,4,5]

v3 = Vector.elements(arr,false) # Vector[2,3,4,5]

arr[2] = 7 # теперь v3 - Vector[2,3,7,5].

Метод

covector
преобразует вектор длины N в матрицу размерности Nx1 (выполняя попутно транспонирование).

v = Vector[2,3,4]

m = v.covector # Matrix[[2,3,4]]

Поддерживается сложение и вычитание векторов одинаковой длины. Вектор можно умножать на матрицу

и на скаляр. Все эти операции подчиняются обычным математическим правилам.

v1 = Vector[2,3,4]

v2 = Vector[4,5,6]

v3 = v1 + v2 # Vector[6,8,10]

v4 = v1*v2.covector # Matrix![8,10,12],[12,15,18],[16,20,24]]

v5 = v1*5 # Vector[10,15,20]

Имеется метод

inner_product
(скалярное произведение):

v1 = Vector[2,3,4]

v2 = Vector[4,5,6]

x = v1.inner_product(v2) # 47

Дополнительную информацию о классах

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

factors = 126.prime_division # [[2,1], [3,2], [7,1]]

# To есть 2**1 * 3**2 * 7**1

Имеется также метод класса

Integer.from_prime_division
, который восстанавливает исходное число из его сомножителей. Это именно метод класса, потому что выступает в роли «конструктора» целого числа.

Поделиться с друзьями: