Skip to content

schubmult.rings.schubert.double_schubert_ring

Double Schubert polynomial ring: the DSx interface.

DoubleSchubertRing represents Z[y][x] in the basis of double Schubert polynomials S_w(x; y), dispatching products to schubmult.mult.double. It is also the workhorse behind the single ring (schubert_ring.SingleSchubertRing is a DoubleSchubertRing with an all-zero coefficient alphabet). Beyond ring arithmetic, DoubleSchubertElement supports divided differences, isobaric divided differences, variable substitution/evaluation, coproducts, and expansion into elementary-symmetric ("CEM"/"SEM") bases.

Variants: ElemDoubleSchubertRing keeps coefficients as unevaluated factorial elementary symmetric functions; DoubleSchubertRingDown uses the descent-side ("down") kernels.

is_fact_elem_sym

def is_fact_elem_sym(obj)

Whether obj is an (unevaluated) factorial elementary symmetric function.

is_fact_complete_sym

def is_fact_complete_sym(obj)

Whether obj is an (unevaluated) factorial complete homogeneous symmetric function.

DoubleSchubertElement Objects

class DoubleSchubertElement(BaseSchubertElement)

An element of a DoubleSchubertRing: {Permutation: coefficient} in the double Schubert basis S_w(x; y), with sympy coefficients in y.

to_genset_dict

def to_genset_dict(trim=False)

Expand to a polynomial and return {exponent_tuple: coeff} over the x variables; trim=True merges keys that differ only by trailing zeros.

divdiff

def divdiff(i)

Divided difference partial_i: S_w -> S_{w s_i} when i is a descent of w, else 0.

simpleref

def simpleref(i)

Action of the simple reflection s_i on the x variables: f + (x_{i+1} - x_i) partial_i f.

coeff_isobaric

def coeff_isobaric(i, beta)

Isobaric divided difference acting on the y (coefficient) alphabet, transported through the basis via the antipode-style inversion S_w -> (-1)^{l(w)} S_{w^{-1}}.

isobaric

def isobaric(i, beta)

Beta-deformed isobaric divided difference pi_i = partial_i + beta (x_i partial_i - 1).

divdiff_perm

def divdiff_perm(perm)

Apply partial_w for w = perm, peeling simple reflections from the last descent.

isobaric_perm

def isobaric_perm(perm, beta)

Apply the beta-isobaric pi_w for w = perm.

isobaric_plus_beta

def isobaric_plus_beta(i, beta)

The variant partial_i + beta x_i partial_i (isobaric without the -beta identity term).

act

def act(perm)

Permute the x variables by perm, as a composition of simplerefs.

max_index

def max_index()

The largest x index (1-indexed) any basis permutation actually depends on.

eval

def eval(x)

Substitute {generator: value} pairs one at a time (via pull_out_gen); returns a scalar if the result collapses to the identity basis element.

subs

def subs(old, new)

Substitute old -> new where old is an x variable (moved to the last position and pulled out via pull_out_var), a y variable (transported through the basis), or a plain coefficient symbol.

free_symbols

@property
def free_symbols()

Coefficient symbols plus the x/y variables the basis permutations actually depend on.

pull_out_gen

def pull_out_gen(gen)

Factor out all dependence on one generator gen (an x or y variable), returning an element over a MaskedGeneratingSet ring with gen removed and explicit (gen - y_j) (or factorial-elementary-symmetric) prefactors.

in_CEM_basis

def in_CEM_basis()

Expand in the complete-elementary-monomial (CEM) basis using the ring's symbolic elementary function.

cem_rep

def cem_rep(elem_func, mumu=None)

CEM expansion with a custom elem_func; mumu selects a dominant permutation to expand against (defaults to the classical route).

coproduct

def coproduct(*indices,
              alt_coeff_genset=None,
              on_coeff_gens=False,
              gname1=None,
              gname2=None)

Coproduct splitting the x variables (or y if on_coeff_gens) at the given 1-indexed indices: returns an element of the TensorRing of two DoubleSchubertRings over the complementary MaskedGeneratingSets, labeled gname1/gname2.

max_gens

@cached_property
def max_gens()

