/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package patternjavaimplementation;


public class Complex {

  private double r;

  private double i;

  public Complex(double rr, double ii) {
    r = rr;
    i = ii;
  }
     @Override
  public String toString() {
    StringBuffer sb = new StringBuffer().append(r);
    if (i>0)
      sb.append('+'); // else append(i) appends - sign
    return sb.append(i).append('i').toString();
  }
  public void change(double rr, double ii){
    r = rr;
    i = ii;
  }

  public double getReal() {
    return r;
  }

  public double getImaginary() {
    return i;
  }

  public double magnitude() {
    return Math.sqrt(r*r + i*i);
  }

  public Complex add(Complex other) {
    return add(this, other);
  }

  public static Complex add(Complex c1, Complex c2) {
    return new Complex(c1.r+c2.r, c1.i+c2.i);
  }

  public Complex subtract(Complex other) {
    return subtract(this, other);
  }

  public static Complex subtract(Complex c1, Complex c2) {
    return new Complex(c1.r-c2.r, c1.i-c2.i);
  }

  public Complex multiply(Complex other) {
    return multiply(this, other);
  }

  public static Complex multiply(Complex c1, Complex c2) {
    return new Complex(c1.r*c2.r - c1.i*c2.i, c1.r*c2.i + c1.i*c2.r);
  }

  public static Complex divide(Complex c1, Complex c2) {
    return new Complex(
      (c1.r*c2.r+c1.i*c2.i)/(c2.r*c2.r+c2.i*c2.i),
      (c1.i*c2.r-c1.r*c2.i)/(c2.r*c2.r+c2.i*c2.i));
  }

    @Override
  public boolean equals(Object o) {
    if (!(o instanceof Complex))
      throw new IllegalArgumentException(
          "Complex.equals argument must be a Complex");
    Complex other = (Complex)o;
    return r == other.r && i == other.i;
  }

    @Override
  public Object clone() {
    Complex emp;
    emp = new Complex(this.r, this.i);
    return emp;
  }
}