Copyright | (c) 2020 Andrew Lelechenko |
---|---|
License | BSD3 |
Maintainer | Andrew Lelechenko <[email protected]> |
Safe Haskell | None |
Language | Haskell2010 |
Data.Poly.Multi.Semiring
Description
Sparse multivariate polynomials with a Semiring
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, Semiring 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, Semiring 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, Semiring 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, Semiring a, KnownNat n, 1 <= n, Vector v (Vector n Word, a)) => MultiPoly v n a
- pattern Y :: (Eq a, Semiring a, KnownNat n, 2 <= n, Vector v (Vector n Word, a)) => MultiPoly v n a
- pattern Z :: (Eq a, Semiring 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). (Semiring 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, Semiring 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, Semiring 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). (Field 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 Integer
1 * X + 1 * Y + 1 * Z>>>
(X + 1) * (Y - 1) :: UMultiPoly 2 Int
1 * 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, Semiring 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 Integer
3 * X + 2 * Y + 1>>>
toMultiPoly [(fromTuple (0,0),0),(fromTuple (0,1),0),(fromTuple (1,0),0)] :: UMultiPoly 2 Int
0
Since: 0.5.0.0
monomial :: forall a (v :: Type -> Type) (n :: Nat). (Eq a, Semiring 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, Semiring 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 Int
3 * X^3 * Y + 3 * X * Y^2
Since: 0.5.0.0
pattern X :: (Eq a, Semiring 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, Semiring 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, Semiring 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). (Semiring 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, Semiring 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, Semiring 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 Int
3 * X^2>>>
deriv 1 (X^3 + 3 * Y) :: UMultiPoly 2 Int
3
Since: 0.5.0.0
integral :: forall a (v :: Type -> Type) (n :: Nat). (Field 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 Double
1.0 * X^3 + 2.0 * X * Y>>>
integral 1 (3 * X^2 + 2 * Y) :: UMultiPoly 2 Double
3.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