h*Oo      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~0.5.2.0#Multivariate polynomials on a ring.(c) Stphane Laurent, 2022-2024GPL-3laurent_step@outlook.fr Safe-Inferred3hsprayA RatioOfSprays a object represents a fraction of two multivariate polynomials whose coefficients are of type a, which represents a field. These two polynomials are represented by two Spray a objects. Generally we do not use this constructor to build a ratio of sprays: we use the  operator instead, because it always returns an irreducible ratio of sprays, meaning that its corresponding fraction of polynomials is irreducible, i.e. its numerator and its denominator are coprime. You can use this constructor if you are sure that the numerator and the denominator are coprime. This can save some computation time, but unfortunate consequences can occur if the numerator and the denominator are not coprime. An arithmetic operation on ratios of sprays always returns an irreducible ratio of sprays under the condition that the ratios of sprays it involves are irreducible. Moreover, it never returns a ratio of sprays with a constant denominator other than the unit spray. If you use this constructor with a constant denominator, always set this denominator to the unit spray (by dividing the numerator by the constant value of the denominator). hspray The type  is helpful when dealing with  sprays, but this type of sprays lost its interest in version 0.4.0.0 (see CHANGELOG or README). hsprayMost often, one deals with sprays with rational coefficients, so we dedicate a type alias for such sprays. hsprayAn object of type Spray a represents a multivariate polynomial whose coefficients are represented by the objects of type a, which must have a ring instance in order that we can add and multiply two polynomials. hspray The type Powers is used to represent the exponents of the monomial occurring in a term of a spray. The integer in the field  nvariables is the number of variables involved in this monomial (it is 3, not 2, for a monomial such as x^2.z^3;, because the exponents of this monomial is the sequence  (2, 0, 3)). Actually this integer is always the length of the sequence in the field  exponents,. The reason of the presence of the field  nvariables is that I thought that it was necessary when I started to develop the package, but now I think it is useless. The type Powers will possibly be abandoned in a future version of the package. However we cannot simply use the type  to represent the exponents, because two sequences of exponents that differ only by some trailing zeros must be considered as identical, and they are considered as such with the type Powers thanks to its Eq instance. Instead of Powers!, a new type encapsulating the  type with such an Eq8 instance should be enough to represent the exponents.hspray The type  Polynomial a- is used to represent univariate polynomials.hspray The type  Rational' is used to introduce the univariate polynomials with rational coefficients (*). It is similar to the well-known type Rational, (actually these two types are the same but  Rational' has more instances and we need them for the univariate polynomials).hspray The new type A a3 is used to attribute some instances to the type  Polynomial a); it is needed to avoid orphan instances.hsprayA spray represents a multivariate polynomial so it like a function. We introduce a class because it will be assigned to the ratios of sprays too.hspray&The type of the coefficients (this is a for both Spray a and RatioOfSprays a)hspray#The type of the variables (this is Spray a for both Spray a and RatioOfSprays a)hspray-Number of variables in a function-like objecthspray0Permutes the variables of a function-like objectf :: Spray Rational -> Spray Rational -> Spray Rational -> Spray Rationalf p1 p2 p3 = p1^**^4 ^+^ (2*^p2^**^3) ^+^ (3*^p3^**^2) ^-^ (4*^unitSpray)x1 = lone 1 :: Spray Rationalx2 = lone 2 :: Spray Rationalx3 = lone 3 :: Spray Rationalspray = f x1 x2 x3.permuteVariables [3, 1, 2] spray == f x3 x1 x2 hspray-Swaps two variables of a function-like object6swapVariables (1, 3) x == permuteVariables [3, 2, 1] x"hsprayDrops a given number of leading variables in a function-like object;  very unsafe, dropVariables n x should not be used if involvesVariable x i is True for some i in 1, ... n spray == constantSpray x ^+^ spray*hspray(Add a constant to a function-like objectobject <+ x == x +> object+hsprayEvaluation (replacing the variables with some values) of a function-like objectx = lone 1 :: Spray Inty = lone 2 :: Spray Intspray = 2*^x^**^2 ^-^ 3*^yevaluate spray [2, 1]5,hsprayFlipped version of evaluate0evaluateAt [2, 1] spray == evaluate spray [2, 1]-hsprayPartial evaluation of a function-like object (replace some variables with some values)x1 = lone 1 :: Spray Intx2 = lone 2 :: Spray Intx3 = lone 3 :: Spray Int+spray = x1^**^2 ^-^ x2 ^+^ x3 ^-^ unitSpray3spray' = substitute [Just 2, Nothing, Just 3] spray*putStrLn $ prettyNumSprayX1X2X3 "x" spray'-x2 + 6 .hspray8Polynomial change of variables of a function-like objectx = lone 1 :: Spray Inty = lone 2 :: Spray Intspray = x ^*^ y1spray' = changeVariables spray [x ^+^ y, x ^-^ y]!putStrLn $ prettyNumSpray' spray' X^2 - Y^2/hspray3Whether a function-like object has a constant value0hsprayWhether a function-like object represents an univariate function; it is considered that it is univariate if it is constant1hsprayWhether a function-like object represents a bivariate function; it is considered that it is bivariate if it is univariate2hsprayWhether a function-like object represents a trivariate function; it is considered that it is trivariate if it is bivariate3hspray,Divides by a scalar in a module over a field4hspray5Scale by an integer (I do not find this operation in numeric-prelude)53 .^ x == x Algebra.Additive.+ x Algebra.Additive.+ x5hsprayConstant univariate polynomial6hsprayUnivariate polynomial from its coefficients (ordered by increasing degrees)7hsprayThe variable of a univariate polynomial; it is called "soleParameter" because this it represents the parameter of a  spray8hspray'Constant rational univariate polynomialimport Number.Ratio ( (%) )constQPoly (2 % 3)-constQPoly (2 % 3) == qpolyFromCoeffs [2 % 3]9hspray0Rational univariate polynomial from coefficientsimport Number.Ratio ( (%) )!qpolyFromCoeffs [2 % 3, 5, 7 % 4]:hsprayThe variable of a univariate rational polynomial; it is called "qsoleParameter" because it represents the parameter of a  spray (qsoleParameter == qpolyFromCoeffs [0, 1]hsprayidentify a `Polynomial a` to a `Spray a`, in order to apply the show spray functions to the univariate polynomialshsprayhelper function for prettyRatioOfPolynomials (and prettyOneParameterSpray);hsprayPretty form of a ratio of univariate polynomials with rational coefficientshsprayhelper function for prettyRatioOfPolynomials (and prettyOneParameterSpray)hsprayhelper function for prettyRatioOfPolynomials (and prettyOneParameterSpray)<hspray0Pretty form of a ratio of univariate polynomials=hspray+Evaluates a ratio of univariate polynomials>hsprayPretty form of a one-parameter spray, using a string (typically a letter) followed by an index to denote the variables?hsprayPretty form of a one-parameter spray, using some given strings (typically some letters) to denote the variables if possible, i.e. if enough letters are provided; otherwise this function behaves exactly like prettyOneParameterSprayX1X2X3 a where a is the first provided letter@hsprayPretty form of a one-parameter spray; see the definition below and see ?prettyOneParameterSpray a spray == prettyOneParameterSprayXYZ a ["x","y","z"] sprayAhsprayPretty form of a one-parameter spray; see the definition below and see ?prettyOneParameterSpray' a spray == prettyOneParameterSprayXYZ a ["X","Y","Z"] sprayBhsprayPretty form of a one-parameter rational spray, using a string (typically a letter) followed by an index to denote the variablesChsprayPretty form of a one-parameter rational spray, using some given strings (typically some letters) to denote the variables if possible, i.e. if enough letters are provided; otherwise this function behaves exactly like  prettyOneParameterQSprayX1X2X3 a where a is the first provided letterDhspray5Pretty form of a one-parameter rational spray, using "x", "y" and "z" for the variables if possible; i.e. if the spray does not have more than three variables, otherwise "x1", "x2"&, ... are used to denote the variablesprettyOneParameterQSpray a == prettyOneParameterQSprayXYZ a ["x","y","z"]Ehspray5Pretty form of a one-parameter rational spray, using "X", "Y" and "Z" for the variables if possible; i.e. if the spray does not have more than three variables, otherwise "X1", "X2", ... are used prettyOneParameterQSpray' a == prettyOneParameterQSprayXYZ a ["X","Y","Z"]FhspraySubstitutes a value to the parameter of a one-parameter spray (the variable occurring in its coefficients)?evalOneParameterSpray spray x == substituteParameters spray [x]GhspraySubstitutes a value to the parameter of a one-parameter spray; same as FsubstituteTheParameter spray x == substituteParameters spray [x]HhspraySubstitutes a value to the parameter of a one-parameter spray as well as some values to the variables of this sprayevalOneParameterSpray' spray a xs == evalParametricSpray' spray [a] xshspray+helper function for evalOneParameterSpray''IhspraySubstitutes some values to the variables of a one-parameter spray; same as hsprayappend trailing zeroshspray,append trailing zeros to get the same lengthhsprayaddition of two sprayshsprayaddition of a term to a sprayhspraysum list of termshsprayopposite sprayhsprayscale a spray by a scalarhspraymultiply two termshspraymultiply a spray by a termhspraymultiply two spraysJhspray6Divides a spray by a scalar; you can equivalently use 3- if the type of the scalar is not ambiguoushsprayremove zero terms of a sprayhspray"helper function for lone and lone'KhsprayThe n-th polynomial variable x_n as a spray; one usually builds a spray by introducing these variables and combining them with the arithmetic operationsx = lone 1 :: Spray Inty = lone 2 :: Spray Intspray = 2*^x^**^2 ^-^ 3*^yputStrLn $ prettyNumSpray spray 2*x^2 - 3*ylone 0 == unitSprayLhsprayThe n-th polynomial variable for rational sprays; this is just a specialization of KMhspray The spray x_n^p%; more efficient than exponentiating lone nlone' 2 10 = lone 2 ^**^ 10NhsprayThe rational spray x_n^pOhsprayMonomial spray, e.g. monomial [(1,4),(3,2)] is x^4.z^2; indices and exponents must be positive but this is not checked prop> monomial [(1, 4), (3, 2)] == (lone 1 ^**^ 4) ^*^ (lone 3 ^**^ 2)Phspray-Monomial rational spray, a specialization of Oqmonomial [(1, 4), (3, 2)] == (qlone 1 ^**^ 4) ^*^ (qlone 3 ^**^ 2)QhsprayThe unit sprayspray ^*^ unitSpray == sprayRhsprayThe null sprayspray ^+^ zeroSpray == sprayShspray!Whether a spray is the zero sprayThsprayConstant spray!constantSpray 3 == 3 *^ unitSprayUhspray%Get coefficient of a term of a spray x = lone 1 :: Spray Inty = lone 2 :: Spray Intz = lone 3 :: Spray Int=p = 2 *^ (2 *^ (x^**^3 ^*^ y^**^2)) ^+^ 4*^z ^+^ 5*^unitSpray1getCoefficient [3, 2] p -- coefficient of x^3.y^24=getCoefficient [3, 2, 0] p -- same as getCoefficient [3, 2] p4-getCoefficient [0, 4] p -- coefficient of y^40Vhspray Get the constant term of a spray(getConstantTerm p == getCoefficient [] phspray#remove the constant term of a sprayWhspray%Whether a spray is constant; same as /hspray5helper function to unify evalSpray and evalSpraySprayXhsprayEvaluates a spray; same as +x = lone 1 :: Spray Inty = lone 2 :: Spray Intspray = 2*^x^**^2 ^-^ 3*^yevalSpray spray [2, 1]5YhsprayEvaluates the coefficients of a spray with spray coefficients; same as hsprayspray from termZhspray>Substitutes some values to some variables of a spray; same as -x1 = lone 1 :: Spray Intx2 = lone 2 :: Spray Intx3 = lone 3 :: Spray Int'p = x1^**^2 ^-^ x2 ^+^ x3 ^-^ unitSpray0p' = substituteSpray [Just 2, Nothing, Just 3] p&putStrLn $ prettyNumSprayX1X2X3 "x" p'-x2 + 6 [hsprayConverts a spray with rational coefficients to a spray with double coefficients (useful for evaluation)\hspray>Sustitutes the variables of a spray with some sprays; same as .x = lone 1 :: Spray Inty = lone 2 :: Spray Intz = lone 3 :: Spray Int p = x ^+^ y%q = composeSpray p [x ^+^ y ^+^ z, z]putStrLn $ prettyNumSpray' q X + Y + 2*Z]hspray$Creates a spray from a list of terms^hsprayPrints a spray; this function is exported for possible usage in other packages_hsprayPrints a spray, with monomials shown as "x.z^2", and with a user-defined showing function for the coefficients`hspray(Prints a spray, with monomials shown as "x.z^2", and with a user-defined showing function for the coefficients; this is the same as the function _ with the pair of braces  ("(", ")")ahsprayPretty form of a spray with monomials displayed in the style of "x.z^2"; you should rather use j or o# if your coefficients are numericx = lone 1 :: Spray Inty = lone 2 :: Spray Intz = lone 3 :: Spray Int$p = 2*^x ^+^ 3*^y^**^2 ^-^ 4*^z^**^3+putStrLn $ prettySprayXYZ ["X", "Y", "Z"] p(2)*X + (3)*Y^2 + (-4)*Z^3&putStrLn $ prettySprayXYZ ["X", "Y"] p(2)*X1 + (3)*X2^2 + (-4)*X3^3bhsprayPretty form of a spray, with monomials shown as "x1.x3^2", and with a user-defined showing function for the coefficientschsprayPretty form of a spray, with monomials shown as "x1.x3^2", and with a user-defined showing function for the coefficients; this is the same as the function b with the pair of braces  ("(", ")")# used to enclose the coefficientsdhsprayPretty form of a spray with monomials displayed in the style of  "x1.x3^2"; you should rather use i or m# if your coefficients are numericx = lone 1 :: Spray Inty = lone 2 :: Spray Intz = lone 3 :: Spray Int(spray = 2*^x ^+^ 3*^y^**^2 ^-^ 4*^z^**^3&putStrLn $ prettySprayX1X2X3 "X" spray(2)*X1 + (3)*X2^2 + (-4)*X3^3ehsprayPretty form of a spray with monomials displayed in the style of "x.z^2"; you should rather use u or q4 if you deal with sprays with numeric coefficientsx = lone 1 :: Spray Inty = lone 2 :: Spray Intz = lone 3 :: Spray Int$p = 2*^x ^+^ 3*^y^**^2 ^-^ 4*^z^**^3putStrLn $ prettySpray p(2)*x + (3)*y^2 + (-4)*z^3%putStrLn $ prettySpray (p ^+^ lone 4)"(2)*x1 + (3)*x2^2 + (-4)*x3^3 + x49prettySpray spray == prettySprayXYZ ["x", "y", "z"] sprayfhspray0Pretty form of a spray, with monomials shown as  "x1.x3^2"; use d to change the letter (or i or m! if the coefficients are numeric)x = lone 1 :: Spray Inty = lone 2 :: Spray Intz = lone 3 :: Spray Int$p = 2*^x ^+^ 3*^y^**^2 ^-^ 4*^z^**^3putStrLn $ prettySpray' p(2)*x1 + (3)*x2^2 + (-4)*x3^3 hspray+showMonomialOld "x" [0, 2, 1] = x^(0, 2, 1)ghspray1Pretty form of a spray; you will probably prefer e or fx = lone 1 :: Spray Inty = lone 2 :: Spray Intz = lone 3 :: Spray Int$p = 2*^x ^+^ 3*^y^**^2 ^-^ 4*^z^**^3putStrLn $ prettySpray'' "x" p+(2)*x^(1) + (3)*x^(0, 2) + (-4)*x^(0, 0, 3)hhsprayShow a spray with numeric coefficients; this function is exported for possible usage in other packageshsprayshowMonomialX1X2X3 X [0, 2, 1] = "X2^2.X3"hsprayshowMonomialsX1X2X3 X# [[0, 2, 1], [1, 2]] = ["X2^2.X3", X1.X2]hsprayshowMonomialXYZ [X, Y, Z,] 3 [1, 2, 1] = X.Y^2.Z showMonomialXYZ [X, Y, Z"] 3 [1, 2, 1, 2] = X1.X2^2.X3.X4^2hsprayshowMonomialsXYZ [X, Y, Z*] [[0, 2, 1], [1, 2]] = ["Y^2.Z", "X.Y^2"]ihsprayPretty form of a spray with numeric coefficients, printing monomials as  "x1.x3^2"x = lone 1 :: Spray Inty = lone 2 :: Spray Intz = lone 3 :: Spray Int$p = 2*^x ^+^ 3*^y^**^2 ^-^ 4*^z^**^3%putStrLn $ prettyNumSprayX1X2X3 "x" p2*x1 + 3*x2^2 - 4*x3^3 jhsprayPretty form of a spray with numeric coefficients, printing monomials as "x.z^2" if possible, i.e. if enough letters are provided, otherwise as  "x1.x3^2"x = lone 1 :: Spray Inty = lone 2 :: Spray Intz = lone 3 :: Spray Intw = lone 4 :: Spray Int$p = 2*^x ^+^ 3*^y^**^2 ^-^ 4*^z^**^3,putStrLn $ prettyNumSprayXYZ ["x","y","z"] p2*x + 3*y^2 - 4*z^3 4putStrLn $ prettyNumSprayXYZ ["x","y","z"] (p ^+^ w)2*x1 + 3*x2^2 - 4*x3^3 + x44putStrLn $ prettyNumSprayXYZ ["a","b","c"] (p ^+^ w)2*a1 + 3*a2^2 - 4*a3^3 + a4hsprayhelper function for showQSprayhspray helper function for showQSpray' khspray Prints a  =; for internal usage but exported for usage in other packageslhspray Prints a  =; for internal usage but exported for usage in other packagesmhsprayPretty form of a spray with rational coefficients, printing monomials in the style of  "x1.x3^2"x = lone 1 :: QSprayy = lone 2 :: QSprayz = lone 3 :: QSpray(p = 2*^x ^+^ 3*^y^**^2 ^-^ (4%3)*^z^**^3#putStrLn $ prettyQSprayX1X2X3 "x" p2*x1 + 3*x2^2 - (4/3)*x3^3 nhspraySame as m but for a   sprayohsprayPretty form of a spray with rational coefficients, printing monomials in the style of "x.z^2" with the provided letters if possible, i.e. if enough letters are provided, otherwise in the style  "x1.x3^2", taking the first provided letter to denote the non-indexed variablesx = lone 1 :: QSprayy = lone 2 :: QSprayz = lone 3 :: QSpray(p = 2*^x ^+^ 3*^y^**^2 ^-^ (4%3)*^z^**^3*putStrLn $ prettyQSprayXYZ ["x","y","z"] p2*x + 3*y^2 - (4/3)*z^3 &putStrLn $ prettyQSprayXYZ ["x","y"] p2*x1 + 3*x2^2 - (4%3)*x3^3&putStrLn $ prettyQSprayXYZ ["a","b"] p2*a1 + 3*a2^2 - (4/3)*a3^3phspraySame as o but for a   sprayqhsprayPretty printing of a spray with rational coefficients prop> prettyQSpray == prettyQSprayXYZ ["x", "y", "z"]rhsprayPretty printing of a spray with rational coefficients prop> prettyQSpray'' == prettyQSprayXYZ [X, Y, Z]shsprayPretty printing of a spray with rational coefficients prop> prettyQSpray' == prettyQSprayXYZ' ["x", "y", "z"]thsprayPretty printing of a spray with rational coefficients prop> prettyQSpray''' == prettyQSprayXYZ' [X, Y, Z]uhsprayPretty printing of a spray with numeric coefficients prop> prettyNumSpray == prettyNumSprayXYZ ["x", "y", "z"]vhsprayPretty printing of a spray with numeric coefficients prop> prettyNumSpray' == prettyNumSprayXYZ [X, Y, Z]hsprayspray as safe spraywhspray Sum of spraysxhsprayProduct of sprayshsprayordered terms of a sprayyhspraySpray as a listzhspray+Bombieri spray (for internal usage in the ' scubature ' package){hspray2Whether two sprays are equal up to a scalar factor|hsprayChecks whether the multivariate polynomial defined by a spray is homogeneous and also returns the degree in case this is true}hspray Get all the exponents of a spray~hspray#Get all the coefficients of a sprayhsprayindex of the maximum of a list maxWithIndex :: Ord a => [a] -> (Int, a) maxWithIndex = maximumBy (comparing snd) . zip [0 .. ]leading term of a spray hspray#whether a term divides another termhspray2quotient of term Q by term P, assuming P divides QhsprayRemainder of the division of a spray by a list of divisors, using the lexicographic ordering of the monomialshsprayDivision of a spray by a sprayhspraydivision of univariate sprays with degree(dividend) >= degree(divisor)hsprayslight modification of  to speed up groebner00hspray+groebner basis, not minimal and not reducedhspray'groebner basis, minimal but not reducedhsprayReduces a Grbner basishspray2Grbner basis, always minimal and possibly reducedgroebnerBasis sprays True == reduceGroebnerBasis (groebnerBasis sprays False)hspray'combinations of k elements among a listhspray/generates all permutations of a binary sequencehsprayElementary symmetric polynomial*putStrLn $ prettySpray' (esPolynomial 3 2)!(1)*x1.x2 + (1)*x1.x3 + (1)*x2.x3hsprayPower sum polynomialhsprayWhether a spray is a symmetric polynomial, an inefficient algorithm (use the function with the same name in the jackpolynomials" package if you need efficiency)hsprayWhether a spray can be written as a polynomial of a given list of sprays; this polynomial is returned if this is truex = lone 1 :: Spray Rationaly = lone 2 :: Spray Rational p1 = x ^+^ y p2 = x ^-^ y p = p1 ^*^ p23isPolynomialOf p [p1, p2] == (True, Just $ x ^*^ y)hspraysylvester matrixhspray"truncated" Sylvester matrixhspraythe coefficients of a spray as a univariate spray in x_1 with spray coefficientshsprayResultant of two  univariate sprayshspraySubresultants of two  univariate/ sprays. This function makes several calls to  and then it can be slow.hsprayResultant of two sprayshspray!Subresultants of two sprays (the  principal subresultants, while the  function returns the polynomial subresultants). This function makes several calls to  and then it can be slow.hsprayResultant of two sprays with coefficients in a field; this function is more efficient than the function hspray,Polynomial subresultants of two sprays (the  function computes the  principal7 subresultants). This function makes several calls to  and then it can be slow.hspray7Sturm-Habicht sequence of a spray. This function calls  and then it can be slow. hsprayPrincipal Sturm-Habicht sequence of a spray. This function calls  sturmHabicht$ sequence and then it can be slow.hsprayNumber of real roots of a spray in an open interval (that makes sense only for a spray on a ring embeddable in the real numbers).hsprayNumber of real roots of a spray in a closed interval (that makes sense only for a spray on a ring embeddable in the real numbers). The roots are not counted with their multiplicity.hsprayNumber of real roots of a spray in an open interval (that makes sense only for a spray on a ring embeddable in the real numbers).hsprayNumber of real roots of a spray in a closed interval (that makes sense only for a spray on a ring embeddable in the real numbers). The roots are not counted with their multiplicity.hsprayNumber of real roots of a spray (that makes sense only for a spray on a ring embeddable in the real numbers). The roots are not counted with their multiplicity.hsprayNumber of real roots of a spray (that makes sense only for a spray on a ring embeddable in the real numbers). The roots are not counted with their multiplicity.hspray?the spray coefficients of a spray as a univariate spray in x_n hspraythe degree of a spray as a univariate spray in x_n with spray coefficientshspraythe degree and the leading coefficient of a spray as a univariate spray in x_n with spray coefficientshsprayPseudo-division of two sprays A and B such that deg(A) >= deg(B) where deg6 is the degree with respect to the outermost variable.hspray9pseudo-division of two sprays, assuming degA >= degB >= 0hsprayrecursive GCD functionhsprayGreatest common divisor of two sprays with coefficients in a fieldhsprayDeterminant of a matrix with entries in a ring by using Laplace expansion (this is slow); the numeric-prelude package provides some stuff to deal with matrices over a ring but it does not provide the determinanthsprayDeterminant of a matrix over a ring by using Laplace expansion; this is the same as  but for a matrix from the numeric-prelude packagehspray,Characteristic polynomial of a square matrix&import Data.Matrix (Matrix, fromLists)m = fromLists [ [12, 16, 4] , [16, 2, 8], [8, 18, 10] ] :: Matrix Int"spray = characteristicPolynomial mputStrLn $ prettyNumSpray spray-x^3 + 24*x^2 + 268*x - 1936hspray8quotients of two univariate sprays by their gcd we use ' because this function is called (by ) with non-constant sprays onlyhsprayirreducible fraction of sprayshspray&set denominator to 1 if it is constanthspray2Ratio of sprays from numerator and denominator, without reducing the fractionhsprayIrreducible ratio of sprays from numerator and denominator; alias of (^/^)hsprayIrreducible ratio of sprays from numerator and denominator; alias of (%//%)hsprayDivision of a ratio of sprays by a spray; the result is an irreducible fractionhspray/Whether a ratio of sprays is constant; same as /hsprayWhether a ratio of sprays actually is polynomial, that is, whether its denominator is a constant spray (and then it should be the unit spray) x = qlone 1 y = qlone 2p = x^**^4 ^-^ y^**^4 q = x ^-^ y$isPolynomialRatioOfSprays $ p %//% qTrue#isPolynomialRatioOfSprays $ p %:% qFalsehsprayThe null ratio of sprayshsprayThe null ratio of sprayshsprayThe unit ratio of sprayshsprayThe unit ratio of sprayshsprayConstant ratio of sprayshspray%Evaluates a ratio of sprays; same as +hspraySubstitutes some values to some variables of a ratio of sprays; same as -hspray$Coerces a spray to a ratio of sprayshspray4Converts a ratio of polynomials to a ratio of sprayshsprayConverts a ratio of rational polynomials to a ratio of rational sprays; this is not a specialization of  because RatioOfQPolynomials is RatioOfPolynomials a with  a = Rational' , not with  a = RationalhsprayGeneral function to print a  objecthspray2Prints a ratio of sprays with numeric coefficientshspray3Prints a ratio of sprays with rational coefficientshspray2Prints a ratio of sprays with numeric coefficientshspray2Prints a ratio of sprays with numeric coefficientshspray3Prints a ratio of sprays with rational coefficientshspray3Prints a ratio of sprays with rational coefficientshsprayPrints a ratio of sprays hsprayPrints a ratio of sprays hsprayPrints a ratio of sprays hsprayPrints a ratio of sprays hspray3Prints a ratio of sprays with rational coefficientshspray3Prints a ratio of sprays with rational coefficientsprettyRatioOfQSprays rOS == prettyRatioOfQSpraysXYZ ["x","y","z"] rOShspray3Prints a ratio of sprays with rational coefficientsprettyRatioOfQSprays' rOS == prettyRatioOfQSpraysXYZ ["X","Y","Z"] rOShsprayPrints a ratio of sprays with rational coefficients, printing the monomials in the style of "x1^2.x2.x3^3"hspray2Prints a ratio of sprays with numeric coefficientshspray2Prints a ratio of sprays with numeric coefficientsprettyRatioOfNumSprays rOS == prettyRatioOfNumSpraysXYZ ["x","y","z"] rOShspray2Prints a ratio of sprays with numeric coefficientsprettyRatioOfNumSprays' rOS == prettyRatioOfNumSpraysXYZ ["X","Y","Z"] rOShsprayPrints a ratio of sprays with numeric coefficients, printing the monomials in the style of "x1^2.x2.x3^3"hspray*Number of parameters in a parametric spray'numberOfParameters (jacobiPolynomial 4)2hsprayApply polynomial transformations to the parameters of a parametric spray; e.g. you have a two-parameters polynomial P_{a, b}(X, Y, Z) and you want to get P_{a^2, b^2}(X, Y, Z)$, or the one-parameter polynomial P_{a, a}(X, Y, Z)jp = jacobiPolynomial 4 a = qlone 1 b = qlone 2$changeParameters jp [a^**^2, b^**^2]hspray?Substitutes some values to the parameters of a parametric sprayjacobi3 = jacobiPolynomial 3*legendre3 = substituteParameters jp [0, 0]hspray'helper function for evalParametricSprayhspray>Substitutes some values to the variables of a parametric sprayhspraySubstitutes some values to the parameters of a parametric spray as well as some values to its variableshsprayWhether the coefficients of a parametric spray polynomially depend on their parameters; I do not know why, but it seems to be the case for the Jacobi polynomials 5canCoerceToSimpleParametricSpray (jacobiPolynomial 8)TruehsprayCoerces a parametric spray to a simple parametric spray, without checking this makes sense with hsprayCoerces a parametric spray to a simple parametric spray, after checking this makes sense with hspray?Converts a `OneParameterSpray a` spray to a `ParametricSpray a`hspray Converts a  spray to a hsprayConverts a `SimpleParametricSpray a` spray to a `ParametricSpray a`hsprayConverts a parametric spray to a one-parameter spray, without checking the conversion makes sensehsprayConverts a rational parametric spray to a rational one-parameter spray, without checking the conversion makes sensehspray 4https://en.wikipedia.org/wiki/Gegenbauer_polynomialsGegenbauer polynomials5; we mainly provide them to give an example of the SimpleParametricSpray typegp = gegenbauerPolynomial 3*putStrLn $ prettySimpleParametricQSpray gp8{ (4/3)*a^3 + 4*a^2 + (8/3)*a }*X^3 + { -2*a^2 - 2*a }*X7putStrLn $ prettyQSpray'' $ substituteParameters gp [1] 8*X^3 - 4*Xhspray 0https://en.wikipedia.org/wiki/Jacobi_polynomialsJacobi polynomial; the n;-th Jacobi polynomial is a univariate polynomial of degree n, with two parameters, except for the case n=0 where it has no parameterjP = jacobiPolynomial 1putStrLn $ prettyParametricQSprayABCXYZ ["alpha", "beta"] ["X"] jP{ [ (1/2)*alpha + (1/2)*beta + 1 ] }*X + { [ (1/2)*alpha - (1/2)*beta ] }hsprayPretty form of a numeric parametric spray, using some given strings (typically some letters) to denote the parameters and some given strings (typically some letters) to denote the variables; rather use " for a rational parametric sprayhspray6Pretty form of a numeric parametric spray; rather use " for a rational parametric sprayprettyParametricNumSpray == prettyParametricNumSprayABCXYZ ["a"] ["X","Y","Z"]hsprayPretty form of a parametric rational spray, using some given strings (typically some letters) to denote the parameters and some given strings (typically some letters) to denote the variables type PQS = ParametricQSpray:{/f :: (QSpray, QSpray) -> (PQS, PQS, PQS) -> PQSf (a, b) (x, y, z) =(a %:% (a ^+^ b)) *^ x^**^2 ^+^ (b %:% (a ^+^ b)) *^ (y ^*^ z):} a = qlone 1 b = qlone 2x = lone 1 :: PQSy = lone 2 :: PQSz = lone 3 :: PQSpqs = f (a, b) (x, y, z)putStrLn $ prettyParametricQSprayABCXYZ ["a","b"] ["X","Y","Z"] pqs;{ [ a ] %//% [ a + b ] }*X^2 + { [ b ] %//% [ a + b ] }*Y.Zhspray*Pretty form of a parametric rational sprayprettyParametricQSpray == prettyParametricQSprayABCXYZ ["a"] ["X","Y","Z"]hsprayPretty form of a numeric simple parametric spray, using some given strings (typically some letters) to denote the parameters and some given strings (typically some letters) to denote the variables; rather use ) for a rational simple parametric sprayhspray?Pretty form of a numeric simple parametric spray; rather use & for a numeric simple parametric sprayprettySimpleParametricNumSpray == prettySimpleParametricNumSprayABCXYZ ["a"] ["X","Y","Z"]hsprayPretty form of a simple parametric rational spray, using some given strings (typically some letters) to denote the parameters and some given strings (typically some letters) to denote the variables "type SPQS = SimpleParametricQSpray:{3f :: (QSpray, QSpray) -> (SPQS, SPQS, SPQS) -> SPQSf (a, b) (x, y, z) =:(a ^+^ b) *^ x^**^2 ^+^ (a^**^2 ^+^ b^**^2) *^ (y ^*^ z):} a = qlone 1 b = qlone 2x = lone 1 :: SPQSy = lone 2 :: SPQSz = lone 3 :: SPQSspqs = f (a, b) (x, y, z)putStrLn $ prettySimpleParametricQSprayABCXYZ ["a","b"] ["X","Y","Z"] spqs!{ a + b }*X^2 + { a^2 + b^2 }*Y.Zhspray1Pretty form of a simple parametric rational sprayprettySimpleParametricQSpray == prettySimpleParametricQSprayABCXYZ ["a"] ["X","Y","Z"]hspray permutation hspray5function-like object whose variables will be permutedhspray0the function-like object with permuted variables hspray;the indices of the variables to be swapped (starting at 1) hspray4function-like object whose variables will be swappedhspray/the function-like object with swapped variables!hsprayfunction-like objecthsprayindex of the variable"hspray#number of leading variables to drophspraya function-like object#hspray8index of the variable of differentiation (starting at 1)hspraythe object to be derivatedhspraythe derivated object+hspray2function-like object to be evaluated, e.g. a sprayhspray1list of values to be substituted to its variables-hsprayJust x to replace the variable with x, Nothing for no replacementhspray.function-like object to be partially evaluated.hspray$function-like object such as a sprayhspraylist of new variables;hspray&a string to denote the variable, e.g. "a" <hspray>string (usually a single letter) to denote the variable, e.g. "a"=hspray,the value at which the evaluation is desired>hspray2string to denote the parameter of the spray, e.g. "a"hspray7typically a letter, to denote the non-indexed variableshspraya one-parameter spray; note that this function does not simplify it?hspray2string to denote the parameter of the spray, e.g. "a"hspray4typically some letters, to denote the main variableshspraya one-parameter spray; note that this function does not simplify it@hspray2string to denote the parameter of the spray, e.g. "a"hspraya one-parameter spray; note that this function does not simplify itAhspray2string to denote the parameter of the spray, e.g. "a"hspraya one-parameter spray; note that this function does not simplify itBhspray=usually a letter, to denote the parameter of the spray, e.g. "a"hsprayusually a letter, to denote the non-indexed variables of the sprayhspraya one-parameter rational spray; note that this function does not simplify itChspray=usually a letter, to denote the parameter of the spray, e.g. "a"hspray:usually some letters, to denote the variables of the sprayhspraya one-parameter rational spray; note that this function does not simplify itDhspray=usually a letter, to denote the parameter of the spray, e.g. "a"hspraythe one-parameter rational spray to be printed; note that this function does not simplify itEhspray=usually a letter, to denote the parameter of the spray, e.g. "a"hspraythe one-parameter rational spray to be printed; note that this function does not simplify itHhspray#one-parameter spray to be evaluatedhspraya value for the parameterhspraysome values for the variables Mhsprayindex hsprayexponentNhsprayindex hsprayexponentOhspray1list of (index, exponent); duplicates are deletedUhspray1sequence of exponents; trailing zeros are droppedhspraysprayhspray>coefficient of the monomial given by the sequence of exponents]hspray list of (exponents, coefficient)^hspray6function mapping a coefficient to a string, typically hspray*pair of braces to enclose the coefficientshsprayfunction mapping a list of exponents to a list of strings representing the monomials corresponding to these exponentshspraythe spray to be printed_hspray6function mapping a coefficient to a string, typically hspray:used to enclose the coefficients, usually a pair of braceshspray.typically some letters, to print the variableshspraythe spray to be printed`hspray6function mapping a coefficient to a string, typically hspray.typically some letters, to print the variableshspraythe spray to be printedahspray.typically some letters, to print the variableshspraythe spray to be printedbhspray6function mapping a coefficient to a string, typically hspray used to enclose the coefficientshspray6typically a letter, to print the non-indexed variableshspraythe spray to be printedchspray1function mapping a coefficient to a string, e.g. hspray6typically a letter, to print the non-indexed variableshspraythe spray to be printeddhspray6typically a letter, to print the non-indexed variableshspraythe spray to be printedghspray)a string denoting the variables, e.g. "x"hspray the sprayhhsprayfunction mapping a list of monomial exponents to a list of strings representing the monomialshspray3function mapping a positive coefficient to a stringihsprayusually a letter such as "x"$ to denote the non-indexed variablesjhspray,usually some letters, denoting the variableskhsprayfunction printing monomialslhsprayfunction mapping a list of monomials exponents to a list of stringsmhsprayusually a letter such as "x"%, to denote the non-indexed variablesnhsprayusually a letter such as "x"%, to denote the non-indexed variablesohspray-usually some letters, to denote the variablesphspray-usually some letters, to denote the variableshspray dividand hspraydivisorhspray(quotient, remainder)hspray dividand hspraydivisorhspray(quotient, remainder)hspray dividand hspraydivisorhspray(quotient, remainder)hspraylist of sprays hspray#whether to return the reduced basishspraynumber of variableshsprayindexhspraynumber of variableshspraypowerhsprayindicator of the variable with respect to which the resultant is desired (e.g. 1 for x)hsprayindicator of the variable with respect to which the subresultants are desired (e.g. 1 for x)hsprayindicator of the variable with respect to which the resultant is desired (e.g. 1 for x)hsprayindex of the variable with respect to which the subresultants will be computed (e.g. 2 for y)hsprayindex of the variable with respect to which the Sturm-Habicht sequence will be computed (e.g. 2 for y)hsprayindex of the variable with respect to which the Sturm-Habicht sequence will be computed (e.g. 2 for y)hspraya sprayhspray!lower bound of the interval; use Just for a finite bound, and Nothing for minus infinityhspray!upper bound of the interval; use Just for a finite bound, and Nothing for minus infinityhspraya sprayhspray!lower bound of the interval; use Just for a finite bound, and Nothing for minus infinityhspray!upper bound of the interval; use Just for a finite bound, and Nothing for minus infinityhspraya sprayhspray!lower bound of the interval; use Just for a finite bound, and Nothing for minus infinityhspray!upper bound of the interval; use Just for a finite bound, and Nothing for minus infinityhspraya sprayhspray!lower bound of the interval; use Just for a finite bound, and Nothing for minus infinityhspray!upper bound of the interval; use Just for a finite bound, and Nothing for minus infinityhsprayAhsprayBhspray)(C, (Q, R)) such that C^*^A = B^*^Q ^+^ Rhspraynumber of variableshsprayAhsprayBhspray)(C, (Q, R)) such that C^*^A = B^*^Q ^+^ Rhsprayfunction which prints a pair of sprays that will be applied to the numerator and the denominatorhspray;pair of braces to enclose the numerator and the denominatorhsprayrepresents the quotient barhspray6function mapping a coefficient to a string, typically hspray:used to enclose the coefficients, usually a pair of braceshspray.typically some letters, to print the variableshspraythe two sprays to be printedhspray6function mapping a coefficient to a string, typically hspray:used to enclose the coefficients, usually a pair of braceshspray6typically a letter, to print the non-indexed variableshspraythe two sprays to be printedhspray3function mapping a positive coefficient to a stringhsprayprints the monomialshspraythe two sprays to be printedhsprayprints the monomialshspraythe two sprays to be printedhspray3function mapping a positive coefficient to a stringhspray.typically some letters, to print the variableshspraythe two sprays to be printedhspray.typically some letters, to print the variableshspraythe two sprays to be printedhspray3function mapping a positive coefficient to a stringhspray5typically a letter, to print the non-indexed variablehspraythe two sprays to be printedhspray6typically a letter, to print the non-indexed variableshspraythe two sprays to be printedhspray3function mapping a positive coefficient to a stringhsprayprints the monomialshspray;pair of braces to enclose the numerator and the denominatorhsprayrepresents the quotient barhsprayprints the monomialshspray;pair of braces to enclose the numerator and the denominatorhsprayrepresents the quotient barhspray3function mapping a positive coefficient to a stringhspray.typically some letters, to print the variableshspray;pair of braces to enclose the numerator and the denominatorhsprayrepresents the quotient barhspray3function mapping a positive coefficient to a stringhspray*typically a letter, to print the variableshspray;pair of braces to enclose the numerator and the denominatorhsprayrepresents the quotient barhspray.typically some letters, to print the variableshspray;pair of braces to enclose the numerator and the denominatorhsprayrepresents the quotient barhspray*typically a letter, to print the variableshspray;pair of braces to enclose the numerator and the denominatorhsprayrepresents the quotient barhspray2typically some letters, to represent the variableshspray6function mapping a coefficient to a string, typically hspray:used to enclose the coefficients, usually a pair of braceshspray;pair of braces to enclose the numerator and the denominatorhsprayrepresents the quotient barhspray2typically some letters, to represent the variableshspray6function mapping a coefficient to a string, typically hspray.typically a letter, to represent the variableshspray6function mapping a coefficient to a string, typically hspray:used to enclose the coefficients, usually a pair of braceshspray;pair of braces to enclose the numerator and the denominatorhsprayrepresents the quotient barhspray.typically a letter, to represent the variableshspray6function mapping a coefficient to a string, typically hspray2typically some letters, to represent the variableshspray:typically a letter, to represent the non-indexed variableshspray2typically some letters, to represent the variableshspray.typically a letter, to represent the variableshsprayOneParameterSpray a, SimpleParametricSpray a, or ParametricSpray ahspray[Polynomial a] or  [Spray a], the new variables hsprayOneParameterSpray a, SimpleParametricSpray a, or ParametricSpray a hsprayvalues of type a$ to be substituted to the parametershspray output: a Spray a sprayhsprayOneParameterSpray a, SimpleParametricSpray a, or ParametricSpray a hsprayvalues of type a# to be substituted to the variableshsprayOneParameterSpray a, SimpleParametricSpray a, or ParametricSpray a hsprayvalues of type a$ to be substituted to the parametershsprayvalues of type a# to be substituted to the variableshsprayresult: a value of type ahspray;usually some letters, to denote the parameters of the sprayhspray:usually some letters, to denote the variables of the sprayhspraya parametric numeric sprayhspraya parametric numeric sprayhspray;usually some letters, to denote the parameters of the sprayhspray:usually some letters, to denote the variables of the sprayhspraya parametric rational sprayhspray;usually some letters, to denote the parameters of the sprayhspray:usually some letters, to denote the variables of the sprayhspray!a numeric simple parametric sprayhspray!a numeric simple parametric sprayhspray;usually some letters, to denote the parameters of the sprayhspray:usually some letters, to denote the variables of the sprayhspraya parametric rational spray+ !"#$%&'()*,-./012  KLMNOPQRTefgad^_`bchklimnjopuvqrst<;56789:=>?@ABCDEFGHIUVSW|}~XZ\Ywx43J]y[z{+ !"#$%&'()*,-./012  KLMNOPQRTefgad^_`bchklimnjopuvqrst<;56789:=>?@ABCDEFGHIUVSW|}~XZ\Ywx43J]y[z{$6%6&7'8(7)6*63747J77777      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~%hspray-0.5.2.0-5ERhQSmOQkrL0ShEpyXXPtMath.Algebra.HsprayhsprayParametricQSprayParametricSpraySimpleParametricQSpraySimpleParametricSprayRatioOfQSprays RatioOfSprays _numerator _denominatorTermQSpray'QSpraySprayPowers exponents nvariables ExponentsOneParameterQSprayOneParameterSprayRatioOfQPolynomialsRatioOfPolynomials QPolynomial Polynomial Rational'A FunctionLikeBaseRing VariablesTypenumberOfVariablespermuteVariables swapVariablesinvolvesVariable dropVariables derivative^+^^-^^*^^**^*^+><+evaluate evaluateAt substitutechangeVariables isConstant isUnivariate isBivariate isTrivariate/>.^ constPolypolyFromCoeffs soleParameter constQPolyqpolyFromCoeffsqsoleParameterprettyRatioOfQPolynomialsprettyRatioOfPolynomialsevalRatioOfPolynomialsprettyOneParameterSprayX1X2X3prettyOneParameterSprayXYZprettyOneParameterSprayprettyOneParameterSpray'prettyOneParameterQSprayX1X2X3prettyOneParameterQSprayXYZprettyOneParameterQSprayprettyOneParameterQSpray'evalOneParameterSpraysubstituteTheParameterevalOneParameterSpray'evalOneParameterSpray''/^loneqlonelone'qlone'monomial qmonomial unitSpray zeroSpray isZeroSpray constantSpraygetCoefficientgetConstantTermisConstantSpray evalSprayevalSpraySpraysubstituteSprayfromRationalSpray composeSprayfromList showSpray showSprayXYZ showSprayXYZ'prettySprayXYZshowSprayX1X2X3showSprayX1X2X3'prettySprayX1X2X3 prettySpray prettySpray' prettySpray'' showNumSprayprettyNumSprayX1X2X3prettyNumSprayXYZ showQSpray showQSpray'prettyQSprayX1X2X3prettyQSprayX1X2X3'prettyQSprayXYZprettyQSprayXYZ' prettyQSprayprettyQSpray'' prettyQSpray'prettyQSpray'''prettyNumSprayprettyNumSpray' sumOfSpraysproductOfSpraystoList bombieriSpraycollinearSpraysisHomogeneousSpray allExponentsallCoefficientssprayDivisionRemainder sprayDivisionreduceGroebnerBasis groebnerBasis esPolynomial psPolynomialisSymmetricSprayisPolynomialOf resultant1subresultants1 resultant subresultants resultant'polynomialSubresultantssturmHabichtSequenceprincipalSturmHabichtSequencenumberOfRealRootsInOpenInterval!numberOfRealRootsInClosedInterval numberOfRealRootsInOpenInterval'"numberOfRealRootsInClosedInterval'numberOfRealRootsnumberOfRealRoots'pseudoDivisiongcdSpray detLaplace detLaplace'characteristicPolynomial%:%%//%^/^%/%isConstantRatioOfSpraysisPolynomialRatioOfSprayszeroRatioOfSprayszeroROSunitRatioOfSpraysunitROSconstantRatioOfSpraysevalRatioOfSprayssubstituteRatioOfSpraysasRatioOfSpraysfromRatioOfPolynomialsfromRatioOfQPolynomialsshowRatioOfSpraysshowRatioOfNumSpraysshowRatioOfQSpraysshowRatioOfSpraysXYZshowRatioOfSpraysXYZ'showRatioOfSpraysX1X2X3showRatioOfSpraysX1X2X3'prettyRatioOfQSpraysXYZprettyRatioOfQSpraysprettyRatioOfQSprays'prettyRatioOfQSpraysX1X2X3prettyRatioOfNumSpraysXYZprettyRatioOfNumSpraysprettyRatioOfNumSprays'prettyRatioOfNumSpraysX1X2X3numberOfParameterschangeParameterssubstituteParametersevalParametricSprayevalParametricSpray' canCoerceToSimpleParametricSprayasSimpleParametricSprayUnsafeasSimpleParametricSprayfromOneParameterSprayfromOneParameterQSpray"parametricSprayToOneParameterSpray$parametricQSprayToOneParameterQSpraygegenbauerPolynomialjacobiPolynomialprettyParametricNumSprayABCXYZprettyParametricNumSprayprettyParametricQSprayABCXYZprettyParametricQSpray$prettySimpleParametricNumSprayABCXYZprettySimpleParametricNumSpray"prettySimpleParametricQSprayABCXYZprettySimpleParametricQSpray$fCA$fFunctionLikeT$fCTT$fCTT0$fCaT$fCaT0$fCAT$fCAT0$fFunctionLikeT0$fHashablePowers $fEqPowers $fCHashMap $fCaHashMap $fCaHashMap0 $fCHashMap0 $fCaHashMap1 $fCaHashMap2 $fCTHashMap $fCTHashMap0$fFunctionLikeHashMap$fCRatioOfSprays$fCRatioOfSprays0$fCHashMapRatioOfSprays$fCHashMapRatioOfSprays0$fCaRatioOfSprays$fCaRatioOfSprays0$fCRatioOfSprays1$fEqRatioOfSprays$fFunctionLikeRatioOfSprays $fCaHashMap3 $fCaHashMap4$fCHashMapHashMap$fCHashMapHashMap0 $fCaHashMap5 $fCaHashMap6$fShowRatioOfSprays $fShowPowers$fEqA$fShowA$fCA0$fCA1$fCA2polynomialToSprayshowRatioOfPolynomialsshowQpolshowQpolysRatioevalOneParameterTerm growSequence harmonize addSpraysaddTermsumTerms negateSpray scaleSpraymultTermmultSprayByTerm multSpraysremoveZeroTerms lonePowerremoveConstantTermevalSprayHelperfromTermshowMonomialsOldshowMonomialX1X2X3showMonomialsX1X2X3showMonomialXYZshowMonomialsXYZ showRatio showRatio' safeSpray orderedTerms leadingTermdividesquotientunivariateSprayDivisionsprayDivisionRemainder' groebner00 groebner0combinationsOfpermutationsBinarySequencesylvesterMatrixsylvesterMatrix'sprayCoefficientssprayCoefficients'degreedegreeAndLeadingCoefficientpseudoDivision' gcdKX1dotsXnquotientsByGCDsprayDivision0irreducibleFractionadjustFractionshowRatioOfNumSpraysXYZshowRatioOfNumSpraysX1X2X3showRatioOfQSpraysXYZshowRatioOfQSpraysX1X2X3 evalTerm'fromSimpleParametricSpraybaseGHC.ShowshowshowTwoSpraysXYZshowTwoSpraysX1X2X3showTwoNumSpraysshowTwoQSpraysshowTwoNumSpraysXYZshowTwoQSpraysXYZshowTwoNumSpraysX1X2X3showTwoQSpraysX1X2X3