Largest 0-indexed descent over all basis permutations.

positive_elem_sym_rep

def positive_elem_sym_rep()

Manifestly positive expansion in factorial elementary symmetric functions (forward pull_out_var).

positive_elem_sym_rep_backward

def positive_elem_sym_rep_backward()

Like positive_elem_sym_rep but peeling from the last descent backward.

antipode

def antipode()

The antipode: swap the two alphabets and invert each basis permutation (see DoubleSchubertRing.antipode).

DoubleSchubertRing Objects

class DoubleSchubertRing(BaseSchubertRing)

The ring of double Schubert polynomials S_w(x; y) over genset (x) and coeff_genset (y). Call the ring with a permutation, Lehmer code, or polynomial expression to construct an element; the module-level DSx is the standard instance.

coeff_ring

@cached_property
def coeff_ring()

The single Schubert ring over the coefficient alphabet y (used by coeff_isobaric).

antipode_ring

@cached_property
def antipode_ring()

The same ring with the two alphabets swapped.

antipode

def antipode(elem)

Map sum c_w S_w(x; y) to sum c_w S_{w^{-1}}(y; x) in the swapped-alphabet ring.

rmul

def rmul(elem, other)

Right-multiply by a scalar (coefficient-domain element) or, failing that, by an expression.

positive_elem_sym_rep

def positive_elem_sym_rep(perm, index=1)

Manifestly positive expansion of S_perm in factorial elementary symmetric functions, peeling the first variable of ~perm at each step (pull_out_var(1, ...)).

positive_elem_sym_rep_backward

def positive_elem_sym_rep_backward(perm)

Like positive_elem_sym_rep but peeling from the last descent of ~perm backward.

printing_term

def printing_term(k, prefix="")

The DSchubPoly display symbol for basis element k.

elem_sym

@property
def elem_sym()

FactorialElemSym.

is_elem_mul_type

def is_elem_mul_type(other)

Whether other is a factorial elementary symmetric function (eligible for elem_mul).

elem_mul

def elem_mul(ring_elem, elem)

Multiply by a factorial elementary symmetric function in x variables via the positional Pieri rule (elem_sym_positional_perms), expanding the leftover factor with expand_func.

symbol_elem_func

@property
def symbol_elem_func()

FactorialElemSym (kept unevaluated for symbolic expansions).

schubert_schur_elem_func

def schubert_schur_elem_func(numvars)

Elementary-symmetric substitute for the Schubert-tensor-Schur expansion: e_p(x_1..x_k) maps to a Schubert basis element on the left factor when k >= numvars and on the right otherwise.

in_schubert_schur_basis

def in_schubert_schur_basis(perm, numvars)

Expand S_perm in the Schubert-tensor-Schur basis, treating the last numvars variables as the symmetric (Schur) part.

in_descending_schur_basis

def in_descending_schur_basis(perm, numvars)

Iterate in_schubert_schur_basis down through numvars, numvars-1, ..., 1, producing a nested tensor of Schur-like factors.

elem_sym_subs

def elem_sym_subs(kk)

Substitution dict {e_p_k: elem_sym_poly(p, k, x)} for all 1 <= p <= k <= kk.

flip

@staticmethod
def flip(elem)

Re-express a factorial elementary symmetric function with its two alphabets swapped, via the corresponding Grassmannian Schubert polynomial's CEM expansion.

in_quantum_basis

def in_quantum_basis(elem)

Expand each basis element via quantum_schubpoly (a quantum double Schubert element).

in_classical_basis

def in_classical_basis(elem)

Identity (this ring is already classical).

quantum_schubpoly

@cache
def quantum_schubpoly(perm)

The classical S_perm expressed in the quantum double Schubert basis (via quantum_elem_func).

cached_product

@cache
def cached_product(u, v, basis2)

Structure constants of S_u(x; y) * S_v(x; z) (z = basis2.coeff_genset), via schubmult_double.

cached_positive_product

@cache
def cached_positive_product(u, v, basis2)

Like cached_product but with manifestly positive coefficients (generic alphabets, then substituted).

double_mul

@property
def double_mul()

schubmult.mult.double.schubmult_double.

single_mul

@property
def single_mul()

