Script File
nilpotent_centralizer.at
computing the centralizer of a complex nilpotent O is a complex nilpotent orbit <-> (H,E,F) and corresponding SL(2) the reductive part of Cent_G(E) is Cent_G(SL(2)) we refer to this group as the "centralizer" Cent_G(E) or Cent_G(O) we need to compute Cent_G(O)^0 as a connected reductive group, and Cent_G(O)/Cent_G(O)^0 The Bala Carter Levi plays a role here, we denote it L
Definitions in source order
torus
L19
torus(ComplexNilpotent O) = matthe Cartan subgroup of Cent(O) is the radical of the Bala Carter Levi of O
columns are coweights generating torus
also defined in basic.at
roots_same_restriction
L23
roots_same_restriction(ComplexNilpotent O,vec alpha)roots of G with same restriction to T as alpha
m_0
L37
m_0 (ComplexNilpotent O,vec alpha) = intgiven (O,alpha)
let H_L be the conjugate of O.H which is dominant for L
define:
m_0(alpha)=#{beta| beta has same restriction to T and <beta,H_L>=0}
m_2(alpha)=#{beta| beta has same restriction to T and <beta,H_L>=2}
m(alpha) =m_0-m_2 \in {0,1}
alpha restricted to T is a root of T in Cent(O) <=> m(alpha)=1
count successes: convert |bool| to |int| and sumL40
then restriction = mat: ^Levi_datum(O.root_datum,Levi).radical_basis
in for beta in O.root_datum.posroots if =restriction*(alpha-beta)
do #(H_L*beta=0) { convert |bool| to |int|: 0 or 1 }
fi od.sum*2 { count successes: sum the integers, double for posroots-<roots }L42m_2
L47
m_2 (ComplexNilpotent O,vec alpha) = intthen restriction = mat: ^Levi_datum(O.root_datum,Levi).radical_basis
in for beta in O.root_datum.posroots if =restriction*(alpha-beta)
do #(H_L*beta=2) { convert |bool| to |int|: 0 or 1 }
fi od.sum{*2} { count successes: sum the integers, double for posroots-<roots }L51m
L56
m (ComplexNilpotent O,vec alpha) = intalso defined in test_braid.at
centralizer_roots
L61
centralizer_roots (ComplexNilpotent O) = ([vec],[vec])roots of centralizer are those with m(alpha)=1 returns a set roots of G, and their restrictions to T (removing duplicates)
centralizer_roots_and_coroots 2 overloads
L83
centralizer_roots_and_coroots (ComplexNilpotent O,[vec] roots_G,[vec] roots_C) = (mat,mat,mat,mat)to compute the centralizer coroots, start with the centralizer roots given a root alpha_C of T in Cent(O), compute the coroot: v:=sum of coroots beta^vee, for all roots beta of G roots restricting to alpha_C pullback_alpha=one of the roots of G restricting to alpha_C alpha_C^\vee=2*v/<v,pullback_alpha> returns: (roots_G, coroots_G,roots_C,coroots_C) roots_G: roots of G restricting to roots of C on T coroots_G: elements of X_*(H), living in X_*(T) roots_C: roots of T in C=Cent(O) coroots_C: coroots of T in C, obtained by writing the coroots_G in the given basis of X_*(T)
L107
centralizer_roots_and_coroots(ComplexNilpotent O) = (mat,mat,mat,mat)compute centralizer coroots from scratch
centralizer
L122
centralizer(ComplexNilpotent O) = RootDatumput it all together: compute the identity component of Cent_G(O) as a reductive group more precisely: the (id component of) reductive part of Cent_G(X), or Cent_G(SL(2)) Note: Cent_G(O) is finite <=> O is distinguished Suppose C=Cent_G(O)^0 has a central torus. If C has a non-trivial semisimple part, then the rank of C is determined (by the length of the vectors in question), i.e. the dimension of the radical is determined. However if Cent_G(O)^0 is a torus (closely related to be not equivlanet to quasi-distinguished), then there are non roots to use to determine the rank of the torus. In this case (only): the rank of the torus is the dimension of the radical (maximal central torus) of the Bala-Carter Levi of the orbit
also defined in good_W_representatives.at
dim_centralizer
L130
dim_centralizer(ComplexNilpotent O) = intthis is the dimension of Cent(O), i.e. the reductive part of Cent(X)
dim_centralizer_nilradical
L139
dim_centralizer_nilradical(ComplexNilpotent O) = intX is a nilpotent element, orbit=G.x dimension of the nilradical of Cent(X) orbit -> C=Cent(O) -> C=C_red*C_u dim(O)=dim(G/C)=dim(G)-dim(C_red)-dim(C_u) dim(C_u)=dim(G)-dim(C_red)-dim(O) recall dim(C_red)=dim_centralizer(orbit)
test
L143
test (ComplexNilpotent O) = voidfor testing only, as the name suggests
also defined in test_unitarity.at, all_finite_order.at, sommers.at
describe_isogeny 2 overloads
L263
describe_isogeny(RootDatum rd) = voidL270
describe_isogeny(ComplexNilpotent O) = voidshow_centralizer_isogeny
L273
show_centralizer_isogeny(ComplexNilpotent O) = voiduseful in determining the precise structure of the centralizer
show_centralizer_isogenies
L281
show_centralizer_isogenies(RootDatum rd) = voidchecking condition on orbits:L287
dim_nilradical_parabolic_H
L291
dim_nilradical_parabolic_H(ComplexNilpotent O) = intrecall dim_centralizer_nilradical(ComplexNilpotent O) is the dimension of the nilradical of the centralizer of X\in OL294
check_nilradical_dimensions 2 overloads
L297
check_nilradical_dimensions(ComplexNilpotent O)L306
check_nilradical_dimensions(RootDatum rd) = [int]run over orbits of rd for each orbit O, with X\in O, test dimension of nilpotent part of centralizer of X = dimension of nilradical of parabolic defined by O.H display table of results, returns [int] indices of the orbits passing the test
Generated from atlas-scripts at commit 7e1b958 (2026-09-17).
Commented-out code, lines 161–261 (99 lines)
{compact listing: i H diagram dim BC-Levi Cent A(O)} set show_nilpotent_orbits([ComplexNilpotent] orbits)=void: tabulate( ["i","H","diagram","dim","BC Levi","Cent","A(O)"]# for orbit@i in orbits do let d=orbit.component_datum in [i.to_string, ([int]:orbit.H).to_string, orbit.diagram.to_string, orbit.dim_nilpotent.to_string, orbit.Bala_Carter_Levi.nice_format, orbit.centralizer.nice_format, d.orders.to_string] od) set show_nilpotent_orbits(RootDatum rd)=void: show_nilpotent_orbits(nilpotent_orbits(rd)) {longer, less compact output, including simple roots and corootsof the centralizers } set show_nilpotent_orbits_long([ComplexNilpotent] orbits)=void: for orbit@i in orbits do let C=orbit.centralizer in prints(new_line,"orbit #",i, new_line,"diagram: ",orbit.diagram, new_line,"dim:", orbit.dim_nilpotent, new_line,"Bala Carter Levi: ", orbit.Bala_Carter_Levi.nice_format, new_line,"A(O): ", orbit.component_datum.orders, new_line,"Centralizer: ", C.nice_format, new_line, "Z(Cent^0): order of center of derived group of id. comp. of Centralizer", new_line,"simple roots of centralizer:", C.simple_roots, new_line,"simple coroots of centralizer:", C.simple_coroots ) od set show_nilpotent_orbits_long(RootDatum rd)=void: prints(new_line,"Nilpotent orbits for ", rd.nice_format); show_nilpotent_orbits_long(nilpotent_orbits(rd)) {i H diagram dim Cent A(O)} set show_nilpotent_orbits_long([RootDatum] rds)=void: for rd in rds do show_nilpotent_orbits_long(rd) od set list=[SL(2),Sp(4),Sp(6),Sp(8),SO(7),SO(8),SO(9),simply_connected(G2),simply_connected(F4)] set show_nilpotent_orbits_plus([ComplexNilpotent] orbits)=void: tabulate( ["i","H","diagram","dim","BC Levi","Cent","Z","C_2","A(O)"]#for orbit@i in orbits do let d=orbit.component_datum then cent=orbit.centralizer in [i.to_string, ([int]:orbit.H).to_string, orbit.diagram.to_string, orbit.dim_nilpotent.to_string, orbit.Bala_Carter_Levi.nice_format, cent.nice_format, cent.derived.order_center.to_string, (#cent.compact_form.strong_real_forms_same_type).to_string, d.orders.to_string ] od) set show_nilpotent_orbits_plus(RootDatum rd)=void: show_nilpotent_orbits_plus(rd.orbits) {----- show commands for orbits of RealForm G------} {includes: number of real forms of the orbit} {compact listing: i H diagram dim BC-Levi Cent A(O) #RF C_2} set show_nilpotent_orbits([ComplexNilpotent] orbits,RealForm G)=void: prints(new_line,"complex nilpotent orbits for ", G, new_line,"i: orbit number", new_line,"H: semisimple element", new_line, "BC Levi: Bala-Carter Levi", new_line, "Cent: identity component of Cent(SL(2))", new_line, "Z(Cent^0): order of center of derived group of id. comp. of Centralizer", new_line, "A(O): orders of conj. classes in component group of centralizer", new_line,"#RF(O): number of real forms of O", new_line,"C_2: conjugacy classes in Cent(SL(2))_0 with square 1"); tabulate( ["i","H","diagram","dim","BC Levi","Cent", "Z(Cent^0)","A(O)","#RF(O)","C_2"]# for orbit@i in orbits do let d=orbit.component_datum then H=orbit.centralizer then C_2=conjugacy_classes_involutions(H) in {C_2=#strong_real_forms_same_type(compact_form(H)) in} [i.to_string, ([int]:orbit.H).to_string, orbit.diagram.to_string, orbit.dim_nilpotent.to_string, orbit.Bala_Carter_Levi.nice_format, orbit.centralizer.nice_format, H.derived.order_center.to_string, d.orders.to_string, (#real_nilpotent_orbits(orbit,G)).to_string, {this line (only) requires a RealForm} C_2.to_string ] od) set show_nilpotent_orbits(RealForm G)=void: show_nilpotent_orbits(nilpotent_orbits(G),G)