InstallMethod( SolvableLieAlgebra, "for a field and a list", true,
[ IsField, IsList ], 0,
function( F, data )
local d, no, a, b, S, L;
if not Length( data ) >= 2then
Error("<data> has to have length at least two"); fi; if not IsPosInt( data[1] ) then
Error("the first element of <data> has to be a positive integer"); else
d:= data[1]; if not d in [1,2,3,4] then
Error("the dimension has to be 1,2,3, or 4"); fi; fi;
no:= data[2]; if d=1then if no > 1then
Error( "the second element of <data> has to be <= 1" ); fi; elif d=2then if no > 2then
Error("the second element of <data> has to be <= 2"); fi; elif d=3then if no > 4then
Error("the second element of <data> has to be <= 4"); fi; else if not no in [1..14] then
Error("the second element of <data> has to be <= 14"); fi; fi; if Length( data ) >=3then
a:= data[3]; fi; if Length( data ) >= 4then
b:= data[4]; fi;
if not Length( data ) >= 2then
Error("<data> has to have length at least two"); fi; if not IsPosInt( data[1] ) then
Error("the first element of <data> has to be a positive integer"); else
d:= data[1]; if not d in [1,2,3,4,5,6] then
Error("the dimension has to be an integer from 1 to 6"); fi; fi;
no:= data[2]; if d=1then if no > 1then
Error( "the second element of <data> has to be <= 1" ); fi; elif d=2then if no > 1then
Error( "the second element of <data> has to be <= 1" ); fi; elif d=3then if no > 2then
Error( "the second element of <data> has to be <= 2" ); fi; elif d=4then if no > 3then
Error( "the second element of <data> has to be <= 3" ); fi; elif d=5then if no > 9then
Error("the second element of <data> has to be <= 9"); fi; else if no > 36then
Error("the second element of <data> has to be <= 36"); fi; fi;
if Length( data ) >= 3then a:= data[3]; fi;
if d = 1then
ff := [N1_1];
L := CallFuncList( ff[no], [ F ] );
L!.arg := data;
return L; elif d = 2then
ff := [N2_1];
L := CallFuncList( ff[no], [ F ] );
L!.arg := data;
return L; elif d = 3then
ff := [N3_1,N3_2];
L := CallFuncList( ff[no], [ F ] );
L!.arg := data;
return L; elif d = 4then
ff := [N4_1,N4_2,N4_3];
L := CallFuncList( ff[no], [ F ] );
L!.arg := data;
return L; elif d = 5then
ff:= [ N5_1, N5_2, N5_3, N5_4, N5_5, N5_6, N5_7, N5_8, N5_9 ];
L := CallFuncList( ff[no], [ F ] );
L!.arg := data;
return L; else
ff:= [ N6_1, N6_2, N6_3, N6_4, N6_5, N6_6, N6_7, N6_8, N6_9, N6_10,
N6_11, N6_12, N6_13, N6_14, N6_15, N6_16, N6_17, N6_18, N6_19,
N6_20, N6_21, N6_22, N6_23, N6_24, N6_25, N6_26, N6_27, N6_28,
N6_29, N6_30, N6_31, N6_32, N6_33, N6_34, N6_35, N6_36]; if no in [19,21,22,24,31,32,35,36] then
arg:= [F,a]; else
arg:= [F]; fi;
L := CallFuncList( ff[no], arg );
L!.arg := data;
return L; fi;
if HasIsFinite(F) and IsFinite(F) then # for M9 we let b be the smallest power of the primitive root # such that T^2-T-b has no roots in F
q:= Size( F );
prim:= PrimitiveRoot( F ); for i in [1..q-1] do if Length(Factors( T^2-T-prim^i ) ) = 1then
b:= prim^i;
break; fi;
od;
x1:= b[1]; x2:= b[2]; if x1*x2 <> Zero(L) then # Here [L,L] has dimension 1, and its centralizer # has dimension 2, and it contains [L,L].
sp:= LieCentralizer( L, LieDerivedSubalgebra(L) );
b:= Basis( sp );
x1:= Basis(sp)[1];
x2:= Basis(sp)[2]; fi;
for k in [1..3] do if not BL[k] in sp then
x3:= BL[k];
break; fi;
od;
if x1*x3 = Zero(L) and x2*x3 = Zero(L) then # Abelian!
name:= "L3_1( ";
Append( name, LieAlgDBField2String( F ) );
Append( name, " )" );
K:= SolvableLieAlgebra( F, [3,1] );
f:= AlgebraHomomorphismByImages( K, L, Basis(K), Basis(L) );
return rec( name:= [ name, [] ], isom:= f ); fi;
if c1[1] = c2[2] and c1[2] = Zero(F) and c2[1] = Zero(F) then
x3:= x3/c1[1];
name:= "L3_2( ";
Append( name, LieAlgDBField2String( F ) );
Append( name, " )" );
K:= SolvableLieAlgebra( F, [3,2] );
f:= AlgebraHomomorphismByImages( K, L, Basis(K), [x1,x2,x3] );
return rec( name:= [ name, [] ], isom:= f ); fi;
if c1[2] = Zero(F) then # i.e., x1 is an eigenvector of ad x3, not good. if c2[1] = Zero(F) then # x2 is an eigenvector as well, so x1+x2 cannot be # (by previous case)...
x1:= x1+x2; else
x1:= x2; fi; fi;
par:= c2[1]; if HasIsFinite(F) and IsFinite(F) and not par in [Zero(F),One(F)] then if Characteristic(F) = 2then
f:= Inverse( FrobeniusAutomorphism( F ) );
a:= Image( f, par );
x2:= a*x2;
x3:= a*x3;
par:= a^2*par; else
exp:= LogFFE( 1/par, PrimitiveRoot(F) ); if IsEvenInt( exp ) then
a:= PrimitiveRoot(F)^(exp/2);
x2:= a*x2;
x3:= a*x3;
par:= a^2*par; else
exp:= LogFFE( PrimitiveRoot(F)/par, PrimitiveRoot(F) );
a:= PrimitiveRoot(F)^(exp/2);
x2:= a*x2;
x3:= a*x3;
par:= a^2*par; fi; fi; fi;
name:= "L3_4( ";
Append( name, LieAlgDBField2String( F ) );
Append( name, ", " );
Append( name, String( par ) );
Append( name, " )" );
K:= SolvableLieAlgebra( F, [3,4,par] );
f:= AlgebraHomomorphismByImages( K, L, Basis(K), [x1,x2,x3] );
return rec( name:= [ name, [par] ], isom:= f );
elif n = 4then
x1:= b[1]; x2:= b[2]; x3:= b[3]; for k in [1..4] do if not BL[k] in sp then
x4:= BL[k];
break; fi;
od;
K:= Subalgebra( L, [x1,x2,x3] );
adM:= List( Basis(K), x -> AdjointMatrix(Basis(K),x ) );
adK:= MutableBasis( F, [ 0*adM[1] ] );
bK:= [ ];
b_adK:= [ ]; for i in [1..Length(adM)] do if not IsContainedInSpan( adK, adM[i] ) then
CloseMutableBasis( adK, adM[i] );
Add( bK, Basis(K)[i] );
Add( b_adK, adM[i] ); fi;
od;
adK:= VectorSpace( F, b_adK, 0*adM[1] );
mat:= List( Basis(K), x -> Coefficients( Basis(K), x4*x ) );
mat:= TransposedMat( mat ); if mat in adK then
c1:= Coefficients( Basis( adK, b_adK ), mat ); if c1 = [ ] then# L is abelian
name:= "L4_1( ";
Append( name, LieAlgDBField2String( F ) );
Append( name, " )" );
K:= SolvableLieAlgebra( F, [4,1] );
f:= AlgebraHomomorphismByImages( K, L, Basis(K), Basis(L) );
return rec( name:= [ name, [] ], isom:= f ); else
x3:= x4 - LinearCombination( c1, bK );
id:= LieAlgebraIdentification( K );
x4:= Image( id.isomorphism, Basis( Source( id.isomorphism ) )[3] );
x1:= Image( id.isomorphism, Basis( Source( id.isomorphism ) )[1] );
x2:= Image( id.isomorphism, Basis( Source( id.isomorphism ) )[2] );
K:= Subalgebra( L, [x1,x2,x3] ); fi; fi;
R:= PolynomialRing( F, 1 );
mat:= TransposedMat( mat );
mp:= MinimalPolynomial( F, mat );
is_diag:= true; for i in [1..3] do if not is_diag then break; fi; for j in [1..3] do if not is_diag then break; fi; if i <> j and mat[i][j] <> Zero(F) then
is_diag:= false; fi;
od;
od;
if D[2][1] <> Zero(F) then
x4:= x4/D[2][1];
a:= D[1][2]/D[2][1]; if Characteristic(F) <> 2then
a:= a - (1/4)*One(F);
return LieAlgDBHelper.isomM9( L, x1/(4*One(F))+x2/(2*One(F)),
x1/(2*One(F)), x3, x3/(2*One(F))+x4, a ); else
return LieAlgDBHelper.isomM10( L, x1, x2, x3, x4, a ); fi; else if D[1][2] <> Zero(F) then
x4:= x4/D[1][2]; if Characteristic(F) <> 2then
y1:= (x1+x2)/(2*One(F));
y2:= x2;
y3:= x3;
y4:= (x3+x4)/(2*One(F));
return LieAlgDBHelper.isomN( L, y1, y2, y3, y4 ); else
name:= "L4_10( ";
Append( name, LieAlgDBField2String( F ) );
Append( name, ", " );
Append( name, String( Zero(F) ) );
Append( name, " )" );
K:= SolvableLieAlgebra( F, [4,10, Zero(F) ] );
f:= AlgebraHomomorphismByImages(K,L,Basis(K),
[x2,x1,x3,x4]);
return rec( name:= [ name, [Zero(F)] ], isom:= f ); fi; fi; fi; fi; elif num = '3'then
D:= TransposedMat( mat );
a:= id.parameters[1]; if a <> Zero(F) then
x4:= x4-(D[1][3]/a-D[2][3])*x1+D[1][3]/a*x2-D[2][1]*x3;
x4:= x4/D[1][1];
return LieAlgDBHelper.isomM9( L, x2, x1, x4, x3, a ); else
LieAlgDBHelper.liealg_hom:= function( K, L, p, i )
return AlgebraHomomorphismByImagesNC( K, L, p, i );
end;
LieAlgDBHelper.class_dim_le4:= function( L )
# finds an isomorphism of the nilpotent Lie algebra L of dim <= 4, # to a "normal form".
local F, C, C1, D, i, x, y, z, u, T, V, K, A, cc, b, a;
F:= LeftActingDomain( L ); if Dimension( L ) = 3then if IsLieAbelian( L ) then
return rec( type:= [ 3, 1 ], f:= LieAlgDBHelper.liealg_hom( L, L, Basis( L ), Basis( L ) ) ); else
C:= LieCentre( L ); for i in [1..3] do if not Basis( L )[i] in C then
x:= Basis( L )[i]; break; fi;
od;
C:= Subalgebra( L, [x,Basis( C )[1]] ); for i in [1..3] do if not Basis( L )[i] in C then
y:= Basis( L )[i]; break; fi;
od;
T:= EmptySCTable( 3, Zero( F ), "antisymmetric" );
SetEntrySCTable( T, 1, 2, [1,3] );
K:= LieAlgebraByStructureConstants( F, T );
return rec( type:= [ 3, 2 ], f:= LieAlgDBHelper.liealg_hom( L, K, [x,y,x*y], Basis( K ) ) ); fi; elif Dimension( L ) = 4then if IsLieAbelian( L ) then
return rec( type:= [ 4, 1 ], f:= LieAlgDBHelper.liealg_hom( L, L, Basis( L ), Basis( L ) ) ); else
C:= LieCentre( L ); if Dimension( C ) = 2then for i in [1..4] do if not Basis( L )[i] in C then
x:= Basis( L )[i]; break; fi;
od;
C1:= Subalgebra( L, [ Basis( C )[1], Basis( C )[2], x ] ); for i in [1..4] do if not Basis( L )[i] in C1 then
y:= Basis( L )[i]; break; fi;
od;
A:= Subalgebra( L, [ x*y ] ); if Basis( C )[1] in A then
u:= Basis( C )[2]; else
u:= Basis( C )[1]; fi;
D:= LieDerivedSubalgebra( L );
b:= ShallowCopy( Basis( D ) );
cc:= [ ]; for i in [1..4] do
x:= Basis( L )[i]; if not x in D then
Add( cc, x );
Add( b, x );
D:= Subalgebra( L, b ); fi;
od;
z:= cc[1]*cc[2]; if cc[1]*z <> Zero( L ) then
x:= cc[1]; y:= cc[2]; else
x:= cc[2]; y:= cc[1]; fi;
z:= x*y; u:= x*z;
# we have to change y to make sure that [x,y]= z, and # [y,u]= 0.
V:= Basis( Subalgebra( L, [u] ), [u] );
a:= Coefficients( V, y*z )[1];
y:= -a*x+y;
# here V is a vector space, and f : VxV -> F a skew-symmetric # bilinear function; we compute a basis of V such that f has standard form. # Here f is just given as a GAP function.
local b, dim, found, i, j, c, W, bU, u, v, bb, done, x, w;
b:= Basis(V);
dim:= Dimension(V);
found:= false; for i in [1..dim] do if found then break; fi; for j in [i+1..dim] do
c:= f(b[i],b[j]); if not IsZero(c) then
u:= [b[i]]; v:= [b[j]/c];
found:= true; break; fi;
od;
od;
done:= false; while not donedo # consider the linear map T: V --> V defined by # T(w) = \sum_i f(w,v[i])u[i] - f(w,u[i])v[i], # then T is projection onto the space spanned by the elts in u,v. # set U = (1-T)V; then T is zero on U, and V is the direct # sum of U and the space spanned by u,v. We compute U.
W:= MutableBasis( LeftActingDomain(V), [], Zero(V) ); for x in b do
w:= x-Sum( List( [1..Length(u)], k -> f(x,v[k])*u[k]-f(x,u[k])*v[k] ) ); if not IsContainedInSpan( W, w ) then
CloseMutableBasis( W, w ); fi;
od;
bU:= BasisVectors(W);
found:= false; for i in [1..Length(bU)] do if found then break; fi; for j in [i+1..Length(bU)] do
c:= f(bU[i],bU[j]); if not IsZero(c) then
Add( u, bU[i] ); Add( v, bU[j]/c );
found:= true; break; fi;
od;
od; if not found then done:= true;
bb:= [ ]; for i in [1..Length(u)] do
Add( bb, u[i] );
Add( bb, v[i] );
od;
Append( bb, bU ); elif2*Length(u) = dim then done:= true;
bb:= [ ]; for i in [1..Length(u)] do
Add( bb, u[i] );
Add( bb, v[i] );
od; fi;
od;
return bb;
end;
LieAlgDBHelper.class_dim_5:= function( K )
local F, C, D, ind, i, bL, bsp, L, W, t, T, d, N, imgs, p, s, coc1, coc2, tau, M, coc21, coc22,
bM, cz, cx, type, a, b, c, m, mat, cf, c1, c2, x, mt, sp, y, y1, r;
if IsLieAbelian( K ) then
return rec( type:= [ 5, 1 ], f:= LieAlgDBHelper.liealg_hom( K, K, Basis( K ), Basis( K ) ) ); fi;
F:= LeftActingDomain( K );
# see if there is an abelian component ( necessarily of dim 1 )
C:= LieCentre( K );
D:= LieDerivedSubalgebra( K );
ind:= 0; for i in [1..Dimension( C )] do if not Basis( C )[i] in D then
ind:= i;
break; fi;
od;
if ind > 0then
bL:= ShallowCopy( Basis( D ) );
bsp:= ShallowCopy( bL );
Add( bsp, Basis( C )[ind] );
sp:= MutableBasis( F, bsp ); for i in [1..Dimension( K )] do if not IsContainedInSpan( sp, Basis( K )[i] ) then
Add( bL, Basis( K )[i] );
CloseMutableBasis( sp, Basis( K )[i] ); fi;
od; # now K = bL \oplus C[ind].
# so now bL is a basis of K, the first n-1 elements form # a basis of an ideal, the last element of an abelian ideal. # We have an isomorphism of K to the direct sum of L with a # 1-dim ideal; write x\in K on the basis bL.
r:= LieAlgDBHelper.class_dim_le4( L ); type:= r.type; tau:= r.f;
T:= ShallowCopy( StructureConstantsTable( Basis( Range( tau ) ) ) );
d:= Dimension( Range( tau ) ); for i in [1..d] do
T[i]:= ShallowCopy( T[i] );
Add( T[i], [ [], [] ] );
od;
T[d+3]:= T[d+2]; T[d+2]:= T[d+1];
T[d+1]:= List( [1..d+1], x -> [ [], [] ] );
N:= LieAlgebraByStructureConstants( F, T );
imgs:= [ ]; for x in Basis( K ) do
cx:= Coefficients( W, x );
y:= Image( tau, LinearCombination( Basis( L ), cx{[1..Length( cx )-1]} ) );
y:= ShallowCopy( Coefficients( Basis( Range( tau ) ), y ) );
Add( y, cx[ Length( cx ) ] );
if type[2]= 2then # isom
y1:= ShallowCopy( y );
y1[1]:= y[1];
y1[2]:= y[2];
y1[3]:= y[3];
y1[4]:= y[5];
y1[5]:= y[4];
y:= ShallowCopy( y1 ); fi;
Add( imgs, LinearCombination( Basis( N ), y ) );
od;
return rec( type:= [ 5, type[2] ], f:= LieAlgDBHelper.liealg_hom( K, N, Basis( K ), imgs ) );
fi;
# if there are no central components, then we look at the # cocycle we get by dividing by the centre, and so on.
C:= LieCentre( K );
p:= NaturalHomomorphismByIdeal( K, C );
L:= Range( p );
s:= function( v ) return PreImagesRepresentative( p, v ); end;
coc1:= function( u, v ) return s( u )*s( v )-s( u*v ); end;
r:= LieAlgDBHelper.class_dim_le4( L ); type:= r.type; tau:= r.f;
M:= Range( tau );
coc2:= function( u, v ) return coc1( PreImage( tau,u ), PreImage( tau,v ) ); end; # i.e., the cocycle for M # now we need to map coc2 to normal form, according to the type of M
if type = [ 4, 1 ] then
coc21:= function( u, v ) return Coefficients( Basis( C ), coc2( u,v ) )[1]; end;
bM:= Basis( M, LieAlgDBHelper.skew_symm_NF( M, coc21 ) );
T:= EmptySCTable( 5, Zero( F ), "antisymmetric" );
SetEntrySCTable( T, 1, 2, [1,5] );
SetEntrySCTable( T, 3, 4, [1,5] );
N:= LieAlgebraByStructureConstants( F, T );
imgs:= [ ]; for x in Basis( K ) do # the coordinate of the central part of x: # this will be the coordinate of the central part of the # image of x.
cz:= Coefficients( Basis( C ), x-s( Image( p,x ) ) )[1];
cx:= ShallowCopy( Coefficients( bM, Image( tau, Image( p,x ) ) ) );
Add( cx, cz );
Add( imgs, LinearCombination( Basis( N ), cx ) );
od;
return rec( type:= [ 5, 4 ], f:= LieAlgDBHelper.liealg_hom( K, N, Basis( K ), imgs ) );
mat:= TransposedMat( mat );
bM:= Basis( M, List( mat, x -> LinearCombination( Basis( M ), x ) ) );
T:= EmptySCTable( 5, Zero( F ), "antisymmetric" );
SetEntrySCTable( T, 1, 2, [1,3] );
SetEntrySCTable( T, 1, 3, [1,5] );
SetEntrySCTable( T, 2, 4, [1,5] );
N:= LieAlgebraByStructureConstants( F, T );
imgs:= [ ]; for x in Basis( K ) do
cz:= Coefficients( Basis( C ), x-s( Image( p,x ) ) )[1];
cx:= ShallowCopy( Coefficients( bM, Image( tau, Image( p, x ) ) ) );
Add( cx, cz );
# effectively subtract a coboundary ( i.e., apply one further # isomorphism ): # Here we have ( in the normal form Lie algebra ) # [x1,x2]= x3. Hence c( x1,x2 )= 1, rest 0 is a coboundary. # The isomorphism corresponding to the subtraction of c # from the cocycle, subtracts coc21( x1, x2 )*x5 from # the element. ( Rather vague comment... ).
cf:= coc21( bM[1], bM[2] );
cx[5]:= cx[5] - cf*cx[3];
Add( imgs, LinearCombination( Basis( N ), cx ) );
od;
return rec( type:= [ 5, 5 ], f:= LieAlgDBHelper.liealg_hom( K, N, Basis( K ), imgs ) );
elif type = [ 4, 3 ] then
coc21:= function( u, v ) return Coefficients( Basis( C ), coc2( u,v ) )[1]; end;
bM:= Basis( M );
a:= coc21( bM[1], bM[4] );
b:= coc21( bM[2], bM[3] );
imgs:= [ ]; for x in Basis( K ) do
cz:= Coefficients( Basis( C ), x-s( Image( p, x ) ) )[1];
cx:= ShallowCopy( Coefficients( Basis( M ), Image( tau, Image( p,x ) ) ) );
Add( cx, cz/a );
# take care of the coboundary...
cf:= coc21( Basis( M )[1], Basis( M )[2] );
cx[5]:= cx[5] - cf/a*cx[3];
cf:= coc21( Basis( M )[1], Basis( M )[3] );
cx[5]:= cx[5] - cf/a*cx[4];
Add( imgs, LinearCombination( Basis( N ), cx ) );
od;
return rec( type:= [ 5, 7 ], f:= LieAlgDBHelper.liealg_hom( K, N, Basis( K ), imgs ) );
fi;
elif type = [ 3, 1 ] then
coc21:= function( u, v ) return Coefficients( Basis( C ), coc2( u,v ) )[1]; end;
coc22:= function( u, v ) return Coefficients( Basis( C ), coc2( u,v ) )[2]; end;
bM:= LieAlgDBHelper.skew_symm_NF( M, coc21 );
b:= coc22( bM[1], bM[3] ); c:= coc22( bM[2],bM[3] ); if IsZero( b ) then # change the basis bM so that it becomes nonzero.
bM[1]:= bM[1]+bM[2];
b:= coc22( bM[1],bM[3] ); c:= coc22( bM[2],bM[3] ); fi;
# change the basis so that c becomes zero...
bM[2]:= bM[2]-c/b*bM[1];
imgs:= [ ]; for x in Basis( K ) do # the coordinate of the central part of x:
cz:= Coefficients( Basis( C ), x-s( Image( p, x ) ) );
cx:= ShallowCopy( Coefficients( bM, Image( tau, Image( p, x ) ) ) );
# account for the base change in the centre:
cz[2]:= -cz[1]*a/b+cz[2]/b;
Append( cx, cz );
Add( imgs, LinearCombination( Basis( N ), cx ) );
od;
return rec( type:= [ 5, 8 ], f:= LieAlgDBHelper.liealg_hom( K, N, Basis( K ), imgs ) );
elif type = [ 3, 2 ] then
coc21:= function( u, v ) return Coefficients( Basis( C ), coc2( u,v ) )[1]; end;
coc22:= function( u, v ) return Coefficients( Basis( C ), coc2( u,v ) )[2]; end;
bM:= Basis( M );
m:= [[coc21( bM[1],bM[3] ),coc21( bM[2],bM[3] )],
[coc22( bM[1],bM[3] ),coc22( bM[2],bM[3] )] ];
imgs:= [ ]; for x in Basis( K ) do
cz:= Coefficients( Basis( C ), x-s( Image( p, x ) ) );
cx:= ShallowCopy( Coefficients( Basis( M ), Image( tau, Image( p, x ) ) ) );
Append( cx, cz*mt );
# take care of the coboundary...
cx[4]:= cx[4] - c1*cx[3];
cx[5]:= cx[5] - c2*cx[3];
Add( imgs, LinearCombination( Basis( N ), cx ) );
od;
return rec( type:= [ 5, 9 ], f:= LieAlgDBHelper.liealg_hom( K, N, Basis( K ), imgs ) ); fi;
# r is a rational number, we output a list of two rationals [a,b], # such that b is square free, r = a^2b and b is an integer.
local sign, f, u, v, k, n1, n2, d1, d2;
if r >= 0then
sign:= 1; else
sign:= -1;
r:= -r; fi;
f:= Factors( NumeratorRat( r ) );
u:= [ ]; v:= [ ];
k:= 1; while k <= Length( f ) do if k < Length( f ) then if f[k]= f[k+1] then
Add( u, f[k] );
k:= k+2; else
Add( v, f[k] );
k:= k+1; fi; else
Add( v, f[k] );
k:= k+1; fi;
od;
n1:= Product( u ); n2:= Product( v );
f:= Factors( DenominatorRat( r ) );
u:= [ ]; v:= [ ];
k:= 1; while k <= Length( f ) do if k < Length( f ) then if f[k]= f[k+1] then
Add( u, f[k] );
k:= k+2; else
Add( v, f[k] );
k:= k+1; fi; else
Add( v, f[k] );
k:= k+1; fi;
od;
d1:= Product( u ); d2:= Product( v );
return [n1/(d1*d2), sign*n2*d2 ];
end;
LieAlgDBHelper.class_dim_6:= function( K )
local F, C, D, ind, i, bL, bsp, sp, W, r, T, d, N, imgs, x, cx, g, P, p, L, s, coc1, coc2, coc21, coc22, coc23, type, tau, M, bM, aa, a, bb, b, c, m,
v1, v2, e, f, c1, c2, c3, c4, a21, tt, cz1, cx1, s13, s24, s14,
t, uu, u, v, cf, y, y1, cz, a32, a41, a42, store, q, cc, f1, f2, f3, f4,
f5, ff, cf1, xi, ex, eps,root;
if IsLieAbelian( K ) then
return rec( type:= [ 6, 1 ], f:= LieAlgDBHelper.liealg_hom( K, K, Basis( K ), Basis( K ) ) );
fi;
F:= LeftActingDomain( K );
# see if there is an abelian component ( necessarily of dim 1 )
C:= LieCentre( K );
D:= LieDerivedSubalgebra( K );
ind:= 0;
for i in [1..Dimension( C )] do
if not Basis( C )[i] in D then
ind:= i;
break;
fi;
od;
if ind > 0 then
bL:= ShallowCopy( Basis( D ) );
bsp:= ShallowCopy( bL );
Add( bsp, Basis( C )[ind] );
sp:= MutableBasis( F, bsp );
for i in [1..Dimension( K )] do
if not IsContainedInSpan( sp, Basis( K )[i] ) then
Add( bL, Basis( K )[i] );
CloseMutableBasis( sp, Basis( K )[i] );
fi;
od;
# now K = bL \oplus C[ind].
# so now bL is a basis of K, the first n-1 elements form
# a basis of an ideal, the last element of an abelian ideal.
# We have an isomorphism of K to the direct sum of L with a
# 1-dim ideal; write x\in K on the basis bL.
r:= LieAlgDBHelper.class_dim_5( L ); type:= r.type; tau:= r.f;
T:= ShallowCopy( StructureConstantsTable( Basis( Range( tau ) ) ) );
d:= Dimension( Range( tau ) );
for i in [1..d] do
T[i]:= ShallowCopy( T[i] );
Add( T[i], [ [], [] ] );
od;
T[d+3]:= T[d+2]; T[d+2]:= T[d+1];
T[d+1]:= List( [1..d+1], x -> [ [], [] ] );
N:= LieAlgebraByStructureConstants( F, T );
imgs:= [ ];
for x in Basis( K ) do
cx:= Coefficients( W, x );
y:= Image( tau, LinearCombination( Basis( L ), cx{[1..Length( cx )-1]} ) );
y:= ShallowCopy( Coefficients( Basis( Range( tau ) ), y ) );
Add( y, cx[ Length( cx ) ] );
if type[2]= 2 then
# isom
y1:= ShallowCopy( y );
y1[1]:= y[1];
y1[2]:= y[2];
y1[3]:= y[3];
y1[4]:= y[6];
y1[5]:= y[4];
y1[6]:= y[5];
y:= ShallowCopy( y1 );
elif type[2]= 3 then
# isom
y1:= ShallowCopy( y );
y1[1]:= y[1];
y1[2]:= y[2];
y1[3]:= y[3];
y1[4]:= y[4];
y1[5]:= y[6];
y1[6]:= y[5];
y:= ShallowCopy( y1 );
fi;
Add( imgs, LinearCombination( Basis( N ), y ) );
od;
return rec( type:= [ 6, type[2] ], f:= LieAlgDBHelper.liealg_hom( K, N, Basis( K ), imgs ) );
fi;
# if there are no central components, then we look at the
# cocycle we get by dividing by the centre, and so on.
C:= LieCentre( K ); p:= NaturalHomomorphismByIdeal( K, C );
L:= Range( p ); s:= function( v ) return PreImagesRepresentative( p, v ); end;
coc1:= function( u, v ) return s( u )*s( v )-s( u*v ); end;
if Dimension( L ) <= 4 then
r:= LieAlgDBHelper.class_dim_le4( L );
else
r:= LieAlgDBHelper.class_dim_5( L );
fi;
type:= r.type; tau:= r.f;
M:= Range( tau );
coc2:= function( u, v ) return coc1( PreImage( tau,u ), PreImage( tau,v ) ); end;
# i.e., the cocycle for M
# now we need to map coc2 to normal form, according to the type of M
if type = [ 5, 2 ] then
coc21:= function( u, v ) return Coefficients( Basis( C ), coc2( u,v ) )[1]; end;
bM:= ShallowCopy( BasisVectors( Basis( ( M ) ) ) );
# we change the basis bM so that the cocycle is in "normal form":
if not ( IsZero( e ) and IsZero( f ) ) then
m:= LieAlgDBHelper.comp_mat( e, f, 1/g );
v1:= m[1][1]*bM[4]+m[1][2]*bM[5];
v2:= m[2][1]*bM[4]+m[2][2]*bM[5];
bM[4]:= v1; bM[5]:= v2;
if IsFinite( F ) then
if not Characteristic( F )= 2 then
xi:= PrimitiveElement( F );
ex:= LogFFE( f, xi );
if IsEvenInt( ex ) then
f:= One( F );
eps:= xi^( ex/2 );
else
f:= xi;
eps:= xi^( ( ex-1 )/2 );
fi;
else
eps:= f^( Size( F )/2 );
f:= One( F );
fi;
elif F = Rationals then u:= LieAlgDBHelper.sq_free( f );
eps:= u[1];
f:= u[2];
else
eps:= 1;
fi;
# take care of the coboundary...
cx[6]:= cx[6] - c1*cx[4]-c2*cx[5];
Add( imgs, LinearCombination( Basis( N ), cx ) );
od;
return rec( type:= [ 6, 20 ], f:= LieAlgDBHelper.liealg_hom( K, N, Basis( K ), imgs ) );
fi;
else # i.e., b = 0
f:= coc21( bM[3],bM[5] );
if not IsZero( f ) then
ff:= ShallowCopy( f );
if IsFinite( F ) then
if not Characteristic( F )= 2 then
xi:= PrimitiveElement( F );
ex:= LogFFE( f, xi );
if IsEvenInt( ex ) then
f:= One( F );
eps:= xi^( ex/2 );
else
f:= xi;
eps:= xi^( ( ex-1 )/2 );
fi;
else
eps:= f^( Size( F )/2 );
f:= One( F );
fi;
elif F = Rationals then u:= LieAlgDBHelper.sq_free( f );
eps:= u[1];
f:= u[2];
else
eps:= 1;
fi;
aa:= ShallowCopy( a );
if IsFinite( F ) then
if not Characteristic( F )= 2 then
xi:= PrimitiveElement( F );
ex:= LogFFE( c/a, xi );
if IsEvenInt( ex ) then
c:= One( F )*a;
eps:= xi^( ex/2 );
else
c:= xi*a;
eps:= xi^( ( ex-1 )/2 );
fi;
else
eps:= ( c/a )^( Size( F )/2 );
c:= One( F )*a;
fi;
elif F = Rationals then u:= LieAlgDBHelper.sq_free( c/a );
eps:= u[1];
c:= u[2]*a;
else
eps:= 1;
fi;
# take care of the coboundary...
cx[6]:= cx[6] - c1*cx[3]-c2*cx[4]-c3*cx[5];
cx[6]:= cx[6]/b;
Add( imgs, LinearCombination( Basis( N ), cx ) );
od;
return rec( type:= [ 6, 34 ], f:= LieAlgDBHelper.liealg_hom( K, N, Basis( K ), imgs ) );
fi;
elif type = [ 4, 1 ] then
coc21:= function( u, v ) return Coefficients( Basis( C ), coc2( u,v ) )[1]; end;
coc22:= function( u, v ) return Coefficients( Basis( C ), coc2( u,v ) )[2]; end;
bM:= LieAlgDBHelper.skew_symm_NF( M, coc21 );
if IsZero( coc21( bM[3],bM[4] ) ) then
# find a linear combination of coc21, coc22 that is nondegenerate:
y:= coc22( bM[1],bM[2] ); a:= coc22( bM[1],bM[3] ); b:= coc22( bM[1],bM[4] ); c:= coc22( bM[2],bM[3] );
d:= coc22( bM[2],bM[4] ); e:= coc22( bM[3],bM[4] );
if IsZero( a*d-b*c ) then
x:= 1-y;
else
x:= -y;
fi;
if IsZero( x ) then
store:= coc21;
coc21:= coc22;
# so now coc21 has become coc22, need to make coc22 equal to
# the old coc21 ( otherwise no longer independent ).
coc22:= store;
r:= 1; t:= 0;
u:= x; v:= 1;
# i.e., we have made abase change in the centre, corresponding
# to theta_1 --> u*theta_1 + v*\theta_2
# theta_2 --> r*theta_1 + t*\theta_2
else
u:= 1; v:= 0;
r:= 0; t:= 1;
fi;
y:= coc22( bM[1],bM[2] );
if not IsZero( y ) then
f2:= coc22;
coc22:= function( u,v ) return -y*coc21( u,v )+f2( u,v ); end;
r:= -u*y+r; t:= -v*y+t;
# a new base change...
fi;
a:= coc22( bM[1],bM[3] );
if IsZero( a ) then
# try to make it not 0: b:= coc22( bM[1],bM[4] );
c:= coc22( bM[2],bM[3] );
d:= coc22( bM[2],bM[4] );
bb:= ShallowCopy( b );
if not IsZero( b ) then
if IsFinite( F ) then
if not Characteristic( F )= 2 then
xi:= PrimitiveElement( F );
ex:= LogFFE( b, xi );
if IsEvenInt( ex ) then b:= One( F );
eps:= xi^( ex/2 );
else b:= xi;
eps:= xi^( ( ex-1 )/2 );
fi;
else
eps:= b^( Size( F )/2 ); b:= Zero( F );
fi;
elif F = Rationals then
uu:= LieAlgDBHelper.sq_free( b );
eps:= uu[1]; b:= uu[2];
else
eps:= 1;
fi;
fi;
if not IsZero( bb ) then
# isom
cx[1]:= cx[1]/eps;
cx[3]:= cx[3]/eps;
cx[5]:= cx[5]/eps;
cx[6]:= cx[6]/eps^2;
if Characteristic( F )= 2 then
# isom
cx1:= ShallowCopy( cx );
cx1[1]:= cx[1]+cx[4];
cx1[2]:= cx[2];
cx1[3]:= cx[2]+cx[3];
cx1[4]:= cx[1];
cx1[5]:= cx[6];
cx1[6]:= cx[5]+cx[6];
cx:= ShallowCopy( cx1 );
fi;
fi;
Add( imgs, LinearCombination( Basis( N ), cx ) );
od;
return rec( type:= [ 6, 22, b ], f:= LieAlgDBHelper.liealg_hom( K, N, Basis( K ), imgs ) );
else
# make it 1:
bM[2]:= bM[2]/e; bM[4]:= bM[4]/e; a:= coc22( bM[2],bM[4] );
if not Characteristic( F )= 2 then
if not IsZero( a ) and not IsZero( a+1/4 ) then
b:= a+1/4;
elif IsZero( a ) then
b:= One( F );
elif IsZero( a+1/4 ) then
b:= Zero( F );
fi;
bb:= ShallowCopy( b );
if not IsZero( b ) then
if IsFinite( F ) then
xi:= PrimitiveElement( F );
ex:= LogFFE( b, xi );
if IsEvenInt( ex ) then b:= One( F );
eps:= xi^( ex/2 );
else b:= xi;
eps:= xi^( ( ex-1 )/2 );
fi;
elif F = Rationals then
uu:= LieAlgDBHelper.sq_free( b );
eps:= uu[1]; b:= uu[2];
else
eps:= 1;
fi;
fi;
if not IsZero( bb ) then
# isom
cx[1]:= cx[1]/eps;
cx[3]:= cx[3]/eps;
cx[5]:= cx[5]/eps;
cx[6]:= cx[6]/eps^2;
fi;
Add( imgs, LinearCombination( Basis( N ), cx ) );
od;
return rec( type:= [ 6, 22, b ], f:= LieAlgDBHelper.liealg_hom( K, N, Basis( K ), imgs ) );
else
b:= coc22( bM[2],bM[4] );
bb:= ShallowCopy( b );
if not IsZero( b ) then
if IsFinite( F ) then
ex:= First( [0..( Size( F )-1 )],i->Trace( F,PrimitiveElement( F )^i )= One( F ) );
xi:= PrimitiveElement( F )^ex; P:= PolynomialRing( F,["y"] );
y:= P.1;
if Trace( F, b )= Zero( F ) then
root:= Factors( P,y^2+y+b )[1];
eps:= CoefficientsOfUnivariatePolynomial( root )[1]; b:= Zero( F );
else
root:= Factors( P,y^2+y+b+xi )[1];
eps:= CoefficientsOfUnivariatePolynomial( root )[1]; b:= xi;
fi;
else
eps:= 1;
fi;
fi;
coc21:= function( u, v ) return Coefficients( Basis( C ), coc2( u,v ) )[1]; end;
coc22:= function( u, v ) return Coefficients( Basis( C ), coc2( u,v ) )[2]; end;
bM:= ShallowCopy( BasisVectors( Basis( M ) ) );
# coc21 can be moved to one of three normal forms a:= coc21( bM[1],bM[3] ); b:= coc21( bM[1],bM[4] );
c:= coc21( bM[2],bM[3] );
d:= coc21( bM[2],bM[4] );
if IsZero( a ) and not IsZero( c ) then # make a not zero
bb:= ShallowCopy( b );
if not IsZero( b ) then
if IsFinite( F ) then
if not Characteristic( F )= 2 then
xi:= PrimitiveElement( F );
ex:= LogFFE( b, xi );
if IsEvenInt( ex ) then b:= One( F );
eps:= xi^( ex/2 );
else b:= xi;
eps:= xi^( ( ex-1 )/2 );
fi;
else
eps:= b^( Size( F )/2 ); b:= Zero( F );
fi;
elif F = Rationals then
uu:= LieAlgDBHelper.sq_free( b );
eps:= uu[1]; b:= uu[2];
else
eps:= 1;
fi;
fi;
bb:= ShallowCopy( b );
if not IsZero( b ) then
if IsFinite( F ) then
xi:= PrimitiveElement( F );
ex:= LogFFE( b, xi );
if IsEvenInt( ex ) then b:= One( F );
eps:= xi^( ex/2 );
else b:= xi;
eps:= xi^( ( ex-1 )/2 );
fi;
elif F = Rationals then
uu:= LieAlgDBHelper.sq_free( b );
eps:= uu[1]; b:= uu[2];
else
eps:= 1;
fi;
fi;
bb:= ShallowCopy( b );
if not IsZero( b ) then
if IsFinite( F ) then
ex:= First( [0..( Size( F )-1 )],i->Trace( F,PrimitiveElement( F )^i )= One( F ) );
xi:= PrimitiveElement( F )^ex; P:= PolynomialRing( F,["y"] );
y:= P.1;
if Trace( F,b )= Zero( F ) then
root:= Factors( P,y^2+y+b )[1];
eps:= CoefficientsOfUnivariatePolynomial( root )[1]; b:= Zero( F );
else
root:= Factors( P,y^2+y+b+xi )[1];
eps:= CoefficientsOfUnivariatePolynomial( root )[1]; b:= xi;
fi;
else
eps:= 1;
fi;
fi;
coc21:= function( u, v ) return Coefficients( Basis( C ), coc2( u,v ) )[1]; end;
coc22:= function( u, v ) return Coefficients( Basis( C ), coc2( u,v ) )[2]; end;
coc21:= function( u, v ) return Coefficients( Basis( C ), coc2( u,v ) )[1]; end;
coc22:= function( u, v ) return Coefficients( Basis( C ), coc2( u,v ) )[2]; end;
coc23:= function( u, v ) return Coefficients( Basis( C ), coc2( u,v ) )[3]; end;
local r, t, a, g, exp, c, K, imgs, pp, s, f, F, name;
if (not Dimension(L) in [5,6]) or (not IsLieNilpotent(L)) then
Error("This function is only implemented for nilpotent Lie algebras of dim 5,6");
fi;
if Dimension(L) = 5 then
r:= LieAlgDBHelper.class_dim_5( L );
else
r:= LieAlgDBHelper.class_dim_6( L );
fi;
n:= Dimension(L);
if n in [2,3,4] then
if not IsLieSolvable(L) then Error("<L> has to be a solvable Lie algebra"); fi;
r:= LieAlgDBHelper.solv_type(L);
elif n in [5,6] then
if not IsLieNilpotent(L) then Error("<L> has to be a nilpotent Lie algebra"); fi;
r:= LieAlgDBHelper.nilp_type(L);
else
Error("the dimension has to satisfy 2<= dim <= 6");
fi;
return rec( name:= r.name[1], parameters:= r.name[2], isomorphism:= r.isom );
end );
InstallMethod( AllSolvableLieAlgebras,
"for a finite field and a positive integer",
true,
[ IsField and IsFinite, IsPosInt ], 0,
function( F, dim )
local parlist, R, fam;
if not IsFinite(F) then Error("F has to be a finite field"); fi;
if not dim in [1,2,3,4] then Error("solvable Lie algebras of this dimension are not included"); fi;
if dim = 1 then
parlist := [[1,1]];
elif dim = 2 then
parlist:= [[2,1],[2,2]];
elif dim = 3 then
parlist := EnumeratorByFunctions( NewFamily( IsList ),
rec(
ElementNumber := function( e, x )
local aa;
aa:= [ Zero(F), One(F) ];
if Characteristic( F ) > 2 then
Add( aa, PrimitiveRoot(F) );
fi;
if x in [1,2] then
return [3,x];
elif x in [3..Size( F )+2] then
return [3,3,Enumerator( F )[x-2]];
elif Characteristic( F ) = 2 and x in [Size( F )+3..Size( F )+4]
then return [3,4,aa[x-Size(F)-2]];
elif Characteristic( F ) <> 2 and x in [Size( F )+3..Size( F )+5]
then return [3,4,aa[x-Size(F)-2]];
fi;
end,
NumberElement := function( e, x )
local list1, list2;
list1 := [[3,1],[3,2]];
list2 := [[3,4,Zero(F)],[3,4,One(F)]];
if Characteristic( F ) > 2 then
Add( list2, [3,4,PrimitiveRoot(F)]);
fi;
if x in list1 then
return Position( list1, x );
elif x{[1,2]} = [3,3] then
return Position( Enumerator( F ), x[3] ) + 2;
elif x in list2 then
return Position( list2, x ) + Size( F )+2;
fi;
end,
Length := function( e )
if Characteristic( F ) = 2 then
return Size( F )+4;
else
return Size( F )+5;
fi;
end ));
elif dim = 4 then
parlist := EnumeratorByFunctions( NewFamily( IsList ),
rec(
ElementNumber := function( e, x )
local a, T, i, ff, q, l1, l2, l3, l4, l5;
if x in [1,2] then
return [4,x];
elif x in [3..Size( F )+2] then
return [4,3,Enumerator( F )[x-2]];
elif x in [Size( F )+3..Size( F )+4] then
return [4,x-Size(F)+1];
elif x in [Size(F)+5..Size(F)^2+Size(F)+4] then
return [4,6,
Enumerator( F )[Int((x-Size( F )-5)/Size( F ))+1],
Enumerator( F )[((x-Size(F)-5) mod Size( F ))+1]];
elif x in [Size(F)^2+Size(F)+5..Size(F)^2+2*Size(F)+4] then
return [4,7,Enumerator( F )[x-(Size(F)^2+Size(F)+4)],
Enumerator( F )[x-(Size(F)^2+Size(F)+4)]];
elif x = Size(F)^2+2*Size(F)+5 then
return [4,8];
elif x = Size(F)^2+2*Size(F)+6 then
a:= PrimitiveRoot( F );
T:= Indeterminate(F);
for i in [1..q-1] do
ff:= Factors( T^2-T-a^i );
if Length(ff) = 1 then
return [4,9,a^i];
break;
fi;
od;
elif x = Size(F)^2+2*Size(F)+7 then
return [4,12];
elif x in [Size(F)^2+2*Size(F)+8..Size(F)^2+3*Size(F)+7] then
return [4,13,Enumerator( F )[x-(Size(F)^2+2*Size(F)+7)]];
elif q mod 6 = 1 and
x in [Size(F)^2+3*Size(F)+8..Size(F)^2+3*Size(F)+14] then
return l1[x-(Size(F)^2+3*Size(F)+7)];
elif q mod 6 = 2 and
x in [Size(F)^2+3*Size(F)+8..Size(F)^2+3*Size(F)+11] then
return l2[x-(Size(F)^2+3*Size(F)+7)];
elif q mod 6 = 3 and
x in [Size(F)^2+3*Size(F)+8..Size(F)^2+3*Size(F)+12] then
return l3[x-(Size(F)^2+3*Size(F)+7)];
elif q mod 6 = 4 and
x in [Size(F)^2+3*Size(F)+8..Size(F)^2+3*Size(F)+13] then
return l4[x-(Size(F)^2+3*Size(F)+7)];
elif q mod 6 = 5 and
x in [Size(F)^2+3*Size(F)+8..Size(F)^2+3*Size(F)+12] then
return l5[x-(Size(F)^2+3*Size(F)+7)];
fi;
end,
NumberElement := function( e, x )
local q, a, l1, l2, l3, l4, l5;
q:= Size( F ); a := PrimitiveRoot( F );
if x[2] in [1,2] then
return x[2];
elif x[2] = 3 then
return Position( Enumerator( F ), x[3] )+2;
elif x[2] in [4,5] then
return Size( F )+x[2]-1;
elif x[2] = 6 then
return Size( F )+4+(Position( Enumerator( F ), x[3])-1)*
Size( F )+Position( Enumerator( F ), x[4] );
elif x[2] = 7 and x[3]=x[4] then
return Size(F)^2+Size(F)+4+Position( Enumerator( F ), x[3] );
elif x[2] = 8 then
return Size(F)^2+2*Size(F)+5;
elif x[2] = 9 then
return Size(F)^2+2*Size(F)+6;
elif x[2] = 12 then
return Size(F)^2+2*Size(F)+7;
elif x[2] = 13 then
return Size(F)^2+2*Size(F)+7+
Position( Enumerator( F ), x[3] );
elif q mod 6 = 1 and x in l1 then
return Size(F)^2+3*Size(F)+7+Position( l1, x );
elif q mod 6 = 2 and x in l2 then
return Size(F)^2+3*Size(F)+7+Position( l2, x );
elif q mod 6 = 3 and x in l3 then
return Size(F)^2+3*Size(F)+7+Position( l3, x );
elif q mod 6 = 4 and x in l4 then
return Size(F)^2+3*Size(F)+7+Position( l4, x );
elif q mod 6 = 5 and x in l5 then
return Size(F)^2+3*Size(F)+7+Position( l5, x );
fi;
end,
Length := function( e )
local q;
q := Size( F );
if q mod 6 = 1 then
return q^2+3*q+14;
elif q mod 6 = 2 then
return q^2+3*q+11;
elif q mod 6 = 3 then
return q^2+3*q+12;
elif q mod 6 = 4 then
return q^2+3*q+13;
elif q mod 6 = 5 then
return q^2+3*q+12;
fi;
end ));
else
Error( "not yet implemented" );
fi;
R := rec( field := F,
dim := dim,
type := "Solvable",
parlist := parlist );
fam := NewFamily( IsLieAlgDBCollection_Solvable );
R := Objectify( NewType( fam, IsLieAlgDBCollection_Solvable ), R );
return R;
end );
InstallMethod( Enumerator,
"method for LieAlgDBCollections",
[ IsLieAlgDBCollection_Solvable ],
function( R )
return EnumeratorByFunctions( NewFamily(
CategoryCollections( IsLieAlgebra )),
rec(
ElementNumber := function( e, n )
local par;
par := R!.parlist[n];
return SolvableLieAlgebra( R!.field, par );
end,
NumberElement := function( e, x )
return Position( R!.parlist, x!.arg );
end,
Length := function( x ) return Length( R!.parlist ); end ));
end );
Messung V0.5 in Prozent
¤ Diese beiden folgenden Angebotsgruppen bietet das Unternehmen0.391Angebot
¤
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.