Package dev.nm.number.complex
Class Complex
- java.lang.Object
-
- java.lang.Number
-
- dev.nm.number.complex.Complex
-
- All Implemented Interfaces:
AbelianGroup<Complex>,Field<Complex>,Monoid<Complex>,Ring<Complex>,NumberUtils.Comparable<Complex>,Serializable
public class Complex extends 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. This class is immutable.- See Also:
- Wikipedia: Complex number, Serialized Form
-
-
Nested Class Summary
-
Nested classes/interfaces inherited from interface dev.nm.algebra.structure.Field
Field.InverseNonExistent
-
-
Field Summary
Fields Modifier and Type Field Description static ComplexIa number representing 0.0 + 1.0i, the square root of -1static ComplexNaNa number representing the complex Not-a-Number (NaN)static ComplexNEGATIVE_INFINITYa number representing -∞ + -∞istatic ComplexONEa number representing 1.0 + 0.0istatic ComplexPOSITIVE_INFINITYa number representing +∞ + ∞istatic ComplexZEROa number representing 0.0 + 0.0i
-
Method Summary
All Methods Static Methods Instance Methods Concrete Methods Deprecated Methods Modifier and Type Method Description Complexadd(Complex that)+ : G × G → Gdoublearg()Get the θ of the complex number in polar representation.intcompare(Number that, double epsilon)Comparethisandthatnumbers up to a precision.Complexconjugate()Get the conjugate of the complex number, namely, (a - bi).Complexdivide(Complex that)Compute the quotient of this complex number divided by another complex number.doubledoubleValue()booleanequals(Object obj)floatfloatValue()static ComplexfromPolar(double r, double theta)Factory method to construct a complex number from the polar form: (r, θ).inthashCode()doubleimaginary()Get the imaginary part of this complex number.intintValue()Deprecated.Invalid operation.Complexinverse()For each a in F, there exists an element b in F such that a × b = b × a = 1.static booleanisInfinite(Complex z)Check if a complex number is an infinity; i.e., either the real or the imaginary part is infinite, c.f.,Double.isInfinite(), and the number is not aNaN.static booleanisNaN(Complex z)Check if a complex number is anNaN; i.e., either the real or the imaginary part is anNaN.static booleanisReal(Complex z)Check if this complex number is a real number; i.e., the imaginary part is 0.longlongValue()Deprecated.Invalid operation.Complexminus(Complex that)- : G × G → Gdoublemodulus()Get the modulus.Complexmultiply(Complex that)Compute the product of this complex number and that complex number.ComplexONE()Get one - the number representing 1.0 + 0.0i.Complexopposite()For each a in G, there exists an element b in G such that a + b = b + a = 0.doublereal()Get the real part of this complex number.DoubletoDouble()Cast the complex number to aDoubleif it is a real number.StringtoString()ComplexZERO()Get zero - the number representing 0.0 + 0.0i.-
Methods inherited from class java.lang.Number
byteValue, shortValue
-
-
-
-
Field Detail
-
I
public static final Complex I
a number representing 0.0 + 1.0i, the square root of -1
-
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 +∞ + ∞i
-
NEGATIVE_INFINITY
public static final Complex NEGATIVE_INFINITY
a number representing -∞ + -∞i
-
NaN
public static final Complex NaN
a number representing the complex Not-a-Number (NaN)
-
-
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 radiustheta- an angle- Returns:
- a complex number equivalent to the polar form (r, θ)
-
real
public double real()
Get the real part of this complex number.- Returns:
- the real part
-
imaginary
public double imaginary()
Get the imaginary part of this complex number.- Returns:
- the imaginary part
-
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:
trueif the imaginary part is 0
-
isNaN
public static boolean isNaN(Complex z)
Check if a complex number is anNaN; i.e., either the real or the imaginary part is anNaN.- Parameters:
z- a complex number- Returns:
trueif either the real or the imaginary part is aNaN
-
isInfinite
public static boolean isInfinite(Complex z)
Check if a complex number is an infinity; i.e., either the real or the imaginary part is infinite, c.f.,Double.isInfinite(), and the number is not aNaN.- Parameters:
z- a complex number- Returns:
trueif either the real or the imaginary part is infinite
-
modulus
public double modulus()
Get the modulus. The modulus is the square root of itself multiplied by its conjugate, namelythis.modulus() * this.modulus() = this.multiply(this.conjugate())
- Returns:
- the modulus
- See Also:
Math.hypot(double, double)
-
arg
public double arg()
Get the θ of the complex number in polar representation.- Returns:
- θ as in the polar form (r, θ)
-
toDouble
public Double toDouble()
Cast the complex number to aDoubleif it is a real number.- Returns:
- the real part if this complex number is a real number
- Throws:
IllegalArgumentException- if this complex number is not a real number
-
conjugate
public Complex conjugate()
Get the conjugate of the complex number, namely, (a - bi).- Returns:
- the conjugate
-
intValue
@Deprecated public int intValue()
Deprecated.Invalid operation.
-
longValue
@Deprecated public long longValue()
Deprecated.Invalid operation.
-
floatValue
public float floatValue()
- Specified by:
floatValuein classNumber
-
doubleValue
public double doubleValue()
- Specified by:
doubleValuein classNumber
-
add
public Complex add(Complex that)
Description copied from interface:AbelianGroup+ : G × G → G- Specified by:
addin interfaceAbelianGroup<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 The operation "-" 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:
minusin interfaceAbelianGroup<Complex>- Parameters:
that- the object to be subtracted (subtrahend)- Returns:
- this - that
-
opposite
public Complex opposite()
Description copied from interface:AbelianGroupFor 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 asthis.add(this.opposite()) == this.ZERO- Specified by:
oppositein interfaceAbelianGroup<Complex>- Returns:
- -this, the additive opposite
- See Also:
- Wikipedia: Additive inverse
-
inverse
public Complex inverse() throws Field.InverseNonExistent
Description copied from interface:FieldFor 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 asthis.multiply(this.inverse()) == this.ONE- Specified by:
inversein interfaceField<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 divided by another complex number. \[ \frac{a + bi}{c + di} = \frac{ac + bd + (bc - ad)i}{c^2 + d^2} \] ABSTRACTWe 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:
dividein interfaceField<Complex>- Parameters:
that- the denominator- Returns:
- this / that
- Throws:
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
This implementation is more efficient by doing 1 less multiplication:(a + bi)(c + di) = (ac - bd) + ((a + b)(c + d) - ac - bd)i
-
ZERO
public Complex ZERO()
Get zero - the number representing 0.0 + 0.0i.- Specified by:
ZEROin interfaceAbelianGroup<Complex>- Returns:
- ZERO
-
ONE
public Complex ONE()
Get one - the number representing 1.0 + 0.0i.
-
compare
public int compare(Number that, double epsilon)
Description copied from interface:NumberUtils.ComparableComparethisandthatnumbers up to a precision.- Specified by:
comparein interfaceNumberUtils.Comparable<Complex>- Parameters:
that- aNumber. As a number can be represented in multiple ways, e.g., 0 = 0 + 0i, the implementation may need to checkObjecttype.epsilon- a precision parameter: when a number |x| ≤ ε, it is considered 0- Returns:
- 0 if both numbers are close enough; +1 if
thisis bigger; -1 ifthatis bigger
-
-