Skip to content

Commit

Permalink
PERFECT: Documentation, test, Access functions for new groups
Browse files Browse the repository at this point in the history
Basic test of creating new groups (reading files in)

Removed constructing all perfect groups, as this will be longer now

Remove now pointless tests that checked for the discrepancy between claimed list (up
to 10^6) and existing data.
  • Loading branch information
hulpke committed Sep 30, 2020
1 parent 4212487 commit dc1bc88
Show file tree
Hide file tree
Showing 6 changed files with 56 additions and 125 deletions.
49 changes: 18 additions & 31 deletions doc/ref/grplib.xml
Original file line number Diff line number Diff line change
Expand Up @@ -297,42 +297,31 @@ It returns <K>fail</K> if no such group exists in the library.
<Heading>Finite Perfect Groups</Heading>

<Index>perfect groups</Index>
The &GAP; library of finite perfect groups provides, up to isomorphism,
a list of all perfect groups whose sizes are less than <M>10^6</M> excluding
the following sizes:
<P/>
<List>
<Item>
For <M>n = 61440</M>, 122880, 172032, 245760, 344064, 491520, 688128, or
983040, the perfect groups of size <M>n</M> have not completely been
determined yet. The library neither provides the number of these
groups nor the groups themselves.
</Item>
<Item>
For <M>n = 86016</M>, 368640, or 737280, the library does not yet
contain the perfect groups of size <M>n</M>, it only provides their
numbers which are 52, 46, and 54, respectively.
</Item>
</List>
<P/>
Except for these eleven sizes, the list of altogether 1097 perfect groups
in the library is complete. It relies on results of Derek&nbsp;F. Holt and
Wilhelm Plesken which are published in their book <Q>Perfect Groups</Q>
<Cite Key="HP89"/>. Moreover, they have supplied us with files with
presentations of 488 of the groups. In terms of these, the remaining 607
nontrivial groups in the library can be described as 276 direct products,
107 central products, and 224 subdirect products. They are computed
automatically by suitable &GAP; functions whenever they are needed. Two
additional groups omitted from the book <Q>Perfect Groups</Q> have also been
included.
The &GAP; library of finite perfect groups provides, up to isomorphism, a
list of all perfect groups whose sizes are less than <M>10^6</M>.
The groups of most of these orders have been enumerated by
Derek&nbsp;F. Holt and Wilhelm Plesken and
published in their book <Q>Perfect Groups</Q> <Cite Key="HP89"/>.
For orders <M>n = 86016</M>, 368640, or 737280 this work only counted the
groups (but did not explicitly list them), the groups of orders
<M>n = 61440</M>, 122880, 172032, 245760, 344064, 491520,
688128, or 983040 were omitted.
<P/>
We are grateful to Derek Holt and Wilhelm Plesken for making their groups
available to the &GAP; community by contributing their files. It should
be noted that their book contains a lot of further information for many
of the library groups. So we would like to recommend it to any &GAP;
user who is interested in the groups.
Two additional groups omitted from the book <Q>Perfect Groups</Q> have also
been included.
<P/>
The library of these has been brought into &GAP; format by Volkmar Felsch.
<P/>
The perfect groups of size less than <M>10^6</M>which were missing in the work of Holt
and Plesken have been enumerated by Alexander
Hulpke. They are stored directly and provide less construction information
in their names.
<P/>
The library has been brought into &GAP; format by Volkmar Felsch.
<P/>
As all groups are stored by presentations, a permutation representation
is obtained by coset enumeration. Note that some of the library groups do
Expand All @@ -343,7 +332,6 @@ Computations in these groups may be rather time consuming.
<#Include Label="PerfectGroup">
<#Include Label="PerfectIdentification">
<#Include Label="NumberPerfectGroups">
<#Include Label="NumberPerfectLibraryGroups">
<#Include Label="SizeNumbersPerfectGroups">
<#Include Label="DisplayInformationPerfectGroups">

Expand Down Expand Up @@ -1168,4 +1156,3 @@ gap> LargestMovedPoint( P2 );
<!-- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -->
<!-- %% -->
<!-- %E -->

