/* ComplexDemo.java * M.Lampton uCB SSL 2009, 2015 * Demonstrates a simple internal Complex class */ public class ComplexDemo { // Exercise methods in Complex class and its Utilities, defined below public static void main ( String args[] ) { System.out.println("\nComplex number demo"); // Set up two complex numbers ..... Complex cA = new Complex( 1.0, 2.0 ); Complex cB = new Complex( 3.0, 4.0 ); System.out.println("Complex number cA = " + cA.toString() ); System.out.println("Complex number cB = " + cB.toString() ); // demonstrate results Complex cC = C.cAdd(cA, cB); System.out.println("Sum = "+ cC.toString()); Complex cD = C.cSub(cA, cB); System.out.println("Diff= "+ cD.toString()); Complex cE = C.cMul(cA, cB); System.out.println("Mul = "+ cE.toString()); Complex cF = C.cDiv(cA, cB); System.out.println("Div = "+ cF.toString()); Complex cG = C.cMul(cF, cB); System.out.println("Mul = "+ cG.toString()); double d = C.dAbs(cB); System.out.println("Abs = " + d); Complex cH = C.cConj(cA); System.out.println("Conj= " + cH.toString()); Complex cI = C.cSqrt(cA); System.out.println("Sqrt= "+ cI.toString()); Complex cJ = C.cMul(cI, cI); System.out.println("S*S = " + cJ.toString()); Complex cK = C.cExp(cA); System.out.println("Exp = "+ cK.toString()); Complex cL = C.cLog(cK); System.out.println("Log = "+ cL.toString()); Complex cM = C.cExp(C.cAdd(C.cLog(cA), C.cLog(cB))); System.out.println("Mul the hard way = "+cM.toString()); Complex cN = C.cExp(C.cScale(C.cLog(cA), 0.5)); System.out.println("Sqrt the hard way = "+cN.toString()); // demonstrate accessibility of internal parts cA.i = 133.0; System.out.println("cA imaginary part is changed to 133: "+ cA.toString()); } } class Complex // defines a complex number { protected double r, i; // allows co-classes to access contents public Complex( double gr, double gi ) // constructor { r = gr; i = gi; } public String toString() // method that classes usually offer { String s = (i>=0) ? "+" : ""; return r + s + i + "i"; } } class C // static utilities for complex arithmetic { public static double dAbs(Complex c) { return Math.sqrt(c.r*c.r + c.i*c.i); } public static Complex cScale(Complex c, double s) { return new Complex(s*c.r, s*c.i); } public static Complex cNeg(Complex c) { return new Complex(-c.r, -c.i); } public static Complex cConj(Complex c) { return new Complex(c.r, -c.i); } public static Complex cAdd(Complex cA, Complex cB) { return new Complex(cA.r+cB.r, cA.i+cB.i); } public static Complex cSub(Complex cA, Complex cB) { return new Complex(cA.r-cB.r, cA.i-cB.i); } public static Complex cMul(Complex cA, Complex cB) { return new Complex(cA.r*cB.r - cA.i*cB.i, cA.i*cB.r + cA.r*cB.i); } public static Complex cDiv(Complex a, Complex b) { double numr = a.r*b.r + a.i*b.i; double numi = a.i*b.r - a.r*b.i; double denom = b.r*b.r + b.i*b.i; return new Complex(numr/denom, numi/denom); } public static Complex cSqrt(Complex c) { double abs = dAbs(c); double rootr = Math.sqrt(abs + c.r); double rooti = Math.sqrt(abs - c.r); double sign = (c.i < 0) ? -1.0 : 1.0; double coef = Math.sqrt(0.5); return new Complex(coef*rootr, coef*sign*rooti); } public static Complex cCirc(double t) { return new Complex(Math.cos(t), Math.sin(t)); } public static Complex cExp(Complex c) { double coef = Math.exp(c.r); return new Complex(coef*Math.cos(c.i), coef*Math.sin(c.i)); } public static Complex cLog(Complex c) { return new Complex(Math.log(dAbs(c)), Math.atan2(c.i, c.r)); } }