# Weyl Groups¶

class sage.categories.weyl_groups.WeylGroups(s=None)

The category of Weyl groups

See the Wikipedia page of Weyl Groups.

EXAMPLES:

sage: WeylGroups()
Category of weyl groups
sage: WeylGroups().super_categories()
[Category of coxeter groups]


Here are some examples:

sage: WeylGroups().example()            # todo: not implemented
sage: FiniteWeylGroups().example()
The symmetric group on {0, ..., 3}
sage: AffineWeylGroups().example()      # todo: not implemented
sage: WeylGroup(["B", 3])
Weyl Group of type ['B', 3] (as a matrix group acting on the ambient space)


This one will eventually be also in this category:

sage: SymmetricGroup(4)
Symmetric group of order 4! as a permutation group


TESTS:

sage: C = WeylGroups()
sage: TestSuite(C).run()

class ElementMethods
bruhat_lower_covers_coroots()

Returns all 2-tuples (v, $$\alpha$$) where v is covered by self and $$\alpha$$ is the positive coroot such that self = v $$s_\alpha$$ where $$s_\alpha$$ is the reflection orthogonal to $$\alpha$$.

ALGORITHM:

See bruhat_lower_covers() and bruhat_lower_covers_reflections() for Coxeter groups.

EXAMPLES:

sage: W = WeylGroup(['A',3], prefix="s")
sage: w = W.from_reduced_word([3,1,2,1])
sage: w.bruhat_lower_covers_coroots()
[(s1*s2*s1, alphacheck[1] + alphacheck[2] + alphacheck[3]), (s3*s2*s1, alphacheck[2]), (s3*s1*s2, alphacheck[1])]

bruhat_upper_covers_coroots()

Returns all 2-tuples (v, $$\alpha$$) where v is covers self and $$\alpha$$ is the positive coroot such that self = v $$s_\alpha$$ where $$s_\alpha$$ is the reflection orthogonal to $$\alpha$$.

ALGORITHM:

See bruhat_upper_covers() and bruhat_upper_covers_reflections() for Coxeter groups.

EXAMPLES:

sage: W = WeylGroup(['A',4], prefix="s")
sage: w = W.from_reduced_word([3,1,2,1])
sage: w.bruhat_upper_covers_coroots()
[(s1*s2*s3*s2*s1, alphacheck[3]), (s2*s3*s1*s2*s1, alphacheck[2] + alphacheck[3]), (s3*s4*s1*s2*s1, alphacheck[4]), (s4*s3*s1*s2*s1, alphacheck[1] + alphacheck[2] + alphacheck[3] + alphacheck[4])]

inversions(side='right', inversion_type='reflections')

Returns the set of inversions of self.

INPUT:

• side – ‘right’ (default) or ‘left’
• inversion_type – ‘reflections’ (default), ‘roots’, or ‘coroots’.

OUTPUT:

For reflections, the set of reflections r in the Weyl group such that self r < self. For (co)roots, the set of positive (co)roots that are sent by self to negative (co)roots; their associated reflections are described above.

If side is ‘left’, the inverse Weyl group element is used.

EXAMPLES:

sage: W=WeylGroup(['C',2], prefix="s")
sage: w=W.from_reduced_word([1,2])
sage: w.inversions()
[s2, s2*s1*s2]
sage: w.inversions(inversion_type = 'reflections')
[s2, s2*s1*s2]
sage: w.inversions(inversion_type = 'roots')
[alpha[2], alpha[1] + alpha[2]]
sage: w.inversions(inversion_type = 'coroots')
[alphacheck[2], alphacheck[1] + 2*alphacheck[2]]
sage: w.inversions(side = 'left')
[s1, s1*s2*s1]
sage: w.inversions(side = 'left', inversion_type = 'roots')
[alpha[1], 2*alpha[1] + alpha[2]]
sage: w.inversions(side = 'left', inversion_type = 'coroots')
[alphacheck[1], alphacheck[1] + alphacheck[2]]

