| Copyright | (c) 2020 Andrew Lelechenko |
|---|---|
| License | BSD3 |
| Maintainer | Andrew Lelechenko <[email protected]> |
| Safe Haskell | None |
| Language | Haskell2010 |
Data.Poly.Multi
Description
Sparse multivariate polynomials with Num instance.
Since: 0.5.0.0
Synopsis
- data MultiPoly (v :: Type -> Type) (n :: Nat) a
- type VMultiPoly (n :: Nat) a = MultiPoly Vector n a
- type UMultiPoly (n :: Nat) a = MultiPoly Vector n a
- unMultiPoly :: MultiPoly v n a -> v (Vector n Word, a)
- toMultiPoly :: forall a v (n :: Nat). (Eq a, Num a, Vector v (Vector n Word, a)) => v (Vector n Word, a) -> MultiPoly v n a
- monomial :: forall a (v :: Type -> Type) (n :: Nat). (Eq a, Num a, Vector v (Vector n Word, a)) => Vector n Word -> a -> MultiPoly v n a
- scale :: forall a (n :: Nat) (v :: Type -> Type). (Eq a, Num a, KnownNat n, Vector v (Vector n Word, a)) => Vector n Word -> a -> MultiPoly v n a -> MultiPoly v n a
- pattern X :: (Eq a, Num a, KnownNat n, 1 <= n, Vector v (Vector n Word, a)) => MultiPoly v n a
- pattern Y :: (Eq a, Num a, KnownNat n, 2 <= n, Vector v (Vector n Word, a)) => MultiPoly v n a
- pattern Z :: (Eq a, Num a, KnownNat n, 3 <= n, Vector v (Vector n Word, a)) => MultiPoly v n a
- eval :: forall a (v :: Type -> Type) (n :: Nat) (u :: Type -> Type). (Num a, Vector v (Vector n Word, a), Vector u a) => MultiPoly v n a -> Vector u n a -> a
- subst :: forall a (m :: Nat) (v :: Type -> Type) (n :: Nat) (w :: Type -> Type). (Eq a, Num a, KnownNat m, Vector v (Vector n Word, a), Vector w (Vector m Word, a)) => MultiPoly v n a -> Vector n (MultiPoly w m a) -> MultiPoly w m a
- deriv :: forall a (v :: Type -> Type) (n :: Nat). (Eq a, Num a, Vector v (Vector n Word, a)) => Finite n -> MultiPoly v n a -> MultiPoly v n a
- integral :: forall a (v :: Type -> Type) (n :: Nat). (Fractional a, Vector v (Vector n Word, a)) => Finite n -> MultiPoly v n a -> MultiPoly v n a
- segregate :: forall (v :: Type -> Type) (m :: Natural) a. (Vector v (Vector (1 + m) Word, a), Vector v (Vector m Word, a)) => MultiPoly v (1 + m) a -> VPoly (MultiPoly v m a)
- unsegregate :: forall (v :: Type -> Type) (m :: Natural) a. (Vector v (Vector (1 + m) Word, a), Vector v (Vector m Word, a)) => VPoly (MultiPoly v m a) -> MultiPoly v (1 + m) a
Documentation
data MultiPoly (v :: Type -> Type) (n :: Nat) a Source #
Sparse polynomials of n variables with coefficients from a,
backed by a Vector v (boxed, unboxed, storable, etc.).
Use the patterns X,
Y and
Z for construction:
>>>:set -XDataKinds>>>(X + 1) + (Y - 1) + Z :: VMultiPoly 3 Integer1 * X + 1 * Y + 1 * Z>>>(X + 1) * (Y - 1) :: UMultiPoly 2 Int1 * X * Y + (-1) * X + 1 * Y + (-1)
Polynomials are stored normalized, without
zero coefficients, so 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 MultiPoly crucially
depends on specialisation of instances. Clients are strongly recommended
to compile with ghc-options: -fspecialise-aggressively and suggested to enable -O2.
Since: 0.5.0.0
Instances
type VMultiPoly (n :: Nat) a = MultiPoly Vector n a Source #
Multivariate polynomials backed by boxed vectors.
Since: 0.5.0.0
type UMultiPoly (n :: Nat) a = MultiPoly Vector n a Source #
Multivariate polynomials backed by unboxed vectors.
Since: 0.5.0.0
unMultiPoly :: MultiPoly v n a -> v (Vector n Word, a) Source #
Convert a MultiPoly to a vector of (powers, coefficient) pairs.
Since: 0.5.0.0
toMultiPoly :: forall a v (n :: Nat). (Eq a, Num a, Vector v (Vector n Word, a)) => v (Vector n Word, a) -> MultiPoly v n a Source #
Make a MultiPoly from a list of (powers, coefficient) pairs.
>>>:set -XOverloadedLists -XDataKinds>>>import Data.Vector.Generic.Sized (fromTuple)>>>toMultiPoly [(fromTuple (0,0),1),(fromTuple (0,1),2),(fromTuple (1,0),3)] :: VMultiPoly 2 Integer3 * X + 2 * Y + 1>>>toMultiPoly [(fromTuple (0,0),0),(fromTuple (0,1),0),(fromTuple (1,0),0)] :: UMultiPoly 2 Int0
Since: 0.5.0.0
monomial :: forall a (v :: Type -> Type) (n :: Nat). (Eq a, Num a, Vector v (Vector n Word, a)) => Vector n Word -> a -> MultiPoly v n a Source #
Create a monomial from powers and a coefficient.
Since: 0.5.0.0
scale :: forall a (n :: Nat) (v :: Type -> Type). (Eq a, Num a, KnownNat n, Vector v (Vector n Word, a)) => Vector n Word -> a -> MultiPoly v n a -> MultiPoly v n a Source #
Multiply a polynomial by a monomial, expressed as powers and a coefficient.
>>>:set -XDataKinds>>>import Data.Vector.Generic.Sized (fromTuple)>>>scale (fromTuple (1, 1)) 3 (X^2 + Y) :: UMultiPoly 2 Int3 * X^3 * Y + 3 * X * Y^2
Since: 0.5.0.0
pattern X :: (Eq a, Num a, KnownNat n, 1 <= n, Vector v (Vector n Word, a)) => MultiPoly v n a Source #
Create a polynomial equal to the first variable.
Since: 0.5.0.0
pattern Y :: (Eq a, Num a, KnownNat n, 2 <= n, Vector v (Vector n Word, a)) => MultiPoly v n a Source #
Create a polynomial equal to the second variable.
Since: 0.5.0.0
pattern Z :: (Eq a, Num a, KnownNat n, 3 <= n, Vector v (Vector n Word, a)) => MultiPoly v n a Source #
Create a polynomial equal to the third variable.
Since: 0.5.0.0
eval :: forall a (v :: Type -> Type) (n :: Nat) (u :: Type -> Type). (Num a, Vector v (Vector n Word, a), Vector u a) => MultiPoly v n a -> Vector u n a -> a Source #
Evaluate the polynomial at a given point.
>>>:set -XDataKinds>>>import Data.Vector.Generic.Sized (fromTuple)>>>eval (X^2 + Y^2 :: UMultiPoly 2 Int) (fromTuple (3, 4) :: Data.Vector.Sized.Vector 2 Int)25
Since: 0.5.0.0
subst :: forall a (m :: Nat) (v :: Type -> Type) (n :: Nat) (w :: Type -> Type). (Eq a, Num a, KnownNat m, Vector v (Vector n Word, a), Vector w (Vector m Word, a)) => MultiPoly v n a -> Vector n (MultiPoly w m a) -> MultiPoly w m a Source #
Substitute other polynomials instead of the variables.
>>>:set -XDataKinds>>>import Data.Vector.Generic.Sized (fromTuple)>>>subst (X^2 + Y^2 + Z^2 :: UMultiPoly 3 Int) (fromTuple (X + 1, Y + 1, X + Y :: UMultiPoly 2 Int))2 * X^2 + 2 * X * Y + 2 * X + 2 * Y^2 + 2 * Y + 2
Since: 0.5.0.0
deriv :: forall a (v :: Type -> Type) (n :: Nat). (Eq a, Num a, Vector v (Vector n Word, a)) => Finite n -> MultiPoly v n a -> MultiPoly v n a Source #
Take the derivative of the polynomial with respect to the i-th variable.
>>>:set -XDataKinds>>>deriv 0 (X^3 + 3 * Y) :: UMultiPoly 2 Int3 * X^2>>>deriv 1 (X^3 + 3 * Y) :: UMultiPoly 2 Int3
Since: 0.5.0.0
integral :: forall a (v :: Type -> Type) (n :: Nat). (Fractional a, Vector v (Vector n Word, a)) => Finite n -> MultiPoly v n a -> MultiPoly v n a Source #
Compute an indefinite integral of the polynomial with respect to the i-th variable, setting the constant term to zero.
>>>:set -XDataKinds>>>integral 0 (3 * X^2 + 2 * Y) :: UMultiPoly 2 Double1.0 * X^3 + 2.0 * X * Y>>>integral 1 (3 * X^2 + 2 * Y) :: UMultiPoly 2 Double3.0 * X^2 * Y + 1.0 * Y^2
Since: 0.5.0.0
segregate :: forall (v :: Type -> Type) (m :: Natural) a. (Vector v (Vector (1 + m) Word, a), Vector v (Vector m Word, a)) => MultiPoly v (1 + m) a -> VPoly (MultiPoly v m a) Source #
Interpret a multivariate polynomial over 1+m variables as a univariate polynomial, whose coefficients are multivariate polynomials over the last m variables.
Since: 0.5.0.0
unsegregate :: forall (v :: Type -> Type) (m :: Natural) a. (Vector v (Vector (1 + m) Word, a), Vector v (Vector m Word, a)) => VPoly (MultiPoly v m a) -> MultiPoly v (1 + m) a Source #
Interpret a univariate polynomials, whose coefficients are multivariate polynomials over the first m variables, as a multivariate polynomial over 1+m variables.
Since: 0.5.0.0