import java.awt.Font;
import java.awt.Graphics;
import java.awt.FontMetrics;
import java.awt.Color;

//********************************
// Complex
//*******************************
public class Complex
{
    // 
    double re;
    double im;
    Complex(double real,double imag)
    {
	re = real;
	im = imag;
    }
    static Complex conj(Complex a)
    {
	return new Complex(a.re, -1.0*a.im);
    }

    static Complex add(Complex a1, Complex a2)
    {
	Complex ret = new Complex(0.0,0.0);
	ret.re = a1.re + a2.re;
        ret.im = a1.im + a2.im;
	return ret;
    }
    static Complex sub(Complex a1, Complex a2)
    {
	Complex ret = new Complex(0.0,0.0);
	ret.re = a1.re - a2.re;
        ret.im = a1.im - a2.im;
	return ret;
    }
    static Complex mult(Complex a1, Complex a2)
    {
	Complex ret = new Complex(0.0,0.0);
	ret.re = a1.re * a2.re - a1.im * a2.im;
	ret.im = a1.im * a2.re + a1.re * a2.im;
	return ret;
    }
    static Complex div(Complex a1, Complex a2)
    {
	double rr,ii,dd;
	Complex ret = new Complex(0.0,0.0);
	rr = a1.re * a2.re + a1.im * a2.im;
	ii = a1.im * a2.re - a1.re * a2.im;
        dd = a2.re * a2.re + a2.im * a2.im;
	if (dd != 0.0)
	{
	    ret.re = rr / dd;
	    ret.im = ii / dd;
	}
	return ret;
    }
    static Complex exp(Complex x)
    {
	double rr,ii;
	Complex ret = new Complex(0.0,0.0);
	rr = Math.exp(x.re) * Math.cos(x.im);
	ii = Math.exp(x.re) * Math.sin(x.im);
	ret.re = rr;
	ret.im = ii;
	return ret;
    }
    static Complex sin(Complex x)
    {
	Complex si = new Complex(0.0,0.0);
	Complex d1 = new Complex(0.0,0.0);
	Complex d2 = new Complex(0.0,0.0);
	Complex ii = new Complex(0.0,1.0);
	Complex mi = new Complex(0.0,-1.0);
	Complex m2i = new Complex(0.0,2.0);

	d1 = exp(mult(ii,x));
	d2 = exp(mult(mi,x));
	si = div(sub(d1,d2),m2i);
	return si;
    }
    static Complex cos(Complex x)
    {
	Complex co = new Complex(0.0,0.0);
	Complex d1 = new Complex(0.0,0.0);
	Complex d2 = new Complex(0.0,0.0);
	Complex ii = new Complex(0.0,1.0);
	Complex mi = new Complex(0.0,-1.0);
	Complex p2i = new Complex(2.0,0.0);

	d1 = exp(mult(ii,x));
	d2 = exp(mult(mi,x));
	co = div(add(d1,d2),p2i);
	return co;
    }
		

};




















