################################################################################ # # Written by Alla Detinko # # Polotsk State University # # # # Library of irreducible maximal solvable subgroups # of a prime degree special linear group # # # ############################################################################ # Documentation ############################################################################ # # # This library provides access to the irreducible maximal solvable # subgroups of the special linear group SL(q, p^l) over a finite # field GF(p^l), where q is a prime. The set M of all irreducible # maximal solvable subgroups of SL(q, p^l) is a union of three # disjoint subsets consisting of imprimitive subgroups, primitive # subgroups containing an irreducible abelian normal subgroup, and # primitive subgroups with a scalar maximal abelian normal subgroup # respectively. The library contains functions returning representa- # tives of conjugacy classes for each of these subsets and the func- # tion returning the complete and irredundant list of SL(q, p^l)- # conjugacy class reresentatives of M. The list of generators # returned by the functions is a polycyclic (consistent) generating # sequence of irreducible maximal solvable subgroups. # # # 1. ImprimitiveMaxSolvableSubgroup(,

, ) # # 'ImprimitiveMaxSolvableSubgroup' returns the unique up to conju- # gacy in SL(q, p^l) imprimitive (monomial) maximal solvable subgroup # MSS1(q, p, l) of SL(q, p^l). # # gap> g := ImprimitiveMaxSolvableSubgroup(2, 5, 2); # MSS1(2,5,2) # gap> gen := g.generators; # [ [ [ 0*Z(5), Z(5)^0 ], [ Z(5)^2, 0*Z(5) ] ], # [ [ Z(5^2)^8, 0*Z(5) ], [ 0*Z(5), Z(5^2)^16 ] ], # [ [ Z(5^2)^3, 0*Z(5) ], [ 0*Z(5), Z(5^2)^21 ] ] ] # # Here the list 'gen' is a polycyclic generating sequence of the group # g = MSS1(2, 5, 2). # # # 2. PrimitiveMaxSolvableSubgroup1(,

, ) # # 'PrimitiveMaxSolvableSubgroup1' returns the unique up to conju- # gacy in SL(q, p^l) primitive maximal solvable subgroup MSS2(q, p, l) # of SL(q, p^l) containing an irreducible abelian normal subgroup. # # gap> g := PrimitiveMaxSolvableSubgroup1(2, 5, 2); # MSS2(2,5,2) # gap> g.generators; # [ [ [ Z(5), 0*Z(5) ], [ 0*Z(5), Z(5)^3 ] ], # [ [ Z(5^2)^5, Z(5^2)^13 ], [ Z(5^2)^14, Z(5^2)^5 ] ] ] # # # 3. PrimitiveMaxSolvableSubgroup2(,

, ) # # 'PrimitiveMaxSolvableSubgroup2' returns for q>2 (resp. q=2) # GL(q, p^l) (resp. SL(q, p^l))-conjugacy class representatives of # primitive maximal solvable subgroups of SL(q, p^l) with a scalar # maximal abelian normal subgroup. These representatives are denoted # as MSS3(q, p, l), MSS4(q, p, l), MSS5(q, p, l), MSS6(q, p, l). Note # that for an arbitrary ,

, some of these subgroups do not # exist. # # gap> g1 := PrimitiveMaxSolvableSubgroup2(3, 2, 6); # MSS3(3,2,6) # gap> g2 := PrimitiveMaxSolvableSubgroup2(11, 23, 1); # [ MSS3(11,23,1), MSS4(11,23,1), MSS5(11,23,1) ] # gap> g3 := PrimitiveMaxSolvableSubgroup2(2, 5, 2); # [ MSS3(2,5,2), MSS3.1(2,5,2) ] # # Here MSS3(2, 5, 2) is conjugate to MSS3.1(2, 5, 2) in GL(2, 25) # but not in SL(2, 25). # # # 4. AllPrimitiveMaxSolvableSubgroups2(,

, ) # # 'AllPrimitiveMaxSolvableSubgroups2' returns the complete and # irredundant list of SL(q, p^l)-conjugacy class representatives of # primitive maximal solvable subgroups of SL(q, p^l) with a scalar # maximal abelian normal subgroup. # # gap> g := AllPrimitiveMaxSolvableSubgroups2(3, 2, 6); # [ MSS3(3,2,6), MSS3.1(3,2,6), MSS3.2(3,2,6) ] # # Here MSS3.1(3, 2, 6) and MSS3.2(3, 2, 6) are conjugate to # MSS3(3, 2, 6) in GL(3, 64). # # # 5. AllIrreducibleMaxSolvableSubgroups(,

, ) # # 'AllIrreducibleMaxSolvableSubgroups' returns the complete and # irredundant list of SL(q, p^l)-conjugacy class representatives of # irreducible maximal solvable subgroups of SL(q, p^l). # # gap> g := AllIrreducibleMaxSolvableSubgroups(2, 5, 2); # [ MSS1(2,5,2), MSS2(2,5,2), [ MSS3(2,5,2), MSS3.1(2,5,2) ] ] # # # ############################################################################## # References ############################################################################## # # The interested reader is refered to the following papers for # details. # # 1. A.S. Detinko, 'Maximal solvable subgroups of the special linear # group over an arbitrary field' Siberian Math.J. 33, 973-979, 1993. # # 2. Detinko A.S., 'Solvable subgroups of unitary groups', # Siberian Math.J. 35, 286-293, 1994. # # 3. A.S. Detinko, 'Data library for irreducible maximal solvable # subgroups of prime degree classical groups', preprint. # # 4. A.S. Detinko, 'Classification of irreducible maximal solvable # subgroups of prime degree classical groups over finite fields', # preprint. # # REMARK. If l = 1 and p^q is less than 256, then groups # isomrphic to MSS1(q, p, l), MSS2(q, p, l), MSS3(q, p, l) # can be constructed by functions of the GAP library # *IrredSol*, which is part of the standard GAP distibution. # ############################################################################ # Program ############################################################################ # 'ImprimitiveMaxSolvableSubgroup' returns the unique up to conjugacy # irreducible imprimitive maximal solvable subgroup MSS1(q, p, l) of # SL(q, p^l). # ImprimitiveMaxSolvableSubgroup( ,

