    /* Custom complex number class */
    public class Complex {
	double re,im;
	public Complex(double x, double y) {
	    re=x;
	    im=y;
	}
	public Complex() {
	    re=0;
	    im=0;
	}
	public Complex(Complex z) {
	    re=z.re;
	    im=z.im;
	}
	public Complex conj() {
	    return new Complex(re,-im);
	}
	public Complex oconj() {
	    return new Complex(-re,im);
	}
	public Complex mul(Complex a) {
	    return new Complex(a.re*re-a.im*im,a.re*im+a.im*re);
	}
	public Complex mul(double a) {
	    return new Complex(a*re,a*im);
	}
	public Complex add(Complex a) {
	    return new Complex(a.re+re,a.im+im);
	}
	public Complex add(double a) {
	    return new Complex(re+a,im);
	}
	public double norm() {
	    return re*re+im*im;
	}
	public Complex opposite() {
	    return new Complex(-re,-im);
	}
	/*
	public static Complex rotator(double theta) {
	    return new Complex(Math.cos(2.0*Math.PI*theta),Math.sin(2.0*Math.PI*theta))
	}
	*/
	public Complex rotate(double theta) {
	    return this.mul(new Complex (Math.cos(2.0*Math.PI*theta),Math.sin(2.0*Math.PI*theta)));
	}
    }
