public class ComplexNumber {

  //representation of the objects of the class
  private double re;  // real part
  private double im;  // imaginary part

  public ComplexNumber(double r, double i) {
    re = r; 
    im = i;
  }

  public ComplexNumber(ComplexNumber c) {
    re = c.re;  
    im = c.im;
  }

  public double real() {
    return re;
  }

  public double imaginary() {
    return im;
  }

  public double module() {
    return Math.sqrt(re * re + im * im);
  }

  public double phase() {
    if (im >= 0) 
      return Math.acos(re/module());
    else 
      return -Math.acos(re/module());
  }

  //overriding of toString inherited from Object
  public String toString() {
    String sim;
    if (im >= 0)
      sim = "+" + im + "i";
    else
      sim = "-" + (-im) + "i";
    return re + sim;
  }

  public ComplexNumber sum(ComplexNumber c) {
    return new ComplexNumber(re + c.re, im + c.im);
  }

  public ComplexNumber difference(ComplexNumber c) {
    return new ComplexNumber(re - c.re, im - c.im);
  }

  public ComplexNumber product(ComplexNumber c) {
    return new ComplexNumber(re * c.re - im * c.im,
                             re * c.im + im * c.re);
  }

  public ComplexNumber quotient(ComplexNumber c) {
    double d = c.re*c.re + c.im*c.im;
    if (d != 0)
      return new ComplexNumber((re*c.re + im*c.im) / d,
                               (im*c.re - re*c.im) / d);
    else
      return null;
  }

  //equality between two complex numbers
  public boolean equalTo(ComplexNumber c) {
    return re == c.re && im == c.im;
  }
}
