Программирование на языке Ruby
Программирование на языке Ruby читать книгу онлайн
Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала
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Простейший способ воспользоваться этой библиотекой — включить ее с помощью директивы
requirecomplexrationalmatrixВ общем случае библиотека
mathnRationalRationalFloatТаблица 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**power2RationalMath.sqrtMath.rsqrtДополнительная информация приводится в разделах 5.13 и 5.14.
5.13. Разложение на простые множители, вычисление НОД и НОК
В библиотеке
mathnIntegergcd2n = 36.gcd2(120) # 12 k = 237.gcd2(79) # 79Метод
prime_divisionfactors = 126.prime_division # [[2,1], [3,2], [7,1]] # To есть 2**1 * 3**2 * 7**1Имеется также метод класса
Integer.from_prime_divisionfactors = [[2,1],[3,1],[7,1]]num = Integer.from_prime_division(factors) # 42Ниже показано, как разложение на простые множители можно использовать для отыскания наименьшего общего кратного (НОК) двух чисел:
require 'mathn'class Integer def lcm(other) pf1 = self.prime_division.flatten pf2 = other.prime_division.flatten h1 = Hash[*pf1] h2 = Hash[*pf2] hash = h2.merge(h1) {|key,old,new| [old,new].max } Integer.from_prime_division(hash.to_a) endendp 15.1cm(150) # 150p 2.1cm(3) # 6p 4.1cm(12) # 12p 200.1cm(30) # 6005.14. Простые числа
В библиотеке
mathneachsuccrequire 'mathn'list = []gen = Prime.newgen.each do |prime| list << prime break if list.size == 100end# или:list = []gen = Prime.new100.times { list << gen.succ }В следующем фрагменте проверяется, является ли данное число простым. Отметим, что если число велико, а машина медленная, то на выполнение может уйти заметное время:
require 'mathn'class Integer def prime? max = Math.sqrt(self).ceil max -= 1 if max % 2 == 0 pgen = Prime.new pgen.each do |factor| return false if self % factor == 0 return true if factor > max
