poly-0.4.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 a 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 a, Eq (v a), Field a, Vector v a) => GcdDomain (LaurentOverField (Laurent v a)) Source # 
Instance details

Defined in Data.Poly.Laurent

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

Defined in Data.Poly.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.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.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.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.Laurent

Methods

rnf :: Laurent v a -> () #

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

Consider using LaurentOverField wrapper, which provides a much faster implementation of gcd for polynomials over Field.

Instance details

Defined in Data.Poly.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.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.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^4 + 0 * X^3 + 3 * X^2 + 0 * X + 0

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

Create an identity polynomial.

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

This operator can be applied only to X, but is instrumental to express Laurent polynomials in mathematical fashion:

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

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

Evaluate at a given point.

>>> eval (X^2 + 1 :: ULaurent Int) 3
10

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.

>>> subst (X^2 + 1 :: UPoly Int) (X + 1 :: ULaurent Int)
1 * X^2 + 2 * X + 2

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

Take a derivative.

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

newtype LaurentOverField laurent Source #

Wrapper for Laurent polynomials over Field, providing a faster GcdDomain instance.

Constructors

LaurentOverField 

Fields

Instances
Eq laurent => Eq (LaurentOverField laurent) Source # 
Instance details

Defined in Data.Poly.Laurent

Methods

(==) :: LaurentOverField laurent -> LaurentOverField laurent -> Bool #

(/=) :: LaurentOverField laurent -> LaurentOverField laurent -> Bool #

Num laurent => Num (LaurentOverField laurent) Source # 
Instance details

Defined in Data.Poly.Laurent

Methods

(+) :: LaurentOverField laurent -> LaurentOverField laurent -> LaurentOverField laurent #

(-) :: LaurentOverField laurent -> LaurentOverField laurent -> LaurentOverField laurent #

(*) :: LaurentOverField laurent -> LaurentOverField laurent -> LaurentOverField laurent #

negate :: LaurentOverField laurent -> LaurentOverField laurent #

abs :: LaurentOverField laurent -> LaurentOverField laurent #

signum :: LaurentOverField laurent -> LaurentOverField laurent #

fromInteger :: Integer -> LaurentOverField laurent #

Ord laurent => Ord (LaurentOverField laurent) Source # 
Instance details

Defined in Data.Poly.Laurent

Methods

compare :: LaurentOverField laurent -> LaurentOverField laurent -> Ordering #

(<) :: LaurentOverField laurent -> LaurentOverField laurent -> Bool #

(<=) :: LaurentOverField laurent -> LaurentOverField laurent -> Bool #

(>) :: LaurentOverField laurent -> LaurentOverField laurent -> Bool #

(>=) :: LaurentOverField laurent -> LaurentOverField laurent -> Bool #

max :: LaurentOverField laurent -> LaurentOverField laurent -> LaurentOverField laurent #

min :: LaurentOverField laurent -> LaurentOverField laurent -> LaurentOverField laurent #

Show laurent => Show (LaurentOverField laurent) Source # 
Instance details

Defined in Data.Poly.Laurent

Methods

showsPrec :: Int -> LaurentOverField laurent -> ShowS #

show :: LaurentOverField laurent -> String #

showList :: [LaurentOverField laurent] -> ShowS #

NFData laurent => NFData (LaurentOverField laurent) Source # 
Instance details

Defined in Data.Poly.Laurent

Methods

rnf :: LaurentOverField laurent -> () #

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

Defined in Data.Poly.Laurent

Semiring laurent => Semiring (LaurentOverField laurent) Source # 
Instance details

Defined in Data.Poly.Laurent

Methods

plus :: LaurentOverField laurent -> LaurentOverField laurent -> LaurentOverField laurent #

zero :: LaurentOverField laurent #

times :: LaurentOverField laurent -> LaurentOverField laurent -> LaurentOverField laurent #

one :: LaurentOverField laurent #

fromNatural :: Natural -> LaurentOverField laurent #

Ring laurent => Ring (LaurentOverField laurent) Source # 
Instance details

Defined in Data.Poly.Laurent

Methods

negate :: LaurentOverField laurent -> LaurentOverField laurent #