atlas Library · Script File
subgroups.at
The functions deal with constructing Levi systems cut out by various linear conditions (being orthogonal to a given set of coroots), and their root data. Levi_subgroups.at handles Levi systems by specifying a RootDatum and a predicate that selects among its positive root indices those for the Levi factor. For the conditions considered here, such predicates are readily written down.
Definitions in source order
subgroup 2 overloads
subgroup (RootDatum rd, [vec] roots) = (bool,RootDatum)subgroup(rd,roots): roots are assumed to be the set of ALL (positive and negative) roots of a reductive subgroup containing H (otherwise an error) let twochocheck=compute sum of positive coroots simple roots are those with inner product 2 with this then construct a RootDatum: root_datum(simple_roots,simple_coroots) Function takes [vec] argument |roots|, which may be empty; always convert them explicitly to a matrix |rd.rank#roots| (implicit fails when |roots| empty).
subgroup(RootDatum rd,[int] roots) = (bool,RootDatum)roots given by indices (in all roots) rather than vecs
subgroup_from_positive 2 overloads
subgroup_from_positive(RootDatum rd,[vec] roots) = (bool,RootDatum)only specify the positive roots
subgroup_from_positive(RootDatum rd,[int] roots) = (bool,RootDatum)each root is given by index in positive roots, rather than a vec
subgroup_by_simple
subgroup_by_simple(RootDatum rd,[vec] roots) = RootDatumspecify a subgroup by a list of roots (not necessarily simple or even positive), to serve as the simple roots of the subgroup
Levi_of_subspace
Levi_of_subspace (RootDatum rd, mat k) = (bool,RootDatum)mat k: columns span a subspace U of X_* construct RootDatum of Levi given by roots vanishing on U this is the same as the Levi defined by the torus given by exp(\C*v) for v the columns of the matrix
Levi_of_dual_subspace
Levi_of_dual_subspace(RootDatum rd, mat k) = (bool,RootDatum)matrix of elements of X^*
Levi_of_w
Levi_of_w (WeylElt w) = (bool,RootDatum)Levi subgroup defined by a group element: Levi of the dual subspace w acts on X^*, U=kernel(w-1) \subset X^*, want roots alpha such that alpha^v vanishes on U this is the Cartan if and only if w is elliptic
Levi_of_weight
Levi_of_weight (RootDatum rd,ratvec v) = (bool,RootDatum)Levi subgroup defined by weight in QX^*
Levi_of_coweight
Levi_of_coweight(RootDatum rd,ratvec v) = (bool,RootDatum)Levi subgroup defined by weight in QX_*
normalizer of a set of rootsL100
normalizer 2 overloads
normalizer([WeylElt] subset_of_W,[vec] set_of_roots) = [WeylElt]w in subgroup of W such that w permutes set_of_roots
normalizer (RootDatum rd,[vec] set_of_roots) = [WeylElt]w in W such that w permutes set_of_roots
also defined in conjugate.at
stabilizer_elementary
stabilizer_elementary (RootDatum rd, ratvec gamma) = [WeylElt]for testing
orthogonal_subgroup 2 overloads
orthogonal_subgroup (RootDatum rd, [vec] S) = (bool,RootDatum)subgroup orthogonal to a set of roots
orthogonal_subgroup(RootDatum rd, RootDatum rd_L) = (bool,RootDatum)subgroup orthogonal to a Levi
note that |centralizer(RootDatum rd,mat wts)| is defioned in conjugate.atL131
centralizer
centralizer (mat cwts,RootDatum rd) = RootDatumroot datum of coroots perpendicular to a set of elements of X_*
cwts is morally transposed
also in this file at line 148, line 170; also defined in good_W_representatives.at, nilpotent_centralizer.at, K_highest_weights.at, conjugate.at, cyclotomic_Lie_algebra.at, bracket.at, weyl_character_formula.at
centralizer_coweight
centralizer_coweight(RootDatum rd,ratvec cowt) = RootDatumcowt is in X_*\otimes Q t=exp(2\pi i cowt)\in T compute (id component of) centralizer_G(t) H=centralizer_coweight(G,v) root datum of H: <alpha,v>\in Z H is a subgroup of G
centralizer
centralizer(RootDatum rd,[ratvec] cowts) = RootDatumcentralizer of a set of torus elements, given as $\exp_1$ images of coweights
also in this file at line 134, line 170; also defined in good_W_representatives.at, nilpotent_centralizer.at, K_highest_weights.at, conjugate.at, cyclotomic_Lie_algebra.at, bracket.at, weyl_character_formula.at
centralizer_weight
centralizer_weight(RootDatum rd, ratvec wt) = RootDatumwt is in X^*(T)_Q=X_*(T^vee)_Q
t=exp(2\pi i wt)\in T^vee
compute (id component of) centralizer_{G^vee}(t)
H=centralizer_weight(G,v)
root datum of H: <alpha^vee,v>\in Z
H^vee is a subgroup of G^vee
centralizer
centralizer = centralizer_coweight@(RootDatum,ratvec)default: v\in X_*(T)_Q, t=exp(2\pi iv)\in T This is giving Cent_G(t), the most common case unfortunately this terminology conflicts with the terminology above for centralizer(RootDatum rd,[vec] wts) should change this, but there are many cases in the scripts
Cent_G(exp(2\pi i v)
also in this file at line 134, line 148; also defined in good_W_representatives.at, nilpotent_centralizer.at, K_highest_weights.at, conjugate.at, cyclotomic_Lie_algebra.at, bracket.at, weyl_character_formula.at
example of centralizer_weight versus centralizer_coweight:
atlas> centralizer_coweight (SO(9),[1,1,1,1]/2)
Value: root datum of Lie type 'D4'
this is a subgroup of G: SO(8)\subset SO(9)
atlas> centralizer_weight (Sp(8),[1,1,1,1]/2)
Value: root datum of Lie type 'D4'
this is a subgroup of G^\vee:
Sp(8) -> SO(9)
|
SO(8) <- SO(8)L172find_conjugate
find_conjugate([WeylElt] S,WeylElt w) = intthese functions are slow, by calling |classify_standard_Levis| each time
also defined in nilpotent_orbits.at
find_all_conjugate
find_all_conjugate([WeylElt] S,WeylElt w) = [int]group_by_conjugacy
group_by_conjugacy([WeylElt] S) = [[WeylElt]]also in this file at line 523
a few simple output routinesL206
show 2 overloads
show([RootDatum] rds) = voidshow([[RootDatum]] rds) = voidalso in this file at line 579; also defined in modules.at, K_Nilpotent.at, good_W_representatives.at, arthur_parameters.at, sub_cells.at, associated_variety_annihilator.at, geck_generic.at, L_packet.at, ratmat.at, Levi_subgroups.at, nilpotent_orbits.at, poset.at, cyclotomic.at, polynomial.at, character_tables.at, springer_tables.at, hodgeParamLaurentPol.at, hodgeParamPol.at, laurentPolynomial.at, weak_packets.at, cyclotomic_Lie_algebra.at, cyclotomicMat.at, bracket.at, exceptional.at, nilpotent_posets.at, lazy_lists.at
can_locate
can_locate (RootDatum rd_ambient, [RootDatum] rds,RootDatum sub_rd) = boolfind a conjugate of sub_rd in rds, everything going on in rd_ambient
is_contained
is_contained (RootDatum rd ,RootDatum sub_rd_1 ,RootDatum sub_rd_2 ,[RootDatum] all_subs_rd_2 ) = booltest sub_rd_1 is rd-conjugate to a subgroup of sub_rd_2, where a list of all subgroups of the latter is precomputed and passed as argument
also in this file at line 491
sorting and grouping of [RootData]L234
sort_by_dimension
sort_by_dimension = ([RootDatum] -> [RootDatum])also defined in nilpotent_orbits.at
sort_by_ss_rank
sort_by_ss_rank = ([RootDatum]->[RootDatum])group_by_ss_rank
group_by_ss_rank([RootDatum] rds) = [[RootDatum]]the next could be defined as |partition_by(ss_rank@RootDatum,<=@(int,int))|, but that would not be equivalent, as it avoids empty |ss_rank| classes. MvL
group_by_number_simple_factors
group_by_number_simple_factors([RootDatum] rds) = [[RootDatum]]group_by_ss_rank_and_number_simple_factors
group_by_ss_rank_and_number_simple_factors([RootDatum] rds)find_weak
find_weak(RootDatum rd_ambient, [RootDatum] rds,RootDatum sub_rd) = boolweak testing: only using rho and rho_check
filter_weak
filter_weak(RootDatum rd_ambient, [RootDatum] subs) = [RootDatum]keep one representative from each conjugacy class of subgroups
group_by_rho
group_by_rho(RootDatum rd_ambient, [RootDatum] rds) = [[RootDatum]]filter
filter (RootDatum rd_ambient, [RootDatum] subs) = [RootDatum]keep one representative from each conjugacy class of subgroups
also defined in basic.at, nilpotent_orbits.at
constructing all equal rank reductive subgroupsL287
weakly_maximal_pseudo_Levis_simple
weakly_maximal_pseudo_Levis_simple (RootDatum rd) = [RootDatum]we call a pseudo Levi "weakly maximal" if it is obtained by deleting a single node [these aren't maximal, for that you should assume the label is prime] proper <=> label is not special (special: label=1) we include the RootDatum rd itself for induction reasons this does NOT include actual Levi subgroups (except rd) assumption: rd has one simple factor, i.e. derived(rd) is simple
maximal_pseudo_Levis_simple
maximal_pseudo_Levis_simple (RootDatum rd) = [RootDatum]all_products
all_products([[RootDatum]] rds,RootDatum rd_ambient) = [RootDatum]given nonsimple RootDatum rd=rd_1 * ... * rd_n in each rd_i we have a list of c_i subgroups construct the resulting list of c_1*...*c_n subgroups of rd each subgroup RootDatum is made from roots in rd_ambient construct Cartesian products (in rd_ambient) of simple factors see maximal_pseudo_Levis below for the main application and an example
maximal_pseudo_Levis
maximal_pseudo_Levis(RootDatum rd) = [RootDatum]construct all maximal pseudo Levis of rd, not necessarily simple no attempt to mod out by conjugacy for example: atlas> rd Value: simply connected root datum of Lie type 'C2.C2' atlas> for sub in maximal_pseudo_Levis(rd) do prints(sub) od simply connected root datum of Lie type 'A1.A1.A1.A1' simply connected root datum of Lie type 'C2.A1.A1' simply connected root datum of Lie type 'A1.A1.C2' simply connected root datum of Lie type 'C2.C2'
proper_maximal_pseudo_Levis
proper_maximal_pseudo_Levis(RootDatum rd) = [RootDatum]for the inductive step need to keep only proper ones
iterate_maximal_pseudo_Levis
iterate_maximal_pseudo_Levis(RootDatum rd) = [RootDatum]iteratively compute all subgroups by repeatedly computing maximal pseudo Levis ignore conjugacy
subgroups_raw
subgroups_raw(RootDatum rd) = [RootDatum]all equal rank reductive subgroups, ignoring conjugacy algorithm: 1) iteratively compute all maximal pseudo Levis 2) for each sub sub_rd list representatives of all conjugacy classes of Levis
ignoring conjugacy
subgroups
subgroups(RootDatum rd) = [RootDatum]cut down subgroups_raw to one representative of each conjugacy class for efficiency group by ss_rank and number of simple factors before testing for conjugacy return two lists first: [[RootDatum]] grouped by ss_rank second:[RootDatum] ordered by dimension
Levi and pseudo-Levi subgroups L408
Levi_subgroups
Levi_subgroups(RootDatum rd) = [RootDatum]conjugacy classes of Levis as root data from W_classes.at
proper_Levi_subgroups
proper_Levi_subgroups(RootDatum rd) = [RootDatum]is_Levi
is_Levi(RootDatum rd_L,RootDatum rd) = boolreturn true if rd_L is a (not necessarily standard) Levi subgroup
also defined in Levi_subgroups.at
regular_central_elements
regular_central_elements(RootDatum rd_L, RootDatum rd)semisimple element t so that L=Cent_G(t)^0
is_pseudo_Levi_in_simple_adjoint
is_pseudo_Levi_in_simple_adjoint(RootDatum rd_L,RootDatum rd) = booladjoint_image
adjoint_image (RootDatum rd_L,RootDatum rd) = RootDatumassuming |rd_L| is a Levi in |rd|, find corresponding Levin in |adjoint(rd)|
is_pseudo_Levi_in_simple
is_pseudo_Levi_in_simple(RootDatum rd_L,RootDatum rd) = boolproject_on_simple_factor
project_on_simple_factor(RootDatum rd,RootDatum rd_L,int i)also defined in simple_factors.at
is_pseudo_Levi
is_pseudo_Levi(RootDatum rd_L,RootDatum rd) = boolregular_central_element
regular_central_element(RootDatum rd_L, RootDatum rd)pseudo_Levi_subgroups 2 overloads
pseudo_Levi_subgroups(RootDatum rd,[RootDatum] subs) = [RootDatum]if you've computed subgroups=subgroups(rd) already, run through these and select the pseudo_Levis. This works for any rd
pseudo_Levi_subgroups(RootDatum rd) = [RootDatum]this works for any rd: find all equal rank subgroups, and then select the pseudo-Levis
strict_pseudo_Levi_subgroups
strict_pseudo_Levi_subgroups(RootDatum rd) = [RootDatum]is_contained
is_contained (RootDatum rd,RootDatum sub_rd_1,RootDatum sub_rd_2) = booltest sub_rd_1 is W(rd)-conjugate to a subgroup of sub_rd_2
also in this file at line 223
proper_subgroups
proper_subgroups(RootDatum rd) = [RootDatum]subgroups_weak
subgroups_weak(RootDatum rd)cut down subgroups_raw to one representative of each conjugacy class for efficiency group by ss_rank and number of simple factors before testing for conjugacy
maps to conjugacy classes in W L517
conjugacy_classes_from_subs
conjugacy_classes_from_subs(RootDatum rd,[RootDatum] subs) = [(RootDatum,WeylElt)]take each subgroup to its Coxeter element, embedded in W
group_by_conjugacy
group_by_conjugacy([(RootDatum,WeylElt)] pairs) = [[(RootDatum,WeylElt)]]also in this file at line 195
iterate_maximal_pseudo_Levis_long
iterate_maximal_pseudo_Levis_long(RootDatum rd)iteratively compute all subgroups by repeatedly computing maximal pseudo Levis ignore conjugacy keep extra information: nested sequence of subgroups
NOT WORKING
transitive_containment
transitive_containment([[int]] done,[int] new, int n) = booltransitivity: for use in computing Hasse diagram, avoid recomputing containments which arise from transitivity
subgroups_poset 2 overloads
subgroups_poset(RootDatum rd,[RootDatum] subgroups) = ([RootDatum],Poset)assume sorted by dimension
subgroups_poset(RootDatum rd) = ([RootDatum],Poset)show
show([RootDatum] subs,Poset P) = voidalso in this file at line 208, line 211; also defined in modules.at, K_Nilpotent.at, good_W_representatives.at, arthur_parameters.at, sub_cells.at, associated_variety_annihilator.at, geck_generic.at, L_packet.at, ratmat.at, Levi_subgroups.at, nilpotent_orbits.at, poset.at, cyclotomic.at, polynomial.at, character_tables.at, springer_tables.at, hodgeParamLaurentPol.at, hodgeParamPol.at, laurentPolynomial.at, weak_packets.at, cyclotomic_Lie_algebra.at, cyclotomicMat.at, bracket.at, exceptional.at, nilpotent_posets.at, lazy_lists.at
sub_graph 2 overloads
sub_graph ( [[int]] data , RootDatum rd , [RootDatum] subs , [RootDatum] levis , [RootDatum] pseudo_levis ) = stringoutput the contents of a .dot file, suitable to be processed by graphviz recommended method: set g=sub_graph(...) >file.dot prints(g) command line: %tred file.dot | dot -Tpdf -o file.pdf (tred computes the reduced graph) the ingredients are: [[int]] data: hasse diagram (produced by hasse(rd,subs)) [RootDatum] subs: list of all subgroups, produced by sub_groups(rd) [RootDatum] levis: list of levis, produced by Levi_subgroups(rd) [RootDatum] pseudo_levis: list of pseudo_levis, produced by pseudo_Levi_subgroups(rd) one node for each subgroup, arrow for containment (graph is not necessarily reduced) node is a Levi: red; strict pseudo_Levi: green; neither: black
sub_graph(RootDatum rd) = stringproduce all of the ingredients needed from RootDatum rd
also defined in sub_cells.at
sub_graph_max_pseudo_levis_only
sub_graph_max_pseudo_levis_only(RootDatum rd) = stringcomputing all pseudo Levis is slow, do just maximal ones
component_group_of_pseudo_Levi
component_group_of_pseudo_Levi(RootDatum rd_L,RootDatum rd) = [mat,WeylElt]centralizer_pseudo_Levi
centralizer_pseudo_Levi (RootDatum rd_L,RootDatum rd) = [(mat,WeylElt)]normalizer_report
normalizer_report (RootDatum rd) = voidnormalizer_reports
normalizer_reports([RootDatum] rds)also in this file at line 743
default
default = …also defined in extended.at
normalizer_reports
normalizer_reports()also in this file at line 730
filter_by_class
filter_by_class ([WeylElt] list) = [WeylElt]the following function could be done more efficiently using a |WeylClassTable|
reduce list of W elements to representatives of distinct conjugacy classes
embed_coxeter
embed_coxeter (RootDatum rd_H,RootDatum rd) = WeylEltembed Coxeter element of W(equal rank subgroup)
embed_coxeters 2 overloads
embed_coxeters(RootDatum rd) = [WeylElt]embed_coxeters([RootDatum] data) = voidfor debugging the previous ?
Commented-out code, lines 786–794 (7 lines)
set groups1=[SL(3),SL(4),SL(5),Sp(4),SO(7),SO(9)] set groups=[SL(3),SL(4),SL(5),SO(7),SO(9),SO(11),SO(13),Sp(4),Sp(6),Sp(8),Sp(10),Sp(12),SO(8),SO(10),SO(12), simply_connected(G2), simply_connected(F4), simply_connected(E6), simply_connected(E7), simply_connected(E8)]
Generated from atlas-scripts at commit 648506c (2026-10-13).
Commented-out code, lines 660–670 (9 lines)
{complex nilpotent obtained by saturating the principal orbit of subgroup} set complex_nilpotent(RootDatum rd,RootDatum sub)=ComplexNilpotent: (rd,(),dominant(ratvec_as_vec(2*rho_check(sub)),rd)) set show_subgroup_nilpotent_map(RootDatum rd)=void: let values= for L in subgroups(rd) do let orbit=complex_nilpotent(rd,L) in [L.derived.Lie_type.nice_format,orbit.diagram.to_string,orbit.H_of_triple.to_string,orbit.dim_nilpotent.to_string] od in tabulate(["L","diagram","H","dim"]#values)