| Copyright | (c) Stéphane Laurent 2023 |
|---|---|
| License | GPL-3 |
| Maintainer | laurent_step@outlook.fr |
| Safe Haskell | Safe-Inferred |
| Language | Haskell2010 |
Math.Algebra.Hspray
Description
Deals with multivariate polynomials on a commutative ring. See README for examples.
Synopsis
- data Powers = Powers {
- exponents :: Seq Int
- nvariables :: Int
- type Spray a = HashMap Powers a
- type Monomial a = (Powers, a)
- lone :: C a => Int -> Spray a
- unitSpray :: C a => Spray a
- zeroSpray :: (Eq a, C a) => Spray a
- constantSpray :: (C a, Eq a) => a -> Spray a
- (*^) :: (C a, Eq a) => a -> Spray a -> Spray a
- (.^) :: (C a, Eq a) => Int -> Spray a -> Spray a
- (^+^) :: (C a, Eq a) => Spray a -> Spray a -> Spray a
- (^-^) :: (C a, Eq a) => Spray a -> Spray a -> Spray a
- (^*^) :: (C a, Eq a) => Spray a -> Spray a -> Spray a
- (^**^) :: (C a, Eq a) => Spray a -> Int -> Spray a
- prettySpray :: (a -> String) -> String -> Spray a -> String
- prettySpray' :: Show a => Spray a -> String
- prettySprayXYZ :: Show a => Spray a -> String
- getCoefficient :: C a => [Int] -> Spray a -> a
- sprayTerms :: Spray a -> HashMap (Seq Int) a
- evalSpray :: C a => Spray a -> [a] -> a
- substituteSpray :: (Eq a, C a) => [Maybe a] -> Spray a -> Spray a
- composeSpray :: forall a. (C a, Eq a) => Spray a -> [Spray a] -> Spray a
- derivSpray :: (C a, Eq a) => Int -> Spray a -> Spray a
- permuteVariables :: [Int] -> Spray a -> Spray a
- swapVariables :: (Int, Int) -> Spray a -> Spray a
- sprayDivision :: forall a. (Eq a, C a) => Spray a -> Spray a -> (Spray a, Spray a)
- sprayDivisionRemainder :: forall a. (Eq a, C a) => Spray a -> [Spray a] -> Spray a
- groebner :: forall a. (Eq a, C a) => [Spray a] -> Bool -> [Spray a]
- reduceGroebnerBasis :: forall a. (Eq a, C a) => [Spray a] -> [Spray a]
- esPolynomial :: (C a, Eq a) => Int -> Int -> Spray a
- isSymmetricSpray :: forall a. (C a, Eq a) => Spray a -> Bool
- resultant :: (Eq a, C a) => Int -> Spray a -> Spray a -> Spray a
- resultant1 :: (Eq a, C a) => Spray a -> Spray a -> a
- subresultants :: (Eq a, C a) => Int -> Spray a -> Spray a -> [Spray a]
- subresultants1 :: (Eq a, C a) => Spray a -> Spray a -> [a]
- gcdSpray :: forall a. (Eq a, C a) => Spray a -> Spray a -> Spray a
- fromList :: (C a, Eq a) => [([Int], a)] -> Spray a
- toList :: Spray a -> [([Int], a)]
- fromRationalSpray :: Spray Rational -> Spray Double
- leadingTerm :: Spray a -> Monomial a
- isPolynomialOf :: forall a. (C a, Eq a) => Spray a -> [Spray a] -> (Bool, Maybe (Spray a))
- bombieriSpray :: C a => Spray a -> Spray a
Types
Basic sprays
lone :: C a => Int -> Spray a Source #
Spray corresponding to the basic monomial x_n
>>>x :: lone 1 :: Spray Int>>>y :: lone 2 :: Spray Int>>>p = 2*^x^**^2 ^-^ 3*^y>>>putStrLn $ prettySpray' p(2) x1^2 + (-3) x2
lone 0 == unitSpray
constantSpray :: (C a, Eq a) => a -> Spray a Source #
Constant spray
constantSpray 3 == 3 *^ unitSpray
Operations on sprays
(.^) :: (C a, Eq a) => Int -> Spray a -> Spray a infixr 7 Source #
Scale spray by an integer
3 .^ p == p ^+^ p ^+^ p
Showing a spray
Arguments
| :: (a -> String) | function mapping a coefficient to a string, typically |
| -> String | a string denoting the variable, e.g. "x" |
| -> Spray a | the spray |
| -> String |
Pretty form of a spray
>>>x :: lone 1 :: Spray Int>>>y :: lone 2 :: Spray Int>>>z :: lone 3 :: Spray Int>>>p = 2*^x ^+^ 3*^y^**^2 ^-^ 4*^z^**^3>>>putStrLn $ prettySpray show "x" p(2) * x^(1) + (3) * x^(0, 2) + (-4) * x^(0, 0, 3)
prettySpray' :: Show a => Spray a -> String Source #
Pretty form of a spray, with monomials showed as "x1x3^2"
>>>x :: lone 1 :: Spray Int>>>y :: lone 2 :: Spray Int>>>z :: lone 3 :: Spray Int>>>p = 2*^x ^+^ 3*^y^**^2 ^-^ 4*^z^**^3>>>putStrLn $ prettySpray' p(2) x1 + (3) x2^2 + (-4) x3^3
prettySprayXYZ :: Show a => Spray a -> String Source #
Pretty form of a spray having at more three variables
>>>x :: lone 1 :: Spray Int>>>y :: lone 2 :: Spray Int>>>z :: lone 3 :: Spray Int>>>p = 2*^x ^+^ 3*^y^**^2 ^-^ 4*^z^**^3>>>putStrLn $ prettySprayXYZ p(2) X + (3) Y^2 + (-4) Z^3
Queries on a spray
getCoefficient :: C a => [Int] -> Spray a -> a Source #
Get coefficient of a term of a spray
>>>x = lone 1 :: Spray Int>>>y = lone 2 :: Spray Int>>>z = lone 3 :: Spray Int>>>p = 2 *^ (2 *^ (x^**^3 ^*^ y^**^2)) ^+^ 4*^z ^+^ 5*^unitSpray>>>getCoefficient [3, 2, 0] p4>>>getCoefficient [0, 4] p0
Evaluation of a spray
evalSpray :: C a => Spray a -> [a] -> a Source #
Evaluates a spray
>>>x :: lone 1 :: Spray Int>>>y :: lone 2 :: Spray Int>>>p = 2*^x^**^2 ^-^ 3*^y>>>evalSpray p [2, 1]5
substituteSpray :: (Eq a, C a) => [Maybe a] -> Spray a -> Spray a Source #
Substitutes some variables in a spray
>>>x1 :: lone 1 :: Spray Int>>>x2 :: lone 2 :: Spray Int>>>x3 :: lone 3 :: Spray Int>>>p = x1^**^2 ^-^ x2 ^+^ x3 ^-^ unitSpray>>>p' = substituteSpray [Just 2, Nothing, Just 3] p>>>putStrLn $ prettySpray' p'(-1) x2 + (6)
composeSpray :: forall a. (C a, Eq a) => Spray a -> [Spray a] -> Spray a Source #
Composes a spray with a change of variables
>>>x :: lone 1 :: Spray Int>>>y :: lone 2 :: Spray Int>>>z :: lone 3 :: Spray Int>>>p = x ^+^ y>>>q = composeSpray p [z, x ^+^ y ^+^ z]>>>putStrLn $ prettySprayXYZ q(1) X + (1) Y + (2) Z
Differentiation of a spray
Arguments
| :: (C a, Eq a) | |
| => Int | index of the variable of differentiation (starting at 1) |
| -> Spray a | the spray to be derivated |
| -> Spray a | the derivated spray |
Derivative of a spray
Permutation of the variables of a spray
permuteVariables :: [Int] -> Spray a -> Spray a Source #
Permutes the variables of a spray
>>>f :: Spray Rational -> Spray Rational -> Spray Rational -> Spray Rational>>>f p1 p2 p3 = p1^**^4 ^+^ (2*^p2^**^3) ^+^ (3*^p3^**^2) ^-^ (4*^unitSpray)>>>x1 = lone 1 :: Spray Rational>>>x2 = lone 2 :: Spray Rational>>>x3 = lone 3 :: Spray Rational>>>p = f x1 x2 x3
permuteVariables [3, 1, 2] p == f x3 x1 x2
swapVariables :: (Int, Int) -> Spray a -> Spray a Source #
Swaps two variables of a spray
swapVariables (1, 3) p == permuteVariables [3, 2, 1] p
Division of a spray
Arguments
| :: forall a. (Eq a, C a) | |
| => Spray a | dividend |
| -> Spray a | divisor |
| -> (Spray a, Spray a) | (quotient, remainder) |
Division of a spray by a spray
sprayDivisionRemainder :: forall a. (Eq a, C a) => Spray a -> [Spray a] -> Spray a Source #
Remainder of the division of a spray by a list of divisors, using the lexicographic ordering of the monomials
Gröbner basis
Arguments
| :: forall a. (Eq a, C a) | |
| => [Spray a] | list of sprays |
| -> Bool | whether to return the reduced basis |
| -> [Spray a] |
Groebner basis (always minimal and possibly reduced)
groebner ps True == reduceGroebnerBasis (groebner ps False)
reduceGroebnerBasis :: forall a. (Eq a, C a) => [Spray a] -> [Spray a] Source #
Reduces a Groebner basis
Symmetric polynomials
Elementary symmetric polynomial
>>>putStrLn $ prettySpray' (esPolynomial 3 2)(1) x1x2 + (1) x1x3 + (1) x2x3
isSymmetricSpray :: forall a. (C a, Eq a) => Spray a -> Bool Source #
Whether a spray is a symmetric polynomial
Resultant and subresultants
Arguments
| :: (Eq a, C a) | |
| => Int | indicator of the variable with respect to which the resultant is desired (e.g. 1 for x) |
| -> Spray a | |
| -> Spray a | |
| -> Spray a |
Resultant of two sprays
Arguments
| :: (Eq a, C a) | |
| => Int | indicator of the variable with respect to which the resultant is desired (e.g. 1 for x) |
| -> Spray a | |
| -> Spray a | |
| -> [Spray a] |
Subresultants of two sprays
subresultants1 :: (Eq a, C a) => Spray a -> Spray a -> [a] Source #
Subresultants of two univariate sprays
Greatest common divisor
gcdSpray :: forall a. (Eq a, C a) => Spray a -> Spray a -> Spray a Source #
Greatest common divisor of two sprays with coefficients in a field
Miscellaneous
fromRationalSpray :: Spray Rational -> Spray Double Source #
Converts a spray with rational coefficients to a spray with double coefficients (useful for evaluation)
leadingTerm :: Spray a -> Monomial a Source #
Leading term of a spray
isPolynomialOf :: forall a. (C a, Eq a) => Spray a -> [Spray a] -> (Bool, Maybe (Spray a)) Source #
Whether a spray can be written as a polynomial of a given list of sprays (the sprays in the list must belong to the same polynomial ring as the spray); this polynomial is returned if this is true
>>>x = lone 1 :: Spray Rational>>>y = lone 2 :: Spray Rational>>>p1 = x ^+^ y>>>p2 = x ^-^ y>>>p = p1 ^*^ p2
isPolynomialOf p [p1, p2] == (True, Just $ x ^*^ y)