Polynomial
Polynomial types using the standard basis.
Polynomials.Polynomial
— TypePolynomial{T<:Number}(coeffs::AbstractVector{T}, var=:x)
Construct a polynomial from its coefficients a
, lowest order first, optionally in terms of the given variable x
. x
can be a character, symbol, or string.
If $p = a_n x^n + \ldots + a_2 x^2 + a_1 x + a_0$, we construct this through Polynomial([a_0, a_1, ..., a_n])
.
The usual arithmetic operators are overloaded to work with polynomials as well as with combinations of polynomials and scalars. However, operations involving two polynomials of different variables causes an error except those involving a constant polynomial.
Examples
DocTestSetup = quote
using Polynomials
end
julia> Polynomial([1, 0, 3, 4])
Polynomial(1 + 3*x^2 + 4*x^3)
julia> Polynomial([1, 2, 3], :s)
Polynomial(1 + 2*s + 3*s^2)
julia> one(Polynomial)
Polynomial(1.0)
Polynomials.ImmutablePolynomial
— TypeImmutablePolynomial{T<:Number}(coeffs::AbstractVector{T}, var=:x)
Construct an immutable (static) polynomial from its coefficients a
, lowest order first, optionally in terms of the given variable x
where x
can be a character, symbol, or string.
If $p = a_n x^n + \ldots + a_2 x^2 + a_1 x + a_0$, we construct this through ImmutablePolynomial((a_0, a_1, ..., a_n))
(assuming a_n ≠ 0
). As well, a vector or number can be used for construction.
The usual arithmetic operators are overloaded to work with polynomials as well as with combinations of polynomials and scalars. However, operations involving two polynomials of different variables causes an error, though for +
and *
operations, constant polynomials are treated as having no variable.
As the coefficient size is a compile-time constant, immutable polynomials can take advantage of faster polynomial evaluation provided by evalpoly
from Julia 1.4.
# Examples
julia> using Polynomials
julia> ImmutablePolynomial((1, 0, 3, 4))
ImmutablePolynomial(1 + 3*x^2 + 4*x^3)
julia> ImmutablePolynomial((1, 2, 3), :s)
ImmutablePolynomial(1 + 2*s + 3*s^2)
julia> one(ImmutablePolynomial)
ImmutablePolynomial(1.0)
This was modeled after https://github.com/tkoolen/StaticUnivariatePolynomials.jl by @tkoolen.
Polynomials.SparsePolynomial
— TypeSparsePolynomial(coeffs::Dict, var)
Polynomials in the standard basis backed by a dictionary holding the non-zero coefficients. For polynomials of high degree, this might be advantageous. Addition and multiplication with constant polynomials are treated as having no symbol.
Examples:
julia> using Polynomials
julia> P = SparsePolynomial
SparsePolynomial
julia> p, q = P([1,2,3]), P([4,3,2,1])
(SparsePolynomial(1 + 2*x + 3*x^2), SparsePolynomial(4 + 3*x + 2*x^2 + x^3))
julia> p + q
SparsePolynomial(5 + 5*x + 5*x^2 + x^3)
julia> p * q
SparsePolynomial(4 + 11*x + 20*x^2 + 14*x^3 + 8*x^4 + 3*x^5)
julia> p + 1
SparsePolynomial(2 + 2*x + 3*x^2)
julia> q * 2
SparsePolynomial(8 + 6*x + 4*x^2 + 2*x^3)
julia> p = Polynomials.basis(P, 10^9) - Polynomials.basis(P,0) # also P(Dict(0=>-1, 10^9=>1))
SparsePolynomial(-1.0 + 1.0*x^1000000000)
julia> p(1)
0.0
Polynomials.LaurentPolynomial
— TypeLaurentPolynomial(coeffs, range, var)
A Laurent polynomial is of the form a_{m}x^m + ... + a_{n}x^n
where m,n
are integers (not necessarily positive) with m <= n
.
The coeffs
specify a_{m}, a_{m-1}, ..., a_{n}
. The range specified is of the form m
(or m:n
), if left empty, m
is taken to be 0
(i.e., the coefficients refer to the standard basis). Alternatively, the coefficients can be specified using an OffsetVector
from the OffsetArrays
package.
Laurent polynomials and standard basis polynomials promote to Laurent polynomials. Laurent polynomials may be converted to a standard basis polynomial when m >= 0
.
Integration will fail if there is a x⁻¹
term in the polynomial.
Example:
julia> using Polynomials
julia> P = LaurentPolynomial
LaurentPolynomial
julia> p = P([1,1,1], -1)
LaurentPolynomial(x⁻¹ + 1 + x)
julia> q = P([1,1,1])
LaurentPolynomial(1 + x + x²)
julia> pp = Polynomial([1,1,1])
Polynomial(1 + x + x^2)
julia> p + q
LaurentPolynomial(x⁻¹ + 2 + 2*x + x²)
julia> p * q
LaurentPolynomial(x⁻¹ + 2 + 3*x + 2*x² + x³)
julia> p * pp
LaurentPolynomial(x⁻¹ + 2 + 3*x + 2*x² + x³)
julia> pp - q
LaurentPolynomial(0)
julia> derivative(p)
LaurentPolynomial(-x⁻² + 1)
julia> integrate(q)
LaurentPolynomial(1.0*x + 0.5*x² + 0.3333333333333333*x³)
julia> integrate(p) # x⁻¹ term is an issue
ERROR: ArgumentError: Can't integrate Laurent polynomial with `x⁻¹` term
julia> integrate(P([1,1,1], -5))
LaurentPolynomial(-0.25*x⁻⁴ - 0.3333333333333333*x⁻³ - 0.5*x⁻²)
julia> x⁻¹ = inv(variable(LaurentPolynomial)) # `inv` defined on monomials
LaurentPolynomial(1.0*x⁻¹)
julia> p = Polynomial([1,2,3])
Polynomial(1 + 2*x + 3*x^2)
julia> x = variable()
Polynomial(x)
julia> x^degree(p) * p(x⁻¹) # reverses coefficients
LaurentPolynomial(3.0 + 2.0*x + 1.0*x²)