Let us fix an algebraically closed field K and let G be a connected reductive algebraic group over K. Let T be a maximal torus of G, let X(T) be the character group of T (resp. Y(T) the dual lattice of one-parameter subgroups) and Φ (resp Φ∨) the roots (resp. coroots) of G with respect to T.
Then G is determined up to isomorphism by the root datum (X(T),Φ, Y(T),Φ∨). In algebraic terms, this consists in giving a root system Φ ⊂ X(T), where X(T) is a free Z-lattice of dimension the rank of G, and giving similarly the dual roots Φ∨⊂ Y(T).
This is obtained by a slight generalization of our setup for a Coxeter
group W. This time we assume the canonical basis of the vector space V
on which W acts is a Z-basis of X(T), and Φ is specified by a
matrix W.simpleRoots
whose lines are the simple roots expressed in this
basis of V. Similarly Φ∨ is described by a matrix
W.simpleCoroots
whose lines are the simple coroots in the basis of
Y(T) dual to the chosen basis of X(T). The duality pairing between
X(T) and Y(T) is the canonical one, that is the pairing between
vectors x∈ X(T) and y∈ Y(T) is given in GAP3 by x*y
. Thus,
we must have the relation
W.simpleCoroots*TransposedMat(W.simpleRoots)=CartanMat(W)
.
We get that by a new form of the function CoxeterGroup
, where the
arguments are the two matrices W.simpleRoots
and W.simpleCoroots
described above. The roots need not generate V, so the matrices need not
be square. For instance, the root datum of the linear group of rank 3 can
be specified as:
gap> W := CoxeterGroup( [ [ -1, 1, 0], [ 0, -1, 1 ] ], > [ [ -1, 1, 0], [ 0, -1, 1 ] ] ); CoxeterGroup([[-1,1,0],[0,-1,1]],[[-1,1,0],[0,-1,1]]) gap> MatXPerm( W, W.1); [ [ 0, 1, 0 ], [ 1, 0, 0 ], [ 0, 0, 1 ] ]
here the symmetric group on 3 letters acts by permutation of the basis vectors of V --- the semi-simple rank is 2; the integral elements of V correspond to the characters of a maximal torus, and the integral elements of V∨ to one-parameter subgroups of that torus.
The default form W:=CoxeterGroup("A",2)
corresponds to the adjoint
algebraic group (the group with a trivial center). In that case Φ is a
basis of X(T), so W.simpleRoots
is the identity matrix and
W.simpleCoroots
is the Cartan matrix CartanMat(W)
of the root system.
The form CoxeterGroup("A",2,"sc")
constructs the semisimple simply
connected algebraic group, where W.simpleRoots
is the transposed of
CartanMat(W)
and W.simpleCoroots
is the identity matrix.
There is also a function RootDatum
which understands some familiar names
for the algebraic groups and gives the results that could be obtained by
giving the appropriate matrices W.simpleRoots
and W.simpleCoroots
:
gap> RootDatum("sl",3); # same as CoxeterGroup("A",2,"sc") RootDatum("sl",3)
It is also possible to compute with finite order elements of T. Over an
algebraically closed field, finite order elements of T are in bijection
with elements of Q/Z⊗ Y(T) whose denominator is prime to the
characteristic of the field. These are represented as elements of a vector
space of rank r over Q, taken Mod1
whenever the need arises, where
Mod1
is the function which replaces the numerator of a fraction with the
numerator mod
the denominator; the fraction p/q represents a
primitive q-th root of unity raised to the p-th power. In this
representation, multiplication of roots of unity becomes addition Mod1
of
rationals and raising to the power n becomes multiplication by n. We
call this the ``additive'' representation of semisimple elements.
Here is an example of computations with semisimple-elements given as list in Q/Z.
gap> G:=RootDatum("sl",4); RootDatum("sl",4) gap> L:=ReflectionSubgroup(G,[1,3]); ReflectionSubgroup(RootDatum("sl",4), [ 1, 3 ]) gap> AlgebraicCentre(L); rec( Z0 := SubTorus(ReflectionSubgroup(RootDatum("sl",4), [ 1, 3 ]),[ [ 1, 2, \ 1 ] ]), complement := SubTorus(ReflectionSubgroup(RootDatum("sl",4), [ 1, 3 ]),[ [ 0, 1, \ 0 ], [ 0, 0, 1 ] ]), AZ := Group( <0,0,1/2> ), descAZ := [ [ 1, 2 ] ] ) gap> SemisimpleSubgroup(last.Z0,3); Group( <1/3,2/3,1/3> ) gap> e:=Elements(last); [ <0,0,0>, <1/3,2/3,1/3>, <2/3,1/3,2/3> ]
First, the group G=SL4 is constructed, then the Levi subgroup L
consisting of block-diagonal matrices of shape 2× 2. The function
AlgebraicCentre
returns a record with : the neutral component Z0 of
the centre Z of L, represented by a basis of Y(Z0), a complement
subtorus S of T to Z0 represented similarly by a basis of Y(S),
and semi-simple elements representing the classes of Z modulo Z0 ,
chosen in S. The classes Z/Z0 are also represented as a quotient of
the fundamental group by the field .descAZ
, see AlgebraicCentre for an
explanation. Finally the semi-simple elements of order 3 in Z0 are
computed.
gap> e[2]^G.2; <1/3,0,1/3> gap> Orbit(G,e[2]); [ <1/3,2/3,1/3>, <1/3,0,1/3>, <2/3,0,1/3>, <1/3,0,2/3>, <2/3,0,2/3>, <2/3,1/3,2/3> ]
Since over an algebraically closed field K the points of T are in
bijection with Y(T)⊗ K× it is also possible to represent
any point of T over K as a list of Rank(T)
non-zero elements of
K. This is the ``multiplicative'' representation of semisimple
elements. here is the same computation as above performed with semisimple
elements whose coefficients are in the finite field GF(4)
:
gap> s:=SemisimpleElement(G,List([1,2,1],i->Z(4)^i)); <Z(2^2),Z(2^2)^2,Z(2^2)> gap> s^G.2; <Z(2^2),Z(2)^0,Z(2^2)> gap> Orbit(G,s); [ <Z(2^2),Z(2^2)^2,Z(2^2)>, <Z(2^2),Z(2)^0,Z(2^2)>, <Z(2^2)^2,Z(2)^0,Z(2^2)>, <Z(2^2),Z(2)^0,Z(2^2)^2>, <Z(2^2)^2,Z(2)^0,Z(2^2)^2>, <Z(2^2)^2,Z(2^2),Z(2^2)^2> ]
The function SemisimpleCentralizer
computes the centralizer CG(s) of
a semisimple element in G:
gap> G:=CoxeterGroup("A",3); CoxeterGroup("A",3) gap> s:=SemisimpleElement(G,[0,1/2,0]); <0,1/2,0> gap> SemisimpleCentralizer(G,s); Extended((A1xA1)<1,3>.(q+1))
The result is an extended reflection group; the reflection group part is the Weyl group of CG0(s) and the extended part are representatives of CG(s) modulo CG0(s) taken as diagram automorphisms of the reflection part. Here is is printed as a coset CG0(s)φ which generates CG(s).
CoxeterGroup( simpleRoots, simpleCoroots )
CoxeterGroup( C[, "sc"] )
CoxeterGroup( type1, n1, ... , typek, nk[, "sc"] )
The above are extended forms of the function CoxeterGroup
allowing to
specify more general root data. In the first form a set of roots is given
explicitly as the lines of the matrix simpleRoots, representing vectors
in a vector space V, as well as a set of coroots as the lines of the
matrix simpleCoroots expressed in the dual basis of V∨. The product
C=simpleCoroots*TransposedMat(simpleRoots)
must be a valid Cartan
matrix. The dimension of V can be greater than Length(C)
. The length
of C is called the semisimple rank of the Coxeter datum, while the
dimension of V is called its rank.
In the second form C is a Cartan matrix, and the call CoxeterGroup(C)
is equivalent to CoxeterGroup(IdentityMat(Length(C)),C)
. When the
optional "sc"
argument is given the situation is reversed: the simple
coroots are given by the identity matrix, and the simple roots by the
transposed of C (this corresponds to the embedding of the root system in
the lattice of characters of a maximal torus in a simply connected
algebraic group).
The argument "sc"
can also be given in the third form with the same
effect.
The following fields in a Coxeter group record complete the description of the corresponding root datum:
simpleRoots
:
simpleCoroots
:
matgens
:
RootDatum(type,rank)
This function returns the root datum for the algebraic group described by
type and rank. The types understood as of now are: "gl"
, "sl"
,
"pgl"
, "sp"
, "so"
, "psp"
, "pso"
, "halfspin"
and
"spin"
.
gap> RootDatum("spin",8);# same as CoxeterGroup("D",4,"sc") RootDatum("spin",8)
Torus(rank)
This function returns the CHEVIE object corresponding to the notion of a torus of dimension r: a Coxeter group of semisimple rank 0 and rank=r. This corresponds to a split torus; variants which return Coxeter cosets are more useful (see Torus for Coxeter cosets).
gap> Torus(3); CoxeterGroup() gap> ReflectionName(last); "(q-1)^3"
86.4 FundamentalGroup for Weyl groups
FundamentalGroup(W)
This function returns the fundamental group corresponding to the Weyl group record W as diagram automorphisms of the corresponding affine Weyl group induced by W, thus as a group of permutations of the simple roots and the lowest root of each irreducible component. Our definition for the fundamental group of an arbitrary, not necessarily semisimple, reductive group is (P∩ Y(T))/Q where P is the coweight lattice and Q is the coroot latice. The bijection between elements of P/Q and diagram automorphisms is expained in the context of non-irreducible groups for example in Bon05, \S 3.B.
gap> W:=CoxeterGroup("A",3); CoxeterGroup("A",3) gap> FundamentalGroup(W); Group( ( 1, 2, 3,12) ) gap> W:=CoxeterGroup("A",3,"sc"); CoxeterGroup("A",3,"sc") gap> FundamentalGroup(W); Group( () )
IntermediateGroup(W, indices)
This computes a Weyl group record representing a semisimple algebraic group
intermediate between the adjoint group --- obtained by a call like
CoxeterGroup("A",3)
--- and the simply connected semi-simple group ---
obtained by a call like CoxeterGroup("A",3,"sc")
. The group is
specified by specifying a subset of the minuscule weights, which are
weights whose scalar product with every coroot is in -1,0,1. The
non-trivial elements of the (algebraic) center of a semi-simple simply
connected algebraic group are in bijection with the minuscule weights; this
set is also in bijection with P/Q where P is the coweight lattice and
Q is the coroot lattice. The minuscule weights are specified, if W is
irreducible, by the list indices of their position in the Dynkin diagram
(see PrintDiagram). The constructed group has lattice Y(T) generated
by the sum of the coroot lattice and the weights with the given indices. If
W is not irreducible, one needs to specify an intermediate group by
giving a sum of minuscule weights in different components. An element of
indices is thus itself a list, interpreted as representing the sum of the
corresponding weights.
gap> W:=CoxeterGroup("A",3);; gap> IntermediateGroup(W,[]); # adjoint CoxeterGroup("A",3) gap> FundamentalGroup(last); Group( ( 1, 2, 3,12) ) gap> IntermediateGroup(W,[2]);# intermediate CoxeterGroup([[2,0,-1],[0,1,0],[0,0,1]],[[1,-1,0],[-1,2,-1],[1,-1,2]]) gap> FundamentalGroup(last); Group( ( 1, 3)( 2,12) )
Mod1(r)
This is a utility function for working in Q/Z. The argument should be
a rational or a list. If r is a rational, it returns
(Numerator(r) mod Denominator(r))/Denominator(r)
. If r is a list,
it returns List(r,Mod1)
.
gap> Mod1([-2/3,-1,7/4,3]); [ 1/3, 0, 3/4, 0 ]
SemisimpleElement(W,v[,additive])
W should be a root datum, given as a Coxeter group record for a Weyl
group, and v a list of length W.rank
. The result is a semisimple
element record, which has the fields:
.v
:Mod1
if its elements are rationals.
.group
:
gap> G:=CoxeterGroup("A",3);; gap> s:=SemisimpleElement(G,[0,1/2,0]); <0,1/2,0>
If all elements of v are rational numbers, they are converted by Mod1
to fractions between 0 and 1 representing roots of unity, and these
roots of unity are multiplied by adding Mod1
the fractions. In this way
any semisimple element of finite order can be represented.
If the entries are not rational numbers, they are assumed to represent
elements of a field which are multiplied or added normally. To explicitly
control if the entries are to be treated additively or not, a third
argument can be given: if true
the entries are treated additively, or
not if false
. For entries to be treated additively, they must belong to a
domain for which the method Mod1
had been defined.
86.8 Operations for Semisimple elements
The arithmetic operations *
, /
and ^
work for semisimple elements.
They also have Print
and String
methods. We first give an element with
elements of Q/Z representing roots of unity.
gap> G:=CoxeterGroup("A",3); CoxeterGroup("A",3) gap> s:=SemisimpleElement(G,[0,1/2,0]); <0,1/2,0> gap> t:=SemisimpleElement(G,[1/2,1/3,1/7]); <1/2,1/3,1/7> gap> s*t; <1/2,5/6,1/7> gap> t^3; <1/2,0,3/7> gap> t^-1; <1/2,2/3,6/7> gap> t^0; <0,0,0> gap> String(t); "<1/2,1/3,1/7>"
GF(5)
:
gap> s:=SemisimpleElement(G,Z(5)*[1,2,1]); <Z(5),Z(5)^2,Z(5)> gap> t:=SemisimpleElement(G,Z(5)*[2,3,4]); <Z(5)^2,Z(5)^0,Z(5)^3> gap> s*t; <Z(5)^3,Z(5)^2,Z(5)^0> gap> t^3; <Z(5)^2,Z(5)^0,Z(5)> gap> t^-1; <Z(5)^2,Z(5)^0,Z(5)> gap> t^0; <Z(5)^0,Z(5)^0,Z(5)^0> gap> String(t); "<Z(5)^2,Z(5)^0,Z(5)^3>"
The operation ^
also works for applying an element of its defining Weyl
group to a semisimple element, which allows orbit computations:
gap> s:=SemisimpleElement(G,[0,1/2,0]); <0,1/2,0> gap> s^G.2; <1/2,1/2,1/2> gap> Orbit(G,s); [ <0,1/2,0>, <1/2,1/2,1/2>, <1/2,0,1/2> ]
The operation ^
also works for applying a root to a semisimple element:
gap> s:=SemisimpleElement(G,[0,1/2,0]); <0,1/2,0> gap> s^G.roots[4]; 1/2 gap> s:=SemisimpleElement(G,Z(5)*[1,1,1]); <Z(5),Z(5),Z(5)> gap> s^G.roots[4]; Z(5)^2
Frobenius( WF )
:WF
is a Coxeter coset associated to the
Coxeter group W, the function Frobenius
returns the associated
automorphism which can be applied to semisimple elements, see Frobenius.
gap> W:=CoxeterGroup("D",4);;WF:=CoxeterCoset(W,(1,2,4));; gap> s:=SemisimpleElement(W,[1/2,0,0,0]); <1/2,0,0,0> gap> F:=Frobenius(WF); function ( arg ) ... end gap> F(s); <0,1/2,0,0> gap> F(s,-1); <0,0,0,1/2>
SemisimpleCentralizer( W, s)
W should be a Weyl group record or and extended reflection group and s a semisimple element for W. This function returns the stabilizer of the semisimple element s in W, which describes also CG(s), if G is the algebraic group described by W. The stabilizer is an extended reflection group, with the reflection group part equal to the Weyl group of CG0(s), and the diagram automorphism part being those induced by CG(s)/CG0(s) on CG0(s).
gap> G:=CoxeterGroup("A",3); CoxeterGroup("A",3) gap> s:=SemisimpleElement(G,[0,1/2,0]); <0,1/2,0> gap> SemisimpleCentralizer(G,s); Extended((A1xA1)<1,3>.(q+1))
SubTorus(W,Y)
The function returns the subtorus S of the maximal torus T
of the reductive group represented by the Weyl group record W such
that Y(S) is the sublattice of Y(T) generated by the (integral) vectors
Y. An echelonized basis of Y(S) is computed by BaseIntMat(Y)
and
is stored in the return subtorus object as S.generators
.
gap> W:=CoxeterGroup("A",4);; gap> SubTorus(W,[[1,2,3,4],[2,3,4,1],[3,4,1,2]]); SubTorus(CoxeterGroup("A",4),[ [ 1, 0, 3, -14 ], [ 0, 1, 2, 7 ], [ 0, \ 0, 4, -4 ] ])
The operation in
can test if a semisimple elements belongs to a subtorus:
gap> W:=RootDatum("gl",4);; gap> r:=AlgebraicCentre(W); rec( Z0 := SubTorus(RootDatum("gl",4),[ [ 1, 1, 1, 1 ] ]), complement := SubTorus(RootDatum("gl",4),[ [ 1, 0, 0, 0 ], [ 0, 0, 1, 0 ], [ 0, 0\ , 0, 1 ] ]), AZ := Group( <0,0,0,0> ), descAZ := [ [ 1 ] ] ) gap> SemisimpleElement(W,[1/4,1/4,1/4,1/4]) in r.Z0; true gap> SemisimpleElement(W,[1/4,1/4,1/4,1/4]) in r.complement; false
The operation Rank
gives the rank of the subtorus:
gap> Rank(r.Z0); 1 gap> Rank(r.complement); 3
AlgebraicCentre( W )
W should be a Weyl group record, that is a Coxeter group record where
.simpleRoots
and .simpleCoroots
are integral, or an extended Weyl group
record. This function returns a description of the centre Z of the
algebraic group defined by W as a record with the following fields:
Z0
:
complement
:
AZ
:
descAZ
:Pi:=FundamentalGroup(W)
, seen as the centre of the simply
connected goup with same isogeny type. This field contains a list of words
in the generators of Pi
which generate the kernel of the map Pi
→
A(Z).
gap> G:=CoxeterGroup("A",3,"sc");; gap> L:=ReflectionSubgroup(G,[1,3]); ReflectionSubgroup(CoxeterGroup("A",3,"sc"), [ 1, 3 ]) gap> AlgebraicCentre(L); rec( Z0 := SubTorus(ReflectionSubgroup(CoxeterGroup("A",3,"sc"), [ 1, 3 ]),[ [\ 1, 2, 1 ] ]), complement := SubTorus(ReflectionSubgroup(CoxeterGroup("A",3,"sc"), [ 1, 3 ]),[ [\ 0, 1, 0 ], [ 0, 0, 1 ] ]), AZ := Group( <0,0,1/2> ), descAZ := [ [ 1, 2 ] ] ) gap> G:=CoxeterGroup("A",3);; gap> s:=SemisimpleElement(G,[0,1/2,0]);; gap> SemisimpleCentralizer(G,s); (A1xA1)<1,3>.(q+1) gap> AlgebraicCentre(last); rec( Z0 := SubTorus(ReflectionSubgroup(CoxeterGroup("A",3), [ 1, 3 ]),), complement := SubTorus(ReflectionSubgroup(CoxeterGroup("A",3), [ 1, 3 ]),[ [ 1, 0\ , 0 ], [ 0, 1, 0 ], [ 0, 0, 1 ] ]), AZ := Group( <1/2,1/2,1/2> ) )
Note that in versions of CHEVIE prior to april 2017, the fields Z0
and
complement
were not subtori but lists of integral vectors. To get the
same values out of the current result, use Z0.generators
and
complement.generators
.
SemisimpleSubgroup( S, n )
This function returns the subgroup of semi-simple elements of order dividing n in the subtorus S.
gap> G:=CoxeterGroup("A",3,"sc");; gap> L:=ReflectionSubgroup(G,[1,3]);; gap> z:=AlgebraicCentre(L);; gap> z.Z0; SubTorus(ReflectionSubgroup(CoxeterGroup("A",3,"sc"), [ 1, 3 ]),[ [ 1,\ 2, 1 ] ]) gap> SemisimpleSubgroup(z.Z0,3); Group( <1/3,2/3,1/3> ) gap> Elements(last); [ <0,0,0>, <1/3,2/3,1/3>, <2/3,1/3,2/3> ]
IsIsolated(W,s)
s should be a semi-simple element for the algebraic group G specified by the Weyl group record W. A semisimple element s of an algebraic group G is isolated if the connected component CG0(s) does not lie in a proper parabolic subgroup of G. This function tests this condition.
gap> W:=CoxeterGroup("E",6);; gap> QuasiIsolatedRepresentatives(W); [ <0,0,0,0,0,0>, <0,0,0,1/3,0,0>, <0,1/6,1/6,0,1/6,0>, <0,1/2,0,0,0,0>, <1/3,0,0,0,0,1/3> ] gap> Filtered(last,x->IsIsolated(W,x)); [ <0,0,0,0,0,0>, <0,0,0,1/3,0,0>, <0,1/2,0,0,0,0> ]
IsQuasiIsolated(W,s)
s should be a semi-simple element for the algebraic group G specified by the Weyl group record W. A semisimple element s of an algebraic group G is quasi-isolated if CG(s) does not lie in a proper parabolic subgroup of G. This function tests this condition.
gap> W:=CoxeterGroup("E",6);; gap> QuasiIsolatedRepresentatives(W); [ <0,0,0,0,0,0>, <0,0,0,1/3,0,0>, <0,1/6,1/6,0,1/6,0>, <0,1/2,0,0,0,0>, <1/3,0,0,0,0,1/3> ] gap> Filtered(last,x->IsQuasiIsolated(ReflectionSubgroup(W,[1,3,5,6]),x)); [ <0,0,0,0,0,0>, <0,0,0,1/3,0,0>, <0,1/2,0,0,0,0> ]
86.16 QuasiIsolatedRepresentatives
QuasiIsolatedRepresentatives(W[,p])
W should be a Weyl group record corresponding to an algebraic group G. This function returns a list of semisimple elements for G, which are representatives of the G-orbits of quasi-isolated semisimple elements. It follows the algorithm given by C. Bonnafé in Bon05. If a second argument p is given, it gives representatives of those quasi-isolated elements which exist in characteristic p.
gap> W:=CoxeterGroup("E",6);;QuasiIsolatedRepresentatives(W); [ <0,0,0,0,0,0>, <0,0,0,1/3,0,0>, <0,1/6,1/6,0,1/6,0>, <0,1/2,0,0,0,0>, <1/3,0,0,0,0,1/3> ] gap> List(last,x->IsIsolated(W,x)); [ true, true, false, true, false ] gap> W:=CoxeterGroup("E",6,"sc");;QuasiIsolatedRepresentatives(W); [ <0,0,0,0,0,0>, <1/3,0,2/3,0,1/3,2/3>, <1/2,0,0,1/2,0,1/2>, <2/3,0,1/3,0,1/3,2/3>, <2/3,0,1/3,0,2/3,1/3>, <2/3,0,1/3,0,2/3,5/6>, <5/6,0,2/3,0,1/3,2/3> ] gap> List(last,x->IsIsolated(W,x)); [ true, true, true, true, true, true, true ] gap> QuasiIsolatedRepresentatives(W,3); [ <0,0,0,0,0,0>, <1/2,0,0,1/2,0,1/2> ]
86.17 SemisimpleCentralizerRepresentatives
SemisimpleCentralizerRepresentatives(W [,p])
W should be a Weyl group record corresponding to an algebraic group
G. This function returns a list giving representatives H of
G-orbits of reductive subgroups of G which can be the identity
component of the centralizer of a semisimple element. Each group H is
specified by a list h of reflection indices in W such that H
corresponds to ReflectionSubgroup(W,h)
. If a second argument p is
given, only the list of the centralizers which occur in characteristic p
is returned.
gap> W:=CoxeterGroup("G",2); CoxeterGroup("G",2) gap> l:=SemisimpleCentralizerRepresentatives(W); [ [ ], [ 1 ], [ 1, 2 ], [ 1, 5 ], [ 2 ], [ 2, 6 ] ] gap> List(last,h->ReflectionName(ReflectionSubgroup(W,h))); [ "(q-1)^2", "A1.(q-1)", "G2", "A2<1,5>", "~A1<2>.(q-1)", "~A1<2>xA1<6>" ] gap> SemisimpleCentralizerRepresentatives(W,2); [ [ ], [ 1 ], [ 1, 2 ], [ 1, 5 ], [ 2 ] ]
gap3-jm