is_pieri_factor()

Returns whether self is a Pieri factor, as used for computing Stanley symmetric functions.

EXAMPLES:

sage: W = WeylGroup(['A',5,1])
sage: W.from_reduced_word([3,2,5]).is_pieri_factor()
True
sage: W.from_reduced_word([3,2,4,5]).is_pieri_factor()
False

sage: W = WeylGroup(['C',4,1])
sage: W.from_reduced_word([0,2,1]).is_pieri_factor()
True
sage: W.from_reduced_word([0,2,1,0]).is_pieri_factor()
False

sage: W = WeylGroup(['B',3])
sage: W.from_reduced_word([3,2,3]).is_pieri_factor()
False
sage: W.from_reduced_word([2,1,2]).is_pieri_factor()
True

left_pieri_factorizations(max_length=+Infinity)

Returns all factorizations of self as $$uv$$, where $$u$$ is a Pieri factor and $$v$$ is an element of the Weyl group.

EXAMPLES:

If we take $$w = w_0$$ the maximal element of a strict parabolic subgroup of type $$A_{n_1} \times \cdots \times A_{n_k}$$, then the Pieri factorizations are in correspondence with all Pieri factors, and there are $$\prod 2^{n_i}$$ of them:

sage: W = WeylGroup(['A', 4, 1])
sage: W.from_reduced_word([]).left_pieri_factorizations().cardinality()
1
sage: W.from_reduced_word([1]).left_pieri_factorizations().cardinality()
2
sage: W.from_reduced_word([1,2,1]).left_pieri_factorizations().cardinality()
4
sage: W.from_reduced_word([1,2,3,1,2,1]).left_pieri_factorizations().cardinality()
8

sage: W.from_reduced_word([1,3]).left_pieri_factorizations().cardinality()
4
sage: W.from_reduced_word([1,3,4,3]).left_pieri_factorizations().cardinality()
8

sage: W.from_reduced_word([2,1]).left_pieri_factorizations().cardinality()
3
sage: W.from_reduced_word([1,2]).left_pieri_factorizations().cardinality()
2
sage: [W.from_reduced_word([1,2]).left_pieri_factorizations(max_length=i).cardinality() for i in [-1, 0, 1, 2]]
[0, 1, 2, 2]

sage: W = WeylGroup(['C',4,1])
sage: w = W.from_reduced_word([0,3,2,1,0])
sage: w.left_pieri_factorizations().cardinality()
7
sage: [(u.reduced_word(),v.reduced_word()) for (u,v) in w.left_pieri_factorizations()]
[([], [3, 2, 0, 1, 0]),
([0], [3, 2, 1, 0]),
([3], [2, 0, 1, 0]),
([3, 0], [2, 1, 0]),
([3, 2], [0, 1, 0]),
([3, 2, 0], [1, 0]),
([3, 2, 0, 1], [0])]

sage: W = WeylGroup(['B',4,1])
sage: W.from_reduced_word([0,2,1,0]).left_pieri_factorizations().cardinality()
6

quantum_bruhat_successors(index_set=None, roots=False, quantum_only=False)

Returns the successors of self in the parabolic quantum Bruhat graph.

INPUT:

• self – a Weyl group element, which is assumed to be of minimum length in its coset with respect to the parabolic subgroup

• index_set – (default: None) indicates the set of simple reflections used to generate the parabolic subgroup;

the default value indicates that the subgroup is the identity

• roots – (default: False) if True, returns the list of 2-tuples (w, $$\alpha$$) where w is a

successor and $$\alpha$$ is the positive root associated with the successor relation.

• quantum_only – (default: False) if True, returns only the quantum successors

Returns the successors of self in the quantum Bruhat graph on the parabolic quotient of the Weyl group determined by the subset of Dynkin nodes index_set.

EXAMPLES:

