Class Complex
In: lib/complex.rb
Parent: Numeric

The complex number class. See complex.rb for an overview.

Methods

%   *   **   +   -   /   <=>   ==   abs   abs2   angle   arg   coerce   conj   conjugate   denominator   hash   inspect   new   new!   numerator   polar   polar   quo   to_s  

Constants

I = Complex(0,1)   I is the imaginary number. It exists at point (0,1) on the complex plane.

External Aliases

image -> imag

Attributes

image  [R]  The imaginary part of a complex number.
real  [R]  The real part of a complex number.

Public Class methods

[Source]

# File lib/complex.rb, line 128
  def initialize(a, b)
    raise TypeError, "non numeric 1st arg `#{a.inspect}'" if !a.kind_of? Numeric
    raise TypeError, "`#{a.inspect}' for 1st arg" if a.kind_of? Complex
    raise TypeError, "non numeric 2nd arg `#{b.inspect}'" if !b.kind_of? Numeric
    raise TypeError, "`#{b.inspect}' for 2nd arg" if b.kind_of? Complex
    @real = a
    @image = b
  end

Creates a Complex number a+bi.

[Source]

# File lib/complex.rb, line 124
  def Complex.new!(a, b=0)
    new(a,b)
  end

Creates a Complex number in terms of r (radius) and theta (angle).

[Source]

# File lib/complex.rb, line 117
  def Complex.polar(r, theta)
    Complex(r*Math.cos(theta), r*Math.sin(theta))
  end

Public Instance methods

Remainder after division by a real or complex number.

[Source]

# File lib/complex.rb, line 251
  def % (other)
    if other.kind_of?(Complex)
      Complex(@real % other.real, @image % other.image)
    elsif Complex.generic?(other)
      Complex(@real % other, @image % other)
    else
      x , y = other.coerce(self)
      x % y
    end
  end

Multiplication with real or complex number.

[Source]

# File lib/complex.rb, line 172
  def * (other)
    if other.kind_of?(Complex)
      re = @real*other.real - @image*other.image
      im = @real*other.image + @image*other.real
      Complex(re, im)
    elsif Complex.generic?(other)
      Complex(@real * other, @image * other)
    else
      x , y = other.coerce(self)
      x * y
    end
  end

Raise this complex number to the given (real or complex) power.

[Source]

# File lib/complex.rb, line 206
  def ** (other)
    if other == 0
      return Complex(1)
    end
    if other.kind_of?(Complex)
      r, theta = polar
      ore = other.real
      oim = other.image
      nr = Math.exp!(ore*Math.log!(r) - oim * theta)
      ntheta = theta*ore + oim*Math.log!(r)
      Complex.polar(nr, ntheta)
    elsif other.kind_of?(Integer)
      if other > 0
        x = self
        z = x
        n = other - 1
        while n != 0
          while (div, mod = n.divmod(2)
                 mod == 0)
            x = Complex(x.real*x.real - x.image*x.image, 2*x.real*x.image)
            n = div
          end
          z *= x
          n -= 1
        end
        z
      else
        if defined? Rational
          (Rational(1) / self) ** -other
        else
          self ** Float(other)
        end
      end
    elsif Complex.generic?(other)
      r, theta = polar
      Complex.polar(r**other, theta*other)
    else
      x, y = other.coerce(self)
      x**y
    end
  end

Addition with real or complex number.

[Source]

# File lib/complex.rb, line 140
  def + (other)
    if other.kind_of?(Complex)
      re = @real + other.real
      im = @image + other.image
      Complex(re, im)
    elsif Complex.generic?(other)
      Complex(@real + other, @image)
    else
      x , y = other.coerce(self)
      x + y
    end
  end

Subtraction with real or complex number.

[Source]

# File lib/complex.rb, line 156
  def - (other)
    if other.kind_of?(Complex)
      re = @real - other.real
      im = @image - other.image
      Complex(re, im)
    elsif Complex.generic?(other)
      Complex(@real - other, @image)
    else
      x , y = other.coerce(self)
      x - y
    end
  end

Division by real or complex number.

[Source]

# File lib/complex.rb, line 188
  def / (other)
    if other.kind_of?(Complex)
      self*other.conjugate/other.abs2
    elsif Complex.generic?(other)
      Complex(@real/other, @image/other)
    else
      x, y = other.coerce(self)
      x/y
    end
  end

Compares the absolute values of the two numbers.

[Source]

# File lib/complex.rb, line 318
  def <=> (other)
    self.abs <=> other.abs
  end

Test for numerical equality (a == a + 0i).

[Source]

# File lib/complex.rb, line 325
  def == (other)
    if other.kind_of?(Complex)
      @real == other.real and @image == other.image
    elsif Complex.generic?(other)
      @real == other and @image == 0
    else
      other == self
    end
  end

Absolute value (aka modulus): distance from the zero point on the complex plane.

[Source]

# File lib/complex.rb, line 281
  def abs
    Math.hypot(@real, @image)
  end

Square of the absolute value.

[Source]

# File lib/complex.rb, line 288
  def abs2
    @real*@real + @image*@image
  end
angle()

Alias for arg

Argument (angle from (1,0) on the complex plane).

[Source]

# File lib/complex.rb, line 295
  def arg
    Math.atan2!(@image, @real)
  end

Attempts to coerce other to a Complex number.

[Source]

# File lib/complex.rb, line 338
  def coerce(other)
    if Complex.generic?(other)
      return Complex.new!(other), self
    else
      super
    end
  end
conj()

Alias for conjugate

Complex conjugate (z + z.conjugate = 2 * z.real).

[Source]

# File lib/complex.rb, line 310
  def conjugate
    Complex(@real, -@image)
  end

FIXME

[Source]

# File lib/complex.rb, line 349
  def denominator
    @real.denominator.lcm(@image.denominator)
  end

Returns a hash code for the complex number.

[Source]

# File lib/complex.rb, line 392
  def hash
    @real.hash ^ @image.hash
  end

Returns "Complex(real, image)".

[Source]

# File lib/complex.rb, line 399
  def inspect
    sprintf("Complex(%s, %s)", @real.inspect, @image.inspect)
  end

FIXME

[Source]

# File lib/complex.rb, line 356
  def numerator
    cd = denominator
    Complex(@real.numerator*(cd/@real.denominator),
            @image.numerator*(cd/@image.denominator))
  end

Returns the absolute value and the argument.

[Source]

# File lib/complex.rb, line 303
  def polar
    return abs, arg
  end

[Source]

# File lib/complex.rb, line 199
  def quo(other)
    Complex(@real.quo(1), @image.quo(1)) / other
  end

Standard string representation of the complex number.

[Source]

# File lib/complex.rb, line 365
  def to_s
    if @real != 0
      if defined?(Rational) and @image.kind_of?(Rational) and @image.denominator != 1
        if @image >= 0
          @real.to_s+"+("+@image.to_s+")i"
        else
          @real.to_s+"-("+(-@image).to_s+")i"
        end
      else
        if @image >= 0
          @real.to_s+"+"+@image.to_s+"i"
        else
          @real.to_s+"-"+(-@image).to_s+"i"
        end
      end
    else
      if defined?(Rational) and @image.kind_of?(Rational) and @image.denominator != 1
        "("+@image.to_s+")i"
      else
        @image.to_s+"i"
      end
    end
  end

[Validate]