polynomialDiscriminant method
The discriminant of a polynomial P(x) is the determinant of the Sylvester matrix of P and P' (where P' is the derivative of P).
By default, the optimize
parameter is set to true
so that the Sylvester
matrix is not computed for polynomials whose degree is 4 or lower. To be
more precise:
-
With
optimize = true
, if the degree of the polynomial is lower than 4 then the Sylvester matrix is not built. The computation of its determinant can be computationally heavy so we can just avoid such complexity by using the simple formulas for lower degree polynomials. -
With
optimize = true
, the Sylvester matrix and its determinant are always computed regardless the degree of the polynomial.
You should keep the default value of optimize
.
Implementation
Complex polynomialDiscriminant({bool optimize = true}) {
// In case the optimization flag were 'true' and the degree of the
// polynomial is <= 4, then go for the easy way.
if (optimize && (_coefficients.length <= 5)) {
return Algebraic.from(coefficients).discriminant();
} else {
// The determinant of the Sylvester matrix
final determinant = matrixDeterminant();
/*
* Once we got the determinant, we need to make the last calculation to also
* determine the sign. The formula is the following:
*
* Disc(A) = (-1)^(n*(n-1)/2) * 1/A[n] * Res(A, A')
*
* In the above formula, 'n' is the degree of the polynomial, A(x) is the
* polynomial and A'(x) is the derivative of A(x).
*
* Res(A, A') is the resultant of A(x) and A'(x), which is nothing more than
* the determinant of the Sylvester matrix.
*/
final degree = _coefficients.length - 1;
final sign = math.pow(-1, degree * (degree - 1) / 2) as double;
final denominator = _coefficients[0];
// Returning the determinant with the correct sign
return Complex.fromReal(sign) / denominator * determinant;
}
}