using System.Numerics; namespace Skeleton.Algebra.ScalarFieldStructure; /// public class ComplexFieldStructure : FieldStructure { /// /// /// public static readonly ComplexFieldStructure Structure = new(); /// public override Complex Addition(Complex self, Complex other) => self + other; /// public override Complex AdditionUnit => 0d; /// public override Complex Multiplication(Complex self, Complex other) => self * other; /// public override Complex MultiplicationUnit => 1d; /// public override Complex AdditionInverse(Complex self) => -self; /// public override Complex MultiplicationInverse(Complex self) => 1d / self; /// public override Complex Subtraction(Complex self, Complex other) => self - other; /// public override Complex Division(Complex self, Complex other) => self / other; /// public override bool IsEqualApprox(Complex self, Complex other, double? absTol = null, double? relTol = null) => RealFieldStructure.Structure.IsEqualApprox(self.Real, other.Real, absTol, relTol) && RealFieldStructure.Structure.IsEqualApprox(self.Imaginary, other.Imaginary, absTol, relTol); /// public override Complex Fix(Complex x) => base.Fix(new Complex( RealFieldStructure.Structure.Fix(x.Real), RealFieldStructure.Structure.Fix(x.Imaginary) )); /// public override Complex Conj(Complex self) => Complex.Conjugate(self); /// public override double AsReal(Complex x) => x.Real; /// public override Complex FromReal(double x) => x; private const string PlusSign = "+"; private const string EmptyString = ""; /// public override string RawRepresentation(Complex x) => RealFieldStructure.Structure.IsEqualApprox(x.Imaginary, 0d) ? RealFieldStructure.Structure.Representation(x.Real) : $"{x.Real}{(x.Imaginary > 0 ? PlusSign : EmptyString)}{x.Imaginary}i"; /// public override string RawPythonRepresentation(Complex x) => RealFieldStructure.Structure.IsEqualApprox(x.Imaginary, 0d) ? RealFieldStructure.Structure.Representation(x.Real) : $"{x.Real}{(x.Imaginary > 0 ? PlusSign : EmptyString)}{x.Imaginary}j"; /// public override string RawCSharpRepresentation(Complex x) => RealFieldStructure.Structure.IsEqualApprox(x.Imaginary, 0d) ? RealFieldStructure.Structure.Representation(x.Real) : $"{x.Real}{(x.Imaginary >= 0 ? PlusSign : EmptyString)}{x.Imaginary}*AlgebraConstant.I"; /// public override string DumpString(Complex x) => "" + RealFieldStructure.Structure.DumpString(x.Real) + "" + RealFieldStructure.Structure.DumpString(x.Imaginary) + ""; /// public override Complex Resolve(string dumpString) { double[] restored = dumpString .Replace("", "") .Replace("", "") .Split("") .Select(x => RealFieldStructure.Structure.Resolve(x)) .ToArray(); return new Complex(restored[0], restored[1]); } /// public override double MaxError(Complex a) => Math.Max(Math.Abs(a.Real), Math.Abs(a.Imaginary)); /// public override Complex ComplexCast(Complex a) => a; /// public override Complex RealMul(Complex a, double b) => a * b; /// public override Complex SquareRoot(Complex a) => Complex.Sqrt(a); /// public override Complex FromComplex(Complex a) => a; /// public override Complex Log(Complex x) => Complex.Log(x); /// public override Complex Exp(Complex x) => Complex.Exp(x); }