Documentation contents

Script File

sub_cells.at

Suppose G is a RootDatum, and \theta is a algebraic involution of G
defining a real form G(R) We say G is a "complex group" if the root
system R of G is "complex": meaning R\simeq R_1\times R_1, with \delta
exchanging the two factors. Equivalently: <\alpha,\delta(\alpha^vee)>=0
for all (simple) roots alpha

Caution: This is slightly weaker than: G\simeq G_1\times G_1 with
\delta switching factors. For example SL(2)xSL(2)/<-I,-I>, delta acts
by switching factors <- SO(3,1); this is disconnected.

is_complex@RealForm tests the condition: <alpha,delta(alpha^vee)>=0

Question: how do we check the stronger condition: G(R) is a connected,
complex group. (This allows Spin(3,1)=SL(2,C) and PSO(3,1)=PSL(2,C),
but not SO(3,1)\simeq PSL(2,C)\times Z_2 (direct product)

Answer: G^\theta\otimes C\simeq G
In the usual notation:
G=G_1\times G_1, \theta(g,h)=(h,g)
G^\theta=G_1-diagonal,
(G^\theta)\otimes C=G_1\times G_1=G

We call this condition: is_strictly_complex

How to test this:

(G^\theta)_0 =K_0(G)  (identity component)

Claim: (G,\theta) is complex <=>
a) G(R), equivalently K=G^\theta, is connected
b) complexification(K_0(G))\simeq G

I believe we can replace b) with

b') complexification(K_0(G)) is locally isomorphic to G

Furthermore this is probably equivalent to:

i)  G.is_complex
ii) G.components_rank=0

Probably we won't use is_strictly_complex much, so
leaving this here
Source
atlas-scripts/sub_cells.at (345 lines)
Definitions
36
Loads
Loaded by
associated_variety_annihilator.at

Definitions in source order

is_complex

L53is_complex(InnerClass ic) = bool
whether root system involution is that of a complex group

also defined in basic.at, complex.at

is_strictly_complex

L58is_strictly_complex(RealForm G) = bool
whether |G| is a complex group, which implies being connected

also defined in complex.at

swapped_factors

L66swapped_factors(RealForm G) = [(int,int)]
find pairing of factors among |simple_factors(root_datum(G))|

left_factors

L75left_factors(RealForm G) = [RootDatum]

left_roots

L80left_roots(RealForm G) = mat

left_coroots

L83left_coroots(RealForm G) = mat

left_copy

L86left_copy(RealForm G) = RootDatum

left_root_indices

L89left_root_indices(RealForm G) = [int]

right_factors

L92right_factors(RealForm G) = [RootDatum]

right_roots

L97right_roots(RealForm G) = mat

right_coroots

L100right_coroots(RealForm G) = mat

right_copy

L103right_copy(RealForm G) = RootDatum

right_root_indices

L106right_root_indices(RealForm G) = [int]

tau

L110tau(WGraph graph,int i) = [int]
tau invariant of node of WGraph

also defined in basic.at, modules.at

in_tau

L111in_tau(WGraph graph,int i, int j) = bool

also defined in modules.at, stable.at

intersection

L115intersection([int] S,[int] T) = [int]
intersection of sets of integers

also in this file at line 131

digraph

L123digraph(WGraph graph) = WGraph
directed graph underlying (symmetric) WGraph
see atlas-functions.help/W_graph
discard edge x->y if tax(x)\subset tau(y)
[keep edge x-> y if there is j\in tau(x), j\not\in\tau(y)]

intersection

L131intersection([int] A,[int] B) = [int]

also in this file at line 115

subgraph of a directed graph
given by subset S of simple roots
keep link x->y if there is j\in S satisfying:
 j\in \tau(x)  j\not\in\tau(y) i.e.
 S\cap tau(x)\not\subset \tau(y)
L134

sub_digraph

L141sub_digraph(WGraph graph,[int] S) = WGraph