sage: W = WeylGroup(['A',3], prefix="s")
sage: w = W.from_reduced_word([3,1,2])
sage: w.quantum_bruhat_successors([1], roots = True)
[(s3, alpha[2]), (s1*s2*s3*s2, alpha[3]), (s2*s3*s1*s2, alpha[1] + alpha[2] + alpha[3])]
sage: w.quantum_bruhat_successors([1,3])
[1, s2*s3*s1*s2]
sage: w.quantum_bruhat_successors(roots = True)
[(s3*s1*s2*s1, alpha[1]), (s3*s1, alpha[2]), (s1*s2*s3*s2, alpha[3]), (s2*s3*s1*s2, alpha[1] + alpha[2] + alpha[3])]
sage: w.quantum_bruhat_successors()
[s3*s1*s2*s1, s3*s1, s1*s2*s3*s2, s2*s3*s1*s2]
sage: w.quantum_bruhat_successors(quantum_only = True)
[s3*s1]
sage: w = W.from_reduced_word([2,3])
sage: w.quantum_bruhat_successors([1,3])
Traceback (most recent call last):
...
ValueError: s2*s3 is not of minimum length in its coset of the parabolic subgroup generated by the reflections (1, 3)

reflection_to_coroot()

Returns the coroot associated with the reflection self.

EXAMPLES:

sage: W=WeylGroup(['C',2],prefix="s")
sage: r=W.from_reduced_word([1,2,1])
sage: r.reflection_to_coroot()
alphacheck[1] + alphacheck[2]
sage: r=W.from_reduced_word([1,2])
sage: r.reflection_to_coroot()
Traceback (most recent call last):
...
ValueError: s1*s2 is not a reflection

reflection_to_root()

Returns the root associated with the reflection self.

EXAMPLES:

sage: W=WeylGroup(['C',2],prefix="s")
sage: r=W.from_reduced_word([1,2,1])
sage: r.reflection_to_root()
2*alpha[1] + alpha[2]
sage: r=W.from_reduced_word([1,2])
sage: r.reflection_to_root()
Traceback (most recent call last):
...
ValueError: s1*s2 is not a reflection

stanley_symmetric_function()

Return the affine Stanley symmetric function indexed by self.

INPUT:

• self – an element $$w$$ of a Weyl group

Returns the affine Stanley symmetric function indexed by $$w$$. Stanley symmetric functions are defined as generating series of the factorizations of $$w$$ into Pieri factors and weighted by a statistic on Pieri factors.

EXAMPLES:

sage: W = WeylGroup(['A', 3, 1])
sage: W.from_reduced_word([3,1,2,0,3,1,0]).stanley_symmetric_function()
8*m[1, 1, 1, 1, 1, 1, 1] + 4*m[2, 1, 1, 1, 1, 1] + 2*m[2, 2, 1, 1, 1] + m[2, 2, 2, 1]
sage: A = AffinePermutationGroup(['A',3,1])
sage: A.from_reduced_word([3,1,2,0,3,1,0]).stanley_symmetric_function()
8*m[1, 1, 1, 1, 1, 1, 1] + 4*m[2, 1, 1, 1, 1, 1] + 2*m[2, 2, 1, 1, 1] + m[2, 2, 2, 1]

sage: W = WeylGroup(['C',3,1])
sage: W.from_reduced_word([0,2,1,0]).stanley_symmetric_function()
32*m[1, 1, 1, 1] + 16*m[2, 1, 1] + 8*m[2, 2] + 4*m[3, 1]

sage: W = WeylGroup(['B',3,1])
sage: W.from_reduced_word([3,2,1]).stanley_symmetric_function()
2*m[1, 1, 1] + m[2, 1] + 1/2*m[3]

sage: W = WeylGroup(['B',4])
sage: w = W.from_reduced_word([3,2,3,1])
sage: w.stanley_symmetric_function()  # long time (6s on sage.math, 2011)
48*m[1, 1, 1, 1] + 24*m[2, 1, 1] + 12*m[2, 2] + 8*m[3, 1] + 2*m[4]

