Skip to main content

Package for algebraic computation with single, double, and quantum Schubert polynomials

Project description

schubmult

Program and package for rapid computation of Littlewood-Richardson coefficients of Schubert polynomials, compliant with sympy and with optional Sage integration

The main purpose of this python package is for executing scripts to compute coefficients of products of various types of Schubert polynomials. Coproducts can also be computed, as well as substitution of commuting difference operators for quantum double Schubert polynomials. Quantum multiplication also has parabolic subgroup support, computed via the Peterson-Woodward comparison theorem. Note that except for quantum Schubert polynomial multiplication with the --basic-pieri option, the methodology for quantum/quantum double Schubert polynomials is conjectural at this time.

Docs to be hosted on Wiki

To install dev version

pip install -r https://raw.githubusercontent.com/matthematics/schubmult/refs/heads/main/requirements.txt
pip install git+https://github.com/matthematics/schubmult.git

Basic script command lines, one-line notation

schubmult_py - ordinary Schubert polynmoials

usage: schubmult_py [-h] [-np] [--code] [--mult MULT [MULT ...]] [--coprod] [--display-mode {basic,raw}]
                    hyphen-separated list of perms [hyphen-separated list of perms ...]

Compute products of ordinary Schubert polynomials

positional arguments:
  hyphen-separated list of perms
                        Space-delimited permutations separated by hyphens, e. g. 3 4 1 2 - 5 1 2 4 3

options:
  -h, --help            show this help message and exit
  -np, --no-print       Compute the result but do not print it
  --code                Permutations represented by the Lehmer code
  --mult MULT [MULT ...]
                        Some additional terms in the ring to multiply by
  --coprod              Compute the coproduct (different syntax: one permutation, then a hyphen, the variable
                        index positions to split on)
  --display-mode {basic,raw}
                        Method of displaying the output. Default basic

Example:
        schubmult_py 5 1 7 3 2 6 4 - 2 1 6 3 5 4
            or equivalently
        schubmult_py --code 4 0 4 1 0 1 - 1 0 3 0 1
            or alternatively
        schubmult_py --coprod --code 2 0 3 0 1 - 2 4

schubmult_double - Double Schubert polynmoials

usage: schubmult_double [-h] [-np] [--code] [--mult MULT [MULT ...]] [--coprod] [--display-positive]
                        [--optimizer-message] [--down] [-nc] [--mixed-var] [--expand]
                        [--display-mode {basic,pretty,latex,raw}]
                        hyphen-separated list of perms [hyphen-separated list of perms ...]

Compute coefficients of products of double Schubert polynomials in the same or different sets of coefficient variables

positional arguments:
  hyphen-separated list of perms
                        Space-delimited permutations separated by hyphens, e. g. 3 4 1 2 - 5 1 2 4 3

options:
  -h, --help            show this help message and exit
  -np, --no-print       Compute the result but do not print it
  --code                Permutations represented by the Lehmer code
  --mult MULT [MULT ...]
                        Some additional terms in the ring to multiply by
  --coprod              Compute the coproduct (different syntax: one permutation, then a hyphen, the variable
                        index positions to split on)
  --display-positive    Display the result in terms of the positive roots, or if mixed variable attempt to display
                        the result as a positive algebraic combination of terms of the form y_i - z_j
  --optimizer-message   Display debug output during integer optimization for --display-positive
  --down                Reverse multiplication
  -nc, --no-check       Do not check if positive result matches the original
  --mixed-var           Used mixed variables y and z
  --expand              Expand the output rather than leaving it as originally computed (slow)
  --display-mode {basic,pretty,latex,raw}
                        Method of displaying the output. Default basic

Example:
        schubmult_double 5 1 7 3 2 6 4 - 2 1 6 3 5 4 [ --display-positive]
            or equivalently
        schubmult_double --code 4 0 4 1 0 1 - 1 0 3 0 1 [ --display-positive]
            or alternatively
        schubmult_double --coprod --code 2 0 3 0 1 - 2 4  [ --display-positive]

schubmult_q - Quantum Schubert polynomials

usage: schubmult_q [-h] [-np] [--code] [--mult MULT [MULT ...]] [--parabolic PARABOLIC [PARABOLIC ...]] [--basic-pieri]
                   [--display-mode {basic,pretty,latex,raw}]
                   hyphen-separated list of perms [hyphen-separated list of perms ...]

Compute products of quantum Schubert polynomials

positional arguments:
  hyphen-separated list of perms
                        Space-delimited permutations separated by hyphens, e. g. 3 4 1 2 - 5 1 2 4 3

options:
  -h, --help            show this help message and exit
  -np, --no-print       Compute the result but do not print it
  --code                Permutations represented by the Lehmer code
  --mult MULT [MULT ...]
                        Some additional terms in the ring to multiply by
  --parabolic PARABOLIC [PARABOLIC ...]
                        Generators of the parabolic subgroup to compute quantum coeffs for
  --basic-pieri         Do not apply conjectural computation optimization to quantum
  --display-mode {basic,pretty,latex,raw}
                        Method of displaying the output. Default basic

