GAP 4.8.9 installation with standard packages -- copy to your CoCalc project to get it
#############################################################################
##
#W smlgp11.g GAP group library Hans Ulrich Besche
## Bettina Eick, Eamonn O'Brien
##
## This file contains the function to extract the data of the stored groups
## of order p^7 for p in { 3, 5, 7, 11 } created by Eamon O'Brien and
## Mike Vaughan-Lee.
##
#############################################################################
##
## tell GAP about the component
##
DeclareComponent("small11","0.1");
#############################################################################
##
#F SMALL_AVAILABLE_FUNCS[ 11 ]
##
SMALL_AVAILABLE_FUNCS[ 11 ] := function( size )
local p;
p := FactorsInt( size );
if Length( p ) <> 7 or p[ 1 ] = 2 or Length( Set( p ) ) > 1 then
return fail;
fi;
return rec( func := 26,
lib := 11,
p := p[ 1 ] );
end;
#############################################################################
##
#F SMALL_GROUP_FUNCS[ 26 ]( size, i, inforec )
##
## p ^ 7, p <> 2
##
SMALL_GROUP_FUNCS[ 26 ] := function( size, i, inforec )
local n, p, sml, l, j, lb, ub, tail, d, pn, m, h, fix_exps, var_exps, f,
c, e, g, UnpackArraytail;
UnpackArraytail := function( pn )
l := sml.arraytails[ pn ];
d := l mod 6;
sml.arraytails[ pn ] := rec( d := d );
l := Int( l / 6 );
sml.arraytails[ pn ].perm :=
CoefficientsMultiadic( [ 1 .. d ] * 0 + d, l );
l := Int( l / d^d );
sml.arraytails[ pn ].width :=
CoefficientsMultiadic( [ 1 .. d ] * 0 + p, l ) + 1;
l := Int( l / p^d );
sml.arraytails[ pn ].inc :=
CoefficientsMultiadic( [ 1 .. d ] * 0 + p, l );
sml.arraytails[ pn ].n := Product( sml.arraytails[ pn ].width );
end;
if not IsBound( inforec.number ) then
inforec := NUMBER_SMALL_GROUPS_FUNCS[ 26 ]( size, inforec );
fi;
n := inforec.number;
if i > n then
Error( "there are just ", n, " groups of size ", size );
fi;
p := inforec.p;
if p > 11 then
Error( "sorry, but groups of size p^7 are available for p<=11 only" );
fi;
sml := Primes[ p + 10 ];
if not IsBound( SMALL_GROUP_LIB[ sml ] ) then
ReadSmallLib( "sml", 11, sml, [ ] );
fi;
sml := SMALL_GROUP_LIB[ sml ];
ub := Length( sml.heads );
# unpack index if required
if Length( sml.index ) <> Length( sml.heads ) then
l := sml.index;
sml.index := [];
for j in [ 1 .. Length( l ) ] do
sml.index[ Int( j / Length( l ) * ub ) ] := l[ j ];
od;
fi;
# search segment by divide et impera
lb := 0;
m := Int( ub / 2 );
while ub > lb + 1 and IsBound( sml.index[ m ] ) do
m := Int( ( lb + ub ) / 2 );
if IsBound( sml.index[ m ] ) then
if i <= sml.index[ m ] then
ub := m;
else
lb := m;
fi;
fi;
od;
# search segment through list
repeat
lb := lb + 1;
if not IsBound( sml.index[ lb ] ) then
pn := sml.pntr[ lb ];
if pn < 0 then
if IsInt( sml.arraytails[ -pn ] ) then
UnpackArraytail( -pn );
fi;
sml.index[ lb ] := sml.index[ lb-1 ] + sml.arraytails[-pn].n;
else
tail := sml.regtails[ pn ];
l := Length( tail );
if tail[ l ] < 0 then
tail[ l ] := sml.regsegms[ -tail[ l ] ];
fi;
if p = 3 and tail[ l ] <= 81 then
l := l * 4 - 3;
elif p = 3 and tail[ l ] <= 6723 then
l := l * 4 - 2;
elif p = 3 and tail[ l ] <= 551367 then
l := l * 4 - 1;
elif p = 3 then
l := l * 4;
elif p = 5 and tail[ l ] <= 625 then
l := l * 3 - 2;
elif p = 5 and tail[ l ] <= 391875 then
l := l * 3 - 1;
elif p = 5 then
l := l * 3;
elif ( p = 7 and tail[ l ] <= 2401 ) or
( p = 11 and tail[ l ] <= 14641 ) then
l := l * 2 - 1;
elif p = 7 or p = 11 then
l := l * 2;
fi;
if lb = 1 then
sml.index[ 1 ] := l;
else
sml.index[ lb ] := sml.index[ lb - 1 ] + l;
fi;
fi;
fi;
until i <= sml.index[ lb ];
# unpack head
h := sml.heads[ lb ];
if h < 0 then
h := sml.heads[ -h ];
fi;
fix_exps := [ 1 .. 56 ] * 0;
var_exps := [];
while h > 0 do
m := CoefficientsMultiadic( [ p, 57 ], h );
if m[ 1 ] = 0 then
Add( var_exps, m[ 2 ] );
else
fix_exps[ m[ 2 ] ] := m[ 1 ];
fi;
h := Int( h / 57 / p );
od;
if lb > 1 then
i := i - sml.index[ lb - 1 ];
fi;
if sml.pntr[ lb ] > 0 then
# find missing exponents in regular tail
tail :=sml.regtails[ sml.pntr[ lb ] ];
l := [ ,,4,,3,,2,,,,2 ];
if IsBound( l[ p ] ) then
l := l[ p ];
else
l := 1;
fi;
m := Int( ( i - 1 ) / l ) + 1;
if tail[ m ] < 0 then
tail[ m ] := sml.regsegms[ -tail[m] ];
fi;
m := CoefficientsMultiadic( [ p, p, p, p ], Int( tail[ m ] /
( p^4 + 1 )^( ( i - 1 ) mod l ) ) mod ( p^4 + 1 ) -1 );
for i in [ 1 .. Length( var_exps) ] do
fix_exps[ var_exps[ i ] ] := m[ 5 - i ];
od;
else
# find missing exponents in array tail
if IsInt( sml.arraytails[ -sml.pntr[ lb ] ] ) then
UnpackArraytail( -sml.pntr[ lb ] );
fi;
tail :=sml.arraytails[ -sml.pntr[ lb ] ];
SortParallel( ShallowCopy( tail.perm ), var_exps );
m := CoefficientsMultiadic( tail.width, i - 1 ) + tail.inc;
for i in [ 1 .. Length( var_exps) ] do
fix_exps[ var_exps[ i ] ] := m[ i ];
od;
fi;
f := FreeGroup( 7 );
c := CombinatorialCollector( f, [p,p,p,p,p,p,p] );
e := fix_exps;
SetPower( c,1,f.2^e[1]*f.3^e[2]*f.4^e[3]*f.5^e[4]*f.6^e[5]*f.7^e[6] );
SetPower( c,2,f.3^e[7]*f.4^e[8]*f.5^e[9]*f.6^e[10]*f.7^e[11] );
SetPower( c,3,f.4^e[12]*f.5^e[13]*f.6^e[14]*f.7^e[15] );
SetPower( c,4,f.5^e[16]*f.6^e[17]*f.7^e[18] );
SetPower( c,5,f.6^e[19]*f.7^e[20] );
SetPower( c,6,f.7^e[21] );
SetCommutator( c,2,1,f.3^e[22]*f.4^e[23]*f.5^e[24]*f.6^e[25]*f.7^e[26] );
SetCommutator( c,3,1,f.4^e[27]*f.5^e[28]*f.6^e[29]*f.7^e[30] );
SetCommutator( c,4,1,f.5^e[31]*f.6^e[32]*f.7^e[33] );
SetCommutator( c,5,1,f.6^e[34]*f.7^e[35] );
SetCommutator( c,6,1,f.7^e[36] );
SetCommutator( c,3,2,f.4^e[37]*f.5^e[38]*f.6^e[39]*f.7^e[40] );
SetCommutator( c,4,2,f.5^e[41]*f.6^e[42]*f.7^e[43] );
SetCommutator( c,5,2,f.6^e[44]*f.7^e[45] );
SetCommutator( c,6,2,f.7^e[46] );
SetCommutator( c,4,3,f.5^e[47]*f.6^e[48]*f.7^e[49] );
SetCommutator( c,5,3,f.6^e[50]*f.7^e[51] );
SetCommutator( c,6,3,f.7^e[52] );
SetCommutator( c,5,4,f.6^e[53]*f.7^e[54] );
SetCommutator( c,6,4,f.7^e[55] );
SetCommutator( c,6,5,f.7^e[56] );
g := GroupByRwsNC( c );
SetIsPGroup( g, true );
return g;
end;
#############################################################################
##
#F SELECT_SMALL_GROUPS_FUNCS[ 26 ]( funcs, vals, inforec, all, id )
##
SELECT_SMALL_GROUPS_FUNCS[ 26 ] := SELECT_SMALL_GROUPS_FUNCS[ 11 ];
#############################################################################
##
#F NUMBER_SMALL_GROUPS_FUNCS[ 26 ]( size, inforec )
##
## p ^ 7, p <> 2
##
NUMBER_SMALL_GROUPS_FUNCS[ 26 ] := function( size, inforec )
local p;
p := inforec.p;
if p = 3 then inforec.number := 9310;
elif p = 5 then inforec.number := 34297;
else
inforec.number :=
3 * p^5 + 12 * p^4 + 44 * p^3 + 170 * p^2 + 707 *p + 2455
+ ( 4 * p^2 + 44 * p + 291 ) * Gcd( p-1, 3 )
+ ( p^2 + 19 * p + 135 ) * Gcd( p-1, 4 )
+ ( 3 * p + 31 ) * Gcd( p-1, 5 )
+ 4 * Gcd( p-1, 7 )
+ 5 * Gcd( p-1, 8 )
+ Gcd( p-1, 9 );
fi;
return inforec;
end;