sage: A = AffinePermutationGroup(['A',4,1])
sage: a = A([-2,0,1,4,12])
sage: a.stanley_symmetric_function()
6*m[1, 1, 1, 1, 1, 1, 1, 1] + 5*m[2, 1, 1, 1, 1, 1, 1] + 4*m[2, 2, 1, 1, 1, 1]
+ 3*m[2, 2, 2, 1, 1] + 2*m[2, 2, 2, 2] + 4*m[3, 1, 1, 1, 1, 1] + 3*m[3, 2, 1, 1, 1]
+ 2*m[3, 2, 2, 1] + 2*m[3, 3, 1, 1] + m[3, 3, 2] + 3*m[4, 1, 1, 1, 1] + 2*m[4, 2, 1, 1]
+ m[4, 2, 2] + m[4, 3, 1]


One more example (trac ticket #14095):

sage: G = SymmetricGroup(4)
sage: w = G.from_reduced_word([3,2,3,1])
sage: w.stanley_symmetric_function()
3*m[1, 1, 1, 1] + 2*m[2, 1, 1] + m[2, 2] + m[3, 1]


REFERENCES:

 [BH1994] S. Billey, M. Haiman. Schubert polynomials for the classical groups. J. Amer. Math. Soc., 1994.
 [Lam2008] T. Lam. Schubert polynomials for the affine Grassmannian. J. Amer. Math. Soc., 2008.
 [LSS2009] T. Lam, A. Schilling, M. Shimozono. Schubert polynomials for the affine Grassmannian of the symplectic group. Mathematische Zeitschrift 264(4) (2010) 765-811 (Arxiv 0710.2720)
 [Pon2010] S. Pon. Types B and D affine Stanley symmetric functions, unpublished PhD Thesis, UC Davis, 2010.
stanley_symmetric_function_as_polynomial(max_length=+Infinity)

Returns a multivariate generating function for the number of factorizations of a Weyl group element into Pieri factors of decreasing length, weighted by a statistic on Pieri factors.

INPUT:

• self – an element $$w$$ of a Weyl group $$W$$
• max_length – a non negative integer or infinity (default: infinity)

Returns the generating series for the Pieri factorizations $$w = u_1 \cdots u_k$$, where $$u_i$$ is a Pieri factor for all $$i$$, $$l(w) = \sum_{i=1}^k l(u_i)$$ and max_length $$\geq l(u_1) \geq \cdots \geq l(u_k)$$.

A factorization $$u_1 \cdots u_k$$ contributes a monomial of the form $$\prod_i x_{l(u_i)}$$, with coefficient given by $$\prod_i 2^{c(u_i)}$$, where $$c$$ is a type-dependent statistic on Pieri factors, as returned by the method u[i].stanley_symm_poly_weight().

EXAMPLES:

sage: W = WeylGroup(['A', 3, 1])
sage: W.from_reduced_word([]).stanley_symmetric_function_as_polynomial()
1
sage: W.from_reduced_word([1]).stanley_symmetric_function_as_polynomial()
x1
sage: W.from_reduced_word([1,2]).stanley_symmetric_function_as_polynomial()
x1^2
sage: W.from_reduced_word([2,1]).stanley_symmetric_function_as_polynomial()
x1^2 + x2
sage: W.from_reduced_word([1,2,1]).stanley_symmetric_function_as_polynomial()
2*x1^3 + x1*x2
sage: W.from_reduced_word([1,2,1,0]).stanley_symmetric_function_as_polynomial()
3*x1^4 + 2*x1^2*x2 + x2^2 + x1*x3
sage: W.from_reduced_word([1,2,3,1,2,1,0]).stanley_symmetric_function_as_polynomial() # long time
22*x1^7 + 11*x1^5*x2 + 5*x1^3*x2^2 + 3*x1^4*x3 + 2*x1*x2^3 + x1^2*x2*x3
sage: W.from_reduced_word([3,1,2,0,3,1,0]).stanley_symmetric_function_as_polynomial() # long time
8*x1^7 + 4*x1^5*x2 + 2*x1^3*x2^2 + x1*x2^3

sage: W = WeylGroup(['C',3,1])
sage: W.from_reduced_word([0,2,1,0]).stanley_symmetric_function_as_polynomial()
32*x1^4 + 16*x1^2*x2 + 8*x2^2 + 4*x1*x3

sage: W = WeylGroup(['B',3,1])
sage: W.from_reduced_word([3,2,1]).stanley_symmetric_function_as_polynomial()
2*x1^3 + x1*x2 + 1/2*x3


Algorithm: Induction on the left Pieri factors. Note that this induction preserves subsets of $$W$$ which are stable by taking right factors, and in particular Grassmanian elements.

WeylGroups.Finite

alias of FiniteWeylGroups

class WeylGroups.ParentMethods
pieri_factors(*args, **keywords)

Returns the set of Pieri factors in this Weyl group.

For any type, the set of Pieri factors forms a lower ideal in Bruhat order, generated by all the conjugates of some special element of the Weyl group. In type $$A_n$$, this special element is $$s_n\cdots s_1$$, and the conjugates are obtained by rotating around this reduced word.

These are used to compute Stanley symmetric functions.

EXAMPLES:

sage: W = WeylGroup(['A',5,1])
sage: PF = W.pieri_factors()
sage: PF.cardinality()
63

sage: W = WeylGroup(['B',3])
sage: PF = W.pieri_factors()
sage: [w.reduced_word() for w in PF]
[[1, 2, 3, 2, 1], [1, 2, 3, 2], [2, 3, 2], [2, 3], [3, 1, 2, 1], [1, 2, 1], [2], [1, 2], [1], [], [2, 1], [3, 2, 1], [3, 1], [2, 3, 2, 1], [3], [3, 2], [1, 2, 3], [1, 2, 3, 1], [3, 1, 2], [2, 3, 1]]

sage: W = WeylGroup(['C',4,1])
sage: PF = W.pieri_factors()
sage: W.from_reduced_word([3,2,0]) in PF
True

quantum_bruhat_graph(index_set=())

Returns the quantum Bruhat graph of the quotient of the Weyl group by a parabolic subgroup $$W_J$$.

INPUT:

• index_set – a tuple $$J$$ of nodes of the Dynkin diagram (default: ())

By default, the value for index_set indicates that the subgroup is trivial and the quotient is the full Weyl group.

EXAMPLES:

sage: W = WeylGroup(['A',3], prefix="s")
sage: g = W.quantum_bruhat_graph((1,3))
sage: g
Parabolic Quantum Bruhat Graph of Weyl Group of type ['A', 3] (as a matrix group acting on the ambient space) for nodes (1, 3): Digraph on 6 vertices
sage: g.vertices()
[s2*s3*s1*s2, s3*s1*s2, s1*s2, s3*s2, s2, 1]
sage: g.edges()
[(s2*s3*s1*s2, s2, alpha[2]), (s3*s1*s2, s2*s3*s1*s2, alpha[1] + alpha[2] + alpha[3]),
(s3*s1*s2, 1, alpha[2]), (s1*s2, s3*s1*s2, alpha[2] + alpha[3]),
(s3*s2, s3*s1*s2, alpha[1] + alpha[2]), (s2, s1*s2, alpha[1] + alpha[2]),
(s2, s3*s2, alpha[2] + alpha[3]), (1, s2, alpha[2])]
sage: W = WeylGroup(['A',3,1], prefix="s")
sage: g = W.quantum_bruhat_graph()
Traceback (most recent call last):
...
ValueError: The Cartan type ['A', 3, 1] is not finite


Return None.

Indeed, the category of Weyl groups defines no additional structure: Weyl groups are a special class of Coxeter groups.

Todo

Should this category be a CategoryWithAxiom?

EXAMPLES:

sage: WeylGroups().additional_structure()

WeylGroups.super_categories()

EXAMPLES:

sage: WeylGroups().super_categories()
[Category of coxeter groups]


Vector Spaces