Example:
        schubmult_q 5 1 7 3 2 6 4 - 2 1 6 3 5 4
            or equivalently
        schubmult_q --code 4 0 4 1 0 1 - 1 0 3 0 1```

schubmult_q_double - Quantum double Schubert polynomials

usage: schubmult_q_double [-h] [-np] [--code] [--mult MULT [MULT ...]] [--display-positive] [--optimizer-message] [--down] [-nc]
                          [--mixed-var] [--expand] [--parabolic PARABOLIC [PARABOLIC ...]] [--basic-pieri] [--nil-hecke N]
                          [--nil-hecke-apply N] [--display-mode {basic,pretty,latex,raw}]
                          hyphen-separated list of perms [hyphen-separated list of perms ...]

Compute coefficients of products of quantum double Schubert polynomials in the same or different sets of coefficient variables

positional arguments:
  hyphen-separated list of perms
                        Space-delimited permutations separated by hyphens, e. g. 3 4 1 2 - 5 1 2 4 3

options:
  -h, --help            show this help message and exit
  -np, --no-print       Compute the result but do not print it
  --code                Permutations represented by the Lehmer code
  --mult MULT [MULT ...]
                        Some additional terms in the ring to multiply by
  --display-positive    Display the result in terms of the positive roots, or if mixed variable attempt to display the result as a
                        positive algebraic combination of terms of the form y_i - z_j
  --optimizer-message   Display debug output during integer optimization for --display-positive
  --down                Reverse multiplication
  -nc, --no-check       Do not check if positive result matches the original
  --mixed-var           Used mixed variables y and z
  --expand              Expand the output rather than leaving it as originally computed (slow)
  --parabolic PARABOLIC [PARABOLIC ...]
                        Generators of the parabolic subgroup to compute quantum coeffs for
  --basic-pieri         Do not apply conjectural computation optimization to quantum
  --nil-hecke N         Substitute up to N of Fomin-Gelfand-Postnikov commuting difference operators
  --nil-hecke-apply N   Substitute commuting difference operators for perm1, then apply to Schub indexed by perm2
  --display-mode {basic,pretty,latex,raw}
                        Method of displaying the output. Default basic

Example:
        schubmult_q_double 5 1 7 3 2 6 4 - 2 1 6 3 5 4 [ --display-positive]
            or equivalently
        schubmult_q_double --code 4 0 4 1 0 1 - 1 0 3 0 1 [ --display-positive]

Diplaying the result positively

The command line argument --display-positive is available in schubmult_double and schubmult_q_double, which displays the result positively (if possible, this is still only always possible conjecturally). It will fail and print out the offending case if it finds a counterexample. This is highly processor intensive.

Runtime will vary tremendously by case. The general problem is #P-hard. Though the result is always nonnegative (which at least is known for schubmult_py, schubmult_q, schubmult_double, and schubmult_q_double) and the problem is in GapP, it is not known to be in #P at this time.

schubmult_py is for multiplying ordinary Schubert polynomials. schubmult_double is for multiplying double Schubert polynomials in different sets of coefficient variables (--mixed-var) or in the same set of coefficient variables (by default). Similarly, schubmult_q is for multiplying quantum Schubert polynomials, schubmult_q_double is for multiplying quantum double Schubert polynomials (in different sets of coefficient variables with the --mixed-var option, or the same set), or in other words it computes the Gromov-Witten invariants, equivariant Gromov-Witten invariants, and (mixed?) equivariant Gromov-Witten invariants of the complete flag variety. All have the same command line syntax as schubmult, except when using the --code option. schubmult_double/schubmult_q_double display the result with nonnegative coefficients (and the q variables) with the --display-positive option (either in the negative simple roots r_i, or in y_i - z_j for --mixed-var).

schubmult_xx --coprod allows you to split (double) Schubert polynomials along certain indices (not available for quantum). It takes one permutation as an argument, followed by a dash -, then the set of indices you would like to split on.

sympy-compliant ring classes (as of version 3.0.0)

There are sympy-compliant ring classes similar to the Sage classes that can be accessed with the Sx, DSx, QSx, QDSx, and QPDSx element constructors. The interface is similar to Sage, shown below, though products are shown as positive if this can be done without extensive computation (i.e. avoiding integer programming).

Examples:

>>> from schubmult import *
>>> QPDSx(2,3)(uncode([1,2]))*QPDSx(2,3)(uncode([1,3]))
q_1*((-y_1 + y_2)*(y_1 - y_4) + (-y_1 + y_2)*(y_2 - y_3) + (-y_1 + y_2)*(-y_1 - y_2 + y_4 + y_5)) 
+ q_1*(-y_1 + y_2)*QPDSx(2, 3)((1, 2, 3, 4, 6, 5), 'y') + q_1*(-y_1 + y_5)*QPDSx(2, 3)((1, 3, 2), 'y') 
+ q_1*QPDSx(2, 3)((1, 3, 2, 4, 6, 5), 'y') + q_1*QPDSx(2, 3)((1, 4, 2, 3), 'y') + q_1*QPDSx(2, 3)((2, 3, 1), 'y') 
+ ((-y_1 + y_2)*(y_2 - y_3)*(y_2 - y_4) + (-y_1 + y_2)*(y_2 - y_4)*(-y_1 - y_2 + y_4 + y_5) + (-y_1 + y_2)*((-y_1 + y_4)*(-y_2 + y_4)
+ (-y_1 + y_4)*(-y_3 + y_5) + (-y_2 + y_5)*(-y_3 + y_5)))*QPDSx(2, 3)((2, 5, 1, 3, 4), 'y') + ((-y_1 + y_2)*(y_2 - y_4)
+ (-y_1 + y_2)*(-y_1 - y_2 - y_3 + y_4 + y_5 + y_6))*QPDSx(2, 3)((2, 6, 1, 3, 4, 5), 'y') + ((-y_1 + y_2)*(-y_1 + y_4) 
- (-y_1 + y_2)*(-y_2 + y_5) + (-y_1 + y_2)*(-y_3 + y_5) - (-y_1 + y_4)*(-y_2 + y_3) + (-y_1 + y_4)*(-y_2 + y_4) 
- (-y_2 + y_3)*(-y_2 + y_5) + (-2*y_1 + y_4 + y_5)*(-y_2 + y_3 - y_4 + y_5))*QPDSx(2, 3)((3, 5, 1, 2, 4), 'y') 
+ (-y_1 + y_2)*QPDSx(2, 3)((2, 7, 1, 3, 4, 5, 6), 'y') + (-2*y_1 + y_5 + y_6)*QPDSx(2, 3)((3, 6, 1, 2, 4, 5), 'y') 
+ (-y_1 + y_5)*QPDSx(2, 3)((4, 5, 1, 2, 3), 'y') + QPDSx(2, 3)((3, 7, 1, 2, 4, 5, 6), 'y') + QPDSx(2, 3)((4, 6, 1, 2, 3, 5), 'y')

which agrees with the following script output,

$ schubmult_q_double --parabolic 2 3 --code 1 2 - 1 3 --display-positive
[]  q_1*(-y_1 + y_2)*(-y_3 + y_5)
[0, 1]  q_1*(-y_1 + y_5)
[0, 2]  q_1
[1, 1]  q_1
[1, 3]  (-y_1 + y_2)*(-y_1 + y_5)*(-y_3 + y_5)
[2, 3]  (-y_1 + y_5)**2
[3, 3]  -y_1 + y_5

except of course that it is not displayed positively, and also parabolic quantum double Schubert polynomials are included that do not show up in the equivariant quantum cohomology ring of the Grassmannian.

Sage integration (as of version 2.0.0)

SageMath is a computer algebra system that, while wonderful, is monstrously large and only works on posix-based operating systems (including WSL VMs, so it is still usable on Windows). This is why Sage support is provided optionally in schubmult. The syntax to install the Sage dependencies is

pip install schubmult[sage]

This will install the sagemath-standard python package in addition to the other dependencies. Again, this only works on Linux, MacOS, or WSL. To use with a currently installed SageMath distribution, use sage's python interpreter to install the package (the [sage] piece is not required in that case).

Basic sage example

sage: from schubmult.sage import FastSchubertPolynomialRing, FastDoubleSchubertPolynomialRing, FastQuantumSchubertPolynomialRing, FastQuantumDoubleSchubertPolynomialRing

sage: SingleRing = FastSchubertPolynomialRing(ZZ, 100, "x")
sage: SingleRing([3,4,1,2])
Sx([3, 4, 1, 2])
sage: SingleRing([3,4,1,2]) * SingleRing([5,1,4,2,3])
Sx([7, 3, 4, 1, 2, 5, 6]) + Sx([7, 4, 2, 1, 3, 5, 6]) + Sx([7, 5, 1, 2, 3, 4, 6])

Mixed variable (Molev-Sagan) type products

sage: DoubleRing = FastDoubleSchubertPolynomialRing(ZZ, 100, "x", ("y", "z"))
sage: DoubleRing([3,4,1,2])*DoubleRing([1,4,2,3])
(y1*y2-y1*y4-y2*y4+y4^2)*DSx([3, 4, 1, 2], 'y') + (-y1-y2+y4+y5)*DSx([3, 5, 1, 2, 4], 'y')
 + DSx([3, 6, 1, 2, 4, 5], 'y')
sage: DoubleRing([3,4,1,2]) * DoubleRing([1,4,2,3],"z")
(y3^2+y3*y4+y4^2-y3*z1-y4*z1-y3*z2-y4*z2+z1*z2-y3*z3-y4*z3+z1*z3+z2*z3)*DSx([3, 4, 1, 2], 'y')
 + (y3+y4+y5-z1-z2-z3)*DSx([3, 5, 1, 2, 4], 'y') + DSx([3, 6, 1, 2, 4, 5], 'y')

expand()

sage: SingleRingQ = FastQuantumSchubertPolynomialRing(ZZ, 100, "x")
sage: SingleRingQ([2,3,1,4]).expand()
x1*x2 + q_1

Coercion

Coercion was implemented as widely as possible.

sage: DoubleRing([1,4,2,3],"z") * SingleRing([3,4,1,2])
z1^2*z4^2*DSx([1, 4, 2, 3], 'z') + (z1^2*z4+z1^2*z5)*DSx([1, 5, 2, 3, 4], 'z') + z1^2*DSx([1, 6, 2, 3, 4, 5], 'z')
 + (z1*z4^2+z2*z4^2)*DSx([2, 4, 1, 3], 'z') + (z1*z4+z2*z4+z1*z5+z2*z5)*DSx([2, 5, 1, 3, 4], 'z')
 + (z1+z2*DSx([2, 6, 1, 3, 4, 5], 'z') + z4^2*DSx([3, 4, 1, 2], 'z') + (z4+z5)*DSx([3, 5, 1, 2, 4], 'z')
 + DSx([3, 6, 1,  2, 4, 5], 'z')
sage: SingleRingQ([2,3,1,4]) * SingleRing([4,1,3,2])
(-2*q1^2*q2+q1*q2*q3)*QSx([1]) + q1*q2*QSx([1, 3, 4, 2]) + (-q1^2)*QSx([2, 3, 1]) + q1*QSx([2, 4, 3, 1]) + (-q1*q2)*QSx([3, 1, 2])
 + q1*QSx([3, 2, 4, 1]) + q1*QSx([3, 4, 1, 2]) + (-q1)*QSx([4, 2, 1, 3]) + QSx([5, 2, 3, 1, 4]) + QSx([5, 3, 1, 2, 4])
sage: R.<x1, x2> = PolynomialRing(ZZ, 2)
sage: SingleRing([1,3,2]) - x1 - x2 == 0
True

Coproducts

FastSchubertPolynomialRing and FastDoubleSchubertPolynomialRings are bialgebras and each element implements the coproduct() member function. set_coproduct_indices() on the base ring will determine the variables to partition on.

sage: DoubleRing.set_coproduct_indices((1,3))
sage: DoubleRing([4,1,5,2,3], "z").coproduct()
(y1^2-y1*z2-y1*z3+z2*z3)*DSx([4, 1, 2, 3], 'z') # DSx([1], 'y') + (y1+y2-z2-z3)*DSx([4, 1, 2, 3], 'z') # DSx([2, 1], 'y')
 + DSx([4, 1, 2, 3], 'z') # DSx([3, 1, 2], 'y') + (y1-z3)*DSx([4, 2, 1, 3], 'z') # DSx([1], 'y')
  + DSx([4, 2, 1, 3], 'z') # DSx([2, 1], 'y') + DSx([4, 3, 1, 2], 'z') # DSx([1], 'y')

Demonstration of quantum double mixed products

sage: QuantumDoubleRing = FastQuantumDoubleSchubertPolynomialRing(ZZ, 100, "x", ("y","z"))
sage: QuantumDoubleRing([4,1,3,2])*QuantumDoubleRing([5,1,3,2,4], "z")
(q1*q2*q3*y1^3 + q1*q2*q3*y1^2*y4 + q1*q2*q3*y1*y4^2 + q1*q2*q3*y4^3 - q1*q2*q3*y1^2*z1 - 
q1*q2*q3*y1*y4*z1 - q1*q2*q3*y4^2*z1 - q1*q2*q3*y1^2*z2 - q1*q2*q3*y1*y4*z2 - q1*q2*q3*y4^2*z2 + 
q1*q2*q3*y1*z1*z2 + q1*q2*q3*y4*z1*z2 - q1*q2*q3*y1^2*z3 - q1*q2*q3*y1*y4*z3 - q1*q2*q3*y4^2*z3 + 
q1*q2*q3*y1*z1*z3 + q1*q2*q3*y4*z1*z3 + q1*q2*q3*y1*z2*z3 + q1*q2*q3*y4*z2*z3 - q1*q2*q3*z1*z2*z3 - 
q1*q2*q3*y1^2*z4 - q1*q2*q3*y1*y4*z4 - q1*q2*q3*y4^2*z4 + q1*q2*q3*y1*z1*z4 + q1*q2*q3*y4*z1*z4 + 
q1*q2*q3*y1*z2*z4 + q1*q2*q3*y4*z2*z4 - q1*q2*q3*z1*z2*z4 + q1*q2*q3*y1*z3*z4 + q1*q2*q3*y4*z3*z4 - 
q1*q2*q3*z1*z3*z4 - q1*q2*q3*z2*z3*z4)*QDSx([1], 'y') + (q1*q2*q3*y1^2 + q1*q2*q3*y1*y4 + 
q1*q2*q3*y4^2 + q1*q2*q3*y1*y5 + q1*q2*q3*y4*y5 + q1*q2*q3*y5^2 - q1*q2*q3*y1*z1 - q1*q2*q3*y4*z1 - 
q1*q2*q3*y5*z1 - q1*q2*q3*y1*z2 - q1*q2*q3*y4*z2 - q1*q2*q3*y5*z2 + q1*q2*q3*z1*z2 - q1*q2*q3*y1*z3 
- q1*q2*q3*y4*z3 - q1*q2*q3*y5*z3 + q1*q2*q3*z1*z3 + q1*q2*q3*z2*z3 - q1*q2*q3*y1*z4 - 
q1*q2*q3*y4*z4 - q1*q2*q3*y5*z4 + q1*q2*q3*z1*z4 + q1*q2*q3*z2*z4 + 
q1*q2*q3*z3*z4)*QDSx([1, 2, 3, 5, 4], 'y') + (q1*q2*q3*y1 + q1*q2*q3*y4 + q1*q2*q3*y5 + q1*q2*q3*y6 - 
q1*q2*q3*z1 - q1*q2*q3*z2 - q1*q2*q3*z3 - q1*q2*q3*z4)*QDSx([1, 2, 3, 6, 4, 5], 'y') + 
q1*q2*q3*QDSx([1, 2, 3, 7, 4, 5, 6], 'y') + (q1*q3*y1^3 + q1*q3*y1^2*y4 + q1*q3*y1*y4^2 + q1*q3*y4^3 - 
q1*q3*y1^2*z1 - q1*q3*y1*y4*z1 - q1*q3*y4^2*z1 - q1*q3*y1^2*z2 - q1*q3*y1*y4*z2 - q1*q3*y4^2*z2 + 
q1*q3*y1*z1*z2 + q1*q3*y4*z1*z2 - q1*q3*y1^2*z3 - q1*q3*y1*y4*z3 - q1*q3*y4^2*z3 + q1*q3*y1*z1*z3 + 
q1*q3*y4*z1*z3 + q1*q3*y1*z2*z3 + q1*q3*y4*z2*z3 - q1*q3*z1*z2*z3 - q1*q3*y1^2*z4 - q1*q3*y1*y4*z4 
- q1*q3*y4^2*z4 + q1*q3*y1*z1*z4 + q1*q3*y4*z1*z4 + q1*q3*y1*z2*z4 + q1*q3*y4*z2*z4 - 
q1*q3*z1*z2*z4 + q1*q3*y1*z3*z4 + q1*q3*y4*z3*z4 - q1*q3*z1*z3*z4 - 
q1*q3*z2*z3*z4)*QDSx([1, 4, 2, 3], 'y') + (q1*y1^3*y3 + q1*y1^3*y4 + q1*y1^2*y3*y4 + q1*y1^2*y4^2 + 
q1*y1*y3*y4^2 + q1*y1*y4^3 + q1*y3*y4^3 - q1*y1^3*z1 - q1*y1^2*y3*z1 - 2*q1*y1^2*y4*z1 - 
q1*y1*y3*y4*z1 - 2*q1*y1*y4^2*z1 - q1*y3*y4^2*z1 - q1*y4^3*z1 + q1*y1^2*z1^2 + q1*y1*y4*z1^2 + 
q1*y4^2*z1^2 - q1*y1^3*z2 - q1*y1^2*y3*z2 - 2*q1*y1^2*y4*z2 - q1*y1*y3*y4*z2 - 2*q1*y1*y4^2*z2 - 
q1*y3*y4^2*z2 - q1*y4^3*z2 + 2*q1*y1^2*z1*z2 + q1*y1*y3*z1*z2 + 3*q1*y1*y4*z1*z2 + q1*y3*y4*z1*z2 + 
2*q1*y4^2*z1*z2 - q1*y1*z1^2*z2 - q1*y4*z1^2*z2 + q1*y1^2*z2^2 + q1*y1*y4*z2^2 + q1*y4^2*z2^2 - 
q1*y1*z1*z2^2 - q1*y4*z1*z2^2 - q1*y1^2*y3*z3 - q1*y1^2*y4*z3 - q1*y1*y3*y4*z3 - q1*y1*y4^2*z3 - 
q1*y3*y4^2*z3 + q1*y1^2*z1*z3 + q1*y1*y3*z1*z3 + 2*q1*y1*y4*z1*z3 + q1*y3*y4*z1*z3 + q1*y4^2*z1*z3 
- q1*y1*z1^2*z3 - q1*y4*z1^2*z3 + q1*y1^2*z2*z3 + q1*y1*y3*z2*z3 + 2*q1*y1*y4*z2*z3 + 
q1*y3*y4*z2*z3 + q1*y4^2*z2*z3 - 2*q1*y1*z1*z2*z3 - q1*y3*z1*z2*z3 - 2*q1*y4*z1*z2*z3 + 
q1*z1^2*z2*z3 - q1*y1*z2^2*z3 - q1*y4*z2^2*z3 + q1*z1*z2^2*z3 - q1*y1^2*y3*z4 - q1*y1^2*y4*z4 - 
q1*y1*y3*y4*z4 - q1*y1*y4^2*z4 - q1*y3*y4^2*z4 + q1*y1^2*z1*z4 + q1*y1*y3*z1*z4 + 2*q1*y1*y4*z1*z4 
+ q1*y3*y4*z1*z4 + q1*y4^2*z1*z4 - q1*y1*z1^2*z4 - q1*y4*z1^2*z4 + q1*y1^2*z2*z4 + q1*y1*y3*z2*z4 + 
2*q1*y1*y4*z2*z4 + q1*y3*y4*z2*z4 + q1*y4^2*z2*z4 - 2*q1*y1*z1*z2*z4 - q1*y3*z1*z2*z4 - 
2*q1*y4*z1*z2*z4 + q1*z1^2*z2*z4 - q1*y1*z2^2*z4 - q1*y4*z2^2*z4 + q1*z1*z2^2*z4 + q1*y1*y3*z3*z4 + 
q1*y1*y4*z3*z4 + q1*y3*y4*z3*z4 - q1*y1*z1*z3*z4 - q1*y3*z1*z3*z4 - q1*y4*z1*z3*z4 + q1*z1^2*z3*z4 
- q1*y1*z2*z3*z4 - q1*y3*z2*z3*z4 - q1*y4*z2*z3*z4 + q1*z1*z2*z3*z4 + 
q1*z2^2*z3*z4)*QDSx([1, 4, 3, 2], 'y') + (q1*y1^3 + q1*y1^2*y4 + q1*y1*y4^2 + q1*y4^3 - q1*y1^2*z1 - 
q1*y1*y4*z1 - q1*y4^2*z1 - q1*y1^2*z2 - q1*y1*y4*z2 - q1*y4^2*z2 + q1*y1*z1*z2 + q1*y4*z1*z2 - 
q1*y1^2*z3 - q1*y1*y4*z3 - q1*y4^2*z3 + q1*y1*z1*z3 + q1*y4*z1*z3 + q1*y1*z2*z3 + q1*y4*z2*z3 - 
q1*z1*z2*z3 - q1*y1^2*z4 - q1*y1*y4*z4 - q1*y4^2*z4 + q1*y1*z1*z4 + q1*y4*z1*z4 + q1*y1*z2*z4 + 
q1*y4*z2*z4 - q1*z1*z2*z4 + q1*y1*z3*z4 + q1*y4*z3*z4 - q1*z1*z3*z4 - 
q1*z2*z3*z4)*QDSx([1, 4, 5, 2, 3], 'y') + (q1*q3*y1^2 + q1*q3*y1*y4 + q1*q3*y4^2 + q1*q3*y1*y5 + 
q1*q3*y4*y5 + q1*q3*y5^2 - q1*q3*y1*z1 - q1*q3*y4*z1 - q1*q3*y5*z1 - q1*q3*y1*z2 - q1*q3*y4*z2 - 
q1*q3*y5*z2 + q1*q3*z1*z2 - q1*q3*y1*z3 - q1*q3*y4*z3 - q1*q3*y5*z3 + q1*q3*z1*z3 + q1*q3*z2*z3 - 
q1*q3*y1*z4 - q1*q3*y4*z4 - q1*q3*y5*z4 + q1*q3*z1*z4 + q1*q3*z2*z4 + 
q1*q3*z3*z4)*QDSx([1, 5, 2, 3, 4], 'y') + (q1*y1^3 + q1*y1^2*y3 + q1*y1^2*y4 + q1*y1*y3*y4 + q1*y1*y4^2 
+ q1*y3*y4^2 + q1*y1^2*y5 + q1*y1*y3*y5 + q1*y1*y4*y5 + q1*y3*y4*y5 + q1*y1*y5^2 + q1*y3*y5^2 - 
2*q1*y1^2*z1 - q1*y1*y3*z1 - 2*q1*y1*y4*z1 - q1*y3*y4*z1 - q1*y4^2*z1 - 2*q1*y1*y5*z1 - q1*y3*y5*z1 
- q1*y4*y5*z1 - q1*y5^2*z1 + q1*y1*z1^2 + q1*y4*z1^2 + q1*y5*z1^2 - 2*q1*y1^2*z2 - q1*y1*y3*z2 - 
2*q1*y1*y4*z2 - q1*y3*y4*z2 - q1*y4^2*z2 - 2*q1*y1*y5*z2 - q1*y3*y5*z2 - q1*y4*y5*z2 - q1*y5^2*z2 + 
3*q1*y1*z1*z2 + q1*y3*z1*z2 + 2*q1*y4*z1*z2 + 2*q1*y5*z1*z2 - q1*z1^2*z2 + q1*y1*z2^2 + q1*y4*z2^2 
+ q1*y5*z2^2 - q1*z1*z2^2 - q1*y1^2*z3 - q1*y1*y3*z3 - q1*y1*y4*z3 - q1*y3*y4*z3 - q1*y1*y5*z3 - 
q1*y3*y5*z3 + 2*q1*y1*z1*z3 + q1*y3*z1*z3 + q1*y4*z1*z3 + q1*y5*z1*z3 - q1*z1^2*z3 + 2*q1*y1*z2*z3 
+ q1*y3*z2*z3 + q1*y4*z2*z3 + q1*y5*z2*z3 - 2*q1*z1*z2*z3 - q1*z2^2*z3 - q1*y1^2*z4 - q1*y1*y3*z4 - 
q1*y1*y4*z4 - q1*y3*y4*z4 - q1*y1*y5*z4 - q1*y3*y5*z4 + 2*q1*y1*z1*z4 + q1*y3*z1*z4 + q1*y4*z1*z4 + 
q1*y5*z1*z4 - q1*z1^2*z4 + 2*q1*y1*z2*z4 + q1*y3*z2*z4 + q1*y4*z2*z4 + q1*y5*z2*z4 - 2*q1*z1*z2*z4 
- q1*z2^2*z4 + q1*y1*z3*z4 + q1*y3*z3*z4 - q1*z1*z3*z4 - q1*z2*z3*z4)*QDSx([1, 5, 3, 2, 4], 'y') + 
(q1*y1^2 + q1*y1*y4 + q1*y4^2 + q1*y1*y5 + q1*y4*y5 + q1*y5^2 - q1*y1*z1 - q1*y4*z1 - q1*y5*z1 - 
q1*y1*z2 - q1*y4*z2 - q1*y5*z2 + q1*z1*z2 - q1*y1*z3 - q1*y4*z3 - q1*y5*z3 + q1*z1*z3 + q1*z2*z3 - 
q1*y1*z4 - q1*y4*z4 - q1*y5*z4 + q1*z1*z4 + q1*z2*z4 + q1*z3*z4)*QDSx([1, 5, 4, 2, 3], 'y') + (q1*q3*y1 
+ q1*q3*y4 + q1*q3*y5 + q1*q3*y6 - q1*q3*z1 - q1*q3*z2 - q1*q3*z3 - 
q1*q3*z4)*QDSx([1, 6, 2, 3, 4, 5], 'y') + (q1*y1^2 + q1*y1*y3 + q1*y1*y4 + q1*y3*y4 + q1*y1*y5 + q1*y3*y5 
+ q1*y1*y6 + q1*y3*y6 - 2*q1*y1*z1 - q1*y3*z1 - q1*y4*z1 - q1*y5*z1 - q1*y6*z1 + q1*z1^2 - 
2*q1*y1*z2 - q1*y3*z2 - q1*y4*z2 - q1*y5*z2 - q1*y6*z2 + 2*q1*z1*z2 + q1*z2^2 - q1*y1*z3 - q1*y3*z3 
+ q1*z1*z3 + q1*z2*z3 - q1*y1*z4 - q1*y3*z4 + q1*z1*z4 + q1*z2*z4)*QDSx([1, 6, 3, 2, 4, 5], 'y') + (q1*y1 
+ q1*y4 + q1*y5 + q1*y6 - q1*z1 - q1*z2 - q1*z3 - q1*z4)*QDSx([1, 6, 4, 2, 3, 5], 'y') + 
q1*q3*QDSx([1, 7, 2, 3, 4, 5, 6], 'y') + (q1*y1 + q1*y3 - q1*z1 - q1*z2)*QDSx([1, 7, 3, 2, 4, 5, 6], 'y') + 
q1*QDSx([1, 7, 4, 2, 3, 5, 6], 'y') + (q1*q2*q3*y1^2 + q1*q2*q3*y1*y2 + q1*q2*q3*y2^2 + q1*q2*q3*y1*y4 + 
q1*q2*q3*y2*y4 + q1*q2*q3*y4^2 - q1*q2*q3*y1*z1 - q1*q2*q3*y2*z1 - q1*q2*q3*y4*z1 - q1*q2*q3*y1*z2 
- q1*q2*q3*y2*z2 - q1*q2*q3*y4*z2 + q1*q2*q3*z1*z2 - q1*q2*q3*y1*z3 - q1*q2*q3*y2*z3 - 
q1*q2*q3*y4*z3 + q1*q2*q3*z1*z3 + q1*q2*q3*z2*z3 - q1*q2*q3*y1*z4 - q1*q2*q3*y2*z4 - q1*q2*q3*y4*z4 
+ q1*q2*q3*z1*z4 + q1*q2*q3*z2*z4 + q1*q2*q3*z3*z4)*QDSx([2, 1], 'y') + (q1*q2*q3*y1 + q1*q2*q3*y2 + 
q1*q2*q3*y4 + q1*q2*q3*y5 - q1*q2*q3*z1 - q1*q2*q3*z2 - q1*q2*q3*z3 - 
q1*q2*q3*z4)*QDSx([2, 1, 3, 5, 4], 'y') + q1*q2*q3*QDSx([2, 1, 3, 6, 4, 5], 'y') + (q1*q3*y1^2 + q1*q3*y1*y2 + 
q1*q3*y2^2 + q1*q3*y1*y4 + q1*q3*y2*y4 + q1*q3*y4^2 - q1*q3*y1*z1 - q1*q3*y2*z1 - q1*q3*y4*z1 - 
q1*q3*y1*z2 - q1*q3*y2*z2 - q1*q3*y4*z2 + q1*q3*z1*z2 - q1*q3*y1*z3 - q1*q3*y2*z3 - q1*q3*y4*z3 + 
q1*q3*z1*z3 + q1*q3*z2*z3 - q1*q3*y1*z4 - q1*q3*y2*z4 - q1*q3*y4*z4 + q1*q3*z1*z4 + q1*q3*z2*z4 + 
q1*q3*z3*z4)*QDSx([2, 4, 1, 3], 'y') + (q1*y1^2*y3 + q1*y1*y2*y3 + q1*y2^2*y3 + q1*y1^2*y4 + 
q1*y1*y2*y4 + q1*y2^2*y4 + q1*y1*y3*y4 + q1*y2*y3*y4 + q1*y1*y4^2 + q1*y2*y4^2 + q1*y3*y4^2 + 
q1*y4^3 - q1*y1^2*z1 - q1*y1*y2*z1 - q1*y2^2*z1 - q1*y1*y3*z1 - q1*y2*y3*z1 - 2*q1*y1*y4*z1 - 
2*q1*y2*y4*z1 - q1*y3*y4*z1 - 2*q1*y4^2*z1 + q1*y1*z1^2 + q1*y2*z1^2 + q1*y4*z1^2 - q1*y1^2*z2 - 
q1*y1*y2*z2 - q1*y2^2*z2 - q1*y1*y3*z2 - q1*y2*y3*z2 - 2*q1*y1*y4*z2 - 2*q1*y2*y4*z2 - q1*y3*y4*z2 
- 2*q1*y4^2*z2 + 2*q1*y1*z1*z2 + 2*q1*y2*z1*z2 + q1*y3*z1*z2 + 3*q1*y4*z1*z2 - q1*z1^2*z2 + 
q1*y1*z2^2 + q1*y2*z2^2 + q1*y4*z2^2 - q1*z1*z2^2 - q1*y1*y3*z3 - q1*y2*y3*z3 - q1*y1*y4*z3 - 
q1*y2*y4*z3 - q1*y3*y4*z3 - q1*y4^2*z3 + q1*y1*z1*z3 + q1*y2*z1*z3 + q1*y3*z1*z3 + 2*q1*y4*z1*z3 - 
q1*z1^2*z3 + q1*y1*z2*z3 + q1*y2*z2*z3 + q1*y3*z2*z3 + 2*q1*y4*z2*z3 - 2*q1*z1*z2*z3 - q1*z2^2*z3 - 
q1*y1*y3*z4 - q1*y2*y3*z4 - q1*y1*y4*z4 - q1*y2*y4*z4 - q1*y3*y4*z4 - q1*y4^2*z4 + q1*y1*z1*z4 + 
q1*y2*z1*z4 + q1*y3*z1*z4 + 2*q1*y4*z1*z4 - q1*z1^2*z4 + q1*y1*z2*z4 + q1*y2*z2*z4 + q1*y3*z2*z4 + 
2*q1*y4*z2*z4 - 2*q1*z1*z2*z4 - q1*z2^2*z4 + q1*y3*z3*z4 + q1*y4*z3*z4 - q1*z1*z3*z4 - 
q1*z2*z3*z4)*QDSx([2, 4, 3, 1], 'y') + (q1*y1^2 + q1*y1*y2 + q1*y2^2 + q1*y1*y4 + q1*y2*y4 + q1*y4^2 - 
q1*y1*z1 - q1*y2*z1 - q1*y4*z1 - q1*y1*z2 - q1*y2*z2 - q1*y4*z2 + q1*z1*z2 - q1*y1*z3 - q1*y2*z3 - 
q1*y4*z3 + q1*z1*z3 + q1*z2*z3 - q1*y1*z4 - q1*y2*z4 - q1*y4*z4 + q1*z1*z4 + q1*z2*z4 + 
q1*z3*z4)*QDSx([2, 4, 5, 1, 3], 'y') + (q1*q3*y1 + q1*q3*y2 + q1*q3*y4 + q1*q3*y5 - q1*q3*z1 - q1*q3*z2 
- q1*q3*z3 - q1*q3*z4)*QDSx([2, 5, 1, 3, 4], 'y') + (q1*y1^2 + q1*y1*y2 + q1*y2^2 + q1*y1*y3 + q1*y2*y3 
+ q1*y1*y4 + q1*y2*y4 + q1*y3*y4 + q1*y4^2 + q1*y1*y5 + q1*y2*y5 + q1*y3*y5 + q1*y4*y5 + q1*y5^2 - 
2*q1*y1*z1 - 2*q1*y2*z1 - q1*y3*z1 - 2*q1*y4*z1 - 2*q1*y5*z1 + q1*z1^2 - 2*q1*y1*z2 - 2*q1*y2*z2 - 
q1*y3*z2 - 2*q1*y4*z2 - 2*q1*y5*z2 + 3*q1*z1*z2 + q1*z2^2 - q1*y1*z3 - q1*y2*z3 - q1*y3*z3 - 
q1*y4*z3 - q1*y5*z3 + 2*q1*z1*z3 + 2*q1*z2*z3 - q1*y1*z4 - q1*y2*z4 - q1*y3*z4 - q1*y4*z4 - 
q1*y5*z4 + 2*q1*z1*z4 + 2*q1*z2*z4 + q1*z3*z4)*QDSx([2, 5, 3, 1, 4], 'y') + (q1*y1 + q1*y2 + q1*y4 + 
q1*y5 - q1*z1 - q1*z2 - q1*z3 - q1*z4)*QDSx([2, 5, 4, 1, 3], 'y') + q1*q3*QDSx([2, 6, 1, 3, 4, 5], 'y') + 
(q1*y1 + q1*y2 + q1*y3 + q1*y4 + q1*y5 + q1*y6 - 2*q1*z1 - 2*q1*z2 - q1*z3 - 
q1*z4)*QDSx([2, 6, 3, 1, 4, 5], 'y') + q1*QDSx([2, 6, 4, 1, 3, 5], 'y') + q1*QDSx([2, 7, 3, 1, 4, 5, 6], 'y') + 
(q1*q2*q3*y1 + q1*q2*q3*y2 + q1*q2*q3*y3 + q1*q2*q3*y4 - q1*q2*q3*z1 - q1*q2*q3*z2 - q1*q2*q3*z3 - 
q1*q2*q3*z4)*QDSx([3, 1, 2], 'y') + q1*q2*q3*QDSx([3, 1, 2, 5, 4], 'y') + (q1*y1^2*y3 + q1*y1*y3^2 + 
q1*y1^2*y4 + 2*q1*y1*y3*y4 + q1*y3^2*y4 + q1*y1*y4^2 + q1*y3*y4^2 - q1*y1^2*z1 - 2*q1*y1*y3*z1 - 
q1*y3^2*z1 - 2*q1*y1*y4*z1 - 2*q1*y3*y4*z1 - q1*y4^2*z1 + q1*y1*z1^2 + q1*y3*z1^2 + q1*y4*z1^2 - 
q1*y1^2*z2 - 2*q1*y1*y3*z2 - q1*y3^2*z2 - 2*q1*y1*y4*z2 - 2*q1*y3*y4*z2 - q1*y4^2*z2 + 
2*q1*y1*z1*z2 + 2*q1*y3*z1*z2 + 2*q1*y4*z1*z2 - q1*z1^2*z2 + q1*y1*z2^2 + q1*y3*z2^2 + q1*y4*z2^2 - 
q1*z1*z2^2 - q1*y1*y3*z3 - q1*y1*y4*z3 - q1*y3*y4*z3 + q1*y1*z1*z3 + q1*y3*z1*z3 + q1*y4*z1*z3 - 
q1*z1^2*z3 + q1*y1*z2*z3 + q1*y3*z2*z3 + q1*y4*z2*z3 - q1*z1*z2*z3 - q1*z2^2*z3 - q1*y1*y3*z4 - 
q1*y1*y4*z4 - q1*y3*y4*z4 + q1*y1*z1*z4 + q1*y3*z1*z4 + q1*y4*z1*z4 - q1*z1^2*z4 + q1*y1*z2*z4 + 
q1*y3*z2*z4 + q1*y4*z2*z4 - q1*z1*z2*z4 - q1*z2^2*z4 + q1*q3*y1 + q1*q3*y2 + q1*q3*y3 + q1*q3*y4 - 
q1*q3*z1 - q1*q3*z2 - q1*q3*z3 - q1*q3*z4)*QDSx([3, 4, 1, 2], 'y') + (q1*y1*y3 + q1*y2*y3 + q1*y3^2 + 
q1*y1*y4 + q1*y2*y4 + 2*q1*y3*y4 + q1*y4^2 - q1*y1*z1 - q1*y2*z1 - 2*q1*y3*z1 - 2*q1*y4*z1 + 
q1*z1^2 - q1*y1*z2 - q1*y2*z2 - 2*q1*y3*z2 - 2*q1*y4*z2 + 2*q1*z1*z2 + q1*z2^2 - q1*y3*z3 - 
q1*y4*z3 + q1*z1*z3 + q1*z2*z3 - q1*y3*z4 - q1*y4*z4 + q1*z1*z4 + q1*z2*z4)*QDSx([3, 4, 2, 1], 'y') + 
(q1*y1 + q1*y2 + q1*y3 + q1*y4 - q1*z1 - q1*z2 - q1*z3 - q1*z4)*QDSx([3, 4, 5, 1, 2], 'y') + (q1*y1^2 + 
2*q1*y1*y3 + q1*y3^2 + q1*y1*y4 + q1*y3*y4 + q1*y1*y5 + q1*y3*y5 - 2*q1*y1*z1 - 2*q1*y3*z1 - 
q1*y4*z1 - q1*y5*z1 + q1*z1^2 - 2*q1*y1*z2 - 2*q1*y3*z2 - q1*y4*z2 - q1*y5*z2 + 2*q1*z1*z2 + 
q1*z2^2 - q1*y1*z3 - q1*y3*z3 + q1*z1*z3 + q1*z2*z3 - q1*y1*z4 - q1*y3*z4 + q1*z1*z4 + q1*z2*z4 + 
q1*q3)*QDSx([3, 5, 1, 2, 4], 'y') + (q1*y1 + q1*y2 + 2*q1*y3 + q1*y4 + q1*y5 - 2*q1*z1 - 2*q1*z2 - q1*z3 
- q1*z4)*QDSx([3, 5, 2, 1, 4], 'y') + q1*QDSx([3, 5, 4, 1, 2], 'y') + (q1*y1 + q1*y3 - q1*z1 - 
q1*z2)*QDSx([3, 6, 1, 2, 4, 5], 'y') + q1*QDSx([3, 6, 2, 1, 4, 5], 'y') + (q3*y4^4 - q3*y4^3*z1 - q3*y4^3*z2 + 
q3*y4^2*z1*z2 - q3*y4^3*z3 + q3*y4^2*z1*z3 + q3*y4^2*z2*z3 - q3*y4*z1*z2*z3 - q3*y4^3*z4 + 
q3*y4^2*z1*z4 + q3*y4^2*z2*z4 - q3*y4*z1*z2*z4 + q3*y4^2*z3*z4 - q3*y4*z1*z3*z4 - q3*y4*z2*z3*z4 + 
q3*z1*z2*z3*z4)*QDSx([4, 1, 2, 3], 'y') + (y1*y4^4 + y3*y4^4 - y1*y4^3*z1 - y3*y4^3*z1 - y4^4*z1 + 
y4^3*z1^2 - y1*y4^3*z2 - y3*y4^3*z2 - y4^4*z2 + y1*y4^2*z1*z2 + y3*y4^2*z1*z2 + 2*y4^3*z1*z2 - 
y4^2*z1^2*z2 + y4^3*z2^2 - y4^2*z1*z2^2 - y1*y4^3*z3 - y3*y4^3*z3 + y1*y4^2*z1*z3 + y3*y4^2*z1*z3 + 
y4^3*z1*z3 - y4^2*z1^2*z3 + y1*y4^2*z2*z3 + y3*y4^2*z2*z3 + y4^3*z2*z3 - y1*y4*z1*z2*z3 - 
y3*y4*z1*z2*z3 - 2*y4^2*z1*z2*z3 + y4*z1^2*z2*z3 - y4^2*z2^2*z3 + y4*z1*z2^2*z3 - y1*y4^3*z4 - 
y3*y4^3*z4 + y1*y4^2*z1*z4 + y3*y4^2*z1*z4 + y4^3*z1*z4 - y4^2*z1^2*z4 + y1*y4^2*z2*z4 + 
y3*y4^2*z2*z4 + y4^3*z2*z4 - y1*y4*z1*z2*z4 - y3*y4*z1*z2*z4 - 2*y4^2*z1*z2*z4 + y4*z1^2*z2*z4 - 
y4^2*z2^2*z4 + y4*z1*z2^2*z4 + y1*y4^2*z3*z4 + y3*y4^2*z3*z4 - y1*y4*z1*z3*z4 - y3*y4*z1*z3*z4 - 
y4^2*z1*z3*z4 + y4*z1^2*z3*z4 - y1*y4*z2*z3*z4 - y3*y4*z2*z3*z4 - y4^2*z2*z3*z4 + y1*z1*z2*z3*z4 + 
y3*z1*z2*z3*z4 + 2*y4*z1*z2*z3*z4 - z1^2*z2*z3*z4 + y4*z2^2*z3*z4 - 
z1*z2^2*z3*z4)*QDSx([4, 1, 3, 2], 'y') + (y4^4 - y4^3*z1 - y4^3*z2 + y4^2*z1*z2 - y4^3*z3 + y4^2*z1*z3 
+ y4^2*z2*z3 - y4*z1*z2*z3 - y4^3*z4 + y4^2*z1*z4 + y4^2*z2*z4 - y4*z1*z2*z4 + y4^2*z3*z4 - 
y4*z1*z3*z4 - y4*z2*z3*z4 + z1*z2*z3*z4)*QDSx([4, 1, 5, 2, 3], 'y') + (y4^4 - y4^3*z1 - y4^3*z2 + 
y4^2*z1*z2 - y4^3*z3 + y4^2*z1*z3 + y4^2*z2*z3 - y4*z1*z2*z3 - y4^3*z4 + y4^2*z1*z4 + y4^2*z2*z4 - 
y4*z1*z2*z4 + y4^2*z3*z4 - y4*z1*z3*z4 - y4*z2*z3*z4 + z1*z2*z3*z4)*QDSx([4, 2, 3, 1], 'y') + (q1*y1 + 
q1*y3 + q1*y4 + q1*y5 - q1*z1 - q1*z2 - q1*z3 - q1*z4)*QDSx([4, 5, 1, 2, 3], 'y') + 
q1*QDSx([4, 5, 2, 1, 3], 'y') + q1*QDSx([4, 6, 1, 2, 3, 5], 'y') + (q3*y4^3 + q3*y4^2*y5 + q3*y4*y5^2 + 
q3*y5^3 - q3*y4^2*z1 - q3*y4*y5*z1 - q3*y5^2*z1 - q3*y4^2*z2 - q3*y4*y5*z2 - q3*y5^2*z2 + 
q3*y4*z1*z2 + q3*y5*z1*z2 - q3*y4^2*z3 - q3*y4*y5*z3 - q3*y5^2*z3 + q3*y4*z1*z3 + q3*y5*z1*z3 + 
q3*y4*z2*z3 + q3*y5*z2*z3 - q3*z1*z2*z3 - q3*y4^2*z4 - q3*y4*y5*z4 - q3*y5^2*z4 + q3*y4*z1*z4 + 
q3*y5*z1*z4 + q3*y4*z2*z4 + q3*y5*z2*z4 - q3*z1*z2*z4 + q3*y4*z3*z4 + q3*y5*z3*z4 - q3*z1*z3*z4 - 
q3*z2*z3*z4)*QDSx([5, 1, 2, 3, 4], 'y') + (y1*y4^3 + y3*y4^3 + y1*y4^2*y5 + y3*y4^2*y5 + y1*y4*y5^2 + 
y3*y4*y5^2 + y1*y5^3 + y3*y5^3 - y1*y4^2*z1 - y3*y4^2*z1 - y4^3*z1 - y1*y4*y5*z1 - y3*y4*y5*z1 - 
y4^2*y5*z1 - y1*y5^2*z1 - y3*y5^2*z1 - y4*y5^2*z1 - y5^3*z1 + y4^2*z1^2 + y4*y5*z1^2 + y5^2*z1^2 - 
y1*y4^2*z2 - y3*y4^2*z2 - y4^3*z2 - y1*y4*y5*z2 - y3*y4*y5*z2 - y4^2*y5*z2 - y1*y5^2*z2 - 
y3*y5^2*z2 - y4*y5^2*z2 - y5^3*z2 + y1*y4*z1*z2 + y3*y4*z1*z2 + 2*y4^2*z1*z2 + y1*y5*z1*z2 + 
y3*y5*z1*z2 + 2*y4*y5*z1*z2 + 2*y5^2*z1*z2 - y4*z1^2*z2 - y5*z1^2*z2 + y4^2*z2^2 + y4*y5*z2^2 + 
y5^2*z2^2 - y4*z1*z2^2 - y5*z1*z2^2 - y1*y4^2*z3 - y3*y4^2*z3 - y1*y4*y5*z3 - y3*y4*y5*z3 - 
y1*y5^2*z3 - y3*y5^2*z3 + y1*y4*z1*z3 + y3*y4*z1*z3 + y4^2*z1*z3 + y1*y5*z1*z3 + y3*y5*z1*z3 + 
y4*y5*z1*z3 + y5^2*z1*z3 - y4*z1^2*z3 - y5*z1^2*z3 + y1*y4*z2*z3 + y3*y4*z2*z3 + y4^2*z2*z3 + 
y1*y5*z2*z3 + y3*y5*z2*z3 + y4*y5*z2*z3 + y5^2*z2*z3 - y1*z1*z2*z3 - y3*z1*z2*z3 - 2*y4*z1*z2*z3 - 
2*y5*z1*z2*z3 + z1^2*z2*z3 - y4*z2^2*z3 - y5*z2^2*z3 + z1*z2^2*z3 - y1*y4^2*z4 - y3*y4^2*z4 - 
y1*y4*y5*z4 - y3*y4*y5*z4 - y1*y5^2*z4 - y3*y5^2*z4 + y1*y4*z1*z4 + y3*y4*z1*z4 + y4^2*z1*z4 + 
y1*y5*z1*z4 + y3*y5*z1*z4 + y4*y5*z1*z4 + y5^2*z1*z4 - y4*z1^2*z4 - y5*z1^2*z4 + y1*y4*z2*z4 + 
y3*y4*z2*z4 + y4^2*z2*z4 + y1*y5*z2*z4 + y3*y5*z2*z4 + y4*y5*z2*z4 + y5^2*z2*z4 - y1*z1*z2*z4 - 
y3*z1*z2*z4 - 2*y4*z1*z2*z4 - 2*y5*z1*z2*z4 + z1^2*z2*z4 - y4*z2^2*z4 - y5*z2^2*z4 + z1*z2^2*z4 + 
y1*y4*z3*z4 + y3*y4*z3*z4 + y1*y5*z3*z4 + y3*y5*z3*z4 - y1*z1*z3*z4 - y3*z1*z3*z4 - y4*z1*z3*z4 - 
y5*z1*z3*z4 + z1^2*z3*z4 - y1*z2*z3*z4 - y3*z2*z3*z4 - y4*z2*z3*z4 - y5*z2*z3*z4 + 2*z1*z2*z3*z4 + 
z2^2*z3*z4)*QDSx([5, 1, 3, 2, 4], 'y') + (y4^3 + y4^2*y5 + y4*y5^2 + y5^3 - y4^2*z1 - y4*y5*z1 - y5^2*z1 
- y4^2*z2 - y4*y5*z2 - y5^2*z2 + y4*z1*z2 + y5*z1*z2 - y4^2*z3 - y4*y5*z3 - y5^2*z3 + y4*z1*z3 + 
y5*z1*z3 + y4*z2*z3 + y5*z2*z3 - z1*z2*z3 - y4^2*z4 - y4*y5*z4 - y5^2*z4 + y4*z1*z4 + y5*z1*z4 + 
y4*z2*z4 + y5*z2*z4 - z1*z2*z4 + y4*z3*z4 + y5*z3*z4 - z1*z3*z4 - z2*z3*z4)*QDSx([5, 1, 4, 2, 3], 'y') + 
(y4^3 + y4^2*y5 + y4*y5^2 + y5^3 - y4^2*z1 - y4*y5*z1 - y5^2*z1 - y4^2*z2 - y4*y5*z2 - y5^2*z2 + 
y4*z1*z2 + y5*z1*z2 - y4^2*z3 - y4*y5*z3 - y5^2*z3 + y4*z1*z3 + y5*z1*z3 + y4*z2*z3 + y5*z2*z3 - 
z1*z2*z3 - y4^2*z4 - y4*y5*z4 - y5^2*z4 + y4*z1*z4 + y5*z1*z4 + y4*z2*z4 + y5*z2*z4 - z1*z2*z4 + 
y4*z3*z4 + y5*z3*z4 - z1*z3*z4 - z2*z3*z4)*QDSx([5, 2, 3, 1, 4], 'y') + (q3*y4^2 + q3*y4*y5 + q3*y5^2 + 
q3*y4*y6 + q3*y5*y6 + q3*y6^2 - q3*y4*z1 - q3*y5*z1 - q3*y6*z1 - q3*y4*z2 - q3*y5*z2 - q3*y6*z2 + 
q3*z1*z2 - q3*y4*z3 - q3*y5*z3 - q3*y6*z3 + q3*z1*z3 + q3*z2*z3 - q3*y4*z4 - q3*y5*z4 - q3*y6*z4 + 
q3*z1*z4 + q3*z2*z4 + q3*z3*z4)*QDSx([6, 1, 2, 3, 4, 5], 'y') + (y1*y4^2 + y3*y4^2 + y1*y4*y5 + y3*y4*y5 
+ y1*y5^2 + y3*y5^2 + y1*y4*y6 + y3*y4*y6 + y1*y5*y6 + y3*y5*y6 + y1*y6^2 + y3*y6^2 - y1*y4*z1 - 
y3*y4*z1 - y4^2*z1 - y1*y5*z1 - y3*y5*z1 - y4*y5*z1 - y5^2*z1 - y1*y6*z1 - y3*y6*z1 - y4*y6*z1 - 
y5*y6*z1 - y6^2*z1 + y4*z1^2 + y5*z1^2 + y6*z1^2 - y1*y4*z2 - y3*y4*z2 - y4^2*z2 - y1*y5*z2 - 
y3*y5*z2 - y4*y5*z2 - y5^2*z2 - y1*y6*z2 - y3*y6*z2 - y4*y6*z2 - y5*y6*z2 - y6^2*z2 + y1*z1*z2 + 
y3*z1*z2 + 2*y4*z1*z2 + 2*y5*z1*z2 + 2*y6*z1*z2 - z1^2*z2 + y4*z2^2 + y5*z2^2 + y6*z2^2 - z1*z2^2 - 
y1*y4*z3 - y3*y4*z3 - y1*y5*z3 - y3*y5*z3 - y1*y6*z3 - y3*y6*z3 + y1*z1*z3 + y3*z1*z3 + y4*z1*z3 + 
y5*z1*z3 + y6*z1*z3 - z1^2*z3 + y1*z2*z3 + y3*z2*z3 + y4*z2*z3 + y5*z2*z3 + y6*z2*z3 - 2*z1*z2*z3 - 
z2^2*z3 - y1*y4*z4 - y3*y4*z4 - y1*y5*z4 - y3*y5*z4 - y1*y6*z4 - y3*y6*z4 + y1*z1*z4 + y3*z1*z4 + 
y4*z1*z4 + y5*z1*z4 + y6*z1*z4 - z1^2*z4 + y1*z2*z4 + y3*z2*z4 + y4*z2*z4 + y5*z2*z4 + y6*z2*z4 - 
2*z1*z2*z4 - z2^2*z4 + y1*z3*z4 + y3*z3*z4 - z1*z3*z4 - z2*z3*z4)*QDSx([6, 1, 3, 2, 4, 5], 'y') + (y4^2 + 
y4*y5 + y5^2 + y4*y6 + y5*y6 + y6^2 - y4*z1 - y5*z1 - y6*z1 - y4*z2 - y5*z2 - y6*z2 + z1*z2 - y4*z3 
- y5*z3 - y6*z3 + z1*z3 + z2*z3 - y4*z4 - y5*z4 - y6*z4 + z1*z4 + z2*z4 + 
z3*z4)*QDSx([6, 1, 4, 2, 3, 5], 'y') + (y4^2 + y4*y5 + y5^2 + y4*y6 + y5*y6 + y6^2 - y4*z1 - y5*z1 - 
y6*z1 - y4*z2 - y5*z2 - y6*z2 + z1*z2 - y4*z3 - y5*z3 - y6*z3 + z1*z3 + z2*z3 - y4*z4 - y5*z4 - 
y6*z4 + z1*z4 + z2*z4 + z3*z4)*QDSx([6, 2, 3, 1, 4, 5], 'y') + (q3*y4 + q3*y5 + q3*y6 + q3*y7 - q3*z1 - 
q3*z2 - q3*z3 - q3*z4)*QDSx([7, 1, 2, 3, 4, 5, 6], 'y') + (y1*y4 + y3*y4 + y1*y5 + y3*y5 + y1*y6 + y3*y6 + 
y1*y7 + y3*y7 - y1*z1 - y3*z1 - y4*z1 - y5*z1 - y6*z1 - y7*z1 + z1^2 - y1*z2 - y3*z2 - y4*z2 - 
y5*z2 - y6*z2 - y7*z2 + 2*z1*z2 + z2^2 - y1*z3 - y3*z3 + z1*z3 + z2*z3 - y1*z4 - y3*z4 + z1*z4 + 
z2*z4)*QDSx([7, 1, 3, 2, 4, 5, 6], 'y') + (y4 + y5 + y6 + y7 - z1 - z2 - z3 - 
z4)*QDSx([7, 1, 4, 2, 3, 5, 6], 'y') + (y4 + y5 + y6 + y7 - z1 - z2 - z3 - z4)*QDSx([7, 2, 3, 1, 4, 5, 6], 'y') + 
q3*QDSx([8, 1, 2, 3, 4, 5, 6, 7], 'y') + (y1 + y3 - z1 - z2)*QDSx([8, 1, 3, 2, 4, 5, 6, 7], 'y') + 
QDSx([8, 1, 4, 2, 3, 5, 6, 7], 'y') + QDSx([8, 2, 3, 1, 4, 5, 6, 7], 'y')

This output of roughly 17,000 characters took about 2 seconds to compute on my laptop. Again note that quantum double computations are technically conjectural, but a proof is likely forthcoming.

Homepage of schubmult

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

schubmult-3.0.1.tar.gz (126.2 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

schubmult-3.0.1-py3-none-any.whl (113.2 kB view details)

Uploaded Python 3

File details

Details for the file schubmult-3.0.1.tar.gz.

File metadata

  • Download URL: schubmult-3.0.1.tar.gz
  • Upload date:
  • Size: 126.2 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.10.12

File hashes

Hashes for schubmult-3.0.1.tar.gz
Algorithm Hash digest
SHA256 cd4e8d86eaf82d888ff1fb2192c98afd041d5dee9014998ffb345036c80d1188
MD5 69af708cb0b09951a859e588828f500d
BLAKE2b-256 6ad13c23b91747801f720ec573d03df533c2c839171225eea10ea0290bf7e858

See more details on using hashes here.

File details

Details for the file schubmult-3.0.1-py3-none-any.whl.

File metadata

  • Download URL: schubmult-3.0.1-py3-none-any.whl
  • Upload date:
  • Size: 113.2 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.10.12

File hashes

Hashes for schubmult-3.0.1-py3-none-any.whl
Algorithm Hash digest
SHA256 c5392687c4c7bb19e4bc506382e7be0bc12ce6109a52247ce29f133937986595
MD5 70052ad0511aa9ab5b83fb079bb791f3
BLAKE2b-256 634a63de9a9efbc9ddec6d348e7ff0a9801dfec2610d205e216ada97e2fcc936

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page