, ) ImprimitiveMaxSolvableSubgroup := function(q, p, l) local pl, f, o, z, mat1, mat2, m, r, n, n1, g, a, b, c, i, k, n1, y ; if not IsPrime(q) then Error( " must be prime " ); else pl := p^l; f := GF(pl); o := f.one; z := f.root; mat1 := IdentityMat(q, o); mat2 := 0*mat1; # Handle the case q=2 first. if q=2 then if pl > 9 or pl = 4 or pl = 8 then m := 0; n := pl - 1; while n mod 2^m = 0 do m := m + 1; od; r := 2^(m-1); # Construct the generators. mat2[1][2] := o; mat2[2][1] := -o; a := mat2; mat1[1][1] := z^r; mat1[2][2] := z^(-r); b := mat1; if p mod 2 = 0 then g := GroupElementsOps.Group( Matrices, [ a, b ], mat1^0); g.1 := a; g.2 := b; else c := 1*mat1; n1 := n/r; c[1][1] := z^n1; c[2][2] := z^(-n1); g := GroupElementsOps.Group( Matrices, [ a, b, c ], mat1^0); g.1 := a; g.2 := b; g.3 := c; fi; else Error ( "if

^ in [2, 3, 5, 7, 9] then SL(2,

^) does not ", "contain imprimitive maximal solvable subgroups"); fi; g.name := ConcatenationString("MSS1(", String(q),",", String(p),",", String(l),")"); g.dimension := Length(mat1); g.field := f; g.operations := MatGroupOps; g.isMatGroup := true; # Add the size g.size := 2*n; # Return the group. return g; fi; # Handle the case q>2 . if q>2 then if pl=2 or q=3 and pl=4 then Error ( "if

^=2 or =3 and

^=4 then SL(,

^) ", "does not contain imprimitive maximal solvable subgroups"); else # Construct the generator a. n := PrimitiveRootMod(q); m := []; mat2[q][q] := -o; for i in [1..q-1] do r := i*n mod q; m[r] := i; mat2[m[r]][r] := -o; od; a := mat2; # Construct the generator b. b := 0*mat2; b[1][q] := o; for i in [2..q] do b[i][i-1] := o; od; # Construct the generators c_i. mat1[q][q] := z^-1; y := function(i) local n1; n1 := 1*mat1; n1[i][i] := z; return n1; end; c := y(1); k := [a, b, c]; for i in [4..q+1] do Add( k, y(i-2) ); od; # Construct the group g. g := GroupElementsOps.Group(Matrices, [a, b, c], mat1^0); g.1 := a; g.2 := b; g.3 := c; g.generators := k; g.name := ConcatenationString("MSS1(", String(q),",", String(p),",", String(l),")"); g.dimension := Length(mat1); g.field := f; g.operations := MatGroupOps; g.isMatGroup := true; # Add the size g.size := q*(q-1)*(pl - 1)^(q-1); # Return the group. return g; fi; fi; fi; end; ############################################################################ # 'PrimitiveMaxSolvableSubgroup1' returns the unique up to conjugacy # primitive maximal solvable subgroup MSS2(q, p, l) of SL(q, p^l) containing # an irreducible abelian normal subgroup, where p^(q*l) must not be greater # than 65536. # PrimitiveMaxSolvableSubgroup1 ( ,