schubmult.mult.single.schubmult_py.

mult_poly_single

@property
def mult_poly_single()

schubmult.mult.single.mult_poly_py.

mult_poly_double

@property
def mult_poly_double()

schubmult.mult.double.mult_poly_double.

quantum_elem_func

@property
def quantum_elem_func()

Elementary symmetric function valued in the quantum double Schubert ring, computed by a divide-and-conquer recursion on the variable set (used by quantum_schubpoly).

monomial_schub

def monomial_schub(monom)

The monomial x^monom expressed in the Schubert basis (trailing zeros in monom ignored).

cached_schubpoly

@cache
def cached_schubpoly(k)

The explicit polynomial S_k(x; y) (cached).

complete_mul

def complete_mul(elem, x)

Multiply by a factorial complete homogeneous symmetric function in x variables via complete_sym_positional_perms (the dual Pieri rule).

handle_sympoly

def handle_sympoly(other)

How a symmetric-function coefficient is stored: evaluated to a polynomial here.

single_variable

def single_variable(elem, varnum)

Multiply by the single variable x_varnum (equivariant Monk rule).

from_expr

def from_expr(expr)

Convert a polynomial expression in x/y into the Schubert basis.

mul_expr

def mul_expr(elem, x)

Multiply elem by an arbitrary expression x: single variables use the Monk rule, (factorial) elementary/complete symmetric functions use their Pieri rules (splitting out variables from the wrong alphabet as needed), and Add/Mul/Pow recurse; anything else is treated as a coefficient.

new

def new(x)

Build an element from a permutation/Lehmer list, an existing element of this ring, or an expression.

DoubleSchubertRingDown Objects

class DoubleSchubertRingDown(DoubleSchubertRing)

DoubleSchubertRing using the descent-side ("down") multiplication kernels (schubmult_double_down/schubmult_py_down); basis symbols print with an op prefix.

double_mul

@property
def double_mul()

schubmult.mult.double.schubmult_double_down.

single_mul

@property
def single_mul()

schubmult.mult.single.schubmult_py_down.

cached_product

@cache
def cached_product(u, v, basis2)

Down-kernel structure constants over generic alphabets, substituted back to the ring's alphabets.

cached_positive_product

@cache
def cached_positive_product(u, v, basis2)

Positive variant of cached_product for the down kernel.

printing_term

def printing_term(k, prefix="op")

The DSchubPoly display symbol, prefixed with op by default.

ElemDoubleSchubertRing Objects

class ElemDoubleSchubertRing(DoubleSchubertRing)

DoubleSchubertRing whose coefficients are kept as unevaluated FactorialElemSym functions instead of being expanded to polynomials; products use the *_from_elems kernels.

replacematch

@property
def replacematch()

A (a, b) -> expression rewriter turning differences a - b into FactorialElemSym(1, 1, ...) forms, respecting which alphabet each symbol belongs to.

elem_func

@property
def elem_func()

FactorialElemSym.

handle_sympoly

def handle_sympoly(other)

Keep symmetric-function coefficients unevaluated.

elem_mul

def elem_mul(ring_elem, elem)

Positional Pieri rule for a factorial elementary symmetric function, keeping the leftover factor as an unevaluated coefficient.

complete_mul

def complete_mul(elem, x)

Dual Pieri rule for a factorial complete symmetric function, keeping the leftover factor unevaluated.

cached_product

@cache
def cached_product(u, v, basis2)

Structure constants via schubmult_double_from_elems with FactorialElemSym coefficients.

cached_positive_product

@cache
def cached_positive_product(u, v, basis2)

Structure constants via the positive schubmult_double_alt_from_elems route.

new

def new(x)

Build an element from a permutation/Lehmer list, an element of this ring, or an expression.

DSx

def DSx(x, genset=GeneratingSet("y"), elem_sym=False, down=False)

Construct a double Schubert polynomial element in x with coefficient alphabet genset.

DSx([3, 1, 2]) is S_{312}(x; y). Pass genset="z" (or a GeneratingSet) for a different coefficient alphabet; elem_sym=True uses ElemDoubleSchubertRing, down=True uses DoubleSchubertRingDown.