|
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 ) >= 2 then
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=1 then
if no > 1 then
Error( "the second element of <data> has to be <= 1" );
fi;
elif d=2 then
if no > 2 then
Error("the second element of <data> has to be <= 2");
fi;
elif d=3 then
if no > 4 then
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 ) >=3 then
a:= data[3];
fi;
if Length( data ) >= 4 then
b:= data[4];
fi;
if d = 1 then
S:= EmptySCTable( 1, Zero(F), "antisymmetric" );
L := LieAlgebraByStructureConstants( F, S );
L!.arg := data;
return L;
elif d = 2 then
if no=1 then
S:= EmptySCTable( 2, Zero(F), "antisymmetric" );
L := LieAlgebraByStructureConstants( F, S );
L!.arg := data;
return L;
else
S:= EmptySCTable( 2, Zero(F), "antisymmetric" );
SetEntrySCTable( S, 2, 1, [One(F),1] );
L := LieAlgebraByStructureConstants( F, S );
L!.arg := data;
return L;
fi;
elif d=3 then
if no=1 then
S:= EmptySCTable( 3, Zero(F), "antisymmetric" );
L := LieAlgebraByStructureConstants( F, S );
L!.arg := data;
return L;
elif no=2 then
S:= EmptySCTable( 3, Zero(F), "antisymmetric" );
SetEntrySCTable( S, 3, 1, [One(F),1] );
SetEntrySCTable( S, 3, 2, [One(F),2] );
L := LieAlgebraByStructureConstants( F, S );
L!.arg := data;
return L;
elif no=3 then
S:= EmptySCTable( 3, Zero(F), "antisymmetric" );
SetEntrySCTable( S, 3, 1, [One(F),2] );
SetEntrySCTable( S, 3, 2, [a,1,One(F),2] );
L := LieAlgebraByStructureConstants( F, S );
L!.arg := data;
return L;
else
S:= EmptySCTable( 3, Zero(F), "antisymmetric" );
SetEntrySCTable( S, 3, 1, [One(F),2] );
SetEntrySCTable( S, 3, 2, [a,1] );
L := LieAlgebraByStructureConstants( F, S );
L!.arg := data;
return L;
fi;
else
if no=1 then
S:= EmptySCTable( 4, Zero(F), "antisymmetric" );
L := LieAlgebraByStructureConstants( F, S );
L!.arg := data;
return L;
elif no=2 then
S:= EmptySCTable( 4, Zero(F), "antisymmetric" );
SetEntrySCTable( S, 4, 1, [One(F),1] );
SetEntrySCTable( S, 4, 2, [One(F),2] );
SetEntrySCTable( S, 4, 3, [One(F),3] );
L := LieAlgebraByStructureConstants( F, S );
L!.arg := data;
return L;
elif no=3 then
S:= EmptySCTable( 4, Zero(F), "antisymmetric" );
SetEntrySCTable( S, 4, 1, [One(F),1] );
SetEntrySCTable( S, 4, 2, [One(F),3] );
SetEntrySCTable( S, 4, 3, [-a,2,a+One(F),3] );
L := LieAlgebraByStructureConstants( F, S );
L!.arg := data;
return L;
elif no = 4 then
S:= EmptySCTable( 4, Zero(F), "antisymmetric" );
SetEntrySCTable( S, 4, 2, [One(F),3] );
SetEntrySCTable( S, 4, 3, [One(F),3] );
L := LieAlgebraByStructureConstants( F, S );
L!.arg := data;
return L;
elif no = 5 then
S:= EmptySCTable( 4, Zero(F), "antisymmetric" );
SetEntrySCTable( S, 4, 2, [One(F),3] );
L := LieAlgebraByStructureConstants( F, S );
L!.arg := data;
return L;
elif no = 6 then
S:= EmptySCTable( 4, Zero(F), "antisymmetric" );
SetEntrySCTable( S, 4, 1, [One(F),2] );
SetEntrySCTable( S, 4, 2, [One(F),3] );
SetEntrySCTable( S, 4, 3, [a,1,b,2,One(F),3] );
L := LieAlgebraByStructureConstants( F, S );
L!.arg := data;
return L;
elif no = 7 then
S:= EmptySCTable( 4, Zero(F), "antisymmetric" );
SetEntrySCTable( S, 4, 1, [One(F),2] );
SetEntrySCTable( S, 4, 2, [One(F),3] );
SetEntrySCTable( S, 4, 3, [a,1,b,2] );
L := LieAlgebraByStructureConstants( F, S );
L!.arg := data;
return L;
elif no=8 then
S:= EmptySCTable( 4, Zero(F), "antisymmetric" );
SetEntrySCTable( S, 1, 2, [One(F),2] );
SetEntrySCTable( S, 3, 4, [One(F),4] );
L := LieAlgebraByStructureConstants( F, S );
L!.arg := data;
return L;
elif no=9 then
S:= EmptySCTable( 4, Zero(F), "antisymmetric" );
SetEntrySCTable( S, 4, 1, [One(F),1,a,2] );
SetEntrySCTable( S, 4, 2, [One(F),1] );
SetEntrySCTable( S, 3, 1, [One(F),1] );
SetEntrySCTable( S, 3, 2, [One(F),2] );
L := LieAlgebraByStructureConstants( F, S );
L!.arg := data;
return L;
elif no=10 then
S:= EmptySCTable( 4, Zero(F), "antisymmetric" );
SetEntrySCTable( S, 4, 1, [One(F),2] );
SetEntrySCTable( S, 4, 2, [a,1] );
SetEntrySCTable( S, 3, 1, [One(F),1] );
SetEntrySCTable( S, 3, 2, [One(F),2] );
L := LieAlgebraByStructureConstants( F, S );
L!.arg := data;
return L;
elif no=11 then
if Characteristic(F) <> 2 then
Error( "The characteristic of F has to be 2 for L4_11");
fi;
S:= EmptySCTable( 4, Zero(F), "antisymmetric" );
SetEntrySCTable( S, 4, 1, [One(F),1] );
SetEntrySCTable( S, 4, 2, [b,2] );
SetEntrySCTable( S, 4, 3, [One(F)+b,3] );
SetEntrySCTable( S, 3, 1, [One(F),2] );
SetEntrySCTable( S, 3, 2, [a,1] );
L := LieAlgebraByStructureConstants( F, S );
L!.arg := data;
return L;
elif no=12 then
S:= EmptySCTable( 4, Zero(F), "antisymmetric" );
SetEntrySCTable( S, 4, 1, [One(F),1] );
SetEntrySCTable( S, 4, 2, [2*One(F),2] );
SetEntrySCTable( S, 4, 3, [One(F),3] );
SetEntrySCTable( S, 3, 1, [One(F),2] );
L := LieAlgebraByStructureConstants( F, S );
L!.arg := data;
return L;
elif no=13 then
S:= EmptySCTable( 4, Zero(F), "antisymmetric" );
SetEntrySCTable( S, 4, 1, [One(F),1,a,3] );
SetEntrySCTable( S, 4, 2, [One(F),2] );
SetEntrySCTable( S, 4, 3, [One(F),1] );
SetEntrySCTable( S, 3, 1, [One(F),2] );
L := LieAlgebraByStructureConstants( F, S );
L!.arg := data;
return L;
else
S:= EmptySCTable( 4, Zero(F), "antisymmetric" );
SetEntrySCTable( S, 4, 1, [a,3] );
SetEntrySCTable( S, 4, 3, [One(F),1] );
SetEntrySCTable( S, 3, 1, [One(F),2] );
L := LieAlgebraByStructureConstants( F, S );
L!.arg := data;
return L;
fi;
fi;
end );
InstallMethod( NilpotentLieAlgebra, "for a field and a list", true,
[ IsField, IsList ], 0,
function( F, data )
local L, d, no, a, ff, arg,
N1_1, N2_1, N3_1, N3_2, N4_1, N4_2, N4_3, N5_1, N5_2, N5_3,
N5_4, N5_5, N5_6, N5_7, N5_8, N5_9, 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 ;
N1_1 := function( F )
local T;
T := EmptySCTable( 1, Zero(F), "antisymmetric" );
return LieAlgebraByStructureConstants( F, T );
end;
N2_1 := function( F )
local T;
T := EmptySCTable( 2, Zero(F), "antisymmetric" );
return LieAlgebraByStructureConstants( F, T );
end;
N3_1 := function( F )
local T;
T := EmptySCTable( 3, Zero(F), "antisymmetric" );
return LieAlgebraByStructureConstants( F, T );
end;
N3_2 := function( F )
local T;
T := EmptySCTable( 3, Zero(F), "antisymmetric" );
SetEntrySCTable( T, 1, 2, [1,3] );
return LieAlgebraByStructureConstants( F, T );
end;
N4_1 := function( F )
local T;
T := EmptySCTable( 4, Zero(F), "antisymmetric" );
return LieAlgebraByStructureConstants( F, T );
end;
N4_2 := function( F )
local T;
T := EmptySCTable( 4, Zero(F), "antisymmetric" );
SetEntrySCTable( T, 1, 2, [1,3] );
return LieAlgebraByStructureConstants( F, T );
end;
N4_3 := function( F )
local T;
T := EmptySCTable( 4, Zero(F), "antisymmetric" );
SetEntrySCTable( T, 1, 2, [1,3] );
SetEntrySCTable( T, 1, 3, [1,4] );
return LieAlgebraByStructureConstants( F, T );
end;
N5_1:= function( F )
local T;
T:= EmptySCTable( 5, Zero(F), "antisymmetric" );
return LieAlgebraByStructureConstants( F, T );
end;
N5_2:= function( F )
local T;
T:= EmptySCTable( 5, Zero(F), "antisymmetric" );
SetEntrySCTable( T, 1, 2, [1,3] );
return LieAlgebraByStructureConstants( F, T );
end;
N5_3:= function( F )
local T;
T:= EmptySCTable( 5, Zero(F), "antisymmetric" );
SetEntrySCTable( T, 1, 2, [1,3] );
SetEntrySCTable( T, 1, 3, [1,4] );
return LieAlgebraByStructureConstants( F, T );
end;
N5_4:= function( F )
local T;
T:= EmptySCTable( 5, Zero(F), "antisymmetric" );
SetEntrySCTable( T, 1, 2, [1,5] );
SetEntrySCTable( T, 3, 4, [1,5] );
return LieAlgebraByStructureConstants( F, T );
end;
N5_5:= function( F )
local T;
T:= EmptySCTable( 5, Zero(F), "antisymmetric" );
SetEntrySCTable( T, 1, 2, [1,3] );
SetEntrySCTable( T, 1, 3, [1,5] );
SetEntrySCTable( T, 2, 4, [1,5] );
return LieAlgebraByStructureConstants( F, T );
end;
N5_6:= function( F )
local T;
T:= EmptySCTable( 5, Zero(F), "antisymmetric" );
SetEntrySCTable( T, 1, 2, [1,3] );
SetEntrySCTable( T, 1, 3, [1,4] );
SetEntrySCTable( T, 1, 4, [1,5] );
SetEntrySCTable( T, 2, 3, [1,5] );
return LieAlgebraByStructureConstants( F, T );
end;
N5_7:= function( F )
local T;
T:= EmptySCTable( 5, Zero(F), "antisymmetric" );
SetEntrySCTable( T, 1, 2, [1,3] );
SetEntrySCTable( T, 1, 3, [1,4] );
SetEntrySCTable( T, 1, 4, [1,5] );
return LieAlgebraByStructureConstants( F, T );
end;
N5_8:= function( F )
local T;
T:= EmptySCTable( 5, Zero(F), "antisymmetric" );
SetEntrySCTable( T, 1, 2, [1,4] );
SetEntrySCTable( T, 1, 3, [1,5] );
return LieAlgebraByStructureConstants( F, T );
end;
N5_9:= function( F )
local T;
T:= EmptySCTable( 5, Zero(F), "antisymmetric" );
SetEntrySCTable( T, 1, 2, [1,3] );
SetEntrySCTable( T, 1, 3, [1,4] );
SetEntrySCTable( T, 2, 3, [1,5] );
return LieAlgebraByStructureConstants( F, T );
end;
N6_1:= function( F )
local T;
T:= EmptySCTable( 6, Zero(F), "antisymmetric" );
return LieAlgebraByStructureConstants( F, T );
end;
N6_2:= function( F )
local T;
T:= EmptySCTable( 6, Zero(F), "antisymmetric" );
SetEntrySCTable( T, 1, 2, [1,3] );
return LieAlgebraByStructureConstants( F, T );
end;
N6_3:= function( F )
local T;
T:= EmptySCTable( 6, Zero(F), "antisymmetric" );
SetEntrySCTable( T, 1, 2, [1,3] );
SetEntrySCTable( T, 1, 3, [1,4] );
return LieAlgebraByStructureConstants( F, T );
end;
N6_4:= function( F )
local T;
T:= EmptySCTable( 6, Zero(F), "antisymmetric" );
SetEntrySCTable( T, 1, 2, [1,5] );
SetEntrySCTable( T, 3, 4, [1,5] );
return LieAlgebraByStructureConstants( F, T );
end;
N6_5:= function( F )
local T;
T:= EmptySCTable( 6, Zero(F), "antisymmetric" );
SetEntrySCTable( T, 1, 2, [1,3] );
SetEntrySCTable( T, 1, 3, [1,5] );
SetEntrySCTable( T, 2, 4, [1,5] );
return LieAlgebraByStructureConstants( F, T );
end;
N6_6:= function( F )
local T;
T:= EmptySCTable( 6, Zero(F), "antisymmetric" );
SetEntrySCTable( T, 1, 2, [1,3] );
SetEntrySCTable( T, 1, 3, [1,4] );
SetEntrySCTable( T, 1, 4, [1,5] );
SetEntrySCTable( T, 2, 3, [1,5] );
return LieAlgebraByStructureConstants( F, T );
end;
N6_7:= function( F )
local T;
T:= EmptySCTable( 6, Zero(F), "antisymmetric" );
SetEntrySCTable( T, 1, 2, [1,3] );
SetEntrySCTable( T, 1, 3, [1,4] );
SetEntrySCTable( T, 1, 4, [1,5] );
return LieAlgebraByStructureConstants( F, T );
end;
N6_8:= function( F )
local T;
T:= EmptySCTable( 6, Zero(F), "antisymmetric" );
SetEntrySCTable( T, 1, 2, [1,4] );
SetEntrySCTable( T, 1, 3, [1,5] );
return LieAlgebraByStructureConstants( F, T );
end;
N6_9:= function( F )
local T;
T:= EmptySCTable( 6, Zero(F), "antisymmetric" );
SetEntrySCTable( T, 1, 2, [1,3] );
SetEntrySCTable( T, 1, 3, [1,4] );
SetEntrySCTable( T, 2, 3, [1,5] );
return LieAlgebraByStructureConstants( F, T );
end;
N6_10:= function( F )
local T;
T:= EmptySCTable( 6, Zero(F), "antisymmetric" );
SetEntrySCTable( T, 1, 2, [1,3] );
SetEntrySCTable( T, 1, 3, [1,6] );
SetEntrySCTable( T, 4, 5, [1,6] );
return LieAlgebraByStructureConstants( F, T );
end;
N6_11:= function( F )
local T;
T:= EmptySCTable( 6, Zero(F), "antisymmetric" );
SetEntrySCTable( T, 1, 2, [1,3] );
SetEntrySCTable( T, 1, 3, [1,4] );
SetEntrySCTable( T, 1, 4, [1,6] );
SetEntrySCTable( T, 2, 3, [1,6] );
SetEntrySCTable( T, 2, 5, [1,6] );
return LieAlgebraByStructureConstants( F, T );
end;
N6_12:= function( F )
local T;
T:= EmptySCTable( 6, Zero(F), "antisymmetric" );
SetEntrySCTable( T, 1, 2, [1,3] );
SetEntrySCTable( T, 1, 3, [1,4] );
SetEntrySCTable( T, 1, 4, [1,6] );
SetEntrySCTable( T, 2, 5, [1,6] );
return LieAlgebraByStructureConstants( F, T );
end;
N6_13:= function( F )
local T;
T:= EmptySCTable( 6, Zero(F), "antisymmetric" );
SetEntrySCTable( T, 1, 2, [1,3] );
SetEntrySCTable( T, 1, 3, [1,5] );
SetEntrySCTable( T, 1, 5, [1,6] );
SetEntrySCTable( T, 2, 4, [1,5] );
SetEntrySCTable( T, 3, 4, [1,6] );
return LieAlgebraByStructureConstants( F, T );
end;
N6_14:= function( F )
local T;
T:= EmptySCTable( 6, Zero(F), "antisymmetric" );
SetEntrySCTable( T, 1, 2, [1,3] );
SetEntrySCTable( T, 1, 3, [1,4] );
SetEntrySCTable( T, 1, 4, [1,5] );
SetEntrySCTable( T, 2, 3, [1,5] );
SetEntrySCTable( T, 2, 5, [1,6] );
SetEntrySCTable( T, 3, 4, [-1,6] );
return LieAlgebraByStructureConstants( F, T );
end;
N6_15:= function( F )
local T;
T:= EmptySCTable( 6, Zero(F), "antisymmetric" );
SetEntrySCTable( T, 1, 2, [1,3] );
SetEntrySCTable( T, 1, 3, [1,4] );
SetEntrySCTable( T, 1, 4, [1,5] );
SetEntrySCTable( T, 1, 5, [1,6] );
SetEntrySCTable( T, 2, 3, [1,5] );
SetEntrySCTable( T, 2, 4, [1,6] );
return LieAlgebraByStructureConstants( F, T );
end;
N6_16:= function( F )
local T;
T:= EmptySCTable( 6, Zero(F), "antisymmetric" );
SetEntrySCTable( T, 1, 2, [1,3] );
SetEntrySCTable( T, 1, 3, [1,4] );
SetEntrySCTable( T, 1, 4, [1,5] );
SetEntrySCTable( T, 2, 5, [1,6] );
SetEntrySCTable( T, 3, 4, [-1,6] );
return LieAlgebraByStructureConstants( F, T );
end;
N6_17:= function( F )
local T;
T:= EmptySCTable( 6, Zero(F), "antisymmetric" );
SetEntrySCTable( T, 1, 2, [1,3] );
SetEntrySCTable( T, 1, 3, [1,4] );
SetEntrySCTable( T, 1, 4, [1,5] );
SetEntrySCTable( T, 1, 5, [1,6] );
SetEntrySCTable( T, 2, 3, [1,6] );
return LieAlgebraByStructureConstants( F, T );
end;
N6_18:= function( F )
local T;
T:= EmptySCTable( 6, Zero(F), "antisymmetric" );
SetEntrySCTable( T, 1, 2, [1,3] );
SetEntrySCTable( T, 1, 3, [1,4] );
SetEntrySCTable( T, 1, 4, [1,5] );
SetEntrySCTable( T, 1, 5, [1,6] );
return LieAlgebraByStructureConstants( F, T );
end;
N6_19:= function( F, a )
local T;
T:= EmptySCTable( 6, Zero(F), "antisymmetric" );
SetEntrySCTable( T, 1, 2, [1,4] );
SetEntrySCTable( T, 1, 3, [1,5] );
SetEntrySCTable( T, 1, 5, [1,6] );
SetEntrySCTable( T, 2, 4, [1,6] );
SetEntrySCTable( T, 3, 5, [a,6] );
return LieAlgebraByStructureConstants( F, T );
end;
N6_20:= function( F )
local T;
T:= EmptySCTable( 6, Zero(F), "antisymmetric" );
SetEntrySCTable( T, 1, 2, [1,4] );
SetEntrySCTable( T, 1, 3, [1,5] );
SetEntrySCTable( T, 1, 5, [1,6] );
SetEntrySCTable( T, 2, 4, [1,6] );
return LieAlgebraByStructureConstants( F, T );
end;
N6_21:= function( F, a )
local T;
T:= EmptySCTable( 6, Zero(F), "antisymmetric" );
SetEntrySCTable( T, 1, 2, [1,3] );
SetEntrySCTable( T, 1, 3, [1,4] );
SetEntrySCTable( T, 1, 4, [1,6] );
SetEntrySCTable( T, 2, 3, [1,5] );
SetEntrySCTable( T, 2, 5, [a,6] );
return LieAlgebraByStructureConstants( F, T );
end;
N6_22:= function( F, a )
local T;
T:= EmptySCTable( 6, Zero(F), "antisymmetric" );
SetEntrySCTable( T, 1, 2, [1,5] );
SetEntrySCTable( T, 1, 3, [1,6] );
SetEntrySCTable( T, 2, 4, [a,6] );
SetEntrySCTable( T, 3, 4, [1,5] );
return LieAlgebraByStructureConstants( F, T );
end;
N6_23:= function( F )
local T;
T:= EmptySCTable( 6, Zero(F), "antisymmetric" );
SetEntrySCTable( T, 1, 2, [1,3] );
SetEntrySCTable( T, 1, 3, [1,5] );
SetEntrySCTable( T, 1, 4, [1,6] );
SetEntrySCTable( T, 2, 4, [1,5] );
return LieAlgebraByStructureConstants( F, T );
end;
N6_24:= function( F, a )
local T;
T:= EmptySCTable( 6, Zero(F), "antisymmetric" );
SetEntrySCTable( T, 1, 2, [1,3] );
SetEntrySCTable( T, 1, 3, [1,5] );
SetEntrySCTable( T, 1, 4, [a,6] );
SetEntrySCTable( T, 2, 3, [1,6] );
SetEntrySCTable( T, 2, 4, [1,5] );
return LieAlgebraByStructureConstants( F, T );
end;
N6_25:= function( F )
local T;
T:= EmptySCTable( 6, Zero(F), "antisymmetric" );
SetEntrySCTable( T, 1, 2, [1,3] );
SetEntrySCTable( T, 1, 3, [1,5] );
SetEntrySCTable( T, 1, 4, [1,6] );
return LieAlgebraByStructureConstants( F, T );
end;
N6_26:= function( F )
local T;
T:= EmptySCTable( 6, Zero(F), "antisymmetric" );
SetEntrySCTable( T, 1, 2, [1,4] );
SetEntrySCTable( T, 1, 3, [1,5] );
SetEntrySCTable( T, 2, 3, [1,6] );
return LieAlgebraByStructureConstants( F, T );
end;
N6_27:= function( F )
local T;
T:= EmptySCTable( 6, Zero(F), "antisymmetric" );
SetEntrySCTable( T, 1, 2, [1,3] );
SetEntrySCTable( T, 1, 3, [1,5] );
SetEntrySCTable( T, 2, 4, [1,6] );
return LieAlgebraByStructureConstants( F, T );
end;
N6_28:= function( F )
local T;
T:= EmptySCTable( 6, Zero(F), "antisymmetric" );
SetEntrySCTable( T, 1, 2, [1,3] );
SetEntrySCTable( T, 1, 3, [1,4] );
SetEntrySCTable( T, 1, 4, [1,5] );
SetEntrySCTable( T, 2, 3, [1,6] );
return LieAlgebraByStructureConstants( F, T );
end;
N6_29:= function( F )
local T;
T:= EmptySCTable( 6, Zero(F), "antisymmetric" );
SetEntrySCTable( T, 1, 2, [1,3] );
SetEntrySCTable( T, 1, 3, [1,5] );
SetEntrySCTable( T, 1, 5, [1,6] );
SetEntrySCTable( T, 2, 4, [1,5,1,6] );
SetEntrySCTable( T, 3, 4, [1,6] );
return LieAlgebraByStructureConstants( F, T );
end;
N6_30:= function( F )
local T;
T:= EmptySCTable( 6, Zero(F), "antisymmetric" );
SetEntrySCTable( T, 1, 2, [1,3] );
SetEntrySCTable( T, 1, 3, [1,4] );
SetEntrySCTable( T, 1, 4, [1,5] );
SetEntrySCTable( T, 1, 5, [1,6] );
SetEntrySCTable( T, 2, 3, [1,5,1,6] );
SetEntrySCTable( T, 2, 4, [1,6] );
return LieAlgebraByStructureConstants( F, T );
end;
N6_31:= function( F, a )
local T;
T:= EmptySCTable( 6, Zero(F), "antisymmetric" );
SetEntrySCTable( T, 1, 2, [1,3] );
SetEntrySCTable( T, 1, 3, [1,4] );
SetEntrySCTable( T, 1, 4, [1,5] );
SetEntrySCTable( T, 2, 3, [1,5,a,6] );
SetEntrySCTable( T, 2, 5, [1,6] );
SetEntrySCTable( T, 3, 4, [1,6] );
return LieAlgebraByStructureConstants( F, T );
end;
N6_32:= function( F, a )
local T;
T:= EmptySCTable( 6, Zero(F), "antisymmetric" );
SetEntrySCTable( T, 1, 2, [1,3] );
SetEntrySCTable( T, 1, 3, [1,4] );
SetEntrySCTable( T, 1, 4, [1,5] );
SetEntrySCTable( T, 2, 3, [a,6] );
SetEntrySCTable( T, 2, 5, [1,6] );
SetEntrySCTable( T, 3, 4, [1,6] );
return LieAlgebraByStructureConstants( F, T );
end;
N6_33:= function( F )
local T;
T:= EmptySCTable( 6, Zero(F), "antisymmetric" );
SetEntrySCTable( T, 1, 2, [1,4] );
SetEntrySCTable( T, 1, 3, [1,5] );
SetEntrySCTable( T, 2, 5, [1,6] );
SetEntrySCTable( T, 3, 4, [1,6] );
return LieAlgebraByStructureConstants( F, T );
end;
N6_34:= function( F )
local T;
T:= EmptySCTable( 6, Zero(F), "antisymmetric" );
SetEntrySCTable( T, 1, 2, [1,3] );
SetEntrySCTable( T, 1, 3, [1,4] );
SetEntrySCTable( T, 1, 5, [1,6] );
SetEntrySCTable( T, 2, 3, [1,5] );
SetEntrySCTable( T, 2, 4, [1,6] );
return LieAlgebraByStructureConstants( F, T );
end;
N6_35:= function( F, a )
local T;
T:= EmptySCTable( 6, Zero(F), "antisymmetric" );
SetEntrySCTable( T, 1, 2, [1,5] );
SetEntrySCTable( T, 1, 3, [1,6] );
SetEntrySCTable( T, 2, 4, [a,6] );
SetEntrySCTable( T, 3, 4, [1,5,1,6] );
return LieAlgebraByStructureConstants( F, T );
end;
N6_36:= function( F, a )
local T;
T:= EmptySCTable( 6, Zero(F), "antisymmetric" );
SetEntrySCTable( T, 1, 2, [1,3] );
SetEntrySCTable( T, 1, 3, [1,5] );
SetEntrySCTable( T, 1, 4, [a,6] );
SetEntrySCTable( T, 2, 3, [1,6] );
SetEntrySCTable( T, 2, 4, [1,5,1,6] );
return LieAlgebraByStructureConstants( F, T );
end;
if not Length( data ) >= 2 then
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=1 then
if no > 1 then
Error( "the second element of <data> has to be <= 1" );
fi;
elif d=2 then
if no > 1 then
Error( "the second element of <data> has to be <= 1" );
fi;
elif d=3 then
if no > 2 then
Error( "the second element of <data> has to be <= 2" );
fi;
elif d=4 then
if no > 3 then
Error( "the second element of <data> has to be <= 3" );
fi;
elif d=5 then
if no > 9 then
Error("the second element of <data> has to be <= 9");
fi;
else
if no > 36 then
Error("the second element of <data> has to be <= 36");
fi;
fi;
if Length( data ) >= 3 then a:= data[3]; fi;
if d = 1 then
ff := [N1_1];
L := CallFuncList( ff[no], [ F ] );
L!.arg := data;
return L;
elif d = 2 then
ff := [N2_1];
L := CallFuncList( ff[no], [ F ] );
L!.arg := data;
return L;
elif d = 3 then
ff := [N3_1,N3_2];
L := CallFuncList( ff[no], [ F ] );
L!.arg := data;
return L;
elif d = 4 then
ff := [N4_1,N4_2,N4_3];
L := CallFuncList( ff[no], [ F ] );
L!.arg := data;
return L;
elif d = 5 then
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;
end );
BindGlobal("LieAlgDBHelper", rec());
LieAlgDBHelper.isomN:= function( L, x1, x2, x3, x4 )
# Here the xi satisfy the commutation relations of N;
# we produce the isomorphism with M_0^13...
local F, y1, y2, y3, y4, name, K, f;
F:= LeftActingDomain( L );
if Characteristic(F) <> 3 then
y1:= x1+x2;
y2:= 3*x1-(3/2*One(F))*x2;
y3:= x1+x2-x3+2*x4;
y4:= x3;
else
y1:= x2;
y2:= x1+x2;
y3:= x1-x2+x3+x4;
y4:= x1-x2+x3;
fi;
name:= "L4_13( ";
Append( name, LieAlgDBField2String( F ) );
Append( name, ", " );
Append( name, String( Zero(F) ) );
Append( name, " )" );
K:= SolvableLieAlgebra( F, [4,13, Zero(F)] );
f:= AlgebraHomomorphismByImages(K,L,Basis(K),[y1,y2,y3,y4]);
return rec( name:= [ name, [ Zero(F) ] ], isom:= f );
end;
LieAlgDBHelper.isomM9:= function( L, x1, x2, x3, x4, a )
# The xi satisfy the commutation rules of M9a; we return
# the isomorphism with either N, M8 or M9a
local F, T, pol, facs, dd, id, f, name, K, c, exp, prim, ef, b, q, i;
F:= LeftActingDomain( L );
if Characteristic(F) <> 2 and a = (-1/4)*One(F) then
return LieAlgDBHelper.isomN( L, x1, x2, x3, x4 );
fi;
T:= Indeterminate( F);
pol:= T^2-T-a;
facs:= Factors( pol );
if Length( facs ) = 2 then
#direct sum...
dd:= DirectSumDecomposition( L );
id:= LieAlgebraIdentification( dd[1] );
f:= id.isomorphism;
x1:= Image( f, Basis( Source(f) )[2] );
x2:= Image( f, Basis( Source(f) )[1] );
id:= LieAlgebraIdentification( dd[2] );
f:= id.isomorphism;
x3:= Image( f, Basis( Source(f) )[2] );
x4:= Image( f, Basis( Source(f) )[1] );
name:= "L4_8( ";
Append( name, LieAlgDBField2String( F ) );
Append( name, " )" );
K:= SolvableLieAlgebra( F, [4,8] );
f:= AlgebraHomomorphismByImages(K,L,Basis(K),[x1,x2,x3,x4]);
return rec( name:= [ name, [] ], isom:= f );
else
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 ) ) = 1 then
b:= prim^i;
break;
fi;
od;
if Characteristic(F) > 2 then
c:= (b+One(F)/4)/(a+One(F)/4);
exp:= LogFFE( c, PrimitiveRoot(F) );
c:= PrimitiveRoot(F)^(exp/2);
x1:= c*x1+((One(F)-c)/2)*x2;
x4:= ((One(F)-c)/2)*x3+c*x4;
else
facs:= Factors( T^2+T+a+b );
ef:= ExtRepPolynomialRatFun( facs[1] );
if Length( ef[1] ) = 0 then
c:= -ef[2];
else
c:= Zero( F );
fi;
x1:= x1+c*x2;
x4:= c*x3+x4;
fi;
else
b:= a;
fi;
name:= "L4_9( ";
Append( name, LieAlgDBField2String( F ) );
Append( name, ", " );
Append( name, String( b ) );
Append( name, " )" );
K:= SolvableLieAlgebra( F, [4,9, b] );
f:= AlgebraHomomorphismByImages(K,L,Basis(K),[x1,x2,x3,x4]);
return rec( name:= [ name, [ b ] ], isom:= f );
fi;
end;
LieAlgDBHelper.isomM10:= function( L, x1, x2, x3, x4, a )
# the xi satisfy the commutation rels of M10(a)
local f, b, y1, y2, y3, y4, name, K, F;
F:= LeftActingDomain( L );
if HasIsFinite(F) and IsFinite(F) then
f:= Inverse( FrobeniusAutomorphism(F) );
b:= Image( f, a );
y1:= x1;
y2:= b*x1+x2;
y3:= x3;
y4:= b*x3+x4;
name:= "L4_13( ";
Append( name, LieAlgDBField2String( F ) );
Append( name, ", " );
Append( name, String( Zero(F) ) );
Append( name, " )" );
K:= SolvableLieAlgebra( F, [4,13, Zero(F)] );
f:= AlgebraHomomorphismByImages(K,L,Basis(K),
[y1,y2,y1+y2+y4,y1+y2+y3]);
return rec( name:= [ name, [Zero(F)] ], isom:= f );
else
name:= "L4_10( ";
Append( name, LieAlgDBField2String( F ) );
Append( name, ", " );
Append( name, String( a ) );
Append( name, " )" );
K:= SolvableLieAlgebra( F, [4,10, a] );
f:= AlgebraHomomorphismByImages(K,L,Basis(K),[x1,x2,x3,x4]);
return rec( name:= [ name, [a] ], isom:= f );
fi;
end;
LieAlgDBHelper.isomM11:= function( L, x1, x2, x3, x4, a, b )
local name, K, f, gam, eps, del, y1, y2, y3, y4, F;
F:= LeftActingDomain(L);
if b = Zero(F) then
name:= "L4_11( ";
Append( name, LieAlgDBField2String( F ) );
Append( name, ", " );
Append( name, String( a ) );
Append( name, ", " );
Append( name, String( b ) );
Append( name, " )" );
K:= SolvableLieAlgebra( F, [4,11,a, b] );
f:= AlgebraHomomorphismByImages(K,L,Basis(K),[x1,x2,x3,x4]);
return rec( name:= [ name, [a,b] ], isom:= f );
elif HasIsFinite(F) and IsFinite(F) then
f:= Inverse( FrobeniusAutomorphism(F) );
gam:= Image( f, b/(a*(b^2+One(F))) );
eps:= Image( f, 1/a );
del:= 1/(1+b);
y1:= a*gam*x1+b*del*x2;
y2:= a*eps*b*del*x1+a*gam*eps*x2;
y3:= eps*x3;
y4:= gam*x3+del*x4;
name:= "L4_11( ";
Append( name, LieAlgDBField2String( F ) );
Append( name, ", " );
Append( name, String( One(F) ) );
Append( name, ", " );
Append( name, String( Zero(F) ) );
Append( name, " )" );
K:= SolvableLieAlgebra( F, [4,11, One(F), Zero(F)] );
f:= AlgebraHomomorphismByImages(K,L,Basis(K),[y1,y2,y3,y4]);
return rec( name:= [ name, [One(F),Zero(F)] ],isom:= f);
else
name:= "L4_11( ";
Append( name, LieAlgDBField2String( F ) );
Append( name, ", " );
Append( name, String( a ) );
Append( name, ", " );
Append( name, String( b ) );
Append( name, " )" );
K:= SolvableLieAlgebra( F, [4,11, a, b] );
f:= AlgebraHomomorphismByImages(K,L,Basis(K),[x1,x2,x3,x4]);
return rec( name:= [ name, [a,b] ], isom:= f );
fi;
end;
LieAlgDBHelper.solv_type:= function( L )
local n, F, sp, k, BL, b, x1, x2, x3, x4, c1, c2, K, f, name, par,
id, num, c3, c4, mat, is_diag, i, j, facs, ev, s, t, sol,
sevec, tevec, cfs, u, v, w, found, y1, y2, y3, y4, u1, u3,
v1, v3, a, D, adM, adK, dd, bK, b_adK, ef, ev1, ev2, mp, q, C,
R, exp;
n:= Dimension( L );
F:= LeftActingDomain( L );
sp:= LieDerivedSubalgebra( L );
k:= 1;
BL:= Basis( L );
while Dimension( sp ) < n-1 do
if not BL[k] in sp then
b:= ShallowCopy( BasisVectors( Basis(sp) ) );
Add( b, BL[k] );
sp:= Subspace( L, b );
fi;
k:= k+1;
od;
b:= Basis( sp );
if n = 2 then
x1:= b[1];
for k in [1,2] do
if not BL[k] in sp then
x2:= BL[k];
break;
fi;
od;
if x1*x2 = Zero(L) then
name:= "L2_1( ";
Append( name, LieAlgDBField2String( F ) );
Append( name, " )" );
K:= SolvableLieAlgebra( F, [2,1] );
f:= AlgebraHomomorphismByImages( K, L, Basis(K), Basis(L) );
return rec( name:= [ name, [] ], isom:= f );
fi;
c1:= Coefficients( b, x2*x1 );
x2:= x2/c1[1];
name:= "L2_2( ";
Append( name, LieAlgDBField2String( F ) );
Append( name, " )" );
K:= SolvableLieAlgebra( F, [2,2] );
f:= AlgebraHomomorphismByImages( K, L, Basis(K), [x1,x2] );
return rec( name:= [ name, [] ], isom:= f );
elif n = 3 then
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;
c1:= Coefficients( b, x3*x1 );
c2:= Coefficients( b, x3*x2 );
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;
x2:= x3*x1;
b:= Basis( Subspace( L, [x1,x2] ), [x1,x2] );
c2:= Coefficients( b, x3*x2 );
if c2[2] <> Zero(F) then
x2:= x2/c2[2];
x3:= x3/c2[2];
par:= c2[1]/(c2[2]^2);
name:= "L3_3( ";
Append( name, LieAlgDBField2String( F ) );
Append( name, ", " );
Append( name, String( par ) );
Append( name, " )" );
K:= SolvableLieAlgebra( F, [3,3,par] );
f:= AlgebraHomomorphismByImages( K, L, Basis(K), [x1,x2,x3] );
return rec( name:= [ name, [par] ], isom:= f );
fi;
par:= c2[1];
if HasIsFinite(F) and IsFinite(F) and not par in [Zero(F),One(F)] then
if Characteristic(F) = 2 then
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 = 4 then
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;
id:= LieAlgebraIdentification( K );
x1:= Image( id.isomorphism, Basis( Source( id.isomorphism ) )[1] );
x2:= Image( id.isomorphism, Basis( Source( id.isomorphism ) )[2] );
x3:= Image( id.isomorphism, Basis( Source( id.isomorphism ) )[3] );
b:= Basis( K, [x1,x2,x3] );
c1:= Coefficients( b, x4*x1 );
c2:= Coefficients( b, x4*x2 );
c3:= Coefficients( b, x4*x3 );
mat:= [ c1, c2, c3 ];
num:= id.name[4];
if num = '1' then
# K is abelian
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 Degree(mp) = 1 then
if c1[1] = Zero(F) then
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
x4:= x4/c1[1];
name:= "L4_2( ";
Append( name, LieAlgDBField2String( F ) );
Append( name, " )" );
K:= SolvableLieAlgebra( F, [4,2] );
f:= AlgebraHomomorphismByImages(K,L,Basis(K),[x1,x2,x3,x4]);
return rec( name:= [ name, [] ], isom:= f );
fi;
fi;
if Degree(mp) = 2 then
# compute rational canonical form; rather clumsy algorithm
# which however works for the 3x3 case.
facs:= Factors( R, mp );
ev:= [ ];
for f in facs do
ef:= ExtRepPolynomialRatFun( f );
if Length( ef[1] ) = 0 then
Add( ev, -ef[2] );
else
Add( ev, Zero( F ) );
fi;
od;
if ev[1] <> ev[2] then
sol:= NullspaceMat( TransposedMat(mat) -
ev[1]*IdentityMat( 3, F ) );
ev1:= List( sol, x -> LinearCombination( x, [x1,x2,x3] ) );
sol:= NullspaceMat( TransposedMat(mat) -
ev[2]*IdentityMat( 3, F ) );
ev2:= List( sol, x -> LinearCombination( x, [x1,x2,x3] ) );
if Length( ev1 ) = 2 then
x1:= ev1[1];
x2:= ev1[2] + ev2[1];
x3:= x4*x2;
s:= ev[1]; t:= ev[2];
else
x1:= ev2[1];
x2:= ev2[2] + ev1[1];
x3:= x4*x2;
s:= ev[2]; t:= ev[1];
fi;
else
s:= ev[1]; t:= s;
sol:= NullspaceMat( TransposedMat(mat) -
ev[1]*IdentityMat( 3, F ) );
ev1:= List( sol, x -> LinearCombination( x, [x1,x2,x3] ) );
sp:= Subspace( L, ev1 );
if not x1 in sp then
x2:= x1;
elif not x3 in sp then
x2:= x3;
fi;
x3:= x4*x2;
sp:= Subspace( L, [x2,x3] );
if not ev1[1] in sp then
x1:= ev1[1];
else
x1:= ev1[2];
fi;
fi;
if s <> Zero(F) then
x3:= x3/s;
x4:= x4/s;
name:= "L4_3( ";
Append( name, LieAlgDBField2String( F ) );
Append( name, ", " );
Append( name, String( t/s ) );
Append( name, " )" );
K:= SolvableLieAlgebra( F, [4,3,t/s] );
f:= AlgebraHomomorphismByImages(K,L,Basis(K),
[x1,x2,x3,x4]);
return rec( name:= [ name, [t/s] ], isom:= f );
elif t <> Zero(F) then
x3:= x3/t;
x4:= x4/t;
name:= "L4_4( ";
Append( name, LieAlgDBField2String( F ) );
Append( name, " )" );
K:= SolvableLieAlgebra( F, [4,4] );
f:= AlgebraHomomorphismByImages(K,L,Basis(K),
[x1,x2,x3,x4]);
return rec( name:= [ name, [] ], isom:= f );
else
name:= "L4_5( ";
Append( name, LieAlgDBField2String( F ) );
Append( name, " )" );
K:= SolvableLieAlgebra( F, [4,5] );
f:= AlgebraHomomorphismByImages(K,L,Basis(K),
[x1,x2,x3,x4]);
return rec( name:= [ name, [] ], isom:= f );
fi;
fi;
# look for a cyclic vector...
# we take a random element, maybe better algorithm needed...
if IsFinite(F) then
cfs:= List( [1..10], x -> PrimitiveRoot(F)^x );
else
cfs:= List( [1..10], x -> x*One(F) );
fi;
Add( cfs, Zero(F) );
found:= false;
while not found do
u:= Random(cfs)*x1+Random(cfs)*x2+Random(cfs)*x3;
v:= x4*u;
w:= x4*v;
sp:= Subspace( L, [u,v,w] );
if Dimension(sp) = 3 then found:= true; fi;
od;
x1:= u; x2:= v; x3:= w;
b:= Basis( sp, [x1,x2,x3] );
c1:= Coefficients( b, x4*x3 );
if c1[3] <> Zero(F) then
x2:= x2/c1[3];
x3:= x3/(c1[3]^2);
x4:= x4/c1[3];
name:= "L4_6( ";
Append( name, LieAlgDBField2String( F ) );
Append( name, ", " );
Append( name, String( c1[1]/(c1[3]^3) ) );
Append( name, ", ");
Append( name, String( c1[2]/(c1[3]^2) ) );
Append( name, " )" );
K:= SolvableLieAlgebra( F, [4,6, c1[1]/(c1[3]^3), c1[2]/(c1[3]^2) ] );
f:= AlgebraHomomorphismByImages(K,L,Basis(K),[x1,x2,x3,x4]);
return rec( name:= [ name, [c1[1]/(c1[3]^3), c1[2]/(c1[3]^2)] ],
isom:= f );
else
if c1[1] <> Zero(F) and c1[2] <> Zero(F) then
s:= c1[2]/c1[1];
x2:= x2*s;
x3:= x3*s^2;
x4:= x4*s;
t:= s^2*c1[2];
name:= "L4_7( ";
Append( name, LieAlgDBField2String( F ) );
Append( name, ", " );
Append( name, String( t ) );
Append( name, ", ");
Append( name, String( t ) );
Append( name, " )" );
K:= SolvableLieAlgebra( F, [4,7, t, t] );
f:= AlgebraHomomorphismByImages(K,L,Basis(K),[x1,x2,x3,x4]);
return rec( name:= [ name, [t,t] ], isom:= f );
else
if HasIsFinite(F) and IsFinite(F) then
q:= Size(F);
if c1[1] <> Zero(F) then
par:= c1[1];
a:= PrimitiveRoot(F);
if q mod 6 = 1 or q mod 6 = 4 then
exp:= LogFFE( par, a );
b:= One(F);
if exp mod 3 <> 0 then
exp:= LogFFE( par/a, a );
b:= a;
if exp mod 3 <> 0 then
exp:= LogFFE( par/(a^2), a );
b:= a^2;
fi;
fi;
a:= a^(exp/3);
else
exp:= LogFFE( par, a );
if exp mod 3 = 1 then
for b in F do
if b^3 = a then
a:= a^((exp-1)/3)*b;
break;
fi;
od;
elif exp mod 3 = 2 then
for b in F do
if b^3 = a^2 then
a:= a^((exp-2)/3)*b;
break;
fi;
od;
else
a:= a^(exp/3);
fi;
b:= One(F);
fi;
c1:= [ b, Zero(F) ];
elif c1[2] <> Zero(F) then
par:= c1[2];
a:= PrimitiveRoot(F);
if IsEvenInt( q ) then
exp:= LogFFE( par, a );
if exp mod 2 = 1 then
a:= a^((exp-1)/2)*a^(q/2);
else
a:= a^(exp/2);
fi;
b:= One(F);
else
exp:= LogFFE( par, a );
b:= One(F);
if not IsEvenInt( exp ) then
exp:= LogFFE( par/a, a );
b:= a;
fi;
a:= a^(exp/2);
fi;
c1:= [ Zero(F), b ];
else
a:= One(F);
fi;
x2:= x2/a;
x3:= x3/(a^2);
x4:= x4/a;
fi;
name:= "L4_7( ";
Append( name, LieAlgDBField2String( F ) );
Append( name, ", " );
Append( name, String( c1[1] ) );
Append( name, ", ");
Append( name, String( c1[2] ) );
Append( name, " )" );
K:= SolvableLieAlgebra( F, [4,7, c1[1], c1[2] ] );
f:= AlgebraHomomorphismByImages(K,L,Basis(K),[x1,x2,x3,x4]);
return rec( name:= [ name, [c1[1],c1[2]] ], isom:= f );
fi;
fi;
elif num = '2' then
D:= TransposedMat( mat );
x4:= x4+D[1][3]*x1+D[2][3]*x2-D[2][2]*x3;
mat:= List( [x1,x2,x3], x -> Coefficients( b, x4*x ) );
D:= TransposedMat( mat );
if D[1][1] <> Zero(F) then
x4:= x4/D[1][1];
D:= D/D[1][1];
w:= D[1][2];
v:= D[2][1];
if w <> Zero(F) then
x1:= w*x1;
v:= v*w;
return LieAlgDBHelper.isomM9( L, x1, x2, x3, x4, v );
else
#direct sum...
dd:= DirectSumDecomposition( L );
id:= LieAlgebraIdentification( dd[1] );
f:= id.isomorphism;
x1:= Image( f, Basis( Source(f) )[2] );
x2:= Image( f, Basis( Source(f) )[1] );
id:= LieAlgebraIdentification( dd[2] );
f:= id.isomorphismorphism;
x3:= Image( f, Basis( Source(f) )[2] );
x4:= Image( f, Basis( Source(f) )[1] );
name:= "L4_8( ";
Append( name, LieAlgDBField2String( F ) );
Append( name, " )" );
K:= SolvableLieAlgebra( F, [4,8] );
f:= AlgebraHomomorphismByImages(K,L,Basis(K),
[x1,x2,x3,x4]);
return rec( name:= [ name, [] ], isom:= f );
fi;
else
if D[2][1] <> Zero(F) then
x4:= x4/D[2][1];
a:= D[1][2]/D[2][1];
if Characteristic(F) <> 2 then
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) <> 2 then
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
x4:= x4+D[2][3]*x1-D[2][1]*x3;
mat:= List( [x1,x2,x3], x -> Coefficients( b, x4*x ) );
D:= TransposedMat( mat );
if D[1][3] = Zero(F) then
x4:= x4/D[1][1];
return LieAlgDBHelper.isomM9( L, x2, x1, x4, x3, a );
elif D[1][1] = Zero(F) then
x4:= x4/D[1][3];
name:= "L4_6( ";
Append( name, LieAlgDBField2String( F ) );
Append( name, ", " );
Append( name, String( Zero(F) ) );
Append( name, ", ");
Append( name, String( Zero(F) ) );
Append( name, " )" );
K:= SolvableLieAlgebra( F, [4,6, Zero(F), Zero(F)] );
f:= AlgebraHomomorphismByImages(K,L,Basis(K),
[-x4,x1,x2,x3]);
return rec( name:= [ name, [Zero(F),Zero(F)] ], isom:= f );
else
x4:= x4/D[1][1];
x3:= -D[1][3]/D[1][1]*x1+x3;
return LieAlgDBHelper.isomM9( L, x2, x1, x4, x3, a );
fi;
fi;
else # i.e., num = '4'...
D:= TransposedMat( mat );
a:= id.parameters[1];
if a <> Zero(F) and Characteristic(F) <> 2 then
x4:= x4+D[2][3]*x1+D[1][3]/a*x2-D[2][1]*x3;
x4:= x4/D[1][1];
return LieAlgDBHelper.isomM9( L, x1/(4*One(F))+x2/(2*One(F)), x1/(2*One(F)),
x4, x3+x4/(2*One(F)), a-(1/4*One(F)) );
elif a <> Zero(F) and Characteristic(F) = 2 then
x4:= x4+D[2][3]*x1+D[1][3]/a*x2-D[2][1]*x3;
if D[3][3] = Zero(F) then
x4:= x4/D[1][1];
return LieAlgDBHelper.isomM10( L, x1, x2, x4, x3, a );
elif D[1][1] <> Zero(F) then
x4:= x4/D[1][1];
b:= One(F) + D[3][3]/D[1][1];
return LieAlgDBHelper.isomM11( L, x1, x2, x3, x4, a, b );
else
if a <> One(F) then
x4:= x4/D[3][3];
y1:= (a*x1+x2)/(a+One(F));
y2:= a*(x1+x2)/(a+One(F));
y3:= x3;
y4:= x3+(a+1)*x4;
return LieAlgDBHelper.isomM11( L, y1, y2, y3, y4, a, a );
else
return LieAlgDBHelper.isomM11( L, x2, x1, x3, x4, One(F), Zero(F) );
fi;
fi;
else
x4:= x4+D[2][3]*x1-D[2][1]*x3;
if D[1][3]=Zero(F) and D[3][1]=Zero(F) and D[1][1]=D[3][3] then
x4:= x4/D[1][1];
name:= "L4_12( ";
Append( name, LieAlgDBField2String( F ) );
Append( name, " )" );
K:= SolvableLieAlgebra( F, [4,12] );
f:= AlgebraHomomorphismByImages(K,L,Basis(K),
[x1,x2,x3,x4]);
return rec( name:= [ name, [] ], isom:= f );
else
if D[3][3] <> Zero(F) then
u1:= D[1][1];
u3:= D[3][1];
v1:= D[1][3];
v3:= D[3][3];
if v1 <> Zero(F) then
x1:= x1+(v3/v1)*x3;
elif u3 <> Zero(F) then
x3:= -(v3/u3)*x1+x3;
elif u1 = Zero(F) then
y1:= x1;
x1:= x3;
x2:= -x2;
x3:= y1;
else
y1:= x1;
x1:= x1/(One(F) - v3/u1)-x3;
x3:= -(v3/u1)*y1/(One(F) - v3/u1)+x3;
fi;
K:= Subalgebra( L, [x1,x2,x3] );
b:= Basis( K, [x1,x2,x3] );
c1:= Coefficients( b, x4*x1 );
c2:= Coefficients( b, x4*x2 );
c3:= Coefficients( b, x4*x3 );
mat:= [ c1, c2, c3 ];
D:= TransposedMat( mat );
fi; # now D[3][3] is zero...
u1:= D[1][1]; u3:= D[3][1]; v1:= D[1][3];
if u1 <> Zero(F) and v1 <> Zero(F) then
x4:= x4/u1;
x1:= (1/u1)*x1;
x2:= (1/(u1*v1))*x2;
x3:= (1/v1)*x3;
a:= (v1/u1)*(u3/u1);
name:= "L4_13( ";
Append( name, LieAlgDBField2String( F ) );
Append( name, ", " );
Append( name, String( a ) );
Append( name, " )" );
K:= SolvableLieAlgebra( F, [4,13, a] );
f:= AlgebraHomomorphismByImages(K,L,Basis(K),
[x1,x2,x3,x4]);
return rec( name:= [ name, [a] ], isom:= f );
elif u1 <> Zero(F) and v1 = Zero(F) then
if u3 <> Zero(F) then
x4:= x4/u1;
x1:= (1/u3)*x1;
x2:= (1/(u1*u3))*x2;
x3:= (1/u1)*x3;
y1:= x1;
x1:= x1+x3;
x2:= -x2;
x3:= y1;
else
x4:= x4/u1;
x3:= x1+x3;
fi;
name:= "L4_13( ";
Append( name, LieAlgDBField2String( F ) );
Append( name, ", " );
Append( name, String( Zero(F) ) );
Append( name, " )" );
K:= SolvableLieAlgebra( F, [4,13, Zero(F)] );
f:= AlgebraHomomorphismByImages(K,L,Basis(K),
[x1,x2,x3,x4]);
return rec( name:= [ name, [Zero(F)] ], isom:= f );
elif u1 = Zero(F) and v1 <> Zero(F) then
x4:= x4/v1;
par:= u3/v1;
if HasIsFinite(F) and IsFinite(F) and
not par in [Zero(F),One(F)] then
if Characteristic(F) = 2 then
f:= Inverse( FrobeniusAutomorphism( F ) );
a:= Image( f, 1/par );
else
exp:= LogFFE( 1/par, PrimitiveRoot(F) );
if IsEvenInt( exp ) then
a:= PrimitiveRoot(F)^(exp/2);
else
exp:= LogFFE( PrimitiveRoot(F)/par,
PrimitiveRoot(F) );
a:= PrimitiveRoot(F)^(exp/2);
fi;
fi;
x1:= a*x1;
x2:= a*x2;
x4:= a*x4;
par:= a^2*par;
fi;
if par = Zero(F) then
name:= "L4_7( ";
Append( name, LieAlgDBField2String( F ) );
Append( name, ", " );
Append( name, String( Zero(F) ) );
Append( name, ", " );
Append( name, String( Zero(F) ) );
Append( name, " )" );
K:= SolvableLieAlgebra( F, [4,7, Zero(F), Zero(F)] );
f:= AlgebraHomomorphismByImages( K, L, Basis(K),
[-x4,x1,x2,x3]);
return rec( name:= [ name, [Zero(F),Zero(F)] ],
isom:= f );
else
name:= "L4_14( ";
Append( name, LieAlgDBField2String( F ) );
Append( name, ", " );
Append( name, String( par ) );
Append( name, " )" );
K:= SolvableLieAlgebra( F, [4,14, par] );
f:= AlgebraHomomorphismByImages( K, L, Basis(K),
[x1,x2,x3,x4] );
return rec( name:= [ name, [par] ], isom:= f );
fi;
else
x4:= x4/u3;
y1:= x3;
y2:= -x2;
y3:= x1;
y4:= x4;
name:= "L4_7( ";
Append( name, LieAlgDBField2String( F ) );
Append( name, ", " );
Append( name, String( Zero(F) ) );
Append( name, ", " );
Append( name, String( Zero(F) ) );
Append( name, " )" );
K:= SolvableLieAlgebra( F, [4, 7, Zero(F), Zero(F)] );
f:= AlgebraHomomorphismByImages( K, L, Basis(K),
[-y4,y1,y2,y3] );
return rec( name:= [ name, [Zero(F),Zero(F)] ], isom:= f );
fi;
fi;
fi;
fi;
else
Error( "dim > 4 not yet implemented" );
fi;
end;
#========================================================================
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 ) = 3 then
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 ) = 4 then
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 ) = 2 then
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;
T:= EmptySCTable( 4, Zero( F ), "antisymmetric" );
SetEntrySCTable( T, 1, 2, [1,3] );
K:= LieAlgebraByStructureConstants( F, T );
return rec( type:= [ 4, 2 ], f:= LieAlgDBHelper.liealg_hom( L, K, [x,y,x*y,u], Basis( K ) ) );
elif Dimension( C ) = 1 then
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;
T:= EmptySCTable( 4, Zero( F ), "antisymmetric" );
SetEntrySCTable( T, 1, 2, [1,3] );
SetEntrySCTable( T, 1, 3, [1,4] );
K:= LieAlgebraByStructureConstants( F, T );
return rec( type:= [ 4, 3 ], f:= LieAlgDBHelper.liealg_hom( L, K, [x,y,z,u], Basis( K ) ) );
fi;
fi;
fi;
end;
LieAlgDBHelper.skew_symm_NF:= function( V, f )
# 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
--> --------------------
--> maximum size reached
--> --------------------
[ Verzeichnis aufwärts0.97unsichere Verbindung
Übersetzung europäischer Sprachen durch Browser
]
|