poly-0.5.0.0: Polynomials

Copyright(c) 2020 Andrew Lelechenko
LicenseBSD3
MaintainerAndrew Lelechenko <andrew.lelechenko@gmail.com>
Safe HaskellNone
LanguageHaskell2010

Data.Poly.Laurent

Description

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 pattern X and 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.

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

Instances
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 #

(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 #

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 #

(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 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, 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 #

(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 #

type VLaurent = Laurent Vector Source #

Laurent polynomials backed by boxed vectors.

type ULaurent = Laurent Vector Source #

Laurent polynomials backed by unboxed vectors.

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)

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

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

Return a 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

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

Create a monomial from a power and a coefficient.

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

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

Create an identity polynomial.

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

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

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

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

Evaluate at a given point.

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

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

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

Take a derivative.

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