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);
}