StaticUnivariatePolynomials provides a Polynomial
type representing a dense univariate polynomial. In contrast to e.g. JuliaMath/Polynomials.jl, coefficients are stored in an NTuple
.
This makes Polynomial
a stack-allocatable bitstype when the coefficient type is a bitstype, enabling high performance.
Polynomials may be created by passing in coeffients ordered from lowest to highest degree:
julia> using StaticUnivariatePolynomials, BenchmarkTools, Test
julia> p = Polynomial(1, 2, 3) # 1 + 2x + 3x^2
Polynomial{3,Int64}((1, 2, 3))
The Polynomial type overloads the call operator for evaluation, and is implemented using Base.@evalpoly
(for real coefficients, using Horner's method):
julia> p(4)
57
Evaluation is fast:
julia> @btime $p(x) setup = x = rand()
2.052 ns (0 allocations: 0 bytes)
Basic arithmetic is implemented:
julia> p + 1
Polynomial{3,Int64}((2, 2, 3))
julia> p + Polynomial(3, 2, 1)
Polynomial{3,Int64}((4, 4, 4))
julia> p / 4
Polynomial{3,Float64}((0.25, 0.5, 0.75))
julia> p * p
Polynomial{5,Int64}((1, 4, 10, 12, 9))
Calculus:
julia> import StaticUnivariatePolynomials: derivative, integral
julia> P = integral(p, 5) # integral of p such that P(0) = 5
Polynomial{4,Float64}((5.0, 1.0, 1.0, 1.0))
julia> P′ = derivative(P)
Polynomial{3,Float64}((1.0, 2.0, 3.0))
julia> @test typeof(P′)(p) === P′
Test Passed