public class Complex {
public double re;
public double im;
public static Complex ZERO = new Complex(0.0, 0.0);
public static Complex ONE = new Complex(1.0, 0.0);
public static Complex I = new Complex(0.0, 1.0);
public static Complex NaN
= new Complex
(Double.
NaN,
Double.
NaN);
public Complex(double r, double i){
re = r; im = i;
}
public Complex(double theta){
}
public Complex(Complex z){
re = z.re; im = z.im;
}
sb.append(df.format(re));
sb.append(" ");
sb.append(df.format(im));
return sb.toString();
}
public double re(){ return re; }
public double im(){ return im; }
public Complex copy(){
return new Complex(re,im);
}
public Complex add(Complex z){
return new Complex(re+z.re, im+z.im);
}
public Complex sub(Complex z){
return new Complex(re-z.re, im-z.im);
}
public Complex mul(Complex z){
return new Complex(re*z.re-im*z.im, re*z.im+im*z.re);
}
public Complex mul(double k){
return new Complex(k*re, k*im);
}
public Complex div(Complex z){
double tmp = z.norm();
return new Complex((re*z.re+im*z.im)/tmp, (-re*z.im+im*z.re)/tmp);
}
public Complex conj(){
return new Complex(re,-im);
}
public Complex sqr(){
return this.mul(this);
}
public void addeq(Complex z){
re += z.re;
im += z.im;
}
public void subeq(Complex z){
re -= z.re;
im -= z.im;
}
public void muleq(Complex z){
double tmp = re*z.re - im*z.im;
im = re*z.im + im*z.re;
re = tmp;
}
public void diveq(Complex z){
double tmp = z.norm();
this.muleq(conj(z));
this.muleq(1.0/tmp);
}
public void muleq(double a){
re *= a;
im *= a;
}
public void conjeq(){
im *= -1.0;
}
public double abs(){
return Math.
hypot(re, im
); }
public double norm(){
return re*re + im*im;
}
public double arg(){
return Math.
atan2(im, re
); }
public static Complex add(Complex x, Complex y){
return new Complex(x.re+y.re, x.im+y.im);
}
public static Complex sub(Complex x, Complex y){
return new Complex(x.re-y.re, x.im-y.im);
}
public static Complex mul(Complex x, Complex y){
return new Complex(x.re*y.re - x.im*y.im, x.re*y.im + x.im*y.re);
}
public static Complex div(Complex x, Complex y){
return new Complex(x.re+y.re, x.im+y.im);
}
public static Complex mul(double a, Complex x){
return new Complex(a*x.re, a*x.im);
}
public static Complex conj(Complex x){
return new Complex(x.re, -x.im);
}
public static double abs(Complex z){
return Math.
hypot(z.
re, z.
im); }
public static double norm(Complex z){
return z.re*z.re + z.im*z.im;
}
public static double arg(Complex z){
return Math.
atan2(z.
im, z.
re); }
public void print(){
System.
out.
println(re
+ "+" + im
+ "i"); }
}