package math; /****************************************************************************** * Compilation: javac Complexofdm.java * Execution: java Complexofdm * * Data type for complex numbers. * * The data type is "immutable" so once you create and initialize * a Complexofdm object, you cannot change it. The "final" keyword * when declaring re and im enforces this rule, making it a * compile-time error to change the .re or .im fields after * they've been initialized. * * % java Complexofdm * a = 5.0 + 6.0i * b = -3.0 + 4.0i * Re(a) = 5.0 * Im(a) = 6.0 * b + a = 2.0 + 10.0i * a - b = 8.0 + 2.0i * a * b = -39.0 + 2.0i * b * a = -39.0 + 2.0i * a / b = 0.36 - 1.52i * (a / b) * b = 5.0 + 6.0i * conj(a) = 5.0 - 6.0i * |a| = 7.810249675906654 * tan(a) = -6.685231390246571E-6 + 1.0000103108981198i * ******************************************************************************/ public class Complex { private double re; // the real part private double im; // the imaginary part // create a new object with the given real and imaginary parts public Complex(double real, double imag) { re = real; im = imag; } // return a string representation of the invoking Complexofdm object public String toString() { if (im == 0) return re + " + 0.0i"; if (re == 0) return "0.0 + " + im + "i"; if (im < 0) return re + " - " + (-im) + "i"; return re + " + " + im + "i"; } // return abs/modulus/magnitude and angle/phase/argument public double abs() { return Math.hypot(re, im); } // Math.sqrt(re*re + im*im) public double phase() { return Math.atan2(im, re); } // between -pi and pi // return a new Complexofdm object whose value is (this + b) public Complex plus(Complex b) { // invoking object double real = re + b.re(); double imag = im + b.im(); return new Complex(real, imag); } // return a new Complexofdm object whose value is (this - b) public Complex minus(Complex b) { double real = re - b.re(); double imag = im - b.im(); return new Complex(real, imag); } // return a new Complexofdm object whose value is (this * b) public Complex times(Complex b) { double real = re * b.re() - im * b.im(); double imag = re * b.im() + im * b.re(); return new Complex(real, imag); } // scalar multiplication // return a new object whose value is (this * alpha) public Complex times(double alpha) { return new Complex(alpha * re, alpha * im); } // return a new Complexofdm object whose value is the conjugate of this public Complex conjugate() { return new Complex(re, -im); } // return a new Complexofdm object whose value is the reciprocal of this public Complex reciprocal() { double scale = plus(re*re, im*im); return new Complex(re / scale, -im / scale); } private double plus(double a, double b) { return a+b; } // return the real or imaginary part public double re() { return re; } public double im() { return im; } // return a / b public Complex divides(Complex b) { Complex a = this; return a.times(b.reciprocal()); } // return a new Complexofdm object whose value is the complex exponential of this public Complex exp() { return new Complex(Math.exp(re) * Math.cos(im), Math.exp(re) * Math.sin(im)); } // return a new Complexofdm object whose value is the complex sine of this public Complex sin() { return new Complex(Math.sin(re) * Math.cosh(im), Math.cos(re) * Math.sinh(im)); } // return a new Complexofdm object whose value is the complex cosine of this public Complex cos() { return new Complex(Math.cos(re) * Math.cosh(im), -Math.sin(re) * Math.sinh(im)); } // return a new Complexofdm object whose value is the complex tangent of this public Complex tan() { return sin().divides(cos()); } // a static version of plus public static Complex plus(Complex a, Complex b) { double real = a.re() + b.re(); double imag = a.im() + b.im(); Complex sum = new Complex(real, imag); return sum; } public double re4() { return (int)(re*10000)/10000.; } public double im4() { return (int)(im*10000)/10000.; } @Override public boolean equals(Object o) { if(o instanceof Complex) { Complex c = (Complex) o ; return ((re4()==c.re4()) && (im4()==c.im4())); } return false; } // sample client for testing public static void main(String[] args) { Complex a = new Complex(5.0, 6.0); Complex b = new Complex(-3.0, 4.0); System.out.println("a = " + a); System.out.println("b = " + b); System.out.println("Re(a) = " + a.re()); System.out.println("Im(a) = " + a.im()); System.out.println("b + a = " + b.plus(a)); System.out.println("a - b = " + a.minus(b)); System.out.println("a * b = " + a.times(b)); System.out.println("b * a = " + b.times(a)); System.out.println("a / b = " + a.divides(b)); System.out.println("(a / b) * b = " + a.divides(b).times(b)); System.out.println("conj(a) = " + a.conjugate()); System.out.println("|a| = " + a.abs()); System.out.println("tan(a) = " + a.tan()); } }