29 changes: 9 additions & 20 deletions grp/perf.gd
Original file line number Diff line number Diff line change
Expand Up @@ -97,7 +97,7 @@ DeclareAttribute("PerfectIdentification", IsGroup );
## One can iterate over the perfect groups library with:
## <Example><![CDATA[
## gap> for n in SizesPerfectGroups() do
## > for k in [1..NrPerfectLibraryGroups(n)] do
## > for k in [1..NrPerfectGroups(n)] do
## > pg := PerfectGroup(n,k);
## > od;
## > od;
Expand All @@ -116,42 +116,31 @@ DeclareGlobalFunction("SizesPerfectGroups");
## <#GAPDoc Label="NumberPerfectGroups">
## <ManSection>
## <Func Name="NumberPerfectGroups" Arg='size'/>
## <Func Name="NrPerfectGroups" Arg='size'/>
## <Func Name="NumberPerfectLibraryGroups" Arg='size'/>
## <Func Name="NrPerfectLibraryGroups" Arg='size'/>
##
## <Description>
## returns the number of non-isomorphic perfect groups of size <A>size</A> for
## each positive integer <A>size</A> up to <M>10^6</M> except for the eight sizes
## listed at the beginning of this section for which the number is not
## yet known. For these values as well as for any argument out of range it
## returns <K>fail</K>.
## <A>NrPerfectGroups</A> is a synonym for <Ref Func="NumberPerfectGroups"/>.
## Moreover <A>NumberPerfectLibraryGroups</A> (and its synonym <A>NrPerfectLibraryGroups</A>)
## exist for historical reasons, and return 0 instead of fail for arguments
## outside the library scope.
## </Description>
## </ManSection>
## <#/GAPDoc>
##
DeclareGlobalFunction("NumberPerfectGroups");
DeclareSynonym("NrPerfectGroups",NumberPerfectGroups);


#############################################################################
##
#F NumberPerfectLibraryGroups( <size> ) . . . . . . . . . . . . . . . . . .
##
## <#GAPDoc Label="NumberPerfectLibraryGroups">
## <ManSection>
## <Func Name="NumberPerfectLibraryGroups" Arg='size'/>
##
## <Description>
## returns the number of perfect groups of size <A>size</A> which are available
## in the library of finite perfect groups. (The purpose of the function
## is to provide a simple way to formulate a loop over all library groups
## of a given size.)
## </Description>
## </ManSection>
## <#/GAPDoc>
##
DeclareGlobalFunction("NumberPerfectLibraryGroups");
DeclareSynonym("NrPerfectLibraryGroups",NumberPerfectLibraryGroups);



#############################################################################
##
#F PerfectGroup( [<filt>, ]<size>[, <n>] )
Expand Down
28 changes: 8 additions & 20 deletions grp/perf.grp
Original file line number Diff line number Diff line change
Expand Up @@ -86,26 +86,14 @@ InstallGlobalFunction( NumberPerfectGroups, function ( size )
fi;
end );

InstallGlobalFunction(NumberPerfectLibraryGroups,function(size)
local a;
a:=NumberPerfectGroups(size);
if a=fail then return 0;
else return a;fi;
end);

#############################################################################
##
#F NumberPerfectLibraryGroups( size )
##
## `NumberPerfectLibraryGroups' returns the number of nonisomorphic perfect
## groups of size `size' for 1 <= size <= 1 000 000 which are available in the
## perfect groups library.
##
InstallGlobalFunction( NumberPerfectLibraryGroups, function ( size )
local sizenum;

if size=1 then
return 1;
elif IsOddInt(size) then return 0;fi;
# get the number and return it.
sizenum := PerfGrpLoad( size );
return PERFRec.number[sizenum];

end );

#############################################################################
##
Expand Down Expand Up @@ -489,7 +477,7 @@ local size,i,nr,n,leng,sizenum,hpnum,description,centre,orbsize;
if IsInt(arg[1]) then
size:=arg[1];
if Length(arg)=1 then
nr:=[1..NumberPerfectLibraryGroups(size)];
nr:=[1..NumberPerfectGroups(size)];
else
nr:=arg[2];
fi;
Expand Down Expand Up @@ -690,7 +678,7 @@ local s,l;
Print("#W No information about size ",s," available\n");
return fail;
fi;
l:=NumberPerfectLibraryGroups(s);
l:=NumberPerfectGroups(s);
while l>1 do
if IsomorphismGroups(G,PerfectGroup(IsPermGroup,s,l))<>fail then
return [s,l];
Expand Down
5 changes: 0 additions & 5 deletions grp/perf0.grp
Original file line number Diff line number Diff line change
Expand Up @@ -46,11 +46,6 @@
## have not yet been determined. It is needed by subroutine
## NumberPerfectGroups.
##
## PERFRec.notAvailable
## is a list of all sizes less than 10^6 for which the perfect groups
## are known, but not yet in the library. It is needed by subroutines
## DisplayInformationPerfectGroups and NumberPerfectLibraryGroups.
##
## PERFRec.sizeNumberSimpleGroup
## is an ordered list of the 'size numbers' of all nonabelian simple
## groups which occur as composition factor of any library group.
Expand Down
50 changes: 1 addition & 49 deletions tst/testinstall/grp/perf.tst
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ gap> NumberPerfectGroups(60);
gap> NumberPerfectGroups(60^6);
fail
gap> NumberPerfectLibraryGroups(60^6);
0
fail

