Safe Haskell | Safe |
---|---|
Language | Haskell2010 |
Free modules over some generator set.
This module should be imported qualified.
Synopsis
- class PartialMonoid a where
- class Ord (BaseF a) => FreeModule a where
- type BaseF a :: *
- type CoeffF a :: *
- toFreeModule :: a -> FreeMod (CoeffF a) (BaseF a)
- fromFreeModule :: FreeMod (CoeffF a) (BaseF a) -> a
- newtype FreeMod coeff base = FreeMod {}
- type ZMod base = FreeMod Integer base
- type QMod base = FreeMod Rational base
- size :: FreeMod c b -> Int
- supportList :: Ord b => FreeMod c b -> [b]
- supportSet :: Ord b => FreeMod c b -> Set b
- normalize :: (Ord b, Eq c, Num c) => FreeMod c b -> FreeMod c b
- safeEq :: (Ord b, Eq b, Eq c, Num c) => FreeMod c b -> FreeMod c b -> Bool
- zero :: FreeMod c b
- isZero :: Ord b => FreeMod c b -> Bool
- generator :: Num c => b -> FreeMod c b
- singleton :: (Ord b, Num c, Eq c) => b -> c -> FreeMod c b
- fromList :: (Eq c, Num c, Ord b) => [(b, c)] -> FreeMod c b
- fromMap :: (Eq c, Num c, Ord b) => Map b c -> FreeMod c b
- fromGeneratorSet :: (Ord b, Num c) => Set b -> FreeMod c b
- fromGeneratorList :: (Ord b, Eq c, Num c) => [b] -> FreeMod c b
- toList :: FreeMod c b -> [(b, c)]
- coeffOf :: (Ord b, Num c) => b -> FreeMod c b -> c
- findMaxTerm :: Ord b => FreeMod c b -> Maybe (b, c)
- findMinTerm :: Ord b => FreeMod c b -> Maybe (b, c)
- neg :: Num c => FreeMod c b -> FreeMod c b
- add :: (Ord b, Eq c, Num c) => FreeMod c b -> FreeMod c b -> FreeMod c b
- sub :: (Ord b, Eq c, Num c) => FreeMod c b -> FreeMod c b -> FreeMod c b
- scale :: (Ord b, Eq c, Num c) => c -> FreeMod c b -> FreeMod c b
- divideByConst :: (Ord b, Eq c, Integral c, Show c) => c -> FreeMod c b -> FreeMod c b
- addScale :: (Ord b, Eq c, Num c) => FreeMod c b -> c -> FreeMod c b -> FreeMod c b
- subScale :: (Ord b, Eq c, Num c) => FreeMod c b -> c -> FreeMod c b -> FreeMod c b
- sum :: (Ord b, Eq c, Num c) => [FreeMod c b] -> FreeMod c b
- linComb :: (Ord b, Eq c, Num c) => [(c, FreeMod c b)] -> FreeMod c b
- flatMap :: (Ord b1, Ord b2, Eq c, Num c) => (b1 -> FreeMod c b2) -> FreeMod c b1 -> FreeMod c b2
- flatMap' :: (Ord b1, Ord b2, Eq c2, Num c2) => (c1 -> c2) -> (b1 -> FreeMod c2 b2) -> FreeMod c1 b1 -> FreeMod c2 b2
- histogram :: (Ord b, Num c) => [b] -> FreeMod c b
- one :: (Monoid b, Num c) => FreeMod c b
- konst :: (Monoid b, Eq c, Num c) => c -> FreeMod c b
- mul :: (Ord b, Monoid b, Eq c, Num c) => FreeMod c b -> FreeMod c b -> FreeMod c b
- mul' :: (Ord b, PartialMonoid b, Eq c, Num c) => FreeMod c b -> FreeMod c b -> FreeMod c b
- product :: (Ord b, Monoid b, Eq c, Num c) => [FreeMod c b] -> FreeMod c b
- product' :: (Ord b, PartialMonoid b, Eq c, Num c) => [FreeMod c b] -> FreeMod c b
- mulWith :: (Ord b, Eq c, Num c) => (b -> b -> b) -> FreeMod c b -> FreeMod c b -> FreeMod c b
- mulWith' :: (Ord b, Eq c, Num c) => (b -> b -> Maybe b) -> FreeMod c b -> FreeMod c b -> FreeMod c b
- mulWith'' :: (Ord b, Eq c, Num c) => (b -> b -> Maybe (b, c)) -> FreeMod c b -> FreeMod c b -> FreeMod c b
- productWith :: (Ord b, Eq c, Num c) => b -> (b -> b -> b) -> [FreeMod c b] -> FreeMod c b
- productWith' :: (Ord b, Eq c, Num c) => b -> (b -> b -> Maybe b) -> [FreeMod c b] -> FreeMod c b
- productWith'' :: (Ord b, Eq c, Num c) => b -> (b -> b -> Maybe (b, c)) -> [FreeMod c b] -> FreeMod c b
- mulByMonom :: (Eq c, Num c, Ord b, Monoid b) => b -> FreeMod c b -> FreeMod c b
- unsafeMulByMonom :: (Ord b, Monoid b) => b -> FreeMod c b -> FreeMod c b
- mulByMonom' :: (Eq c, Num c, Ord b, PartialMonoid b) => b -> FreeMod c b -> FreeMod c b
- unsafeMulByMonom' :: (Ord b, PartialMonoid b) => b -> FreeMod c b -> FreeMod c b
- freeModCoeffProxy :: FreeMod c b -> Proxy c
- fromZMod :: (Num c, Typeable c, Eq c, Num c, Ord b, Typeable b) => ZMod b -> FreeMod c b
- fromQMod :: (Fractional c, Typeable c, Eq c, Num c, Ord b, Typeable b) => QMod b -> FreeMod c b
- unsafeCoeffChange :: (Typeable c1, Typeable c2, Eq c2, Num c2, Ord b, Typeable b) => (c1 -> c2) -> FreeMod c1 b -> FreeMod c2 b
- unsafeZModFromQMod :: Ord b => QMod b -> ZMod b
- mapBase :: (Ord a, Ord b, Eq c, Num c) => (a -> b) -> FreeMod c a -> FreeMod c b
- unsafeMapBase :: (Ord a, Ord b) => (a -> b) -> FreeMod c a -> FreeMod c b
- mapCoeff :: (Ord b, Eq c2, Num c2) => (c1 -> c2) -> FreeMod c1 b -> FreeMod c2 b
- mapCoeffWithKey :: (Ord b, Eq c2, Num c2) => (b -> c1 -> c2) -> FreeMod c1 b -> FreeMod c2 b
- filterBase :: Ord b => (b -> Bool) -> FreeMod c b -> FreeMod c b
- mapMaybeBase :: (Ord a, Ord b, Eq c, Num c) => (a -> Maybe b) -> FreeMod c a -> FreeMod c b
- unsafeMapMaybeBase :: (Ord a, Ord b) => (a -> Maybe b) -> FreeMod c a -> FreeMod c b
- mapMaybeBaseCoeff :: (Ord a, Ord b, Eq c, Num c) => (a -> Maybe (b, c)) -> FreeMod c a -> FreeMod c b
- onFreeMod :: (Ord a, Ord b) => (Map a c -> Map b c) -> FreeMod c a -> FreeMod c b
- onFreeMod' :: (Ord a, Ord b) => (Map a c -> Map b d) -> FreeMod c a -> FreeMod d b
Partial monoids
class PartialMonoid a where Source #
A type class
class Ord (BaseF a) => FreeModule a where Source #
The reason for this type class is to make using newtype wrappers more convenient
toFreeModule :: a -> FreeMod (CoeffF a) (BaseF a) Source #
fromFreeModule :: FreeMod (CoeffF a) (BaseF a) -> a Source #
Instances
Ord b => FreeModule (FreeMod c b) Source # | |
Defined in Math.Algebra.Polynomial.FreeModule | |
FreeModule (Poly c v) Source # | |
Ord v => FreeModule (Poly c v) Source # | |
Defined in Math.Algebra.Polynomial.Multivariate.Generic | |
FreeModule (Univariate c v) Source # | |
Defined in Math.Algebra.Polynomial.Univariate type BaseF (Univariate c v) :: Type Source # type CoeffF (Univariate c v) :: Type Source # toFreeModule :: Univariate c v -> FreeMod (CoeffF (Univariate c v)) (BaseF (Univariate c v)) Source # fromFreeModule :: FreeMod (CoeffF (Univariate c v)) (BaseF (Univariate c v)) -> Univariate c v Source # | |
FreeModule (Poly c v n) Source # | |
Defined in Math.Algebra.Polynomial.Multivariate.Indexed | |
FreeModule (Poly c v n) Source # | |
Defined in Math.Algebra.Polynomial.Multivariate.Compact | |
FreeModule (ExtAlg c v n) Source # | |
Defined in Math.Algebra.Polynomial.Exterior.Indexed |
Free modules
newtype FreeMod coeff base Source #
Free module over a coefficient ring with the given base. Internally a map storing the coefficients. We maintain the invariant that the coefficients are never zero.
Instances
Support
supportList :: Ord b => FreeMod c b -> [b] Source #
The support as a list
Sanity checking
normalize :: (Ord b, Eq c, Num c) => FreeMod c b -> FreeMod c b Source #
Should be the identity function
safeEq :: (Ord b, Eq b, Eq c, Num c) => FreeMod c b -> FreeMod c b -> Bool Source #
Safe equality testing (should be identical to ==
)
Constructing and deconstructing
isZero :: Ord b => FreeMod c b -> Bool Source #
Testing for equality with zero (WARNING: this assumes that the invariant of never having zero coefficients actually holds!)
singleton :: (Ord b, Num c, Eq c) => b -> c -> FreeMod c b Source #
A single generator with a coefficient
fromList :: (Eq c, Num c, Ord b) => [(b, c)] -> FreeMod c b Source #
Conversion from list. This should handle repeated generators correctly (adding their coefficients).
fromGeneratorSet :: (Ord b, Num c) => Set b -> FreeMod c b Source #
Returns the sum of the given generator elements
fromGeneratorList :: (Ord b, Eq c, Num c) => [b] -> FreeMod c b Source #
Returns the sum of the given generator elements
findMaxTerm :: Ord b => FreeMod c b -> Maybe (b, c) Source #
Finds the term with the largest generator (in the natural ordering of the generators)
findMinTerm :: Ord b => FreeMod c b -> Maybe (b, c) Source #
Finds the term with the smallest generator (in the natural ordering of the generators)
Basic operations
divideByConst :: (Ord b, Eq c, Integral c, Show c) => c -> FreeMod c b -> FreeMod c b Source #
Dividing by a number (assuming that the coefficient ring is integral, and each coefficient is divisible by the given number)
addScale :: (Ord b, Eq c, Num c) => FreeMod c b -> c -> FreeMod c b -> FreeMod c b Source #
Addition after scaling: A + c*B
.
subScale :: (Ord b, Eq c, Num c) => FreeMod c b -> c -> FreeMod c b -> FreeMod c b Source #
Subtraction after scaling: A - c*B
. This is a handy optimization for conversion algorithms.
flatMap :: (Ord b1, Ord b2, Eq c, Num c) => (b1 -> FreeMod c b2) -> FreeMod c b1 -> FreeMod c b2 Source #
Expand each generator into a term in another module and then sum the results
flatMap' :: (Ord b1, Ord b2, Eq c2, Num c2) => (c1 -> c2) -> (b1 -> FreeMod c2 b2) -> FreeMod c1 b1 -> FreeMod c2 b2 Source #
histogram :: (Ord b, Num c) => [b] -> FreeMod c b Source #
The histogram of a multiset of generators is naturally an element of the given Z-module.
Rings (at least some simple ones, where the basis form a partial monoid)
mul :: (Ord b, Monoid b, Eq c, Num c) => FreeMod c b -> FreeMod c b -> FreeMod c b Source #
Multiplying two ring elements
mul' :: (Ord b, PartialMonoid b, Eq c, Num c) => FreeMod c b -> FreeMod c b -> FreeMod c b Source #
Multiplying two ring elements, when the base forms a partial monoid
product' :: (Ord b, PartialMonoid b, Eq c, Num c) => [FreeMod c b] -> FreeMod c b Source #
Product, when the base forms a partial monoid
mulWith :: (Ord b, Eq c, Num c) => (b -> b -> b) -> FreeMod c b -> FreeMod c b -> FreeMod c b Source #
Multiplying two ring elements, using the given monoid operation on base
mulWith' :: (Ord b, Eq c, Num c) => (b -> b -> Maybe b) -> FreeMod c b -> FreeMod c b -> FreeMod c b Source #
Multiplication using a "truncated" operation on the base
mulWith'' :: (Ord b, Eq c, Num c) => (b -> b -> Maybe (b, c)) -> FreeMod c b -> FreeMod c b -> FreeMod c b Source #
productWith :: (Ord b, Eq c, Num c) => b -> (b -> b -> b) -> [FreeMod c b] -> FreeMod c b Source #
Product, using the given Monoid empty and operation.
Implementation note: we only use the user-supported empty value in case of an empty product.
productWith' :: (Ord b, Eq c, Num c) => b -> (b -> b -> Maybe b) -> [FreeMod c b] -> FreeMod c b Source #
productWith'' :: (Ord b, Eq c, Num c) => b -> (b -> b -> Maybe (b, c)) -> [FreeMod c b] -> FreeMod c b Source #
mulByMonom :: (Eq c, Num c, Ord b, Monoid b) => b -> FreeMod c b -> FreeMod c b Source #
Multiplies by a monomial
unsafeMulByMonom :: (Ord b, Monoid b) => b -> FreeMod c b -> FreeMod c b Source #
Multiplies by a monomial (NOTE: we assume that this is an injective operation!!!)
mulByMonom' :: (Eq c, Num c, Ord b, PartialMonoid b) => b -> FreeMod c b -> FreeMod c b Source #
Multiplies by a partial monomial
unsafeMulByMonom' :: (Ord b, PartialMonoid b) => b -> FreeMod c b -> FreeMod c b Source #
Integer / Rational conversions
freeModCoeffProxy :: FreeMod c b -> Proxy c Source #
fromZMod :: (Num c, Typeable c, Eq c, Num c, Ord b, Typeable b) => ZMod b -> FreeMod c b Source #
This is an optimized coefficient ring change function. It detects runtime whether the output coefficient ring is also the integers, and does nothing in that case.
fromQMod :: (Fractional c, Typeable c, Eq c, Num c, Ord b, Typeable b) => QMod b -> FreeMod c b Source #
This is an optimized coefficient ring change function. It detects runtime whether the output coefficient ring is also the rational, and does nothing in that case.
unsafeCoeffChange :: (Typeable c1, Typeable c2, Eq c2, Num c2, Ord b, Typeable b) => (c1 -> c2) -> FreeMod c1 b -> FreeMod c2 b Source #
This is an optimized coefficient ring change function. It detects runtime whether the output coefficient ring is the same as the input, and does nothing in that case.
For this to be valid, it is required that the supported function is identity in
the case c1 ~ c2
!!!
unsafeZModFromQMod :: Ord b => QMod b -> ZMod b Source #
Given a polynomial with formally rational coefficients, but whose coeffiecients are actually integers, we return the corresponding polynomial with integer coefficients
Misc
mapBase :: (Ord a, Ord b, Eq c, Num c) => (a -> b) -> FreeMod c a -> FreeMod c b Source #
Changing the base set
unsafeMapBase :: (Ord a, Ord b) => (a -> b) -> FreeMod c a -> FreeMod c b Source #
Changing the base set (the user must guarantee that the map is injective!!)
mapCoeff :: (Ord b, Eq c2, Num c2) => (c1 -> c2) -> FreeMod c1 b -> FreeMod c2 b Source #
Changing the coefficient ring
mapCoeffWithKey :: (Ord b, Eq c2, Num c2) => (b -> c1 -> c2) -> FreeMod c1 b -> FreeMod c2 b Source #
mapMaybeBase :: (Ord a, Ord b, Eq c, Num c) => (a -> Maybe b) -> FreeMod c a -> FreeMod c b Source #
Map and extract a subset of terms
unsafeMapMaybeBase :: (Ord a, Ord b) => (a -> Maybe b) -> FreeMod c a -> FreeMod c b Source #
Like mapMaybeBase
, but the user must guarantee that the Just
part of the map is injective!
mapMaybeBaseCoeff :: (Ord a, Ord b, Eq c, Num c) => (a -> Maybe (b, c)) -> FreeMod c a -> FreeMod c b Source #