# Extending Polynomials

The `AbstractPolynomial`

type was made to be extended via a rich interface.

`Polynomials.AbstractPolynomial`

— Type`AbstractPolynomial{T}`

An abstract container for various polynomials.

**Properties**

`coeffs`

- The coefficients of the polynomial`var`

- 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.