SuanShu, a Java numerical and statistical library

com.numericalmethod.suanshu.number.complex
Class Complex

java.lang.Object
  extended by java.lang.Number
      extended by com.numericalmethod.suanshu.number.complex.Complex
All Implemented Interfaces:
AbelianGroup<Complex>, Field<Complex>, Monoid<Complex>, Ring<Complex>, NumberUtils.Comparable<Complex>, java.io.Serializable

public class Complex
extends java.lang.Number
implements Field<Complex>, NumberUtils.Comparable<Complex>

A complex number is a number consisting of a real number part and an imaginary number part. It is normally written in the form a + bi, where a and b are real numbers, and i is the square root of minus one.

Complex extends the Number system, and is a Field.

This class is immutable.

See Also:
Wikipedia: Complex number, Serialized Form

Nested Class Summary
 
Nested classes/interfaces inherited from interface com.numericalmethod.suanshu.mathstructure.Field
Field.InverseNonExistent
 
Field Summary
static Complex I
          the square root of -1; a number representing 0.0 + 1.0i
 double imaginary
          the imaginary part of this complex number
static Complex NaN
          a number representing a Not-a-Number (NaN) value of type Complex
static Complex NEGATIVE_INFINITY
          a number representing the negative infinity of type Complex
static Complex ONE
          a number representing 1.0 + 0.0i
static Complex POSITIVE_INFINITY
          a number representing the positive infinity of type Complex
 double real
          the real part of this complex number
static Complex ZERO
          a number representing 0.0 + 0.0i
 
Constructor Summary
Complex(double a)
          Construct a complex number from a real number a.
Complex(double a, double b)
          Construct a complex number from the real and imaginary parts.
 
Method Summary
 Complex add(Complex that)
          + : G × G → G
 double arg()
          Get the θ of the complex number's polar representation.
 int compare(java.lang.Number that, double epsilon)
          Compare this and that numbers up to a precision.
 Complex conjugate()
          Conjugate of (a + bi) is (a - bi).
 Complex divide(Complex that)
          Compute the quotient of this complex number and that complex number.
 double doubleValue()
           
 boolean equals(java.lang.Object obj)
           
 float floatValue()
           
static Complex fromPolar(double r, double theta)
          Factory method to construct a complex number from the polar form: (r, θ).
 int hashCode()
           
 int intValue()
          Deprecated. Not supported yet.
 Complex inverse()
          For each a in F, there exists an element b in F such that a × b = b × a = 1 That is, it is the object such as this.multiply(this.inverse()) == this.ONE
static boolean isInfinite(Complex z)
          Check if this complex number is an infinity; i.e., the number is not a NaN and either the real or the imaginary part is infinite, c.f., Double.isInfinite().
static boolean isNaN(Complex z)
          Check if this complex number is a NaN; i.e., either the real or the imaginary part is a NaN.
static boolean isReal(Complex z)
          Check if this complex number is a real number; i.e., the imaginary part is 0.
 long longValue()
          Deprecated. Not supported yet.
 Complex minus(Complex that)
          - : G × G → G - is not in the definition of of an additive group but can be deduced.
 double modulus()
          Get the modulus.
 Complex multiply(Complex that)
          Compute the product of this complex number and that complex number.
 Complex ONE()
          A number representing 1.0 + 0.0i.
 Complex opposite()
          For each a in G, there exists an element b in G such that a + b = b + a = 0 That is, it is the object such as this.add(this.opposite()) == this.ZERO
 java.lang.Double toDouble()
          Cast the complex number to a Double if it is a real number.
 java.lang.String toString()
           
 Complex ZERO()
          A number representing 0.0 + 0.0i.
 
Methods inherited from class java.lang.Number
byteValue, shortValue
 
Methods inherited from class java.lang.Object
clone, finalize, getClass, notify, notifyAll, wait, wait, wait
 

Field Detail

I

public static final Complex I
the square root of -1; a number representing 0.0 + 1.0i


ZERO

public static final Complex ZERO
a number representing 0.0 + 0.0i


ONE

public static final Complex ONE
a number representing 1.0 + 0.0i


POSITIVE_INFINITY

public static final Complex POSITIVE_INFINITY
a number representing the positive infinity of type Complex


NEGATIVE_INFINITY

public static final Complex NEGATIVE_INFINITY
a number representing the negative infinity of type Complex


NaN

public static final Complex NaN
a number representing a Not-a-Number (NaN) value of type Complex


real

public final double real
the real part of this complex number


imaginary

public final double imaginary
the imaginary part of this complex number

Constructor Detail

Complex

public Complex(double a,
               double b)
Construct a complex number from the real and imaginary parts.

Parameters:
a - the real part
b - the imaginary part

Complex

public Complex(double a)
Construct a complex number from a real number a.

Parameters:
a - the real part
Method Detail

fromPolar

public static Complex fromPolar(double r,
                                double theta)
Factory method to construct a complex number from the polar form: (r, θ).

Parameters:
r - a radius
theta - an angle
Returns:
a Complex object created from the polar form (r, θ)

isReal

public static boolean isReal(Complex z)
Check if this complex number is a real number; i.e., the imaginary part is 0.

Parameters:
z - a complex number
Returns:
true iff the imaginary part is 0

isNaN

public static boolean isNaN(Complex z)
Check if this complex number is a NaN; i.e., either the real or the imaginary part is a NaN.

Parameters:
z - a complex number
Returns:
true iff either the real or the imaginary part is a NaN

isInfinite

public static boolean isInfinite(Complex z)
Check if this complex number is an infinity; i.e., the number is not a NaN and either the real or the imaginary part is infinite, c.f., Double.isInfinite().