, ) PrimitiveMaxSolvableSubgroup1 := function(q, p, l) local f, f1, f2, pl, pl1, o, z, z1, a, b, c, d, e, k, k1, m, n, r, s, s1, r1, r2, b1, b2, h, h1, g, x, y, mat1, mat2, i, j ; if not IsPrime(q) then Error ( " must be prime " ); else if p^(q*l) > 65536 then Error ( "

^(*) must not be greater than 65536 "); else pl := p^l; f := GF(pl); pl1 := p^(q*l); f1 := GF(pl1); f2 := f1/f; o := f.one; z := f.root; z1 := f1.root; s := pl - 1; r := z1^s; mat1 := IdentityMat(q, o); mat2 := 0*mat1; # Handle the case q=2 first. if q=2 then n := pl + 1; if pl mod 4 = 1 then k := (o*2)^-1; e := z^(s/4); d := z1^(n/2); mat1[1][1] := e; mat1[2][2] := e^-1; a := mat1; r1 := r^2; mat2[1][1] := k*Trace(f2, r1); mat2[2][2] := mat2[1][1]; mat2[1][2] := k*Trace(f2, r1*(d^-1)); mat2[2][1] := k*Trace(f2, r1*d); b := mat2; g := GroupElementsOps.Group(Matrices, [a,b], mat1^0); g.1 := a; g.2 := b; elif pl mod 4 = 3 and pl > 7 then k := (o*2)^-1; d := (pl1 - 1)/4; e := z1^d; i := 1; x := z; y := z; while x^2 + y^2 <> -o and i <= s do i := i+1; x := z^i; j := 1; y := z; while x^2 + y^2 <> -o and j <= s do j := j+1; y := z^j; od; od; # Construct the generator a. mat2[1][1] := x; mat2[2][2] := -x; mat2[1][2] := y; mat2[2][1] := y; a := mat2; # Construct the generators b1, b2. c := 0; while n mod 2^c = 0 do c := c+1; od; m := 2^(c-1); r1 := r^m; r2 := r^(n/m); mat1[1][1] := k*Trace(f2, r1); mat1[2][2] := mat1[1][1]; mat1[2][1] := k*Trace(f2, e*r1); mat1[1][2] := -mat1[2][1]; b1 := mat1; b2 := 1*mat1; b2[1][1] := k*Trace(f2, r2); b2[2][2] := b2[1][1]; b2[2][1] := k*Trace(f2, e*r2); b2[1][2] := -b2[2][1]; g := GroupElementsOps.Group(Matrices, [a, b1, b2], mat1^0); g.1 := a; g.2 := b1; g.3 := b2; elif p mod 2 = 0 then k1 := 0*z; c := [ [k1, o], [o, k1] ]; s1 := r^pl; d := [ [r, k1], [k1, s1] ]; h := [ [o, o], [r, s1] ]; h1 := h^-1; a := h*c*h1; b := h*d*h1; g := GroupElementsOps.Group(Matrices, [a, b], mat1^0); g.1 := a; g.2 := b; else Error( " SL(2, 3) and SL(2, 7) do not contain primitive maximal ", "solvable subgroups of this type"); fi; fi; # Construct the generators for the case q > 2. if q>2 then if pl mod q = 1 then k := (o*q)^-1; e := z^(s/q); x := (pl1 - 1)/(q*s); d := z1^x; # Construct the generator a. for i in [2..q] do mat1[i][i] := e^(i-1); od; a := mat1; # Construct the generator b. for j in [1..q] do for i in [1..q] do mat2[i][j] := k*Trace(f2, r*d^(i-j)); od; od; b := mat2; else # Construct the matrix d. n := Conjugates(f2, r); for i in [1..q] do mat1[i][i] := n[i]; od; d := mat1; # Construct the matrix h. for i in [1..q] do mat2[i] := Conjugates(f2, r^(i-1)); od; h := mat2; h1 := h^-1; # Construct the matrix c. c := 0*mat2; c[1][q] := o; for i in [2..q] do c[i][i-1] := o; od; # Construct the generators a, b. a := h*c*h1; b := h*d*h1; fi; g := GroupElementsOps.Group(Matrices, [a, b], mat1^0); g.1 := a; g.2 := b; fi; g.name := ConcatenationString("MSS2(", String(q), ",", String(p), ",", String(l), ")"); g.isMatGroup := true; g.dimension := Length(mat1); g.field := f; g.operations := MatGroupOps; # Add the size. g.size := q*(pl1 - 1)/s; # Return the group. return g; fi; fi; end; ########################################################################## # 'PrimitiveMaxSolvableSubgroup2' returns for q>2 (resp. q=2) # GL(q, p^l) (resp. SL(q, p^l))-conjugacy class representatives of # primitive maximal solvable subgroups of SL(q, p^l) with a scalar # maximal abelian normal subgroup. # PrimitiveMaxSolvableSubgroup2(,

, ) PrimitiveMaxSolvableSubgroup2 := function(q, p, l) local pl, f, o, z, z1, n, s, mat1, mat2, a, b, c, d, e, e1, k, t, m, g, h, g1, h1, s1, s2,a1, b1, c1, d1, m1, a2, b2, c2, d2, m2, a3, b3, c3, d3, m3, a4, b4, c4, d4, m4, t1, t2, s2, x, y, i, j, im, x11, x12, x21, x22, x1, y1, z1, o1, b11, q3 ; if not IsPrime(q) then Error( " must be prime"); else pl := p^l; f := GF(pl); o := f.one; z := f.root; n := pl - 1; z1 := z*0; mat1 := IdentityMat(q, o); mat2 := 0*mat1; # Handle the case q=2 first. if q=2 then if p > 2 then e := -mat1; s := [ [o, z1], [z1, z] ]; m := o*2; if pl mod 8 = 1 or pl mod 8 = 7 then i := 1; t := z; while t^2 <> m do i := i+1; t := z^i; od; fi; if pl mod 4 = 1 then e1 := z^(n/4); k := (e1 + o)/m; # Construct the generator b. mat2[1][1] := k*e1; mat2[2][1] := mat2[1][1]; mat2[1][2] := k; mat2[2][2] := -k; b := mat2; # Construct the generator c. c := [ [z1, e1], [e1, z1] ]; # Construct the generator d. d := [ [e1, z1], [z1, -e1] ]; if pl mod 8 = 1 then # Construct the generator a. j := e1/t; mat1[1][1] := -j; mat1[1][2] := j; mat1[2][1] := j; mat1[2][2] := j; a := mat1; # Construct the group g. g := GroupElementsOps.Group(Matrices, [a, b, c, d, e], mat1^0); g.1 := a; g.2 := b; g.3 := c; g.4 := d; g.5 := e; g.size := 48; # Construct the group h. s1 := s^-1; a1 := s*a*s1; b1 := s*b*s1; c1 := s*c*s1; h := GroupElementsOps.Group(Matrices, [a1, b1, c1, d, e], mat1^0); h.1 := a1; h.2 := b1; h.3 := c1; h.4 := d; h.5 := e; h.size := 48; g.name := ConcatenationString("MSS3(2", ",", String(p), ",", String(l), ")"); h.name := ConcatenationString("MSS3.1(2", ",", String(p), ",", String(l), ")"); g.isMatGroup := true; g.dimension := Length(mat1); g.field := f; g.operations := MatGroupOps; h.isMatGroup := true; h.dimension := Length(mat1); h.field := f; h.operations := MatGroupOps; return [g, h]; else # Construct the group g. g := GroupElementsOps.Group(Matrices, [b, c, d, e], mat1^0); g.1 := b; g.2 := c; g.3 := d; g.4 := e; g.size := 24; g.name := ConcatenationString("MSS3(2", ",", String(p), ",", String(l), ")"); g.isMatGroup := true; g.dimension := Length(mat1); g.field := f; g.operations := MatGroupOps; return g; fi; else i := 1; x := z; y := z; while x^2 + y^2 <> -o and i <= n do i := i+1; x := z^i; j := 1; y := z; while x^2 + y^2 <> -o and j<= n do j := j+1; y := z^j; od; od; # Construct the generator b. mat2[1][1] := (x - y - o)/m; mat2[1][2] := (x + y - o)/m; mat2[2][1] := (x + y + o)/m; mat2[2][2] := (-x + y - o)/m; b := mat2; # Construct the generators c and d. c := [ [0, -1], [1, 0] ] * o; d := [ [x, y], [y, -x] ]; if pl mod 8 = 7 then # Construct the generator a. mat1[1][1] := x/t; mat1[2][2] := - mat1[1][1] ; mat1[1][2] := (y + o)/t; mat1[2][1] := (y - o)/t; a := mat1; # Construct the group g. g := GroupElementsOps.Group(Matrices, [a, b, c, d, e], mat1^0); g.1 := a; g.2 := b; g.3 := c; g.4 := d; g.5 := e; g.size := 48; # Construct the group h. s1 := s^-1; a1 := s*a*s1; b1 := s*b*s1; c1 := s*c*s1; d1 := s*c*s1; h := GroupElementsOps.Group(Matrices, [a1, b1, c1, d1, e], mat1^0); h.1 := a1; h.2 := b1; h.3 := c1; h.4 := d1; h.5 := e; h.size := 48; g.name := ConcatenationString("MSS3(2", ",", String(p), ",", String(l), ")"); h.name := ConcatenationString("MSS3.1(2", ",", String(p), ",", String(l), ")"); g.isMatGroup := true; g.dimension := Length(mat1); g.field := f; g.operations := MatGroupOps; h.isMatGroup := true; h.dimension := Length(mat1); h.field := f; h.operations := MatGroupOps; return [g, h]; else g := GroupElementsOps.Group(Matrices, [b, c, d, e], mat1^0); g.1 := b; g.2 := c; g.3 := d; g.4 := e; g.size := 24; g.name := ConcatenationString("MSS3(2", ",", String(p), ",", String(l), ")"); g.isMatGroup := true; g.dimension := Length(mat1); g.field := f; g.operations := MatGroupOps; return g; fi; fi; else Error ("SL(2, 2^) does not contain primitive maximal solvable subgroups ", "of this type"); fi; fi; # Handle the case q=3. if q=3 then if pl mod 3 = 1 then e1 := z^(n/3); k :=(o - e1)^-1; z1 := z*0; # Construct the generators b, c, d, m. b := k*[ [o, e1, o], [e1, o, o], [e1, e1, e1^2] ]; c := k*[ [o, e1, e1], [e1, o, e1], [o, o, e1^2] ]; d := [ [z1, z1, o], [o, z1, z1], [z1, o, z1] ]; m := e1 * mat1; # Construct the generator e. mat1[2][2] := e1; mat1[3][3] := e1^2; e := mat1; if pl mod 9 = 1 then t := z^(n/9); # Construct the generator a. mat2[1][1] := t^-1; mat2[2][2] := mat2[1][1]; mat2[3][3] := mat2[1][1] * e1; a := mat2; # Construct the group g . g := GroupElementsOps.Group( Matrices, [a, b, c, d, e, m], mat1^0 ); g.1 := a; g.2 := b; g.3 := c; g.4 := d; g.5 := e; g.6 := m; g.size := 648; g.name := ConcatenationString("MSS3(3", ",", String(p), ",", String(l), ")"); g.isMatGroup := true; g.dimension := Length(mat1); g.field := f; g.operations := MatGroupOps; return g; else # Construct the group g. g := GroupElementsOps.Group(Matrices, [ b, c, d, e, m], mat1^0); g.1 := b; g.2 := c; g.3 := d; g.4 := e; g.5 := m; g.size := 216; g.name := ConcatenationString("MSS3(3", ",", String(p), ",", String(l), ")"); g.isMatGroup := true; g.dimension := Length(mat1); g.field := f; g.operations := MatGroupOps; return g; fi; else Error ( "if

