Copyright | (c) Masahiro Sakai 2012-2013 |
---|---|
License | BSD-style |
Maintainer | masahiro.sakai@gmail.com |
Stability | provisional |
Portability | portable |
Safe Haskell | Safe-Inferred |
Language | Haskell2010 |
ToySolver.Data.Polynomial
Description
Polynomials
References:
- Monomial order http://en.wikipedia.org/wiki/Monomial_order
- Polynomial class for Ruby http://www.math.kobe-u.ac.jp/~kodama/tips-RubyPoly.html
- constructive-algebra package http://hackage.haskell.org/package/constructive-algebra
Synopsis
- data Polynomial r v
- class Vars a v => Var a v | a -> v where
- var :: v -> a
- constant :: (Eq k, Num k) => k -> Polynomial k v
- terms :: Polynomial k v -> [Term k v]
- fromTerms :: (Eq k, Num k, Ord v) => [Term k v] -> Polynomial k v
- coeffMap :: Polynomial r v -> Map (Monomial v) r
- fromCoeffMap :: (Eq k, Num k) => Map (Monomial v) k -> Polynomial k v
- fromTerm :: (Eq k, Num k) => Term k v -> Polynomial k v
- class Degree t where
- class Ord v => Vars a v | a -> v where
- lt :: Num k => MonomialOrder v -> Polynomial k v -> Term k v
- lc :: Num k => MonomialOrder v -> Polynomial k v -> k
- lm :: Num k => MonomialOrder v -> Polynomial k v -> Monomial v
- coeff :: (Num k, Ord v) => Monomial v -> Polynomial k v -> k
- lookupCoeff :: Ord v => Monomial v -> Polynomial k v -> Maybe k
- isPrimitive :: (Eq k, Num k, ContPP k, Ord v) => Polynomial k v -> Bool
- class Factor a where
- class SQFree a where
- class ContPP k where
- type PPCoeff k
- cont :: Ord v => Polynomial k v -> k
- pp :: Ord v => Polynomial k v -> Polynomial (PPCoeff k) v
- deriv :: (Eq k, Num k, Ord v) => Polynomial k v -> v -> Polynomial k v
- integral :: (Eq k, Fractional k, Ord v) => Polynomial k v -> v -> Polynomial k v
- eval :: Num k => (v -> k) -> Polynomial k v -> k
- subst :: (Eq k, Num k, Ord v2) => Polynomial k v1 -> (v1 -> Polynomial k v2) -> Polynomial k v2
- mapCoeff :: (Eq k1, Num k1) => (k -> k1) -> Polynomial k v -> Polynomial k1 v
- toMonic :: (Eq r, Fractional r) => MonomialOrder v -> Polynomial r v -> Polynomial r v
- toUPolynomialOf :: (Ord k, Num k, Ord v) => Polynomial k v -> v -> UPolynomial (Polynomial k v)
- divModMP :: forall k v. (Eq k, Fractional k, Ord v) => MonomialOrder v -> Polynomial k v -> [Polynomial k v] -> ([Polynomial k v], Polynomial k v)
- reduce :: (Eq k, Fractional k, Ord v) => MonomialOrder v -> Polynomial k v -> [Polynomial k v] -> Polynomial k v
- type UPolynomial r = Polynomial r X
- data X = X
- type UTerm k = Term k X
- type UMonomial = Monomial X
- div :: (Eq k, Fractional k) => UPolynomial k -> UPolynomial k -> UPolynomial k
- mod :: (Eq k, Fractional k) => UPolynomial k -> UPolynomial k -> UPolynomial k
- divMod :: (Eq k, Fractional k) => UPolynomial k -> UPolynomial k -> (UPolynomial k, UPolynomial k)
- divides :: (Eq k, Fractional k) => UPolynomial k -> UPolynomial k -> Bool
- gcd :: (Eq k, Fractional k) => UPolynomial k -> UPolynomial k -> UPolynomial k
- lcm :: (Eq k, Fractional k) => UPolynomial k -> UPolynomial k -> UPolynomial k
- exgcd :: (Eq k, Fractional k) => UPolynomial k -> UPolynomial k -> (UPolynomial k, UPolynomial k, UPolynomial k)
- pdivMod :: (Eq r, Num r) => UPolynomial r -> UPolynomial r -> (r, UPolynomial r, UPolynomial r)
- pdiv :: (Eq r, Num r) => UPolynomial r -> UPolynomial r -> UPolynomial r
- pmod :: (Eq r, Num r) => UPolynomial r -> UPolynomial r -> UPolynomial r
- gcd' :: Integral r => UPolynomial r -> UPolynomial r -> UPolynomial r
- isRootOf :: (Eq k, Num k) => k -> UPolynomial k -> Bool
- isSquareFree :: (Eq k, Fractional k) => UPolynomial k -> Bool
- nat :: MonomialOrder X
- eisensteinsCriterion :: (ContPP k, PPCoeff k ~ Integer) => UPolynomial k -> Bool
- type Term k v = (k, Monomial v)
- tdeg :: Term k v -> Integer
- tscale :: Num k => k -> Term k v -> Term k v
- tmult :: (Num k, Ord v) => Term k v -> Term k v -> Term k v
- tdivides :: Ord v => Term k v -> Term k v -> Bool
- tdiv :: (Fractional k, Ord v) => Term k v -> Term k v -> Term k v
- tderiv :: (Num k, Ord v) => Term k v -> v -> Term k v
- tintegral :: (Fractional k, Ord v) => Term k v -> v -> Term k v
- data Monomial v
- mone :: Monomial v
- mfromIndices :: Ord v => [(v, Integer)] -> Monomial v
- mfromIndicesMap :: Ord v => Map v Integer -> Monomial v
- mindices :: Monomial v -> [(v, Integer)]
- mindicesMap :: Monomial v -> Map v Integer
- mmult :: Ord v => Monomial v -> Monomial v -> Monomial v
- mpow :: Ord v => Monomial v -> Integer -> Monomial v
- mdivides :: Ord v => Monomial v -> Monomial v -> Bool
- mdiv :: Ord v => Monomial v -> Monomial v -> Monomial v
- mderiv :: Ord v => Monomial v -> v -> (Integer, Monomial v)
- mintegral :: Ord v => Monomial v -> v -> (Rational, Monomial v)
- mlcm :: Ord v => Monomial v -> Monomial v -> Monomial v
- mgcd :: Ord v => Monomial v -> Monomial v -> Monomial v
- mcoprime :: Ord v => Monomial v -> Monomial v -> Bool
- type MonomialOrder v = Monomial v -> Monomial v -> Ordering
- lex :: Ord v => MonomialOrder v
- revlex :: Ord v => Monomial v -> Monomial v -> Ordering
- grlex :: Ord v => MonomialOrder v
- grevlex :: Ord v => MonomialOrder v
- data PrintOptions k v = PrintOptions {
- pOptPrintVar :: PrettyLevel -> Rational -> v -> Doc
- pOptPrintCoeff :: PrettyLevel -> Rational -> k -> Doc
- pOptIsNegativeCoeff :: k -> Bool
- pOptMonomialOrder :: MonomialOrder v
- prettyPrint :: (Ord k, Num k) => PrintOptions k v -> PrettyLevel -> Rational -> Polynomial k v -> Doc
- class PrettyCoeff a where
- pPrintCoeff :: PrettyLevel -> Rational -> a -> Doc
- isNegativeCoeff :: a -> Bool
- class PrettyVar a where
- pPrintVar :: PrettyLevel -> Rational -> a -> Doc
Polynomial type
data Polynomial r v Source #
Polynomial over commutative ring r
Instances
Conversion
terms :: Polynomial k v -> [Term k v] Source #
list of terms
fromTerms :: (Eq k, Num k, Ord v) => [Term k v] -> Polynomial k v Source #
construct a polynomial from a list of terms
fromCoeffMap :: (Eq k, Num k) => Map (Monomial v) k -> Polynomial k v Source #
fromTerm :: (Eq k, Num k) => Term k v -> Polynomial k v Source #
construct a polynomial from a singlet term
Query
total degree of a given polynomial
Instances
Degree AReal Source # | Degree of the algebraic number. If the algebraic number's |
Degree (Monomial v) Source # | |
Degree (Polynomial k v) Source # | |
Defined in ToySolver.Data.Polynomial.Base Methods deg :: Polynomial k v -> Integer Source # |
lt :: Num k => MonomialOrder v -> Polynomial k v -> Term k v Source #
leading term with respect to a given monomial order
lc :: Num k => MonomialOrder v -> Polynomial k v -> k Source #
leading coefficient with respect to a given monomial order
lm :: Num k => MonomialOrder v -> Polynomial k v -> Monomial v Source #
leading monomial with respect to a given monomial order
coeff :: (Num k, Ord v) => Monomial v -> Polynomial k v -> k Source #
Look up a coefficient for a given monomial.
If no such term exists, it returns 0
.
lookupCoeff :: Ord v => Monomial v -> Polynomial k v -> Maybe k Source #
Look up a coefficient for a given monomial.
If no such term exists, it returns Nothing
.
isPrimitive :: (Eq k, Num k, ContPP k, Ord v) => Polynomial k v -> Bool Source #
a polynomial is called primitive if the greatest common divisor of its coefficients is 1.
Operations
Prime factorization of polynomials
Methods
factor :: a -> [(a, Integer)] Source #
factor a polynomial p
into p1 ^ n1 * p2 ^ n2 * ..
and
return a list [(p1,n1), (p2,n2), ..]
.
Instances
Factor (UPolynomial Rational) Source # | |
Defined in ToySolver.Data.Polynomial.Factorization.Rational Methods factor :: UPolynomial Rational -> [(UPolynomial Rational, Integer)] Source # | |
KnownNat p => Factor (UPolynomial (PrimeField p)) Source # | |
Defined in ToySolver.Data.Polynomial.Factorization.FiniteField Methods factor :: UPolynomial (PrimeField p) -> [(UPolynomial (PrimeField p), Integer)] Source # | |
Factor (UPolynomial Integer) Source # | |
Defined in ToySolver.Data.Polynomial.Factorization.Integer Methods factor :: UPolynomial Integer -> [(UPolynomial Integer, Integer)] Source # |
Square-free factorization of polynomials
Methods
sqfree :: a -> [(a, Integer)] Source #
factor a polynomial p
into p1 ^ n1 * p2 ^ n2 * ..
and
return a list [(p1,n1), (p2,n2), ..]
.
Instances
SQFree (UPolynomial Rational) Source # | |
Defined in ToySolver.Data.Polynomial.Factorization.SquareFree Methods sqfree :: UPolynomial Rational -> [(UPolynomial Rational, Integer)] Source # | |
KnownNat p => SQFree (UPolynomial (PrimeField p)) Source # | |
Defined in ToySolver.Data.Polynomial.Factorization.FiniteField Methods sqfree :: UPolynomial (PrimeField p) -> [(UPolynomial (PrimeField p), Integer)] Source # | |
SQFree (UPolynomial Integer) Source # | |
Defined in ToySolver.Data.Polynomial.Factorization.SquareFree Methods sqfree :: UPolynomial Integer -> [(UPolynomial Integer, Integer)] Source # |
Methods
cont :: Ord v => Polynomial k v -> k Source #
Content of a polynomial
pp :: Ord v => Polynomial k v -> Polynomial (PPCoeff k) v Source #
Primitive part of a polynomial
deriv :: (Eq k, Num k, Ord v) => Polynomial k v -> v -> Polynomial k v Source #
Formal derivative of polynomials
integral :: (Eq k, Fractional k, Ord v) => Polynomial k v -> v -> Polynomial k v Source #
Formal integral of polynomials
eval :: Num k => (v -> k) -> Polynomial k v -> k Source #
Evaluation
subst :: (Eq k, Num k, Ord v2) => Polynomial k v1 -> (v1 -> Polynomial k v2) -> Polynomial k v2 Source #
Substitution or bind
mapCoeff :: (Eq k1, Num k1) => (k -> k1) -> Polynomial k v -> Polynomial k1 v Source #
Transform polynomial coefficients.
toMonic :: (Eq r, Fractional r) => MonomialOrder v -> Polynomial r v -> Polynomial r v Source #
Transform a polynomial into a monic polynomial with respect to the given monomial order.
toUPolynomialOf :: (Ord k, Num k, Ord v) => Polynomial k v -> v -> UPolynomial (Polynomial k v) Source #
Convert K[x,x1,x2,…] into K[x1,x2,…][x].
divModMP :: forall k v. (Eq k, Fractional k, Ord v) => MonomialOrder v -> Polynomial k v -> [Polynomial k v] -> ([Polynomial k v], Polynomial k v) Source #
Multivariate division algorithm
divModMP cmp f [g1,g2,..]
returns a pair ([q1,q2,…],r)
such that
f = g1*q1 + g2*q2 + .. + r
andg1, g2, ..
do not divider
.
reduce :: (Eq k, Fractional k, Ord v) => MonomialOrder v -> Polynomial k v -> [Polynomial k v] -> Polynomial k v Source #
Multivariate division algorithm
reduce cmp f gs = snd (divModMP cmp f gs)
Univariate polynomials
type UPolynomial r = Polynomial r X Source #
Univariate polynomials over commutative ring r
Variable "x"
Constructors
X |
Instances
div :: (Eq k, Fractional k) => UPolynomial k -> UPolynomial k -> UPolynomial k infixl 7 Source #
division of univariate polynomials
mod :: (Eq k, Fractional k) => UPolynomial k -> UPolynomial k -> UPolynomial k infixl 7 Source #
division of univariate polynomials
divMod :: (Eq k, Fractional k) => UPolynomial k -> UPolynomial k -> (UPolynomial k, UPolynomial k) Source #
division of univariate polynomials
divides :: (Eq k, Fractional k) => UPolynomial k -> UPolynomial k -> Bool Source #
gcd :: (Eq k, Fractional k) => UPolynomial k -> UPolynomial k -> UPolynomial k Source #
GCD of univariate polynomials
lcm :: (Eq k, Fractional k) => UPolynomial k -> UPolynomial k -> UPolynomial k Source #
LCM of univariate polynomials
exgcd :: (Eq k, Fractional k) => UPolynomial k -> UPolynomial k -> (UPolynomial k, UPolynomial k, UPolynomial k) Source #
Extended GCD algorithm
pdivMod :: (Eq r, Num r) => UPolynomial r -> UPolynomial r -> (r, UPolynomial r, UPolynomial r) Source #
pseudo division
pdiv :: (Eq r, Num r) => UPolynomial r -> UPolynomial r -> UPolynomial r Source #
pseudo quotient
pmod :: (Eq r, Num r) => UPolynomial r -> UPolynomial r -> UPolynomial r Source #
pseudo reminder
gcd' :: Integral r => UPolynomial r -> UPolynomial r -> UPolynomial r Source #
GCD of univariate polynomials
isRootOf :: (Eq k, Num k) => k -> UPolynomial k -> Bool Source #
Is the number a root of the polynomial?
isSquareFree :: (Eq k, Fractional k) => UPolynomial k -> Bool Source #
Is the polynomial square free?
nat :: MonomialOrder X Source #
Natural ordering x^0 < x^1 < x^2 .. is the unique monomial order for univariate polynomials.
eisensteinsCriterion :: (ContPP k, PPCoeff k ~ Integer) => UPolynomial k -> Bool Source #
Eisenstein's irreducibility criterion.
Given a polynomial with integer coefficients P[x] = an x^n + .. + a1*x + a0
,
it is irreducible over rational numbers if there exists a prime number p
satisfying the following conditions:
p
divides ai fori /= n
,p
does not dividesan
, andp^2
does not dividesa0
.
Term
Monic monomial
Monic monomials
Instances
(Ord v, IsString v) => IsString (Monomial v) Source # | |
Defined in ToySolver.Data.Polynomial.Base Methods fromString :: String -> Monomial v # | |
Show v => Show (Monomial v) Source # | |
NFData v => NFData (Monomial v) Source # | |
Defined in ToySolver.Data.Polynomial.Base | |
Eq v => Eq (Monomial v) Source # | |
Ord v => Ord (Monomial v) Source # | |
Defined in ToySolver.Data.Polynomial.Base | |
Hashable v => Hashable (Monomial v) Source # | |
Defined in ToySolver.Data.Polynomial.Base | |
Degree (Monomial v) Source # | |
Ord v => Var (Monomial v) v Source # | |
Defined in ToySolver.Data.Polynomial.Base | |
Ord v => Vars (Monomial v) v Source # | |
Monomial order
lex :: Ord v => MonomialOrder v Source #
Lexicographic order
revlex :: Ord v => Monomial v -> Monomial v -> Ordering Source #
Reverse lexicographic order.
Note that revlex is NOT a monomial order.
grlex :: Ord v => MonomialOrder v Source #
Graded lexicographic order
grevlex :: Ord v => MonomialOrder v Source #
Graded reverse lexicographic order
Pretty Printing
data PrintOptions k v Source #
Options for pretty printing polynomials
The default value can be obtained by def
.
Constructors
PrintOptions | |
Fields
|
Instances
(PrettyCoeff k, PrettyVar v, Ord v) => Default (PrintOptions k v) Source # | |
Defined in ToySolver.Data.Polynomial.Base Methods def :: PrintOptions k v # |
prettyPrint :: (Ord k, Num k) => PrintOptions k v -> PrettyLevel -> Rational -> Polynomial k v -> Doc Source #
class PrettyCoeff a where Source #
Minimal complete definition
Methods
pPrintCoeff :: PrettyLevel -> Rational -> a -> Doc Source #
isNegativeCoeff :: a -> Bool Source #