# Rational (Class)

In: | mathn.rb
Parent: | Object

## Methods

** inspect power2

## Constants

Unify | = | true

## External Aliases

** -> power!

## Public Instance methods

inspect()

[Source]

    # File mathn.rb, line 119
      def inspect
        format "%s/%s", numerator.inspect, denominator.inspect
      end

**(other)

[Source]

    # File mathn.rb, line 125
      def ** (other)
        if other.kind_of?(Rational)
          if self < 0
            return Complex(self, 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) ** other
            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) ** other
            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.new!(num, den)
        elsif other.kind_of?(Float)
          Float(self) ** other
        else
          x , y = other.coerce(self)
          x ** y
        end
      end

power2(other)

[Source]

    # File mathn.rb, line 185
      def power2(other)
        if other.kind_of?(Rational)
          if self < 0
            return Complex(self, 0) ** other
          elsif other == 0
            return Rational(1,1)
          elsif self == 0
            return Rational(0,1)
          elsif self == 1
            return Rational(1,1)
          end

          dem = nil
          x = self.denominator.to_f.to_i
          neard = self.denominator.to_f ** (1.0/other.denominator.to_f)
          loop do
            if (neard**other.denominator == self.denominator)
              dem = neaed
              break
            end
          end
          nearn = self.numerator.to_f ** (1.0/other.denominator.to_f)
          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.new!(num, den)
        elsif other.kind_of?(Float)
          Float(self) ** other
        else
          x , y = other.coerce(self)
          x ** y
        end
      end

[Validate]