Documentation contents

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
Source
atlas-scripts/nilpotent_centralizer.at (322 lines)
Definitions
19
Loads
Loaded by
sommers.at

Definitions in source order

torus

L19torus(ComplexNilpotent O) = mat
the 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

L23roots_same_restriction(ComplexNilpotent O,vec alpha)
roots of G with same restriction to T as alpha

m_0

L37m_0 (ComplexNilpotent O,vec alpha) = int
given (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 sum
L40
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 }
L42

m_2

L47m_2 (ComplexNilpotent O,vec alpha) = int
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=2) { convert |bool| to |int|: 0 or 1 }
   fi od.sum{*2} { count successes: sum the integers, double for posroots-<roots }
L51

m

L56m (ComplexNilpotent O,vec alpha) = int

also defined in test_braid.at

centralizer_roots

L61centralizer_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

L83centralizer_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)
L107centralizer_roots_and_coroots(ComplexNilpotent O) = (mat,mat,mat,mat)
compute centralizer coroots from scratch

centralizer

L122centralizer(ComplexNilpotent O) = RootDatum
put 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

L130dim_centralizer(ComplexNilpotent O) = int
this is the dimension of Cent(O), i.e. the reductive part of Cent(X)

dim_centralizer_nilradical

L139dim_centralizer_nilradical(ComplexNilpotent O) = int
X 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

L143test (ComplexNilpotent O) = void
for testing only, as the name suggests

also defined in test_unitarity.at, all_finite_order.at, sommers.at

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)

describe_isogeny 2 overloads

L263describe_isogeny(RootDatum rd) = void
L270describe_isogeny(ComplexNilpotent O) = void

show_centralizer_isogeny

L273show_centralizer_isogeny(ComplexNilpotent O) = void
useful in determining the precise structure of the centralizer

show_centralizer_isogenies

L281show_centralizer_isogenies(RootDatum rd) = void
checking condition on orbits:
L287

dim_nilradical_parabolic_H

L291dim_nilradical_parabolic_H(ComplexNilpotent O) = int
recall dim_centralizer_nilradical(ComplexNilpotent O)
is the dimension of the nilradical of the centralizer of X\in O
L294

check_nilradical_dimensions 2 overloads

L297check_nilradical_dimensions(ComplexNilpotent O)
L306check_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).