AUTHORS:
DESCRIPTION:
We provide tools to calculate composition factors of some Weyl modules over certain algebraic and symmetric groups. These tools are based on the papers of Kleshchev-Sheth [KS99] and [KS01], including some results of Adamovich [Ada86] reprinted therein.
The tools are implemented in four classes:
The main functions are KleshchevShethWeight.composition_factors() and KleshchevShethGroup.draw_diagrams(). The first of these returns the composition factors of a given weight, as a KleshchevShethFactors instance. The second of these determines the composition factors for a range of weights and returns a graphic showing the poset of composition factors for each.
EXAMPLES:
sage: Sig = KleshchevShethGroup('Sigma',168,5)
sage: w = Sig.weight(38,130)
sage: w.composition_factors().weights().list()
[(6, 162), (3, 165), (31, 137), (36, 132), (28, 140), (38, 130)]
sage: w.composition_factors().show() # draw poset of composition factors
sage: G = KleshchevShethGroup('GL',34,3)
sage: w = G.weight(22,25)
sage: w.composition_factors().weights().list()
[(17, 30), (16, 31), (20, 27), (22, 25)]
sage: w.composition_factors().show() # draw poset of composition factors
Nodes are colored to indicate nontrivial ext1 with the trivial module. See KleshchevShethFactors.vertex_colors():
sage: G = KleshchevShethGroup('C',142,5)
sage: w = G.weight(0)
sage: w.nontrivial_ext1()
{(30, 142): 30, (6, 142): 6}
sage: w = G.weight(30)
sage: w.composition_factors().weights().list()
[6, 26, 0, 30]
sage: w.composition_factors().show() # draw poset of composition factors
sage: w = Sig.weight(0)
sage: w.nontrivial_ext1()
{(4, 164): (4, 164), (25, 143): (25, 143), (15, 153): (15, 153)}
sage: w = Sig.weight(25)
sage: w.composition_factors().weights().list()
[(19, 149), (15, 153), (24, 144), (0, 168), (25, 143)]
sage: w.composition_factors().show()
REFERENCES:
[Ada86] |
|
[KS99] |
|
[KS01] |
|
Bases: sage.structure.sage_object.SageObject
Class to hold data for Kleshchev-Sheth composition factors of a particular Weyl module, and produce convenient output (posets or diagrams).
INPUTS:
EXAMPLES:
sage: S = KleshchevShethGroup('SL',18,3)
sage: w = S.weight(7,11)
sage: F = w.composition_factors(); F
Composition factors for Weyl module with highest weight (7, 11) for Group SL_18 over algebraically closed field of characteristic 3
sage: F.weights()
Finite poset containing 4 elements
sage: F.weights().list()
[(3, 15), (6, 12), (1, 17), (7, 11)]
sage: F.graphics_object() # draws poset of composition factors (not tested)
Return the graphics object for self, for use with generic graphics manipulations such as graphics_array. This is a Hasse diagram for the poset of composition factors determined by the Kleshchev-Sheth algorithm.
The optional argument dual is passed to the weights() method. By default, nodes are labeled with vertex_colors(). Setting labels='intervals' can be used to label with KleshchevShethIntervals instead – in this case all nodes are given default color.
EXAMPLES:
sage: G = KleshchevShethGroup('C',34,3)
sage: G.draw_diagrams()
sage: w = G.weight(12)
sage: w.composition_factors().graphics_object() # draw poset of composition factors (not tested)
Return poset of intervals.
EXAMPLES:
sage: S = KleshchevShethGroup('SL',18,3)
sage: w = S.weight(7,11)
sage: F = w.composition_factors()
sage: F.intervals().list()
[[0,2), [1,2), [0,1), [0,0)]
sage: G = KleshchevShethGroup('C',30,3)
sage: w = G.weight(6)
sage: F = w.composition_factors()
sage: F.intervals().list()
[[0,3), [1,3), [0,0)]
Save png file in current directory – this is the same graphic returned by graphics_object() and show(). If filename is omitted, a default name of the form ‘poset_Gn_p_u-v.png’ is used and, if present, dirname is prepended to the default filename.
EXAMPLES:
sage: G = KleshchevShethGroup('C',34,3)
sage: w = G.weight(12)
sage: F = w.composition_factors()
sage: F.save(filename='tmp.png',labels='intervals',dual=True) # not tested
Show graph of self. Use save() to save the image in the current directory. See graphics_object() for a description of the graphic.
EXAMPLES:
sage: G = KleshchevShethGroup('C',34,3)
sage: G.draw_diagrams()
sage: w = G.weight(12)
sage: w.composition_factors().show(dual=True) # draw poset of composition factors (not tested)
Return vertex coloring for use with graphing composition factors. Colors track interaction with marked weight (default: the trivial weight).
EXAMPLES:
sage: G = KleshchevShethGroup('C',34,3)
sage: w = G.weight(12)
sage: w.composition_factors().graphics_object() # indirect doctest
sage: Sig = KleshchevShethGroup('Sigma',168,5)
sage: v = Sig.weight(40)
sage: v.composition_factors().show(marked_weight=v) # indirect doctest
sage: w = Sig.weight(39)
sage: w.composition_factors().show(marked_weight=v) # indirect doctest
TESTS:
sage: v.composition_factors().vertex_colors(marked_weight=v) == {'#ccffcc': [(40, 128)], '#ffffcc': [(4, 164), (29, 139), (0, 168)], '#ffccff': [(39, 129), (25, 143)]}
True
sage: w.composition_factors().vertex_colors(marked_weight=v) == {'#ccffcc': [], '#ffffcc': [(5, 163), (30, 138), (35, 133), (4, 164), (29, 139)], '#ffccff': [(39, 129)]}
True
Return poset of weights of composition factors. Use the optional argument dual to return the dual poset.
EXAMPLES:
sage: S = KleshchevShethGroup('SL',18,3)
sage: w = S.weight(7,11)
sage: F = w.composition_factors()
sage: F.weights().list()
[(3, 15), (6, 12), (1, 17), (7, 11)]
sage: G = KleshchevShethGroup('C',30,3)
sage: w = G.weight(6)
sage: F = w.composition_factors()
sage: F.weights().list()
[2, 0, 6]
NOTES:
As an intermediate step, we build a dictionary of composition factor weights and their corresponding intervals – this depends on the fact that delta is injective.
Bases: sage.structure.sage_object.SageObject
Class to hold basic group data (type, rank, prime).
INPUTS:
EXAMPLES:
sage: G = KleshchevShethGroup('GL',10,5); G
Group GL_10 over algebraically closed field of characteristic 5
sage: S = KleshchevShethGroup('SL',10,3); S
Group SL_10 over algebraically closed field of characteristic 3
sage: C = KleshchevShethGroup('C',20,7); C
Group C_20 over algebraically closed field of characteristic 7
sage: Sig = KleshchevShethGroup('Sigma',35,3); Sig
Group Sigma_35 over algebraically closed field of characteristic 3
Return dict whose values are all weights of this group for which the Kleshchev-Sheth combinatorics apply. Keys of the dict are indices for the weights.
TESTS:
sage: G = KleshchevShethGroup('GL',10,5)
sage: sorted(G.allowable_weights().keys())
[(0, 0), (0, 1), (0, 2), ...
sage: len(G.allowable_weights().keys()) == (G.rank+1)*(G.rank+2)/2
True
sage: H = KleshchevShethGroup('SL',10,5)
sage: sorted(G.allowable_weights().keys()) == sorted(H.allowable_weights().keys())
True
sage: G = KleshchevShethGroup('C',20,5)
sage: sorted(G.allowable_weights().keys())
[(0, 20), (1, 20), (2, 20), (3, 20)...]
sage: len(G.allowable_weights().keys()) == (G.rank+1)
True
sage: G = KleshchevShethGroup('Sigma',10,5)
sage: sorted(G.allowable_weights().keys())
[(0, 10), (1, 9), (2, 8), (3, 7), (4, 6), (5, 5)]
sage: G = KleshchevShethGroup('Sigma',11,5)
sage: sorted(G.allowable_weights().keys())
[(0, 11), (1, 10), (2, 9), (3, 8), (4, 7), (5, 6)]
Draw composition factor diagrams for Weyl modules of this group. Only modules whose number of composition factors is at least min_factors will be drawn. The arguments each_width and each_height specify the width and height of each diagram. Due to limitations of poset plotting and graphics array, it is often necessary to test and modify the width and height settings.
The keyword return_graphic can be used to store this graphic in another variable for saving.
EXAMPLES:
sage: C = KleshchevShethGroup('C',12,3)
sage: C.draw_diagrams(each_height=4)
Draw only specific Weyl modules by using the keyword specific_weights:
sage: G = KleshchevShethGroup('Sigma',168,5)
sage: s = [x.indices for x in G.allowable_weights().values() if len(x.interval_set()) >= 5]
sage: G.draw_diagrams(specific_weights=s, each_width=20,each_height=10) # not tested
Returns a KleshchevShethWeight. Two arguments are required except for types C and Sigma, where v can be determined from u.
EXAMPLES:
sage: G = KleshchevShethGroup('GL',34,5)
sage: w = G.weight(12,15)
sage: C = KleshchevShethGroup('C',12,3)
sage: w = G.weight(12)
Bases: sage.sets.family.TrivialFamily
A bookkeeping class for the index intervals in Kleshchev-Sheth. This implements union of intervals as addition, checking to see that the endpoint condition for unions is met.
Each instance of this class represents a single element of
EXAMPLES:
sage: from sage.combinat.kleshchev_sheth import KleshchevShethIntervals
sage: G = KleshchevShethGroup('C',30,3)
sage: w = G.weight(6)
sage: I = KleshchevShethIntervals(G,w,[(0,3)]); I
[0,3)
sage: I.list() # list of the integers in this union of intervals
[0, 1, 2]
sage: I.is_valid() # is this a valid element of A?
True
sage: J = KleshchevShethIntervals(G,w,[(0,3),(1,3)]); J
[0,3) + [1,3)
sage: J.list()
[0, 1, 2, 1, 2]
sage: J.is_valid()
False
sage: J.contains(I)
True
sage: I.less_than(J)
False
sage: K = KleshchevShethIntervals(G,w,[(7,9)]); K
[7,9)
sage: K.list()
[7, 8]
sage: K.is_valid()
False
sage: I.less_than(K)
True
True iff self is contained in other
EXAMPLES:
sage: from sage.combinat.kleshchev_sheth import KleshchevShethIntervals
sage: G = KleshchevShethGroup('Sigma',30,3)
sage: w = G.weight(6,24)
sage: I = KleshchevShethIntervals(G,w,[(0,2)])
sage: J = KleshchevShethIntervals(G,w,[(1,4)])
sage: K = KleshchevShethIntervals(G,w,[(0,4)])
sage: K.contained_in(I)
False
sage: J.contained_in(K)
True
True iff self contains other
EXAMPLES:
sage: from sage.combinat.kleshchev_sheth import KleshchevShethIntervals
sage: G = KleshchevShethGroup('Sigma',30,3)
sage: w = G.weight(6,24)
sage: I = KleshchevShethIntervals(G,w,[(0,2)])
sage: J = KleshchevShethIntervals(G,w,[(1,4)])
sage: K = KleshchevShethIntervals(G,w,[(0,4)])
sage: K.contains(I)
True
sage: J.contains(I)
False
Return value of
EXAMPLES:
sage: from sage.combinat.kleshchev_sheth import KleshchevShethIntervals
sage: G = KleshchevShethGroup('Sigma',30,5)
sage: w = G.weight(6,24)
sage: I = KleshchevShethIntervals(G,w,[(0,2)]); I
[0,2)
sage: I.delta()
6
This function generates a list of coefficients for delta_interval_sum.
Given left- and right-hand endpoints l and r, it returns coefficients
for
EXAMPLES:
sage: from sage.combinat.kleshchev_sheth import KleshchevShethIntervals
sage: G = KleshchevShethGroup('Sigma',30,3)
sage: w = G.weight(6,24)
sage: w.a_digits()
[1, 0, 2]
sage: I = KleshchevShethIntervals(G,w,[(0,2)])
sage: I.delta_coefficients(0,2)
[2, 2]
sage: I.delta_coefficients(0,4)
[2, 2, 0, 2]
Determine if self is a member of the set
EXAMPLES:
sage: from sage.combinat.kleshchev_sheth import KleshchevShethIntervals
sage: G = KleshchevShethGroup('C',30,5)
sage: w = G.weight(10)
sage: I = KleshchevShethIntervals(G,w,[(0,2)]); I
[0,2)
sage: I.in_A()
True
sage: I = KleshchevShethIntervals(G,w,[(0,3)]); I
[0,3)
sage: I.in_A()
False
Return True iff self is in the set
EXAMPLES:
sage: from sage.combinat.kleshchev_sheth import KleshchevShethIntervals
sage: G = KleshchevShethGroup('C',30,5)
sage: w = G.weight(10)
sage: I = KleshchevShethIntervals(G,w,[(0,2)]); I
[0,2)
sage: I.is_valid()
True
sage: I = KleshchevShethIntervals(G,w,[(0,3)]); I
[0,3)
sage: I.is_valid()
False
Comparison by ordering on the integers; for s + t to be a valid sum of Kleshchev-Sheth intervals, s.less_than(t) must return True.
EXAMPLES:
sage: from sage.combinat.kleshchev_sheth import KleshchevShethIntervals
sage: G = KleshchevShethGroup('Sigma',30,3)
sage: w = G.weight(6,24)
sage: I = KleshchevShethIntervals(G,w,[(0,2)])
sage: J = KleshchevShethIntervals(G,w,[(2,4)])
sage: K = KleshchevShethIntervals(G,w,[(3,4)])
sage: I.less_than(J)
False
sage: I.less_than(K)
True
Return list of subintervals
EXAMPLES:
sage: from sage.combinat.kleshchev_sheth import KleshchevShethIntervals
sage: G = KleshchevShethGroup('GL',55,7)
sage: w = G.weight(6,34)
sage: J = KleshchevShethIntervals(G,w,[(0,2),(3,5)]); J
[0,2) + [3,5)
sage: J.subintervals()
[[0,2), [3,5)]
Bases: sage.structure.sage_object.SageObject
Class to hold basic weight data.
INPUTS:
G – a KleshchevShethGroup instance
uv – a tuple (u,v) representing a weight
- For
GLn ,λ=(2u,1v−u) , with0≤u≤v≤n - For
SLn ,λ=ωu+ωv , with0≤u≤v≤n - For
Cn=Sp2n ,λ=ωu , with0≤u≤n (v=n )- for
Σn ,λ=(v,u) , with0≤u≤v≤n andu+v=n
EXAMPLES:
sage: G = KleshchevShethGroup('SL',14,5)
sage: w = G.weight(2,6); w
(2, 6)
sage: G = KleshchevShethGroup('SL',14,5)
sage: w = G.weight(4,5)
sage: F = w.composition_factors()
sage: F.weights()
Finite poset containing 2 elements
sage: F.intervals().list()
[[0,1), [0,0)]
sage: F.graphics_object() # draw poset of composition factors
sage: C = KleshchevShethGroup('C',16,3)
sage: la = C.weight(12); la
12
sage: la = C.weight(12)
sage: F = la.composition_factors()
sage: F.weights().list()
[4, 0, 10, 12]
sage: F.graphics_object() # draw poset of composition factors
sage: Sig = KleshchevShethGroup('Sigma',30,5)
sage: w = Sig.weight(6,24)
sage: F = w.composition_factors()
sage: F.weights().list()
[(0, 30), (5, 25), (6, 24)]
a = v - u + 1. For type
EXAMPLES:
sage: G = KleshchevShethGroup('GL',34,5)
sage: w = G.weight(7,12)
sage: w.a()
6
Base-
EXAMPLES:
sage: G = KleshchevShethGroup('GL',34,5)
sage: w = G.weight(7,12)
sage: w.a_digits()
[1, 1]
sage: C = KleshchevShethGroup('C',12,3)
sage: w = C.weight(6)
sage: w.a_digits()
[1, 2]
sage: Sig = KleshchevShethGroup('Sigma',30,5)
sage: w = Sig.weight(6,24)
sage: w.a_digits()
[4, 3]
Note that the single intervals of
This function returns pairs of endpoints corresponding to the
exceptional intervals. We deal with the infinite generic family when
computing
EXAMPLES:
sage: G = KleshchevShethGroup('GL',34,5)
sage: wG = G.weight(7,12)
sage: wG.a_digits()
[1, 1]
sage: wG.a_hat_endpoints()
[(0, 1)]
sage: C30 = KleshchevShethGroup('C',30,5)
sage: wC30 = C30.weight(25)
sage: wC30.a_hat_endpoints()
[(0, 1)]
sage: Sig = KleshchevShethGroup('Sigma',30,5)
sage: w = Sig.weight(6,24)
sage: w.a_hat_endpoints()
[(0, 1)]
Return sets of integers
EXAMPLES:
sage: G = KleshchevShethGroup('GL',34,5)
sage: w = G.weight(7,12)
sage: w.a_digits()
[1, 1]
sage: w.b_minus_plus() == {'plus': [0, 1], 'minus': [0, 1]}
True
sage: C = KleshchevShethGroup('C',12,3)
sage: w = C.weight(6)
sage: w.a_digits()
[1, 2]
sage: w.b_minus_plus() == {'plus': [0], 'minus': [0, 1]}
True
sage: Sig = KleshchevShethGroup('Sigma',30,5)
sage: w = Sig.weight(6,24)
sage: w.a_digits()
[4, 3]
sage: w.b_minus_plus() == {'plus': [1], 'minus': [0, 1]}
True
Return composition factors of self. This is an instance of KleshchevShethFactors.
EXAMPLES:
sage: G = KleshchevShethGroup('GL',34,5)
sage: w = G.weight(10,27)
sage: w.composition_factors()
Composition factors for Weyl module with highest weight (10, 27) for Group GL_34 over algebraically closed field of characteristic 5
sage: w.composition_factors().weights().list()
[(3, 34), (8, 29), (10, 27)]
sage: w.composition_factors().graphics_object() # draw poset of composition factors (not tested)
Determine rank of
EXAMPLES:
sage: G = KleshchevShethGroup('GL',34,5)
sage: w = G.weight(10,27)
sage: w.ext1(G.weight(13,24))
1
sage: w.ext1(G.weight(10,24))
0
sage: Sig = KleshchevShethGroup('Sigma',30,5)
sage: w = Sig.weight(6,24)
sage: w.ext1(Sig.weight(3,27))
0
sage: w.ext1(Sig.weight(10,20))
1
Return True if other weight is a composition factor of Weyl module with highest weight self. Default input checks other = trivial module.
EXAMPLES:
sage: G = KleshchevShethGroup('GL',105,5)
sage: w = G.weight(15,33)
sage: w.has_composition_factor(G.weight(5,43))
True
sage: w.has_composition_factor(G.weight(19,29))
False
sage: G.weight(19,29).has_composition_factor(w)
True
Given Kleshchev-Sheth interval I, determine whether I is in the interval set of self.
EXAMPLES:
sage: from sage.combinat.kleshchev_sheth import KleshchevShethIntervals
sage: C = KleshchevShethGroup('C',196,5)
sage: w = C.weight(104)
sage: P = [KleshchevShethIntervals(C,w,[J]) for J in [(0,3),(1,3),(0,1),(2,3),(0,2),(1,2)]]
sage: w.in_interval_set(P[0])
True
sage: w.in_interval_set(P[2])
True
sage: w.interval_set()
[[0,1), [0,2), [1,2), [0,3), [1,3), [2,3), [0,1) + [2,3), [0,0)]
Return set of intervals,
The function a_hat_endpoints() returns the endpoints of the
finite family of ‘exceptional’ intervals, this function
additionally determines how many elements from the infinite
‘generic’ family of intervals which are in
EXAMPLES:
sage: G = KleshchevShethGroup('GL',34,5)
sage: w = G.weight(4,5)
sage: w.interval_set()
[[0,1), [0,0)]
sage: w = G.weight(10,27)
sage: w.interval_set()
[[0,1), [0,2), [0,0)]
sage: C = KleshchevShethGroup('C',30,3)
sage: w = C.weight(6)
sage: w.interval_set()
[[0,3), [1,3), [0,0)]
sage: Sig = KleshchevShethGroup('Sigma',30,5)
sage: w = Sig.weight(6,24)
sage: w.interval_set()
[[0,1), [0,2), [0,0)]
Return all allowable weights of self.group which have nontrivial ext1 with self. Keys are tuples (u,v), values are corresponding KleshchevShethWeight instances.
EXAMPLES:
sage: G = KleshchevShethGroup('GL',105,5)
sage: w = G.weight(15,33)
sage: w.a_digits()
[4, 3]
sage: sorted(w.nontrivial_ext1().keys())
[(5, 43), (14, 34), (19, 29)]
sage: G = KleshchevShethGroup('Sigma',23,5)
sage: w = G.weight(10)
sage: sorted(w.nontrivial_ext1().keys())
[(9, 14)]
sage: m = G.weight(3)
sage: sorted(m.nontrivial_ext1().keys())
[(1, 22), (6, 17)]
sage: G = KleshchevShethGroup('C',16,5)
sage: w = G.weight(4)
sage: sorted(w.nontrivial_ext1().keys())
[(0, 16), (10, 16)]
sage: G = KleshchevShethGroup('C',30,3)
sage: w = G.weight(18)
sage: sorted(w.nontrivial_ext1().keys())
[(6, 30), (14, 30), (20, 30), (24, 30)]
Given a list of Kleshchev-Sheth intervals, return a new list of Kleshchev-Sheth intervals which adds all valid unions.
EXAMPLES:
sage: from sage.combinat.kleshchev_sheth import KleshchevShethIntervals
sage: C = KleshchevShethGroup('C',196,5)
sage: w = C.weight(104)
sage: P = [KleshchevShethIntervals(C,w,[J]) for J in [(0,3),(1,3),(0,1),(2,3),(0,2),(1,2)]]
sage: w.take_valid_unions_KS(P)
[[0,3), [1,3), [0,1), [2,3), [0,2), [1,2), [0,1) + [2,3)]
Convert I to composition factor: return weight of composition factor corresponding to this interval (or union of intervals).
EXAMPLES:
sage: G = KleshchevShethGroup('GL',34,5)
sage: w = G.weight(10,27)
sage: P = w.interval_set()
sage: P[0].delta()
2
sage: w.to_cf(P[0])
(8, 29)
sage: P[1].delta()
7
sage: w.to_cf(P[1])
(3, 34)
sage: C = KleshchevShethGroup('C',12,3)
sage: w = C.weight(6)
sage: P = w.interval_set(); P
[[0,2), [1,2), [0,0)]
sage: P[1].delta()
3
sage: w.to_cf(P[1])
0
sage: Sig = KleshchevShethGroup('Sigma',30,5)
sage: w = Sig.weight(6,24)
sage: P = w.interval_set(); P
[[0,1), [0,2), [0,0)]
sage: P[1].delta()
6
sage: w.to_cf(P[1])
(0, 30)
Test algorithms by calculating Ext^1 in two different ways. Returns True if the two calculations agree, False if not.
EXAMPLES:
sage: from sage.combinat.kleshchev_sheth import ext1_tests
sage: ext1_tests('GL',20,5)
True
sage: ext1_tests('SL',20,3)
True
sage: ext1_tests('C',162,5)
True
sage: ext1_tests('Sigma',83,7)
True