Class: Rational

Inherits:
Object
  • Object
show all
Defined in:
lib/mathn.rb

Overview

When mathn is required Rational is changed to simplify the use of Rational operations.

Normal behaviour:

Rational.new!(1,3) ** 2 # => Rational(1, 9)
(1 / 3) ** 2            # => 0

require ‘mathn’ behaviour:

(1 / 3) ** 2            # => 1/9

Instance Method Summary collapse

Instance Method Details

#**(other) ⇒ Object

Exponentiate by other

(1/3) ** 2 # => 1/9


138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
# File 'lib/mathn.rb', line 138

def ** (other)
  if other.kind_of?(Rational)
    other2 = other
    if self < 0
      return Complex(self, 0.0) ** other
    elsif other == 0
      return Rational(1,1)
    elsif self == 0
      return Rational(0,1)
    elsif self == 1
      return Rational(1,1)
    end

    npd = numerator.prime_division
    dpd = denominator.prime_division
    if other < 0
      other = -other
      npd, dpd = dpd, npd
    end

    for elm in npd
      elm[1] = elm[1] * other
      if !elm[1].kind_of?(Integer) and elm[1].denominator != 1
        return Float(self) ** other2
      end
      elm[1] = elm[1].to_i
    end

    for elm in dpd
      elm[1] = elm[1] * other
      if !elm[1].kind_of?(Integer) and elm[1].denominator != 1
        return Float(self) ** other2
      end
      elm[1] = elm[1].to_i
    end

    num = Integer.from_prime_division(npd)
    den = Integer.from_prime_division(dpd)

    Rational(num,den)

  elsif other.kind_of?(Integer)
    if other > 0
      num = numerator ** other
      den = denominator ** other
    elsif other < 0
      num = denominator ** -other
      den = numerator ** -other
    elsif other == 0
      num = 1
      den = 1
    end
    Rational(num, den)
  elsif other.kind_of?(Float)
    Float(self) ** other
  else
    x , y = other.coerce(self)
    x ** y
  end
end