| 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 Integer1 * X + 0 + 1 * X^-1>>>(X + 1) * (1 - X^-1) :: ULaurent Int1 * 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 Int3 * 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 Int1 * X^-3>>>X + 2 + 3 * (X^2)^-1 :: ULaurent Int1 * 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) 21.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