#
gap> SizesPerfectGroups();
Expand Down Expand Up @@ -49,36 +49,6 @@ gap> SizesPerfectGroups();
887040, 892800, 900000, 903168, 907200, 912576, 921600, 921984, 929280,
933120, 936000, 937500, 943488, 950400, 950520, 960000, 962280, 967680,
976500, 979200, 979776, 983040, 987840 ]
gap> List(SizesPerfectGroups(), NrPerfectLibraryGroups);
[ 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 2, 7, 1, 1, 1, 1, 3, 1, 1, 1, 7, 1,
2, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 1, 5, 1, 1, 3, 1, 1, 9, 4, 1, 1, 1, 1, 1,
1, 3, 1, 7, 1, 1, 1, 1, 5, 22, 1, 3, 1, 1, 1, 1, 1, 4, 1, 1, 37, 2, 1, 1,
4, 1, 1, 1, 4, 25, 3, 1, 1, 1, 3, 1, 1, 1, 2, 2, 2, 1, 2, 1, 3, 0, 1, 4, 1,
1, 1, 4, 1, 4, 4, 3, 1, 1, 6, 1, 0, 1, 8, 2, 1, 3, 1, 1, 1, 1, 1, 1, 15, 3,
1, 1, 1, 4, 5, 2, 0, 1, 6, 4, 3, 2, 2, 1, 1, 1, 1, 1, 1, 18, 1, 3, 1, 12,
1, 0, 8, 1, 1, 1, 3, 1, 19, 1, 1, 2, 1, 1, 1, 1, 1, 3, 1, 2, 1, 26, 3, 3,
1, 17, 5, 1, 1, 2, 0, 1, 1, 4, 3, 2, 7, 1, 1, 2, 1, 3, 2, 3, 1, 3, 18, 1,
27, 1, 1, 0, 3, 1, 1, 1, 6, 1, 1, 3, 3, 0, 1, 1, 11, 1, 1, 2, 2, 1, 1, 4,
3, 1, 1, 1, 1, 3, 1, 2, 1, 1, 3, 8, 1, 1, 25, 4, 3, 18, 1, 4, 17, 6, 1, 0,
1, 1, 1, 1, 1, 9, 1, 1, 1, 1, 19, 1, 1, 7, 1, 1, 2, 3, 1, 4, 1, 12, 1, 2,
41, 1, 1, 1, 3, 2, 1, 0, 23, 3, 2, 1, 1, 1, 1, 2, 3, 2, 1, 1, 3, 0, 1, 13,
2, 5, 3, 16, 2, 2, 1, 3, 2, 3, 3, 2, 1, 2, 1, 1, 3, 1, 7, 6, 4, 1, 23, 8,
2, 21, 3, 8, 1, 2, 1, 12, 1, 20, 1, 1, 4, 0, 1 ]
gap> List(SizesPerfectGroups(), NrPerfectGroups);
[ 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 2, 7, 1, 1, 1, 1, 3, 1, 1, 1, 7, 1,
2, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 1, 5, 1, 1, 3, 1, 1, 9, 4, 1, 1, 1, 1, 1,
1, 3, 1, 7, 1, 1, 1, 1, 5, 22, 1, 3, 1, 1, 1, 1, 1, 4, 1, 1, 37, 2, 1, 1,
4, 1, 1, 1, 4, 25, 3, 1, 1, 1, 3, 1, 1, 1, 2, 2, 2, 1, 2, 1, 3, fail, 1, 4,
1, 1, 1, 4, 1, 4, 4, 3, 1, 1, 6, 1, 52, 1, 8, 2, 1, 3, 1, 1, 1, 1, 1, 1,
15, 3, 1, 1, 1, 4, 5, 2, fail, 1, 6, 4, 3, 2, 2, 1, 1, 1, 1, 1, 1, 18, 1,
3, 1, 12, 1, fail, 8, 1, 1, 1, 3, 1, 19, 1, 1, 2, 1, 1, 1, 1, 1, 3, 1, 2,
1, 26, 3, 3, 1, 17, 5, 1, 1, 2, fail, 1, 1, 4, 3, 2, 7, 1, 1, 2, 1, 3, 2,
3, 1, 3, 18, 1, 27, 1, 1, fail, 3, 1, 1, 1, 6, 1, 1, 3, 3, 46, 1, 1, 11, 1,
1, 2, 2, 1, 1, 4, 3, 1, 1, 1, 1, 3, 1, 2, 1, 1, 3, 8, 1, 1, 25, 4, 3, 18,
1, 4, 17, 6, 1, fail, 1, 1, 1, 1, 1, 9, 1, 1, 1, 1, 19, 1, 1, 7, 1, 1, 2,
3, 1, 4, 1, 12, 1, 2, 41, 1, 1, 1, 3, 2, 1, fail, 23, 3, 2, 1, 1, 1, 1, 2,
3, 2, 1, 1, 3, 54, 1, 13, 2, 5, 3, 16, 2, 2, 1, 3, 2, 3, 3, 2, 1, 2, 1, 1,
3, 1, 7, 6, 4, 1, 23, 8, 2, 21, 3, 8, 1, 2, 1, 12, 1, 20, 1, 1, 4, fail, 1 ]

