using System.Numerics;
using Skeleton.Algebra.Extensions;
using Skeleton.Analysis.BivariantFunctions.Real.Implements;
using Skeleton.Analysis.BivariantFunctions.Real.PolynomialHelpers;
using Skeleton.Utils.Helpers;
namespace Skeleton.Analysis.AnalyticFunctions.Polynomials.Implements;
///
///
public class C2Polynomial : Polynomial
{
///
public C2Polynomial()
{
Coefficients = new Complex[3];
Fix();
}
///
public C2Polynomial(Complex a0, Complex a1, Complex a2)
{
Coefficients = new[] { a0, a1, a2 };
Fix();
}
///
///
public Complex A0 => Coefficients[0];
///
///
public Complex A1 => Coefficients[1];
///
///
public Complex A2 => Coefficients[2];
///
public override string Representation =>
$"{A0.Real} + {A0.Imaginary}i + ({A1.Real} + {A1.Imaginary}i)x + ({A2.Real} + {A2.Imaginary}i)x2";
///
public override int Dim => 2;
///
public override Polynomial Derivative => new C1Polynomial(A1, A2 * 2);
///
public override IEnumerable Roots => Decorators.WithTol(1E-20,
() =>
{
if (A2.IsEqualApprox(0))
return new C1Polynomial(A0, A1).Roots;
if (A0.IsEqualApprox(0))
return new C1Polynomial(A1, A2).Roots.Concat(new[] { Complex.Zero });
Complex x1 = (-A1 + Complex.Sqrt(A1 * A1 - 4 * A2 * A0)) / (2 * A2);
Complex x2 = (-A1 - Complex.Sqrt(A1 * A1 - 4 * A2 * A0)) / (2 * A2);
return new[] { x1, x2 };
}
);
///
public override BivariantContinuous Re => new PolyCHelper.PolyC2Re(A0, A1, A2);
///
public override BivariantContinuous Im => new PolyCHelper.PolyC2Im(A0, A1, A2);
///
public override Complex Evaluate(Complex x)
{
return A0 + x * (A1 + x * A2);
}
}