# SIMDPoly.jl

SIMD optimized polyomial evaluation for real and complex inputs.

## Usage

The functions for packing and evaluating polynomials are suffixed
with `(N)x(L)[r|c]`

:

`N`

is the number of polynomials to evaluate`L`

is the number of SIMD lanes per polynomial`r`

or`c`

signifies that the polynomial will be evaluated with a real or complex input, respectively.

For instance evaluating one polynomial with four SIMD lanes:

```
coeffs = ntuple(x -> Float64(x), 30) # p(x) = 1 + 2x^1 + ... + 30x^29
packed = packpoly1x4r(coeffs) # pack coefficients into SIMD vectors
result = evalpoly1x4r(2.0, packed) # evaluate p(2)
```

Complex polynomial division:

```
poly1 = ntuple(x -> Float64(x), 30) # p(x) = 1 + 2x^1 + ... + 30x^29
poly2 = reverse(poly1) # q(x) = 30 + 29x^1 + ... + x^29
packed = packpoly2x2c(poly1, poly2)
result = evalpolydiv2x2c(2.0+2.0im, packed) # p(2+2i) / q(2+2i)
```

## Benchmarks

Note: these only measure evaluation time; the packed coefficients have been precomputed.