Parameters:
z - a complex number
Returns:
true iff either the real or the imaginary part is a NaN

modulus

public double modulus()
Get the modulus.

The modulus is the same as the square root of itself multiplied by its conjugate, namely

this.modulus() * this.modulus() == this.multiply(this.conjugate())

To reduce the chance of overflow, this is implemented as:

|a + bi| = |a| sqrt(1 + (b/a)2) if |a| > |b|

|a + bi| = |b| sqrt(1 + (a/b)2) otherwise

Math.hypot() is used for the native implementation of this approach.

Returns:
the modulus
See Also:
Math.hypot(double, double)

arg

public double arg()
Get the θ of the complex number's polar representation.

Returns:
θ of the polar form: (r, θ)

toDouble

public java.lang.Double toDouble()
Cast the complex number to a Double if it is a real number.

Returns:
the real part as a Double if this complex number is a real number
Throws:
java.lang.IllegalArgumentException - if this complex number is not a real number

conjugate

public Complex conjugate()
Conjugate of (a + bi) is (a - bi).

Returns:
conjugate of this complex number

intValue

@Deprecated
public int intValue()
Deprecated. Not supported yet.

Specified by:
intValue in class java.lang.Number

longValue

@Deprecated
public long longValue()
Deprecated. Not supported yet.

Specified by:
longValue in class java.lang.Number

floatValue

public float floatValue()
Specified by:
floatValue in class java.lang.Number

doubleValue

public double doubleValue()
Specified by:
doubleValue in class java.lang.Number

add

public Complex add(Complex that)
Description copied from interface: AbelianGroup
+ : G × G → G

Specified by:
add in interface AbelianGroup<Complex>
Parameters:
that - the object to be added
Returns:
this + that

minus

public Complex minus(Complex that)
Description copied from interface: AbelianGroup
- : G × G → G

- is not in the definition of of an additive group but can be deduced. This function is provided for convenience purpose. It is equivalent to

this.add(that.opposite())

Specified by:
minus in interface AbelianGroup<Complex>
Parameters:
that - the object to be subtracted (subtrahend)
Returns:
this - that

opposite

public Complex opposite()
Description copied from interface: AbelianGroup
For each a in G, there exists an element b in G such that
a + b = b + a = 0

That is, it is the object such as

this.add(this.opposite()) == this.ZERO

Specified by:
opposite in interface AbelianGroup<Complex>
Returns:
-this
See Also:
Wikipedia: Additive inverse

inverse

public Complex inverse()
                throws Field.InverseNonExistent
Description copied from interface: Field
For each a in F, there exists an element b in F such that
a × b = b × a = 1

That is, it is the object such as

this.multiply(this.inverse()) == this.ONE

Specified by:
inverse in interface Field<Complex>
Returns:
1 / this if it exists
Throws:
Field.InverseNonExistent - if the inverse does not exist
See Also:
Wikipedia: Multiplicative inverse

divide

public Complex divide(Complex that)
Compute the quotient of this complex number and that complex number.
    a + bi          ac + bd + (bc - ad)i
   -------- = -------------------------------
    c + di                 c2 + d2
 

c.f.

 Efficient scaling for complex division
 by Douglas M. Priest Sun Microsystems, Menlo Park, CA
 ACM Transactions on Mathematical Software (TOMS) archive
 Volume 30, Issue 4 (December 2004)
 Pages: 389 - 401
 

ABSTRACT

We develop a simple method for scaling to avoid overflow and harmful underflow in complex division. The method guarantees that no overflow will occur unless at least one component of the quotient must overflow, otherwise the normwise error in the computed result is at most a few units in the last place. Moreover, the scaling requires only four floating point multiplications and a small amount of integer arithmetic to compute the scale factor. Thus, on many modern CPUs, our method is both safer and faster than Smith's widely used algorithm.

Specified by:
divide in interface Field<Complex>
Parameters:
that - the denominator
Returns:
this / that
Throws:
java.lang.ArithmeticException - if division by zero happens

multiply

public Complex multiply(Complex that)
Compute the product of this complex number and that complex number.
(a + bi)(c + di) = (ac - bd) + (ad + bc)i

A more efficient implementation is used (1 less multiplication):

(a + bi)(c + di) = (ac - bd) + ((a + b)(c + d) - ac - bd)i

Specified by:
multiply in interface Monoid<Complex>
Parameters:
that - the multiplicand
Returns:
this * that

ZERO

public Complex ZERO()
A number representing 0.0 + 0.0i.

Specified by:
ZERO in interface AbelianGroup<Complex>
Returns:
new Complex(0.0, 0.0)

ONE

public Complex ONE()
A number representing 1.0 + 0.0i.

Specified by:
ONE in interface Monoid<Complex>
Returns:
new Complex(1.0, 0.0)

compare

public int compare(java.lang.Number that,
                   double epsilon)
Description copied from interface: NumberUtils.Comparable
Compare this and that numbers up to a precision.

Specified by:
compare in interface NumberUtils.Comparable<Complex>
Parameters:
that - a Number. Because a number can be represented in multiple ways, e.g., 0 = 0 + 0i, the implementation may need to check Object type.
epsilon - a precision parameter: when a number |x| ≤ ε, it is considered 0
Returns:
|this - that|

equals

public boolean equals(java.lang.Object obj)
Overrides:
equals in class java.lang.Object

hashCode

public int hashCode()
Overrides:
hashCode in class java.lang.Object

toString

public java.lang.String toString()
Overrides:
toString in class java.lang.Object

SuanShu, a Java numerical and statistical library

Copyright © 2011 Numerical Method Inc. Ltd. All Rights Reserved.