# here type is a list, e.g., [ "B", 5 ] -- we return the # coefficients of the highest root of the root system
local t, rank, c;
t:= type[1]; rank:= type[2];
if t = "A"then
c:= List( [1..rank], x -> 1 ); elif t = "B"then
c:= [1];
Append( c, List( [2..rank], x -> 2 ) ); elif t = "C"then
c:= List( [1..rank-1], x -> 2 );
Add( c, 1 ); elif t = "D"then
c:= [1];
Append( c, List( [2..rank-2], x -> 2 ) );
Append( c, [1,1] ); elif t = "E" and rank = 6then
c:= [ 1, 2, 2, 3, 2, 1 ]; elif t ="E" and rank = 7then
c:= [ 2, 2, 3, 4, 3, 2, 1 ]; elif t = "E" and rank = 8then
c:= [ 2, 3, 4, 6, 5, 4, 3, 2 ]; elif t ="F"then
c:= [ 2, 3, 4, 2 ]; elif t = "G"then
c:= [ 3, 2 ]; fi;
return c;
end;
SLAfcts.derived_systems:= function( B, p )
# here p is a pi-system, B matrix of the bilinear form.
local rts, tps, der, i, j, k, l, rts0, tps0, c, rr, rank, C, t, rt,
tp, e, r;
rts:= p.roots;
tps:= p.types;
der:= [ ];
for i in [1..Length(tps)] do
rts0:= List( rts, x -> ShallowCopy(x) );
tps0:= List( tps, x -> ShallowCopy(x) );
RemoveElmList( rts0, i );
RemoveElmList( tps0, i );
c:= -SLAfcts.highest_root( tps[i] );
c:= c*rts[i]; for j in [1..Length(rts[i])] do
rr:= ShallowCopy( rts[i] );
rr[j]:= c;
rank:= Length(rr);
C:= NullMat( rank, rank ); for k in [1..rank] do for l in [1..rank] do
C[k][l]:= 2*rr[k]*(B*rr[l])/( rr[l]*(B*rr[l]) );
od;
od;
t:= CartanType( C );
if not ( Length(t.types) = 1 and t.types[1] = tps[i] ) then
rt:= List( rts0, ShallowCopy );
tp:= List( tps0, ShallowCopy ); for k in [1..Length(t.types)] do
e:= t.enumeration[k];
r:= [ ]; for l in [1..Length(e)] do
Add( r, rr[ e[l] ] );
od;
Add( rt, r );
Add( tp, t.types[k] );
od;
Add( der, rec( roots:= rt, types:= tp ) ); fi;
od;
od;
return der;
end;
SLAfcts.pi_systems_0:= function( R )
# We assume R is a simple root system.
local C, t, e, rts, i, p, res, newpis, news, x, B;
C:= CartanMatrix(R);
t:= CartanType( C );
B:= BilinearFormMatNF(R);
e:= t.enumeration[1];
rts:= [ ]; for i in [1..Length(e)] do
Add( rts, SimpleSystemNF(R)[ e[i] ] );
od;
p:= rec( roots:= [rts], types:= t.types );
res:= [ p ];
newpis:= [ p ]; while newpis <> [ ] do
news:= [ ]; for x in newpis do
Append( news, SLAfcts.derived_systems( B, x ) );
od;
newpis:= news;
Append( res, newpis );
od;
return res;
end;
# now some functions for dealing with sub-Weyl groups # They are given as records: W.roots gives the roots # as weights rel to the big root system, W.wgts, gives # the simple roots as weights rel to the small root system.
SLAfcts.conj_dom_wt:= function( wt, relwt, W )
# Here wt is a weight (rel to the big root system). # relwt is the weight rel to the small root system (i.e., # the vector of values < mu, \beta_i^\vee >, i = 1,..,m. # W a sub-Weyl group datum.. # We compute the dominant weight (rel to small root sys) # conj to wt, we output the dom wt, its rel wt, and the word, # in terms of the generators of W that maps the weight # to the dominant one.
local lam, rlam, pos, w;
lam:= ShallowCopy( wt );
rlam:= ShallowCopy( relwt );
pos:= PositionProperty( rlam, x -> x < 0 );
w:= [ ]; while pos <> fail do
# Here W is a sub-Weyl group, and wt a weight rel to # the big root system R. B is the matrix of the bilin form # wrt weight basis (in the big root system). # we find generators of the stabiliser of wt in W, # output as a sub-Weyl group
local relwt, d, inds, i, j, g, w, rt, relt, CM;
relwt:= List( W.roots, x -> 2*wt*(B*x)/( x*(B*x) ) );
d:= SLAfcts.conj_dom_wt( wt, relwt, W );
inds:= [ ]; for i in [1..Length(d[2])] do if d[2][i] = 0then Add( inds, i ); fi;
od;
g:= [ ];
w:= d[3];
for i in inds do
rt:= ShallowCopy(W.roots[i]);
relt:= ShallowCopy(W.wgts[i]);
# apply w...
for j in w do
rt:= rt - relt[j]*W.roots[j];
relt:= relt - relt[j]*W.wgts[j];
od;
Add( g, rt );
od;
CM:= List( g, x -> List( g, y -> 2*x*(B*y)/( y*(B*y) ) ) );
rank:= Length( CartanMatrix(R) );
B:= NullMat( rank, rank );
b:= BilinearFormMatNF( R );
bas:= IdentityMat( rank ); for i in [1..rank] do for j in [i..rank] do
c:= Coefficients( sp, bas[i] )*( b*Coefficients(sp,bas[j]) );
B[i][j]:= c; B[j][i]:= c;
od;
od;
# R is the big root system, B the bilin form mat wrt weights, # mus and lams are lists of weights, we determine whether # there exists w in W wich w(mus[i]) = lams[i], all i.
# same as previous function, but now we also permute # the mus, lams. We do assume that they arrive in an # order that defines the same Cartan matrix...
local C, perms, i, newperms, p, q, good, j, k, l, nus;
# however,... first we try the identity permutation...
if SLAfcts.are_conjugate_0( R, B, mus, lams ) then
return true; fi;
# The Cartan matrix:
C:= List( mus, x -> List( mus, y -> 2*x*(B*y)/( y*(B*y) ) ) );
# Now we determine all permutations of the mus that leave C invariant:
perms:= List( [1..Length(mus)], x -> [x] ); # i.e., the first element can be mapped to one of the other elts. # now we see whether this can be extended...
for i in [2..Length(mus)] do
newperms:= [ ]; for p in perms do for j in [1..Length(mus)] do # see whether p can be extended by adding j... if not j in p then
q:= ShallowCopy(p);
Add( q, j );
good:= true; for k in [1..i] do if not good then break; fi; for l in [1..i] do if not good then break; fi; if C[k][l] <> C[ q[k] ][ q[l] ] then
good:= false; fi;
od;
od; if good then Add( newperms, q ); fi; fi;
od;
od;
perms:= newperms;
od;
perms:= Filtered( perms, x -> x <> [1..Length(mus)] ); # already tried it
# now we see whether there is a permutation mapping # a permuted mus to lams...
for p in perms do
nus:= [ ]; for i in [1..Length(p)] do
nus[p[i]]:= mus[i];
od;
if SLAfcts.are_conjugate_0( R, B, nus, lams ) then
return true; fi;
od;
CartInt := function( R, a, b )
local s,t,rt;
s:=0; t:=0;
rt:=a-b; while (rt in R) or (rt=0*R[1]) do
rt:=rt-b;
s:=s+1;
od;
rt:=a+b; while (rt in R) or (rt=0*R[1]) do
rt:=rt+b;
t:=t+1;
od;
return s-t; end;
R:= RootSystem(L);
s:= SLAfcts.sub_systems( R );
posRw:= PositiveRootsAsWeights( R );
ch:= ChevalleyBasis(L);
xL:= ch[1]; yL:= ch[2];
tL:= SemiSimpleType(L);
algs:= [ ]; for i in [1..Length(s.roots)] do
tK:= Concatenation( s.types[i][1][1], String( s.types[i][1][2] ) ); if tK <> tL then
r:= s.roots[i];
x:= [ ]; y:= [ ]; for j in [1..Length(r)] do
pos:= Position( posRw, r[j] ); if pos <> fail then
Add( x, xL[pos] );
Add( y, yL[pos] ); else
pos:= Position( posRw, -r[j] );
Add( x, yL[pos] );
Add( y, xL[pos] ); fi;
od;
K:= Subalgebra( L, Concatenation( x, y ) );
# make the root system of K...
h:= List( [1..Length(x)], k -> x[k]*y[k] );
SetCartanSubalgebra( K, Subalgebra(K,h) );
fund:= [ ]; for j in [1..Length(x)] do
rt:= [ ];
sp:= Basis( Subspace(L,[x[j]]), [x[j]] ); for k in [1..Length(h)] do
Add( rt, Coefficients( sp, h[k]*x[j] )[1] );
od;
Add( fund, rt );
od;
posR:= ShallowCopy( fund );
posRv:= ShallowCopy( x );
oldR:= ShallowCopy(fund);
oldRv:= ShallowCopy( x );
while oldR <> [ ] do
newR:= [ ];
newRv:= [ ];
newneg:= [ ]; for j in [1..Length(fund)] do for k in [1..Length(oldR)] do
u:= x[j]*oldRv[k]; if not IsZero( u ) then
rt:= fund[j]+oldR[k]; if not rt in newR then
Add( newR, rt );
Add( newRv, u );
Add( newneg, y[j]*oldneg[k] ); fi; fi;
od;
od;
Append( posR, newR );
Append( posRv, newRv );
Append( negR, -newR );
Append( negRv, newneg );
oldR:= newR; oldRv:= newRv;
oldneg:= newneg;
od;
allrts:= Concatenation( posR, negR );
C:= List( fund, a -> List( fund, b -> CartInt( allrts, a, b ) ) );
RK:= Objectify( NewType( NewFamily( "RootSystemFam", IsObject ),
IsAttributeStoringRep and IsRootSystemFromLieAlgebra ),
rec() );
SetCanonicalGenerators( RK, [ x, y, h ] );
SetUnderlyingLieAlgebra( RK, K );
SetPositiveRootVectors( RK, posRv );
SetNegativeRootVectors( RK, negRv );
SetCartanMatrix( RK, C );
# Functions for computing the closed subsystems of root systems # up to conjugacy by the Weyl group. # # # the addition table of the roots will always be Q # if a sum is not a root, then the entry is 0, otherwise the index of the root.
# Also note that if a is a root with index i then -a has index i+n0 mod 2n0, # where n0 is the number of positive roots.
SLAfcts.clos:= function( rts, S )
local i,j, a, T, added, start, start0, u;
T:= ShallowCopy(S);
added:= true;
start:= 1; while added do
added:= false; start0:= Length(T); for i in [1..Length(T)] do
u:= Maximum( start, i+1 ); for j in [u..Length(T)] do
a:= T[i]+T[j]; if (a in rts) and (not a in T) then
Add( T, a );
added:= true; fi;
od;
od;
start:= start0+1;
od;
return T;
end;
SLAfcts.dynkintable:= function( type, rank )
local defseq, R, s, Pw, rts, sys, r, sim;
defseq:= function( rk, rts, r )
local sim, pos, ip, s, sq;
sim:= rts{[1..rk]};
pos:= PositionProperty( r, x -> x <> 0 ); if r[pos] > 0then
ip:= true;
s:= ShallowCopy(r); else
ip:= false;
s:= -ShallowCopy(r); fi;
sq:= [ ]; while not IsZero(s) do
pos:= PositionProperty( sim, x -> s-x in rts ); if pos = fail then
pos:= Position( sim, s ); fi;
Add( sq, pos );
s:= s-sim[pos];
od;
return [ ip, Reversed(sq) ];
end;
R:= RootSystem( type, rank );
s:= SLAfcts.sub_systems(R);
Pw:= PositiveRootsAsWeights(R);
Pw:= Concatenation( Pw, -Pw );
rts:= Concatenation( PositiveRootsNF(R), -PositiveRootsNF(R) );
sys:= [ ]; for r in s.roots do
sim:= List( r, x -> rts[ Position( Pw, x ) ] );
sim:= Concatenation( sim, -sim );
Add( sys, SLAfcts.clos( rts, sim ) );
od;
sys:= List( sys, x -> List( x, y -> defseq( rank, rts, y ) ) );
return rec( type:= type, sys:= sys );
end;
SLAfcts.semsim:= function(s,H,n0,rts,Q,B,ipmat)
local setss, rows, sm, max, r, a, b, c, k, l, iscl, sums, bas, C, tp,
sets, set, n, T, zyz, m, s0, pos, U, mat, j, p0, conj, i, ind, u;
T:= [ ];
setss:= [ ];
rows:= [ ];
sm:= Sum(rts{s});
max:= [ ]; # max set that can be added...(just the pos rts)
for r in [1..n0] do if (not r in s) and (not r+n0 in s) and (rts[r]*B*sm = 0) then
iscl:= true; for a in s do
b:= Q[a][r]; c:= Q[a][r+n0]; if (b<>0 and not b in s) or (c<>0 and not c in s) then
iscl:= false; break; fi;
od; if iscl then Add( max, r ); fi; fi;
od;
if Length(max) >0then
sums:= []; for k in max dofor l in max do Add( sums, Q[k][l] ); od; od;
bas:= Filtered( max, x -> not x in sums );
C:= List( bas, x -> List( bas, y -> 2*ipmat[x][y]/ipmat[y][y]));
tp:= CartanType(C);
sets:= [ ];
for k in [1..Length(tp.types)] do
set:= [ [] ];
n:= tp.types[k][2]; if not IsBound( T[n] ) then T[n]:= [ ]; fi;
l:= PositionProperty( T[n], x -> x.type[1] =
tp.types[k][1] ); if l = fail then
Add( T[n], SLAfcts.dynkintable( tp.types[k][1], n ) );
l:= Length( T[n] ); fi;
zyz:= T[n][l].sys; for m in [1..Length(zyz)] do
s0:= [ ]; for r in zyz[m] do if r[1] then
u:= bas[tp.enumeration[k][r[2][1]]]; for j in [2..Length(r[2])] do
u:= Q[u][bas[tp.enumeration[k][r[2][j]]]];
od;
Add( s0, u ); fi;
od;
Add( set, s0 );
od;
Add( sets, set );
od; # now make unions...
ind:= List( sets, x -> 1 );
k:= 1; while k <> 0do
s0:= Concatenation( List( [1..Length(ind)], j ->
sets[j][ind[j]] ) );
s0:= Concatenation( s0, List( s0, x ->
((x+n0) mod (2*n0)) ) );
pos:= Position( s0, 0 ); if pos <> fail then s0[pos]:= 2*n0; fi;
U:= Concatenation( s0, s );
Sort(U);
mat:= List( U, x -> [ ] ); for j in [1..Length(U)] do for l in [j..Length(U)] do
mat[j][l]:= ipmat[U[j]][U[l]];
mat[l][j]:= mat[j][l];
od;
od;
p0:= List( mat, Sum ); Sort(p0);
conj:= false; for l in [1..Length(setss)] do if Length(setss[l]) = Length(U) and
p0 = rows[l] and
RepresentativeAction(H,setss[l],U,OnSets) <> fail then
conj:= true; break; fi;
od; if not conj then
Add( setss, U );
Add( rows, p0 ); fi;
k:= 0; for i in [1..Length(ind)] do if ind[i] < Length(sets[i]) then k:= i; break; fi;
od;
if k > 0then for i in [1..k-1] do ind[i]:= 1; od;
ind[k]:= ind[k]+1; fi;
od; else
setss:= [s]; fi;
return setss;
end;
SLAfcts.normaliser_ofclset:= function( S, n0, Q ) # all a such that a+b in S for all b in S # if a+b is a root; assume S closed... # we return the part that is not in S
local res, x, b, good, c;
res:= [ ]; for x in [1..n0] do
good:= true; if not x in S then#and not ((x+n0) mod (2*n0)) in S then for b in S do
c:= Q[b][x]; if c <> 0 and not c in S then
good:= false;
break; fi;
od; if good then AddSet( res, x ); fi; fi;
od;
return res; end;
SLAfcts.normalvec:= function( R, v )
# v is a vector with rational coordinates of length rank(R). # we compute the W-conjugate lying in the dominant Weyl chamber.
Q:= List( rts, x -> [] ); for k in [1..2*n0] do for l in [1..2*n0] do
p0:= Position( rts, rts[k]+rts[l] ); if p0 = fail then p0:= 0; fi;
Q[k][l]:= p0;
od;
od;
B:= BilinearFormMatNF(R);
rank:= Length(B);
ipmat:= List( rts, x -> [ ] ); for k in [1..Length(rts)] do for l in [k..Length(rts)] do
ipmat[k][l]:= rts[k]*B*rts[l];
ipmat[l][k]:= ipmat[k][l];
od;
od;
# now we compute the derived system of S, that is the closed # set consisting of all sums of elements of S
N:= [ ]; for k in [1..Length(S)] do for l in [k+1..Length(S)] do
AddSet( N, Q[S[k]][S[l]] );
od;
od;
N:= Filtered( N, x -> x <> 0 );
D:= Filtered( S, x -> not x in N );
orbs:= Orbits( H, D ); for o in orbs do
j:= o[1];
T:= ShallowCopy( S );
pos:= Position( S, j );
RemoveSet( T, j );
N:= SLAfcts.normaliser_ofclset( T, n0, Q );
vecs:= [ ];
d0:= Sum( prw{T} ); for k in N do
Add( vecs, SLAfcts.normalvec( R, d0+prw[k] ) ); if k = j then
v0:= vecs[Length(vecs)]; fi;
od; if ForAll( vecs, x -> v0 <= x ) then
mat:= ipmat{T}{T}; for k in mat do Sort(k); od;
Sort(mat);
vals:= [ ]; for l in [1..Length(mat)] do
k:= 1;
val:= []; ind:= 1; cnt:=0; while k <= Length(mat) do while k<=Length(mat) and mat[l][k]=Bvals[ind] do
k:= k+1;
cnt:= cnt+1;
od;
Add( val, cnt );
ind:= ind+1;
cnt:=0;
od;
Add( vals, val );
od;
d0:= List( vals, x -> Sum( [1..Length(x)],
i -> x[i]*n0exp[Length(x)-i+1] ) );
nn:= Filtered( [1..2*n0], x -> ForAll(T,y->ipmat[x][y]
>= -1 ) );
nn:= SLAfcts.normalvec( R, Sum( prw{nn} ) );
conj:= false;
k:= PositionSorted( dets, d0 );
while k<= Length(newSS) and dets[k] = d0 do
if rows[k] = nn then
cj:= RepresentativeAction( G,newSS[k],T,OnSets ); else
cj:= fail; fi;
if cj <> fail then
conj:= true; break; fi;
k:= k+1;
od;
if not conj then
InsertElmList( newSS, k, T );
InsertElmList( dets, k, d0 );
InsertElmList( rows, k, nn ); fi;
fi;
od;
od;
SS:= newSS; if Length(SS)>0 and Length(SS[1])=1then for S in SS do
H:= Stabilizer( G, S, OnSets );
Append( closeds, SLAfcts.semsim(S,H,n0,rts,Q,B,ipmat));
od;
SS:= [ ]; fi;
od;
sys:= List( closeds, x -> rts{x} );
s:= SLAfcts.sub_systems(R);
Pw:= PositiveRootsAsWeights(R);
Pw:= Concatenation( Pw, -Pw ); for r in s.roots do
sim:= List( r, x -> rts[ Position( Pw, x ) ] );
sim:= Concatenation( sim, -sim );
Add( sys, SLAfcts.clos( rts, sim ) );
od;
return sys;
end );
InstallMethod( IsSpecialClosedSet, "for a closed subset of a root system", true, [ IsList ], 0,
function(c)
return ForAll( c, x -> not -x in c );
end );
InstallMethod( DecompositionOfClosedSet, "for a closed subset of a root system", true, [ IsList ], 0,
function(c)
local S, N;
S:= Filtered( c, x -> -x in c );
N:= Filtered( c, x -> not x in S );
return [S,N];
end );
InstallMethod( SubalgebraOfClosedSet, "for a Lie algebra and a closed subset of its root system", true,
[ IsLieAlgebra, IsList ], 0,
function( L, c )
local b, pr, rts, ch, rvcs, bas, r, pos;
b:= [ ];
pr:= PositiveRootsNF(RootSystem(L));
rts:= Concatenation( pr, -pr );
ch:= ChevalleyBasis(L);
rvcs:= Concatenation( ch[1], ch[2] );
bas:= ShallowCopy( ch[3] ); for r in c do
pos:= Position( rts, r ); if pos = fail then
Error( "One of the elements of <c> is not a root" ); fi;
Add( bas, rvcs[pos] );
od;
return Subalgebra( L, bas, "basis" );
end );
Messung V0.5 in Prozent
¤ Diese beiden folgenden Angebotsgruppen bietet das Unternehmen0.59Angebot
(Wie Sie bei der Firma Beratungs- und Dienstleistungen beauftragen können 2026-10-11)
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.