poly-0.5.1.0: Polynomials
Copyright(c) 2020 Andrew Lelechenko
LicenseBSD3
MaintainerAndrew Lelechenko <andrew.lelechenko@gmail.com>
Safe HaskellSafe-Inferred
LanguageHaskell2010

Data.Poly.Laurent

Description

Laurent polynomials.

Since: 0.4.0.0

Synopsis

Documentation

data Laurent (v :: Type -> Type) (a :: Type) Source #

Laurent polynomials of one variable with coefficients from a, backed by a Vector v (boxed, unboxed, storable, etc.).

Use the pattern X and the ^- operator for construction:

>>> (X + 1) + (X^-1 - 1) :: VLaurent Integer
1 * X + 0 + 1 * X^-1
>>> (X + 1) * (1 - X^-1) :: ULaurent Int
1 * X + 0 + (-1) * X^-1

Polynomials are stored normalized, without leading and trailing zero coefficients, so 0 * X + 1 + 0 * X^-1 equals to 1.

The Ord instance does not make much sense mathematically, it is defined only for the sake of Set, Map, etc.

Due to being polymorphic by multiple axis, the performance of Laurent crucially depends on specialisation of instances. Clients are strongly recommended to compile with ghc-options: -fspecialise-aggressively and suggested to enable -O2.

Since: 0.4.0.0

Instances

Instances details
(Eq a, Num a, Vector v a) => Num (Laurent v a) Source #

Note that abs = id and signum = const 1.

Instance details

Defined in Data.Poly.Internal.Dense.Laurent

Methods

(+) :: Laurent v a -> Laurent v a -> Laurent v a #

(-) :: Laurent v a -> Laurent v a -> Laurent v a #

(*) :: Laurent v a -> Laurent v a -> Laurent v a #

negate :: Laurent v a -> Laurent v a #

abs :: Laurent v a -> Laurent v a #

signum :: Laurent v a -> Laurent v a #

fromInteger :: Integer -> Laurent v a #

(Show a, Vector v a) => Show (Laurent v a) Source # 
Instance details

Defined in Data.Poly.Internal.Dense.Laurent

Methods

showsPrec :: Int -> Laurent v a -> ShowS #

show :: Laurent v a -> String #

showList :: [Laurent v a] -> ShowS #

NFData (v a) => NFData (Laurent v a) Source # 
Instance details

Defined in Data.Poly.Internal.Dense.Laurent

Methods

rnf :: Laurent v a -> () #

Eq (v a) => Eq (Laurent v a) Source # 
Instance details

Defined in Data.Poly.Internal.Dense.Laurent

Methods

(==) :: Laurent v a -> Laurent v a -> Bool #

(/=) :: Laurent v a -> Laurent v a -> Bool #

Ord (v a) => Ord (Laurent v a) Source # 
Instance details

Defined in Data.Poly.Internal.Dense.Laurent

Methods

compare :: Laurent v a -> Laurent v a -> Ordering #

(<) :: Laurent v a -> Laurent v a -> Bool #

(<=) :: Laurent v a -> Laurent v a -> Bool #

(>) :: Laurent v a -> Laurent v a -> Bool #

(>=) :: Laurent v a -> Laurent v a -> Bool #

max :: Laurent v a -> Laurent v a -> Laurent v a #

min :: Laurent v a -> Laurent v a -> Laurent v a #

(Eq a, Ring a, GcdDomain a, Vector v a) => GcdDomain (Laurent v a) Source # 
Instance details

Defined in Data.Poly.Internal.Dense.Laurent

Methods

divide :: Laurent v a -> Laurent v a -> Maybe (Laurent v a) #

gcd :: Laurent v a -> Laurent v a -> Laurent v a #

lcm :: Laurent v a -> Laurent v a -> Laurent v a #

coprime :: Laurent v a -> Laurent v a -> Bool #

(Eq a, Ring a, Vector v a) => Ring (Laurent v a) Source # 
Instance details

Defined in Data.Poly.Internal.Dense.Laurent

Methods

negate :: Laurent v a -> Laurent v a #

(Eq a, Semiring a, Vector v a) => Semiring (Laurent v a) Source # 
Instance details

