public final Cmplx sqrt() { Cmplx c = new Cmplx(); double x, y, w, r; if ((this.r == 0.0) && (this.i == 0.0)) { c.r = (c.i = 0.0); return (c); } else { x = Math.abs(this.r); y = Math.abs(this.i); if (x >= y) { r = y / x; w = Math.sqrt(x) * Math.sqrt(0.5 * (1.0 + Math.sqrt(1.0 + r * r))); } else { r = x / y; w = Math.sqrt(y) * Math.sqrt(0.5 * (r + Math.sqrt(1.0 + r * r))); } if (this.r >= 0.0) { c.r = w; c.i = this.i / (2.0 * w); } else { c.i = (this.i >= 0.0) ? w : -w; c.r = this.i / (2.0 * c.i); } return (c); } }
public static final Cmplx div(Cmplx a, Cmplx b) { Cmplx c = new Cmplx(); double r, den; if (Math.abs(b.r) >= Math.abs(b.i)) { r = b.i / b.r; den = b.r + r * b.i; c.r = (a.r + r * a.i) / den; c.i = (a.i - r * a.r) / den; } else { r = b.r / b.i; den = b.i + r * b.r; c.r = (a.r * r + a.i) / den; c.i = (a.i * r - a.r) / den; } return c; }
public static final Cmplx mul(Cmplx a, Cmplx b) { Cmplx c = new Cmplx(); c.r = a.r * b.r - a.i * b.i; c.i = a.i * b.r + a.r * b.i; return c; }
public static final Cmplx sub(Cmplx a, Cmplx b) { Cmplx c = new Cmplx(); c.r = a.r - b.r; c.i = a.i - b.i; return c; }
public static final Cmplx add(Cmplx a, Cmplx b) { Cmplx c = new Cmplx(); c.r = a.r + b.r; c.i = a.i + b.i; return c; }
public static final Cmplx exp(Cmplx arg) { Cmplx c = new Cmplx(); c.r = Math.exp(arg.r) * Math.cos(arg.i); c.i = Math.exp(arg.r) * Math.sin(arg.i); return c; }
public final Cmplx conjg() { Cmplx c = new Cmplx(); c.r = this.r; c.i = -this.i; return c; }