^ mod 3 <> 1 then SL(3,

^) does not contain ", "maximal solvable subgroups of this type"); fi; fi; # Handle the case q>3. if q>3 then if pl mod q = 1 then e1 := z^(n/q); # Construct the matrix a. for i in [3..q] do mat1[i][i] := e1^((i-1)*(i-2)/2); od; a := mat1; # Construct the matrix b. for i in [1..q] do for j in [1..q] do mat2[i][j] := e1^((i-1)*(j-1)); od; od; # Construct an element t . m := Determinant(mat2); if m = o then b := mat2; else i := 1; t := z*1; while t^q <> m do i := i+1; t := z^i; od; b := (t^-1)*mat2; fi; # Construct the generator c. c := 0*mat1; c[1][q] := o; for i in [2..q] do c[i][i-1] := o; od; # Construct the generator d. d := 1*mat1; for i in [2..q] do d[i][i] := e1^(i-1); od; # Construct the generator e. e := 0*mat2; for i in [1..q] do e[i][i] := e1; od; # construct the function y. y := function(x11, x12, x21, x22) local o1, b11, x1, y1, z1, im ; o1 := GF(q).one; b11 := b^-1; if x12 <> 0*o1 then x1 := IntFFE( ( o1 - x11)/x12 ); y1 := IntFFE( x21 + x22 * x1); z1 := IntFFE( x12); im := b11 * a^y1 * b * a^(-z1) * b11 * a^(-x1) * b; else x1 := IntFFE( ( o1 + x21)/(-x22) ); y1 := IntFFE( x11 ); z1 := IntFFE( -x22); im := b11^2 * a^y1 * b * a^(-z1) * b11 * a^(-x1) * b; fi; return im; end; # Handle the case q = 5; if q=5 then h1 := PrimitiveMaxSolvableSubgroup1 ( 2, 5, 1); a2 := y( h1.1[1][1], h1.1[1][2], h1.1[2][1], h1.1[2][2] ); b2 := y( h1.2[1][1], h1.2[1][2], h1.2[2][1], h1.2[2][2] ); h := GroupElementsOps.Group( Matrices, [a2, b2, c, d, e], mat1^0 ); h.1 := a2; h.2 := b2; h.3 := c; h.4 := d; h.5 := e; h.size := 1500; h.name := ConcatenationString("MSS4(5", ",", String(p), ",", String(l), ")" ); h.isMatGroup := true; h.dimension := Length(mat1); h.field := f; h.operations := MatGroupOps; g1 := PrimitiveMaxSolvableSubgroup2 ( 2, 5, 1); a1 := y( g1.1[1][1], g1.1[1][2], g1.1[2][1], g1.1[2][2] ); b1 := y( g1.2[1][1], g1.2[1][2], g1.2[2][1], g1.2[2][2] ); c1 := y( g1.3[1][1], g1.3[1][2], g1.3[2][1], g1.3[2][2] ); d1 := y( g1.4[1][1], g1.4[1][2], g1.4[2][1], g1.4[2][2] ); g := GroupElementsOps.Group( Matrices, [a1, b1, c1, d1, c, d, e], mat1^0 ); g.1 := a1; g.2 := b1; g.3 := c1; g.4 := d1; g.5 := c; g.6 := d; g.7 := e; g.size := 3000; g.name := ConcatenationString("MSS5(5", ",", String(p), ",", String(l), ")" ); g.isMatGroup := true; g.dimension := Length(mat1); g.field := f; g.operations := MatGroupOps; return [h, g]; fi; # Handle the case q = 7. if q=7 then k := PrimitiveMaxSolvableSubgroup2(2, 7, 1); g1 := k[1]; h1 := k[2]; a1 := y( g1.1[1][1], g1.1[1][2], g1.1[2][1], g1.1[2][2] ); b1 := y( g1.2[1][1], g1.2[1][2], g1.2[2][1], g1.2[2][2] ); c1 := y( g1.3[1][1], g1.3[1][2], g1.3[2][1], g1.3[2][2] ); d1 := y( g1.4[1][1], g1.4[1][2], g1.4[2][1], g1.4[2][2] ); m1 := y( g1.5[1][1], g1.5[1][2], g1.5[2][1], g1.5[2][2] ); g := GroupElementsOps.Group( Matrices, [a1, b1, c1, d1, m1, c, d, e], mat1^0 ); g.1 := a1; g.2 := b1; g.3 := c1; g.4 := d1; g.5 := m1; g.6 := c; g.7 := d; g.8 := e; g.size := 16464; g.name := ConcatenationString("MSS5(7", ",", String(p), ",", String(l), ")" ); g.isMatGroup := true; g.dimension := Length(mat1); g.field := f; g.operations := MatGroupOps; a2 := y( h1.1[1][1], h1.1[1][2], h1.1[2][1], h1.1[2][2] ); b2 := y( h1.2[1][1], h1.2[1][2], h1.2[2][1], h1.2[2][2] ); c2 := y( h1.3[1][1], h1.3[1][2], h1.3[2][1], h1.3[2][2] ); d2 := y( h1.4[1][1], h1.4[1][2], h1.4[2][1], h1.4[2][2] ); m2 := y( h1.5[1][1], h1.5[1][2], h1.5[2][1], h1.5[2][2] ); h := GroupElementsOps.Group( Matrices, [a2, b2, c2, d2, m2, c, d, e], mat1^0 ); h.1 := a2; h.2 := b2; h.3 := c2; h.4 := d2; h.5 := m2; h.6 := c; h.7 := d; h.8 := e; h.size := 16464; h.name := ConcatenationString("MSS6(7", ",", String(p), ",", String(l), ")" ); h.isMatGroup := true; h.dimension := Length(mat1); h.field := f; h.operations := MatGroupOps; return [g, h]; fi; # Handle the case q>7 . if q > 7 then q3 := q^3; g1 := ImprimitiveMaxSolvableSubgroup (2, q, 1); # Construct the generators of g. a1 := y( g1.1[1][1], g1.1[1][2], g1.1[2][1], g1.1[2][2] ); b1 := y( g1.2[1][1], g1.2[1][2], g1.2[2][1], g1.2[2][2] ); c1 := y( g1.3[1][1], g1.3[1][2], g1.3[2][1], g1.3[2][2] ); g := GroupElementsOps.Group( Matrices, [a1, b1, c1, c, d, e], mat1^0 ); g.1 := a1; g.2 := b1; g.3 := c1; g.4 := c; g.5 := d; g.6 := e; g.size := 2 * (q-1) * q3; g.name := ConcatenationString("MSS3(", String(q), ",", String(p), ",", String(l), ")" ); g.isMatGroup := true; g.dimension := Length(mat1); g.field := f; g.operations := MatGroupOps; h1 := PrimitiveMaxSolvableSubgroup1 (2, q, 1); # Construct the generators of h. a2 := y( h1.1[1][1], h1.1[1][2], h1.1[2][1], h1.1[2][2] ); b2 := y( h1.2[1][1], h1.2[1][2], h1.2[2][1], h1.2[2][2] ); if q mod 4 = 3 then c2 := y( h1.3[1][1], h1.3[1][2], h1.3[2][1], h1.3[2][2] ); h := GroupElementsOps.Group( Matrices, [a2, b2, c2, c, d, e], mat1^0 ); h.1 := a2; h.2 := b2; h.3 := c2; h.4 := c; h.5 := d; h.6 := e; else h := GroupElementsOps.Group( Matrices, [a2, b2, c, d, e], mat1^0 ); h.1 := a2; h.2 := b2; h.3 := c; h.4 := d; h.5 := e; fi; h.size := 2 * (q + 1) * q3; h.name := ConcatenationString("MSS4(", String(q), ",", String(p), ",", String(l), ")" ); h.isMatGroup := true; h.dimension := Length(mat1); h.field := f; h.operations := MatGroupOps; s := PrimitiveMaxSolvableSubgroup2(2, q, 1); # Construct the generators. if q mod 8 = 3 or q mod 8 = 5 then # Construct the generators of s1. a3 := y( s.1[1][1], s.1[1][2], s.1[2][1], s.1[2][2] ); b3 := y( s.2[1][1], s.2[1][2], s.2[2][1], s.2[2][2] ); c3 := y( s.3[1][1], s.3[1][2], s.3[2][1], s.3[2][2] ); d3 := y( s.4[1][1], s.4[1][2], s.4[2][1], s.4[2][2] ); s1 := GroupElementsOps.Group( Matrices, [a3, b3, c3, d3, c, d, e], mat1^0 ); s1.1 := a3; s1.2 := b3; s1.3 := c3; s1.4 := d3; s1.5 := c; s1.6 := d; s1.7 := e; s1.size := 24 * q3; s1.name := ConcatenationString("MSS5(", String(q), ",", String(p), ",", String(l), ")" ); s1.isMatGroup := true; s1.dimension := Length(mat1); s1.field := f; s1.operations := MatGroupOps; return [g, h, s1]; else # Construct the generators of s1. t1 := s[1]; a3 := y( t1.1[1][1], t1.1[1][2], t1.1[2][1], t1.1[2][2] ); b3 := y( t1.2[1][1], t1.2[1][2], t1.2[2][1], t1.2[2][2] ); c3 := y( t1.3[1][1], t1.3[1][2], t1.3[2][1], t1.3[2][2] ); d3 := y( t1.4[1][1], t1.4[1][2], t1.4[2][1], t1.4[2][2] ); m3 := y( t1.5[1][1], t1.5[1][2], t1.5[2][1], t1.5[2][2] ); s1 := GroupElementsOps.Group( Matrices, [a3, b3, c3, d3, m3, c, d, e], mat1^0 ); s1.1 := a3; s1.2 := b3; s1.3 := c3; s1.4 := d3; s1.5 := m3; s1.6 := c; s1.7 := d; s1.8 := e; s1.size := 48 * q3; s1.name := ConcatenationString("MSS5(", String(q), ",", String(p), ",", String(l), ")" ); s1.isMatGroup := true; s1.dimension := Length(mat1); s1.field := f; s1.operations := MatGroupOps; # Construct the generators of s2. t2 := s[2]; a4 := y( t2.1[1][1], t2.1[1][2], t2.1[2][1], t2.1[2][2] ); b4 := y( t2.2[1][1], t2.2[1][2], t2.2[2][1], t2.2[2][2] ); c4 := y( t2.3[1][1], t2.3[1][2], t2.3[2][1], t2.3[2][2] ); d4 := y( t2.4[1][1], t2.4[1][2], t2.4[2][1], t2.4[2][2] ); m4 := y( t2.5[1][1], t2.5[1][2], t2.5[2][1], t2.5[2][2] ); s2 := GroupElementsOps.Group( Matrices, [a4, b4, c4, d4, m4, c, d, e], mat1^0 ); s2.1 := a4; s2.2 := b4; s2.3 := c4; s2.4 := d4; s2.5 := m4; s2.6 := c; s2.7 := d; s2.8 := e; s2.size := 48 * q3; s2.name := ConcatenationString("MSS6(", String(q), ",", String(p), ",", String(l), ")" ); s2.isMatGroup := true; s2.dimension := Length(mat1); s2.field := f; s2.operations := MatGroupOps; return [g, h, s1, s2]; fi; fi; else Error("if