Defined in Data.Poly.Internal.Dense.Laurent

Methods

plus :: Laurent v a -> Laurent v a -> Laurent v a #

zero :: Laurent v a #

times :: Laurent v a -> Laurent v a -> Laurent v a #

one :: Laurent v a #

fromNatural :: Natural -> Laurent v a #

type VLaurent = Laurent Vector Source #

Laurent polynomials backed by boxed vectors.

Since: 0.4.0.0

type ULaurent = Laurent Vector Source #

Laurent polynomials backed by unboxed vectors.

Since: 0.4.0.0

unLaurent :: Laurent v a -> (Int, Poly v a) Source #

Deconstruct a Laurent polynomial into an offset (largest possible) and a regular polynomial.

>>> unLaurent (2 * X + 1 :: ULaurent Int)
(0,2 * X + 1)
>>> unLaurent (1 + 2 * X^-1 :: ULaurent Int)
(-1,1 * X + 2)
>>> unLaurent (2 * X^2 + X :: ULaurent Int)
(1,2 * X + 1)
>>> unLaurent (0 :: ULaurent Int)
(0,0)

Since: 0.4.0.0

toLaurent :: (Eq a, Semiring a, Vector v a) => Int -> Poly v a -> Laurent v a Source #

Construct Laurent polynomial from an offset and a regular polynomial. One can imagine it as scale, but allowing negative offsets.

>>> toLaurent 2 (2 * Data.Poly.X + 1) :: ULaurent Int
2 * X^3 + 1 * X^2
>>> toLaurent (-2) (2 * Data.Poly.X + 1) :: ULaurent Int
2 * X^-1 + 1 * X^-2

Since: 0.4.0.0

leading :: Vector v a => Laurent v a -> Maybe (Int, a) Source #

Return the leading power and coefficient of a non-zero polynomial.

>>> leading ((2 * X + 1) * (2 * X^2 - 1) :: ULaurent Int)
Just (3,4)
>>> leading (0 :: ULaurent Int)
Nothing

Since: 0.4.0.0

monomial :: (Eq a, Semiring a, Vector v a) => Int -> a -> Laurent v a Source #

Create a monomial from a power and a coefficient.

Since: 0.4.0.0

scale :: (Eq a, Semiring a, Vector v a) => Int -> a -> Laurent v a -> Laurent v a Source #

Multiply a polynomial by a monomial, expressed as a power and a coefficient.

>>> scale 2 3 (X^-2 + 1) :: ULaurent Int
3 * X^2 + 0 * X + 3

Since: 0.4.0.0

pattern X :: (Eq a, Semiring a, Vector v a) => Laurent v a Source #

The polynomial X.

X == monomial 1 one

Since: 0.4.0.0

(^-) :: (Eq a, Num a, Vector v a) => Laurent v a -> Int -> Laurent v a Source #

Used to construct monomials with negative powers.

This operator can be applied only to monomials with unit coefficients, but is instrumental to express Laurent polynomials in a mathematical fashion:

>>> X^-3 :: ULaurent Int
1 * X^-3
>>> X + 2 + 3 * (X^2)^-1 :: ULaurent Int
1 * X + 2 + 0 * X^-1 + 3 * X^-2

Since: 0.4.0.0

eval :: (Field a, Vector v a) => Laurent v a -> a -> a Source #

Evaluate the polynomial at a given point.

>>> eval (X^-2 + 1 :: ULaurent Double) 2
1.25

Since: 0.4.0.0

subst :: (Eq a, Semiring a, Vector v a, Vector w a) => Poly v a -> Laurent w a -> Laurent w a Source #

Substitute another polynomial instead of X.

>>> import Data.Poly (UPoly)
>>> subst (Data.Poly.X^2 + 1 :: UPoly Int) (X^-1 + 1 :: ULaurent Int)
2 + 2 * X^-1 + 1 * X^-2

Since: 0.4.0.0

deriv :: (Eq a, Ring a, Vector v a) => Laurent v a -> Laurent v a Source #

Take the derivative of the polynomial.

>>> deriv (X^-1 + 3 * X) :: ULaurent Int
3 + 0 * X^-1 + (-1) * X^-2

Since: 0.4.0.0