#
gap> DisplayInformationPerfectGroups(1);
Expand Down Expand Up @@ -106,10 +76,6 @@ gap> DisplayInformationPerfectGroups([3840,2]);
#I Perfect group 3840: A5 ( 2^4 E 2^1 A ) C 2^1 II
#I centre = 4 size = 2^8*3*5 orbit size = 64
#I Holt-Plesken class 1 (6,2)
gap> DisplayInformationPerfectGroups(61440);
#I no information known about size 61440
gap> DisplayInformationPerfectGroups(86016);
#I no information available about size 86016
gap> DisplayInformationPerfectGroups(967680,4);
#I Perfect group
967680: quasisimple group L3(4) 3^1 x ( 2^1 A 2^1 ) x ( 2^1 A 2^1 )
Expand Down Expand Up @@ -163,16 +129,6 @@ A5
gap> IsFpGroup(g);
true

#
# construct all perfect groups, to verify this works
# TODO: slow (takes a few seconds), move to teststandard?
#
gap> for n in SizesPerfectGroups() do
> for i in [1..NumberPerfectLibraryGroups(n)] do
> PerfectGroup(n, i);
> od;
> od;

#
# test PerfGrpConst directly for some corner cases
#
Expand All @@ -192,10 +148,6 @@ gap> PerfectGroup(1,2);
Error, PerfectGroup(1,2) does not exist !
gap> PerfectGroup(30,1);
Error, PerfectGroup(30,1) does not exist !
gap> PerfectGroup(61440, 1);
Error, Perfect groups of size 61440 not known
gap> PerfectGroup(86016, 1);
Error, Perfect groups of size 86016 not available

#
gap> STOP_TEST("perfectgroups.tst", 1);
20 changes: 20 additions & 0 deletions tst/teststandard/opers/PerfectGroups.tst
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
gap> START_TEST("PerfectGroups.tst");

#
gap> Sum(SizesPerfectGroups(),NrPerfectGroups);
6002
gap> l:=[61440, 86016, 122880, 172032, 245760, 344064, 368640, 491520,
> 688128, 737280, 983040 ];;
gap> List(l,NrPerfectGroups);
[ 98, 52, 258, 154, 582, 291, 46, 975, 508, 54, 1881 ]
gap> gp:=List(l,x->PerfectGroup(IsPermGroup,x,30));;
gap> gp:=List(gp,x->Group(GeneratorsOfGroup(x)));;
gap> List(gp,Size)=l;
true
gap> ForAll(gp,IsPerfect);
true
gap> List(gp,NrMovedPoints);
[ 240, 28, 768, 128, 400, 224, 116, 80, 308, 1024, 360 ]

#
gap> STOP_TEST("PerfectGroups.tst",1);

0 comments on commit dc1bc88

Please sign in to comment.