^ mod <> 1 then SL(,

^) does not contain maximal ", " solvable subgroups of this type "); fi; fi; fi; end; ############################################################################ # 'AllPrimitiveMaxSolvableSubgroups2' returns SL(q, p^l)-conjugacy class # representatives of primitive maximal solvable subgroups of SL(q, p^l) # with a scalar maximal abelian normal subgroup. # AllPrimitiveMaxSolvableSubgroups2( ,

, ) AllPrimitiveMaxSolvableSubgroups2 := function(q, p, l) local pl, mat1, s, g, 2q, 3q, k, m, i, s1, s2, s12; pl := p^l; if pl mod q <> 1 then Error("

^ mod must be equal 1"); else mat1 := IdentityMat(q, GF(pl).one); mat1[q][q] := GF(pl).root; s := mat1; s1 := s^-1; k :=[]; m := []; g := PrimitiveMaxSolvableSubgroup2(q, p, l); # Handle the case q=2. if q=2 then return g; fi; # Handle the case q=3. if q=3 then if pl mod 9 = 1 then k[1] := g; m := [ [], [] ]; m[1][1] := s*g.1*s1; m[1][2] := s*g.2*s1; m[1][3] := s*g.3*s1; m[1][4] := s*g.4*s1; m[1][5] := s*g.5*s1; m[1][6] := s*g.6*s1; k[2] := GroupElementsOps.Group( Matrices, [ m[1][1], m[1][2], m[1][3], m[1][4], m[1][5], m[1][6] ], mat1^0 ); k[2].1 := m[1][1]; k[2].2 := m[1][2]; k[2].3 := m[1][3]; k[2].4 := m[1][4]; k[2].5 := m[1][5]; k[2].6 := m[1][6]; k[2].size := 648; k[2].name := ConcatenationString("MSS3.1(3", ",", String(p), ",", String(l), ")"); k[2].isMatGroup := true; k[2].dimension := Length(mat1); k[2].field := g.field; k[2].operations := MatGroupOps; s2 := s^2; s12 := s1^2; m[2][1] := s2*g.1*s12; m[2][2] := s2*g.2*s12; m[2][3] := s2*g.3*s12; m[2][4] := s2*g.4*s12; m[2][5] := s2*g.5*s12; m[2][6] := s2*g.6*s12; k[3] := GroupElementsOps.Group( Matrices, [ m[2][1], m[2][2], m[2][3], m[2][4], m[2][5], m[2][6] ], mat1^0 ); k[3].1 := m[2][1]; k[3].2 := m[2][2]; k[3].3 := m[2][3]; k[3].4 := m[2][4]; k[3].5 := m[2][5]; k[3].6 := m[2][6]; k[3].size := 648; k[3].name := ConcatenationString("MSS3.2(3", ",", String(p), ",", String(l), ")"); k[3].isMatGroup := true; k[3].dimension := Length(mat1); k[3].field := g.field; k[3].operations := MatGroupOps; return k; else return g; fi; fi; # Handle the case q=5. if q=5 then k[1] := g[1]; k[6] := g[2]; for i in [1..10] do m[i] := []; od; for i in [1..4] do m[i][1] := s^i * g[1].1 * s1^i; m[i][2] := s^i * g[1].2 * s1^i; m[i][3] := s^i * g[1].3 * s1^i; m[i][4] := s^i * g[1].4 * s1^i; m[i][5] := s^i * g[1].5 * s1^i; k[i+1] := GroupElementsOps.Group( Matrices, [ m[i][1], m[i][2], m[i][3], m[i][4], m[i][5] ], mat1^0 ); k[i+1].1 := m[i][1]; k[i+1].2 := m[i][2]; k[i+1].3 := m[i][3]; k[i+1].4 := m[i][4]; k[i+1].5 := m[i][5]; k[i+1].name := ConcatenationString( "MSS4", ".", String(i), "(", "5", ",", String(p), ",", String(l), ")" ); k[i+1].size := 324; m[i+5][1] := s^i * g[2].1 * s1^i; m[i+5][2] := s^i * g[2].2 * s1^i; m[i+5][3] := s^i * g[2].3 * s1^i; m[i+5][4] := s^i * g[2].4 * s1^i; m[i+5][5] := s^i * g[2].5 * s1^i; m[i+5][6] := s^i * g[2].6 * s1^i; m[i+5][7] := s^i * g[2].7 * s1^i; k[i+6] := GroupElementsOps.Group( Matrices, [ m[i+5][1], m[i+5][2], m[i+5][3], m[i+5][4], m[i+5][5], m[i+5][6], m[i+5][7] ], mat1^0 ); k[i+6].1 := m[i+5][1]; k[i+6].2 := m[i+5][2]; k[i+6].3 := m[i+5][3]; k[i+6].4 := m[i+5][4]; k[i+6].5 := m[i+5][5]; k[i+6].6 := m[i+5][6]; k[i+6].7 := m[i+5][7]; k[i+6].name := ConcatenationString( "MSS5", ".", String(i), "(", "5", ",", String(p), ",", String(l), ")" ); k[i+6].size := 3000; od; for i in [1..10] do k[i].isMatGroup := true; k[i].dimension := Length(mat1); k[i].field := g[1].field; k[i].operations := MatGroupOps; od; return k; fi; # Handle the case q=7. if q=7 then k[1] := g[1]; k[8] := g[2]; for i in [1..14] do m[i] := []; od; for i in [1..6] do m[i][1] := s^i * g[1].1 * s1^i; m[i][2] := s^i * g[1].2 * s1^i; m[i][3] := s^i * g[1].3 * s1^i; m[i][4] := s^i * g[1].4 * s1^i; m[i][5] := s^i * g[1].5 * s1^i; m[i][6] := s^i * g[1].6 * s1^i; m[i][7] := s^i * g[1].7 * s1^i; m[i][8] := s^i * g[1].8 * s1^i; k[i+1] := GroupElementsOps.Group( Matrices, [ m[i][1], m[i][2], m[i][3], m[i][4], m[i][5], m[i][6], m[i][7], m[i][8] ], mat1^0 ); k[i+1].1 := m[i][1]; k[i+1].2 := m[i][2]; k[i+1].3 := m[i][3]; k[i+1].4 := m[i][4]; k[i+1].5 := m[i][5]; k[i+1].6 := m[i][6]; k[i+1].7 := m[i][7]; k[i+1].8 := m[i][8]; k[i+1].name := ConcatenationString( "MSS5", ".", String(i), "(", "7", ",", String(p), ",", String(l), ")" ); k[i+1].size := 16464; m[i+7][1] := s^i * g[2].1 * s1^i; m[i+7][2] := s^i * g[2].2 * s1^i; m[i+7][3] := s^i * g[2].3 * s1^i; m[i+7][4] := s^i * g[2].4 * s1^i; m[i+7][5] := s^i * g[2].5 * s1^i; m[i+7][6] := s^i * g[2].6 * s1^i; m[i+7][7] := s^i * g[2].7 * s1^i; m[i+7][8] := s^i * g[2].8 * s1^i; k[i+8] := GroupElementsOps.Group( Matrices, [ m[i+7][1], m[i+7][2], m[i+7][3], m[i+7][4], m[i+7][5], m[i+7][6], m[i+7][7] ], mat1^0 ); k[i+8].1 := m[i+7][1]; k[i+8].2 := m[i+7][2]; k[i+8].3 := m[i+7][3]; k[i+8].4 := m[i+7][4]; k[i+8].5 := m[i+7][5]; k[i+8].6 := m[i+7][6]; k[i+8].7 := m[i+7][7]; k[i+8].8 := m[i+7][8]; k[i+8].name := ConcatenationString( "MSS6", ".", String(i), "(", "7", ",", String(p), ",", String(l), ")" ); k[i+8].size := 16464; od; for i in [1..14] do k[i].isMatGroup := true; k[i].dimension := Length(mat1); k[i].field := g[1].field; k[i].operations := MatGroupOps; od; return k; fi; # Handle the case q>7. if q>7 then if not IsPrime(q) then Error ( " must be prime" ); else 2q := 2*q; 3q := 3*q; k[1] := g[1]; k[q+1] := g[2]; for i in [1..2q] do m[i] := []; od; for i in [1..q-1] do m[i][1] := s^i * g[1].1 * s1^i; m[i][2] := s^i * g[1].2 * s1^i; m[i][3] := s^i * g[1].3 * s1^i; m[i][4] := s^i * g[1].4 * s1^i; m[i][5] := s^i * g[1].5 * s1^i; m[i][6] := s^i * g[1].6 * s1^i; k[i+1] := GroupElementsOps.Group( Matrices, [ m[i][1], m[i][2], m[i][3], m[i][4], m[i][5], m[i][6] ], mat1^0 ); k[i+1].1 := m[i][1]; k[i+1].2 := m[i][2]; k[i+1].3 := m[i][3]; k[i+1].4 := m[i][4]; k[i+1].5 := m[i][5]; k[i+1].6 := m[i][6]; k[i+1].name := ConcatenationString( "MSS3", ".", String(i), "(", String(q), ",", String(p), ",", String(l), ")" ); k[i+1].size := g[1].size; m[i+q][1] := s^i * g[2].1 * s1^i; m[i+q][2] := s^i * g[2].2 * s1^i; m[i+q][3] := s^i * g[2].3 * s1^i; m[i+q][4] := s^i * g[2].4 * s1^i; m[i+q][5] := s^i * g[2].5 * s1^i; k[i+q+1] := GroupElementsOps.Group( Matrices, [ m[i+q][1], m[i+q][2], m[i+q][3], m[i+q][4], m[i+q][5] ], mat1^0 ); k[i+q+1].1 := m[i+q][1]; k[i+q+1].2 := m[i+q][2]; k[i+q+1].3 := m[i+q][3]; k[i+q+1].4 := m[i+q][4]; k[i+q+1].5 := m[i+q][5]; k[i+q+1].name := ConcatenationString( "MSS4", ".", String(i), "(", String(q), ",", String(p), ",", String(l), ")" ); k[i+q+1].size := g[2].size; od; if q mod 8 = 3 or q mod 8 = 5 then k[2q+1] := g[3]; for i in [2q+1..3q] do m[i] := []; od; for i in [1..q-1] do m[2q+i][1] := s^i * g[3].1 * s1^i; m[2q+i][2] := s^i * g[3].2 * s1^i; m[2q+i][3] := s^i * g[3].3 * s1^i; m[2q+i][4] := s^i * g[3].4 * s1^i; m[2q+i][5] := s^i * g[3].5 * s1^i; m[2q+i][6] := s^i * g[3].6 * s1^i; m[2q+i][7] := s^i * g[3].7 * s1^i; k[2q+i+1] := GroupElementsOps.Group( Matrices, [ m[2q+i][1], m[2q+i][2], m[2q+i][3], m[2q+i][4], m[2q+i][5], m[2q+i][6], m[2q+i][7] ], mat1^0 ); k[2q+i+1].1 := m[2q+i][1]; k[2q+i+1].2 := m[2q+i][2]; k[2q+i+1].3 := m[2q+i][3]; k[2q+i+1].4 := m[2q+i][4]; k[2q+i+1].5 := m[2q+i][5]; k[2q+i+1].6 := m[2q+i][6]; k[2q+i+1].7 := m[2q+i][7]; k[2q+i+1].name := ConcatenationString( "MSS5", ".", String(i), "(", String(q), ",", String(p), ",", String(l), ")" ); k[2q+i+1].size := g[3].size; od; for i in [1..3q] do k[i].isMatGroup := true; k[i].dimension := Length(mat1); k[i].field := g[1].field; k[i].operations := MatGroupOps; od; elif q mod 8 = 1 or q mod 8 = 7 then k[2q+1] := g[3]; k[3q+1] := g[4]; for i in [2q+1..4*q] do m[i] := []; od; for i in [1..q-1] do m[i+2q][1] := s^i * g[3].1 * s1^i; m[i+2q][2] := s^i * g[3].2 * s1^i; m[i+2q][3] := s^i * g[3].3 * s1^i; m[i+2q][4] := s^i * g[3].4 * s1^i; m[i+2q][5] := s^i * g[3].5 * s1^i; m[i+2q][6] := s^i * g[3].6 * s1^i; m[i+2q][7] := s^i * g[3].7 * s1^i; m[i+2q][8] := s^i * g[3].8 * s1^i; k[i+2q+1] := GroupElementsOps.Group( Matrices, [ m[i+2q][1], m[i+2q][2], m[i+2q][3], m[i+2q][4], m[i+2q][5], m[i+2q][6], m[i+2q][7], m[i+2q][8] ], mat1^0 ); k[i+2q+1].1 := m[i+2q][1]; k[i+2q+1].2 := m[i+2q][2]; k[i+2q+1].3 := m[i+2q][3]; k[i+2q+1].4 := m[i+2q][4]; k[i+2q+1].5 := m[i+2q][5]; k[i+2q+1].6 := m[i+2q][6]; k[i+2q+1].7 := m[i+2q][7]; k[i+2q+1].8 := m[i+2q][8]; k[i+2q+1].name := ConcatenationString( "MSS5", ".", String(i), "(", String(q), ",", String(p), ",", String(l), ")" ); k[i+2q+1].size := g[3].size; m[i+3q][1] := s^i * g[4].1 * s1^i; m[i+3q][2] := s^i * g[4].2 * s1^i; m[i+3q][3] := s^i * g[4].3 * s1^i; m[i+3q][4] := s^i * g[4].4 * s1^i; m[i+3q][5] := s^i * g[4].5 * s1^i; m[i+3q][6] := s^i * g[4].6 * s1^i; m[i+3q][7] := s^i * g[4].7 * s1^i; m[i+3q][8] := s^i * g[4].8 * s1^i; k[i+3q+1] := GroupElementsOps.Group( Matrices, [ m[i+3q][1], m[i+3q][2], m[i+3q][3], m[i+3q][4], m[i+3q][5], m[i+3q][6], m[i+3q][7], m[i+3q][8] ], mat1^0 ); k[i+3q+1].1 := m[i+3q][1]; k[i+3q+1].2 := m[i+3q][2]; k[i+3q+1].3 := m[i+3q][3]; k[i+3q+1].4 := m[i+3q][4]; k[i+3q+1].5 := m[i+3q][5]; k[i+3q+1].6 := m[i+3q][6]; k[i+3q+1].7 := m[i+3q][7]; k[i+3q+1].8 := m[i+3q][8]; k[i+3q+1].name := ConcatenationString( "MSS6", ".", String(i), "(", String(q), ",", String(p), ",", String(l), ")" ); k[i+3q+1].size := g[4].size; od; for i in [1..4*q] do k[i].isMatGroup := true; k[i].dimension := Length(mat1); k[i].field := g[1].field; k[i].operations := MatGroupOps; od; fi; return k; fi; fi; fi; end; ############################################################################# # 'AllIrreducibleMaxSolvableSubgroups' returns the complete and # irredundant list of SL(q, p^l)-conjugacy class representatives of # irreducible maximal solvable subgroups of SL(q, p^l), where q^(p*l) # must not be greater then 2^16 # # AllIrreducibleMaxSolvableSubgroups(,

, ) AllIrreducibleMaxSolvableSubgroups := function(q, p, l) local g1, g2, g3, pl, g; if not IsPrime(q) then Error( " must be prime " ); else if p^(q*l) <= 65536 then pl := p^l; if pl mod q = 1 then g := AllPrimitiveMaxSolvableSubgroups2(q, p, l); fi; # Handle the case q=2. if q = 2 then if pl > 9 and p > 2 then return [ ImprimitiveMaxSolvableSubgroup(2, p, l), PrimitiveMaxSolvableSubgroup1(2, p, l), g ]; elif pl > 7 and p = 2 then return [ ImprimitiveMaxSolvableSubgroup(2, p, l), PrimitiveMaxSolvableSubgroup1(2, p, l) ]; elif pl in [5, 9] then return [ PrimitiveMaxSolvableSubgroup1(2, p, l), g ]; elif pl=3 or pl=7 then return [g]; elif pl=4 then return [ ImprimitiveMaxSolvableSubgroup(2, 2, 2), PrimitiveMaxSolvableSubgroup1(2, 2, 2) ]; elif pl=2 then return [ PrimitiveMaxSolvableSubgroup1(2, 2, 1) ]; fi; fi; # Handle the case q=3. if q=3 then if pl mod 3 = 1 and pl<>4 then return [ImprimitiveMaxSolvableSubgroup(3, p, l), PrimitiveMaxSolvableSubgroup1(3, p, l), g ]; elif pl mod 3 <> 1 and pl>2 then return [ ImprimitiveMaxSolvableSubgroup(3, p, l), PrimitiveMaxSolvableSubgroup1(3, p, l) ]; elif pl=4 then return [ PrimitiveMaxSolvableSubgroup1(3, 2, 2), g ]; elif pl=2 then return [ PrimitiveMaxSolvableSubgroup1(3, 2, 1) ]; fi; fi; # Handle the case q>3. if q > 3 then if pl mod q = 1 and pl > 2 then return [ImprimitiveMaxSolvableSubgroup(q, p, l), PrimitiveMaxSolvableSubgroup1(q, p, l), g ]; elif pl mod q = 1 and pl = 2 then return [ PrimitiveMaxSolvableSubgroup1(q, 2, l), g ]; elif pl mod q <> 1 and pl > 2 then return [ ImprimitiveMaxSolvableSubgroup(q, p, l), PrimitiveMaxSolvableSubgroup1(q, p, l) ]; elif pl mod q <> 1 and pl = 2 then return [ PrimitiveMaxSolvableSubgroup1(q, 2, l) ]; fi; fi; else Error("

^(*) must be less than 65536" ); fi; fi; end;