Copyright | (c) 2020 Andrew Lelechenko |
---|---|
License | BSD3 |
Maintainer | Andrew Lelechenko <[email protected]> |
Safe Haskell | None |
Language | Haskell2010 |
Data.Poly.Laurent
Description
Since: 0.4.0.0
Synopsis
- data Laurent (v :: Type -> Type) a
- type VLaurent = Laurent Vector
- type ULaurent = Laurent Vector
- unLaurent :: forall (v :: Type -> Type) a. Laurent v a -> (Int, Poly v a)
- toLaurent :: forall a (v :: Type -> Type). (Eq a, Semiring a, Vector v a) => Int -> Poly v a -> Laurent v a
- leading :: forall (v :: Type -> Type) a. Vector v a => Laurent v a -> Maybe (Int, a)
- monomial :: forall a (v :: Type -> Type). (Eq a, Semiring a, Vector v a) => Int -> a -> Laurent v a
- scale :: forall a (v :: Type -> Type). (Eq a, Semiring a, Vector v a) => Int -> a -> Laurent v a -> Laurent v a
- pattern X :: (Eq a, Semiring a, Vector v a) => Laurent v a
- (^-) :: forall a (v :: Type -> Type). (Eq a, Num a, Vector v a) => Laurent v a -> Int -> Laurent v a
- eval :: forall a (v :: Type -> Type). (Field a, Vector v a) => Laurent v a -> a -> a
- subst :: forall a (v :: Type -> Type) (w :: Type -> Type). (Eq a, Semiring a, Vector v a, Vector w a) => Poly v a -> Laurent w a -> Laurent w a
- deriv :: forall a (v :: Type -> Type). (Eq a, Ring a, Vector v a) => Laurent v a -> Laurent v a
Documentation
data Laurent (v :: Type -> Type) a 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
(Eq a, Num a, Vector v a) => Num (Laurent v a) Source # | |
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 # | |
NFData (v a) => NFData (Laurent v a) Source # | |
Defined in Data.Poly.Internal.Dense.Laurent | |
Eq (v a) => Eq (Laurent v a) Source # | |
Ord (v a) => Ord (Laurent v a) Source # | |
Defined in Data.Poly.Internal.Dense.Laurent | |
(Eq a, Ring a, GcdDomain a, Vector v a) => GcdDomain (Laurent v a) Source # | |
(Eq a, Ring a, Vector v a) => Ring (Laurent v a) Source # | |
Defined in Data.Poly.Internal.Dense.Laurent | |
(Eq a, Semiring a, Vector v a) => Semiring (Laurent v a) Source # | |
unLaurent :: forall (v :: Type -> Type) a. 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 :: forall a (v :: Type -> Type). (Eq a, Semiring a, Vector v a) => Int -> Poly v a -> Laurent v a Source #
leading :: forall (v :: Type -> Type) a. 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 :: forall a (v :: Type -> Type). (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 :: forall a (v :: Type -> Type). (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
(^-) :: forall a (v :: Type -> Type). (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 :: forall a (v :: Type -> Type). (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 :: forall a (v :: Type -> Type) (w :: Type -> Type). (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