poly-0.5.0.0: Polynomials

Copyright(c) 2020 Andrew Lelechenko
LicenseBSD3
MaintainerAndrew Lelechenko <andrew.lelechenko@gmail.com>
Safe HaskellNone
LanguageHaskell2010

Data.Poly.Multi.Laurent

Description

Sparse multivariate Laurent polynomials.

Synopsis

Documentation

data MultiLaurent (v :: Type -> Type) (n :: Nat) (a :: Type) Source #

Sparse Laurent polynomials of n variables with coefficients from a, backed by a Vector v (boxed, unboxed, storable, etc.).

Use patterns X, Y, Z and operator ^- for construction:

>>> (X + 1) + (Y^-1 - 1) :: VMultiLaurent 2 Integer
1 * X + 1 * Y^-1
>>> (X + 1) * (Z - X^-1) :: UMultiLaurent 3 Int
1 * X * Z + 1 * Z + (-1) + (-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
(Eq a, Ring a, GcdDomain a, Vector v (Vector 1 Word, a)) => GcdDomain (Laurent v a) Source # 
Instance details

Defined in Data.Poly.Internal.Multi.Laurent

Methods

divide :: Laurent v a -> Laurent v a -> Maybe (Laurent v a) #

gcd :: Laurent v a -> Laurent v a -> Laurent v a #

lcm :: Laurent v a -> Laurent v a -> Laurent v a #

coprime :: Laurent v a -> Laurent v a -> Bool #

(Eq a, Semiring a, KnownNat n, Vector v (Vector n Int, a), Vector v (Vector n Word, a)) => IsList (MultiLaurent v n a) Source # 
Instance details

Defined in Data.Poly.Internal.Multi.Laurent

Associated Types

type Item (MultiLaurent v n a) :: Type #

Methods

fromList :: [Item (MultiLaurent v n a)] -> MultiLaurent v n a #

fromListN :: Int -> [Item (MultiLaurent v n a)] -> MultiLaurent v n a #

toList :: MultiLaurent v n a -> [Item (MultiLaurent v n a)] #

Eq (v (Vector n Word, a)) => Eq (MultiLaurent v n a) Source # 
Instance details

Defined in Data.Poly.Internal.Multi.Laurent

Methods

(==) :: MultiLaurent v n a -> MultiLaurent v n a -> Bool #

(/=) :: MultiLaurent v n a -> MultiLaurent v n a -> Bool #

(Eq a, Num a, KnownNat n, Vector v (Vector n Word, a)) => Num (MultiLaurent v n a) Source #

Note that abs = id and signum = const 1.

Instance details

Defined in Data.Poly.Internal.Multi.Laurent

Methods

(+) :: MultiLaurent v n a -> MultiLaurent v n a -> MultiLaurent v n a #

(-) :: MultiLaurent v n a -> MultiLaurent v n a -> MultiLaurent v n a #

(*) :: MultiLaurent v n a -> MultiLaurent v n a -> MultiLaurent v n a #

negate :: MultiLaurent v n a -> MultiLaurent v n a #

abs :: MultiLaurent v n a -> MultiLaurent v n a #

signum :: MultiLaurent v n a -> MultiLaurent v n a #

fromInteger :: Integer -> MultiLaurent v n a #

Ord (v (Vector n Word, a)) => Ord (MultiLaurent v n a) Source # 
Instance details

Defined in Data.Poly.Internal.Multi.Laurent

Methods

compare :: MultiLaurent v n a -> MultiLaurent v n a -> Ordering #

(<) :: MultiLaurent v n a -> MultiLaurent v n a -> Bool #

(<=) :: MultiLaurent v n a -> MultiLaurent v n a -> Bool #

(>) :: MultiLaurent v n a -> MultiLaurent v n a -> Bool #

(>=) :: MultiLaurent v n a -> MultiLaurent v n a -> Bool #

max :: MultiLaurent v n a -> MultiLaurent v n a -> MultiLaurent v n a #

min :: MultiLaurent v n a -> MultiLaurent v n a -> MultiLaurent v n a #

(Show a, KnownNat n, Vector v (Vector n Word, a)) => Show (MultiLaurent v n a) Source # 
Instance details

Defined in Data.Poly.Internal.Multi.Laurent

Methods

showsPrec :: Int -> MultiLaurent v n a -> ShowS #

show :: MultiLaurent v n a -> String #

showList :: [MultiLaurent v n a] -> ShowS #

NFData (v (Vector n Word, a)) => NFData (MultiLaurent v n a) Source # 
Instance details

Defined in Data.Poly.Internal.Multi.Laurent

Methods

rnf :: MultiLaurent v n a -> () #

(Eq a, Ring a, GcdDomain a, KnownNat n, forall (m :: Nat). KnownNat m => Vector v (Vector m Word, a), forall (m :: Nat). KnownNat m => Eq (v (Vector m Word, a))) => GcdDomain (MultiLaurent v n a) Source # 
Instance details

Defined in Data.Poly.Internal.Multi.Laurent

Methods

divide :: MultiLaurent v n a -> MultiLaurent v n a -> Maybe (MultiLaurent v n a) #

gcd :: MultiLaurent v n a -> MultiLaurent v n a -> MultiLaurent v n a #

lcm :: MultiLaurent v n a -> MultiLaurent v n a -> MultiLaurent v n a #

coprime :: MultiLaurent v n a -> MultiLaurent v n a -> Bool #

(Eq a, Semiring a, KnownNat n, Vector v (Vector n Word, a)) => Semiring (MultiLaurent v n a) Source # 
Instance details

Defined in Data.Poly.Internal.Multi.Laurent

Methods

plus :: MultiLaurent v n a -> MultiLaurent v n a -> MultiLaurent v n a #

zero :: MultiLaurent v n a #

times :: MultiLaurent v n a -> MultiLaurent v n a -> MultiLaurent v n a #

one :: MultiLaurent v n a #

fromNatural :: Natural -> MultiLaurent v n a #

(Eq a, Ring a, KnownNat n, Vector v (Vector n Word, a)) => Ring (MultiLaurent v n a) Source # 
Instance details

Defined in Data.Poly.Internal.Multi.Laurent

Methods

negate :: MultiLaurent v n a -> MultiLaurent v n a #

type Item (MultiLaurent v n a) Source # 
Instance details

Defined in Data.Poly.Internal.Multi.Laurent

type Item (MultiLaurent v n a) = (Vector n Int, a)

type VMultiLaurent (n :: Nat) (a :: Type) = MultiLaurent Vector n a Source #

Multivariate Laurent polynomials backed by boxed vectors.

type UMultiLaurent (n :: Nat) (a :: Type) = MultiLaurent Vector n a Source #

Multivariate Laurent polynomials backed by unboxed vectors.

unMultiLaurent :: MultiLaurent v n a -> (Vector n Int, MultiPoly v n a) Source #

Deconstruct a MultiLaurent polynomial into an offset (largest possible) and a regular polynomial.

>>> unMultiLaurent (2 * X + 1 :: UMultiLaurent 2 Int)
(Vector [0,0],2 * X + 1)
>>> unMultiLaurent (1 + 2 * X^-1 :: UMultiLaurent 2 Int)
(Vector [-1,0],1 * X + 2)
>>> unMultiLaurent (2 * X^2 + X :: UMultiLaurent 2 Int)
(Vector [1,0],2 * X + 1)
>>> unMultiLaurent (0 :: UMultiLaurent 2 Int)
(Vector [0,0],0)

toMultiLaurent :: (KnownNat n, Vector v (Vector n Word, a)) => Vector n Int -> MultiPoly v n a -> MultiLaurent v n a Source #

Construct MultiLaurent polynomial from an offset and a regular polynomial. One can imagine it as scale, but allowing negative offsets.

>>> :set -XDataKinds
>>> import Data.Vector.Generic.Sized (fromTuple)
>>> toMultiLaurent (fromTuple (2, 0)) (2 * Data.Poly.Multi.X + 1) :: UMultiLaurent 2 Int
2 * X^3 + 1 * X^2
>>> toMultiLaurent (fromTuple (0, -2)) (2 * Data.Poly.Multi.X + 1) :: UMultiLaurent 2 Int
2 * X * Y^-2 + 1 * Y^-2

monomial :: (Eq a, Semiring a, KnownNat n, Vector v (Vector n Word, a)) => Vector n Int -> a -> MultiLaurent v n a Source #

Create a monomial from a power and a coefficient.

scale :: (Eq a, Semiring a, KnownNat n, Vector v (Vector n Word, a)) => Vector n Int -> a -> MultiLaurent v n a -> MultiLaurent v n a Source #

Multiply a polynomial by a monomial, expressed as a power and a coefficient.

>>> :set -XDataKinds
>>> import Data.Vector.Generic.Sized (fromTuple)
>>> scale (fromTuple (1, 1)) 3 (X^-2 + Y) :: UMultiLaurent 2 Int
3 * X * Y^2 + 3 * X^-1 * Y

pattern X :: (Eq a, Semiring a, KnownNat n, 1 <= n, Vector v (Vector n Word, a)) => MultiLaurent v n a Source #

Create a polynomial equal to the first variable.

pattern Y :: (Eq a, Semiring a, KnownNat n, 2 <= n, Vector v (Vector n Word, a)) => MultiLaurent v n a Source #

Create a polynomial equal to the second variable.

pattern Z :: (Eq a, Semiring a, KnownNat n, 3 <= n, Vector v (Vector n Word, a)) => MultiLaurent v n a Source #

Create a polynomial equal to the third variable.

(^-) :: (Eq a, Semiring a, KnownNat n, Vector v (Vector n Word, a)) => MultiLaurent v n a -> Int -> MultiLaurent v n a Source #

This operator can be applied only to monomials with unit coefficients, but is still instrumental to express Laurent polynomials in mathematical fashion:

>>> 3 * X^-1 + 2 * (Y^2)^-2 :: UMultiLaurent 2 Int
2 * Y^-4 + 3 * X^-1

eval :: (Field a, Vector v (Vector n Word, a), Vector u a) => MultiLaurent v n a -> Vector u n a -> a Source #

Evaluate at a given point.

>>> :set -XDataKinds
>>> import Data.Vector.Generic.Sized (fromTuple)
>>> eval (X^2 + Y^-1 :: UMultiLaurent 2 Double) (fromTuple (3, 4) :: Data.Vector.Sized.Vector 2 Double)
9.25

subst :: (Eq a, Semiring a, KnownNat n, Vector v (Vector n Word, a), Vector w (Vector n Word, a)) => MultiPoly v n a -> Vector n (MultiLaurent w n a) -> MultiLaurent w n a Source #

Substitute another polynomial instead of X.

>>> :set -XDataKinds
>>> import Data.Vector.Generic.Sized (fromTuple)
>>> import Data.Poly.Multi (UMultiPoly)
>>> subst (Data.Poly.Multi.X * Data.Poly.Multi.Y :: UMultiPoly 2 Int) (fromTuple (X + Y^-1, Y + X^-1 :: UMultiLaurent 2 Int))
1 * X * Y + 2 + 1 * X^-1 * Y^-1

deriv :: (Eq a, Ring a, KnownNat n, Vector v (Vector n Word, a)) => Finite n -> MultiLaurent v n a -> MultiLaurent v n a Source #

Take a derivative with respect to the i-th variable.

>>> :set -XDataKinds
>>> deriv 0 (X^3 + 3 * Y) :: UMultiLaurent 2 Int
3 * X^2
>>> deriv 1 (X^3 + 3 * Y) :: UMultiLaurent 2 Int
3

segregate :: (KnownNat m, Vector v (Vector (1 + m) Word, a), Vector v (Vector m Word, a)) => MultiLaurent v (1 + m) a -> VLaurent (MultiLaurent v m a) Source #

Interpret a multivariate Laurent polynomial over 1+m variables as a univariate Laurent polynomial, whose coefficients are multivariate Laurent polynomials over the last m variables.

unsegregate :: forall v m a. (KnownNat m, KnownNat (1 + m), Vector v (Vector (1 + m) Word, a), Vector v (Vector m Word, a)) => VLaurent (MultiLaurent v m a) -> MultiLaurent v (1 + m) a Source #

Interpret a univariate Laurent polynomials, whose coefficients are multivariate Laurent polynomials over the first m variables, as a multivariate polynomial over 1+m variables.