public static Complex Sqrt(Complex value) { if (value.IsRealNonNegative()) { return new Complex((double)Math.Sqrt(value.Real), 0.0); } Complex result; var absReal = Abs(value.Real); var absImag = Abs(value.Imaginary); double w; if (absReal >= absImag) { var ratio = value.Imaginary / value.Real; w = Sqrt(absReal) * Sqrt(0.5 * (1.0 + Sqrt(1.0 + (ratio * ratio)))); } else { var ratio = value.Real / value.Imaginary; w = Sqrt(absImag) * Sqrt(0.5 * (Abs(ratio) + Sqrt(1.0 + (ratio * ratio)))); } if (value.Real >= 0.0) { result = new Complex(w, value.Imaginary / (2.0 * w)); } else if (value.Imaginary >= 0.0) { result = new Complex((absImag / (2.0 * w)).Real, w); } else { result = new Complex((absImag / (2.0 * w)).Real, -w); } return result; }
public static Complex Ln(Complex c) { /*if (c.IsReal() && c < 0.0) return Ln(-c) + (Constants.I * Constants.Pi); if (c.IsReal()) return Quad.Log(c.Real); return Math.Log(c.Module, Constants.E) + (Constants.I * (Complex)c.Argument);*/ if(c.IsRealNonNegative()) return new Complex(Math.Log(c.Real, Constants.E), 0.0); return new Complex(0.5 * Math.Log(c.MagnitudeSquared(), Constants.E), c.Argument); }