Copyright | (c) 2020 Andrew Lelechenko |
---|---|
License | BSD3 |
Maintainer | Andrew Lelechenko <andrew.lelechenko@gmail.com> |
Safe Haskell | None |
Language | Haskell2010 |
Sparse Laurent polynomials.
Synopsis
- data Laurent v a
- type VLaurent = Laurent Vector
- type ULaurent = Laurent Vector
- unLaurent :: Laurent v a -> (Int, Poly v a)
- toLaurent :: (Eq a, Semiring a, Vector v (Word, a)) => Int -> Poly v a -> Laurent v a
- leading :: Vector v (Word, a) => Laurent v a -> Maybe (Int, a)
- monomial :: (Eq a, Semiring a, Vector v (Word, a)) => Int -> a -> Laurent v a
- scale :: (Eq a, Semiring a, Vector v (Word, a)) => Int -> a -> Laurent v a -> Laurent v a
- pattern X :: (Eq a, Semiring a, Vector v (Word, a), Eq (v (Word, a))) => Laurent v a
- (^-) :: (Eq a, Semiring a, Vector v (Word, a), Eq (v (Word, a))) => Laurent v a -> Int -> Laurent v a
- eval :: (Field a, Vector v (Word, a)) => Laurent v a -> a -> a
- subst :: (Eq a, Semiring a, Vector v (Word, a), Vector w (Word, a)) => Poly v a -> Laurent w a -> Laurent w a
- deriv :: (Eq a, Ring a, Vector v (Word, a)) => Laurent v a -> Laurent v a
Documentation
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 + 1 * X^-1>>>
(X + 1) * (1 - X^-1) :: ULaurent Int
1 * X + (-1) * X^-1
Polynomials are stored normalized, without 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
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)
leading :: Vector v (Word, 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 (Word, a)) => Int -> a -> Laurent v a Source #
Create a monomial from a power and a coefficient.
scale :: (Eq a, Semiring a, Vector v (Word, 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 + 3 * X^2
pattern X :: (Eq a, Semiring a, Vector v (Word, a), Eq (v (Word, a))) => Laurent v a Source #
Create an identity polynomial.
(^-) :: (Eq a, Semiring a, Vector v (Word, a), Eq (v (Word, 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 (Word, a)) => Laurent v a -> a -> a Source #
Evaluate at a given point.
>>>
eval (X^2 + 1 :: ULaurent Int) 3
10