Extending Polynomials
The AbstractPolynomial type was made to be extended via a rich interface.
Polynomials.AbstractPolynomial — TypeAbstractPolynomial{T}An abstract container for various polynomials.
Properties
coeffs- The coefficients of the polynomialvar- The indeterminate of the polynomial
A polynomial's coefficients are relative to some basis. The Polynomial type relates coefficients [a0, a1, ..., an], say, to the polynomial a0 + a1*x + a2*x^ + ... + an*x^n, through the standard basis 1, x, x^2, ..., x^n. New polynomial types typically represent the polynomial through a different basis. For example, CheyshevT uses a basis T_0=1, T_1=x, T_2=2x^2-1, ..., T_n = 2xT_{n-1} - T_{n-2}. For this type the coefficients [a0,a1,...,an] are associated with the polynomial a0*T0 + a1*T_1 + ... + an*T_n.
To implement a new polynomial type, P, the following methods should be implemented.
Promotion rules will always coerce towards the Polynomial type, so not all methods have to be implemented if you provide a conversion function.
As always, if the default implementation does not work or there are more efficient ways of implementing, feel free to overwrite functions from common.jl for your type.
| Function | Required | Notes |
|---|---|---|
| Constructor | x | |
Type function ((::P)(x)) | x | |
convert(::Polynomial, ...) | Not required, but the library is built off the Polynomial type, so all operations are guaranteed to work with it. Also consider writing the inverse conversion method. | |
domain | x | Should return an AbstractInterval |
vander | Required for fit | |
companion | Required for roots | |
fromroots | By default, will form polynomials using prod(variable(::P) - r) for reach root r | |
+(::P, ::P) | Addition of polynomials | |
-(::P, ::P) | Subtraction of polynomials | |
*(::P, ::P) | Multiplication of polynomials | |
divrem | Required for gcd | |
variable | Convenience to find monomial x in new basis |
Check out both the Polynomial and ChebyshevT for examples of this interface being extended.