sub_graph

L161sub_graph(WGraph graph,[int] S) = WGraph
sub_root_datum is needed for the W_cells to be understood by the
underlying "real" character table. But it isn't good enough: if
ct=GL(3,R).character_table and C is a left cell from GL(3,C), then ct
cannot see C: the root datum of C is SL(3), and that for ct is GL(3).

strong_components 2 overloads

L191strong_components(WGraph g) = [WCell]
strong_components(g) returns [([int] nodes,WGraph)]:
the ith entry ([int] nodes,WGraph graph) is:
 nodes is the list of nodes in the strong component
  (as returned by strong_components(links(g)))
 graph is the WGraph of these nodes, renumbered [0,1,...,k]
  so this really is a WGraph, without reference to the original,
  as in the W_cells command,
[([int],WGraph)]:
L213strong_components(WCell cell) = [WCell]
same as the previous, except that the nodes [0,1,...,n] of
g are also labeled by [int] nodes, and we want to keep track of
this numbering also
this means for each component there are two lists of indices:
 first one:  the nodes of component, in their numbering [0,...,n] of nodes of g
 second one: the nodes of component, in their numbering from [int] nodes
 return: (second one,graph)
[([int],WGraph)]:

sub_cells

L219sub_cells(WCell (nodes,graph,ops),[int] S) = [WCell]

left_cells

L222left_cells(RealForm G, WCell cell) = [WCell]

right_cells

L225right_cells(RealForm G,WCell cell) = [WCell]

left_cell_of

L247left_cell_of(Param p) = WCell
dangerous bend
p is for a complex group
p -> p.integrality_datum is also complex
left_cell_of(p) has root_datum a "left" copy of p.integrality_datum
on the other hand we're going to be inducing a character of the Weyl
 group from this root datum to a "left" copy of p.root_datum
in other words we need guarantee:

** left_roots of p.integrality_datum is a subsystem of left_roots of p.real_form **

[note: to be precise, left_roots is defined on a (complex) real form, not a root datum
to define left_roots of p.integrality_datum (which we're NOT going to do) do this:
inner_class(p.integrality_datum,p.x.involution).quasisplit_form]

since taking a left copy isn't unique this might fail (see below for example)
solution:
compute p.integrality_datum
choose the simple roots in this which occur in p.real_form.left_copy

left_cell_of_old

L267left_cell_of_old(Param p) = WCell
this version failed in this example:
set G=GL(5,C)
set p=parameter(KGB(G,33),[1,0,0,-1,-2,2,2,0,-1,-1]/1,[13,11,6,14,1,-13,-1,-6,-11,-14]/8)
associated_variety_ann_res_complex(p) fails, because
inner_class(p.integrality_datum,p.x.involution).quasisplit_form.left_copy is
not a sub-system of p.real_form.left_copy

extract_nodes

L277extract_nodes(WGraph g, [int] nodes) = WGraph

show 4 overloads

L288show(WGraph g) = void
----- output commands  -----------
L292show(WCell (vertices,g,))
L295show([WGraph] graphs) = void
L301show([WCell] cells) = void

also defined in modules.at, K_Nilpotent.at, good_W_representatives.at, arthur_parameters.at, associated_variety_annihilator.at, geck_generic.at, L_packet.at

short_string

L307short_string([int] list,int max)
convert [int] to string, truncating after max terms

show_short

L315show_short([WCell] cells) = void

export

L325export(WGraph g) = string
write a graphviz file
typical usage:
> file.dot prints(export(g))
in console:
dot -Tpdf -ofile.pdf file.dot"
G is complex,
st_left is the springer table for the left copy of G
L340
Commented-out code, lines 343–345 (2 lines)
set special_left_orbit(SpringerTable st_left,Param p)=
special_orbit(st_left,W_cell

Generated from atlas-scripts at commit 7e1b958 (2026-09-17).