############################################################################# ## #W trans.grp GAP transitive groups library Alexander Hulpke ## ## #Y Copyright (C) 1997, Lehrstuhl D für Mathematik, RWTH Aachen, Germany ## ## This file contains the routines for the transitive groups library ##
############################################################################# ## #V TRANSGRP . . . . . . . . . generators and names of the transitive groups ## List contains one list per degree. Entries are lists itself ## for each group,starting with generators,then the name.
if IsHPCGAP then
LockAndMigrateObj(TRANSGRP, TRANSREGION); fi;
############################################################################# ## #V TRANSPROPERTIES . . . . . . . . . property list for the transitive groups ## ## This list is in the same order as the groups generators. For each group, ## properties are stored as follows: ## ## <size>: Size of the group ## <primitive>: 1 indicates, that the group operates primitive ## <transitivity>: Transitivity ## <sign>: Sign ## <shapes>: List of all occurring shapes (except ()), sorted ## according to the ordering of the Partitions command ## <2Set>: Orbits on 2-Sets ## <2Seq>: Orbits on 2-Sequences ## <3Set>: Orbits on 3-Sets ## <special>: following entries mark special properties, which ## ... are coded as [type,description1,description2,...] . ## The list starts with orbit lengths: ## ## Types: ## 1 1-Set=Pts. ## 2 2-Set ## 3 3-Set ## 4 4-Set ## 5 5-Sets ## 6 i/2-Diff (only possible with even number of points) ## 8 Blocks ## 9 2Seq ## 0 Blockfingerprint ## ## 20+b alternating Subgroup on b ## ## 100*a+b factor group by operation on the b cosets of a ## type a stabilizer; description field gives the ## number of this factor group as TransitiveGroup ## 1000*a+10*b+c factor group by operation on the b cosets of ## a type a stabilizer operates on c: ## description fields are a list for each of the ## possible stabilizers ## 10000*a+10*b+c type a stabilizer of index b operation on c: ## description fields are a list for each of the ## possible stabilizers, split again for the ## (raw-split) due to the Orbits of <G> itself. ## ## All Orbit information is coded as a list in which each entry has ## the form ## SignOperation*( 1000*(number of orbits with this description-1) ## +length) ## ## Group theoretic information that cannot be used by the Galois ## determination routines is indicated by a negative sign: ## ## -50 Size of the derived subgroup ## -60 Size of the Frattini subgroup ## -70 Number of normal subgroups ## ## some special cases are not discriminated completely by this ## list. The program will deal with them separately.
if IsHPCGAP then
TRANSLENGTHS:=MakeWriteOnceAtomic(TRANSLENGTHS);
atomic TRANSREGION do
MigrateObj(TRANSPROPERTIES, TRANSREGION);
MigrateObj(TRANSNONDISCRIM, TRANSREGION);
MigrateObj(TRANSSIZES, TRANSREGION);
MigrateObj(TRANSPARTNUM, TRANSREGION);
MigrateObj(TRANSMINIMALS, TRANSREGION);
od; fi;
TRANSAVAILABLE:=BlistList([1..50],[2..7]);
CallFuncList(function()
local dir,fnam,tradeg; for tradeg in [8..48] do
fnam:=Concatenation("trans",String(tradeg),".grp"); if tradeg=32 then
dir:= DirectoriesPackageLibrary( "transgrp", "dat32" ); elif tradeg=48 then
dir:= DirectoriesPackageLibrary( "transgrp", "dat48" );
fnam:="TransitiveGroupsOfDegree48_1959.gz"; else
dir:= DirectoriesPackageLibrary( "transgrp", "data" ); fi;
fnam:=Filename( dir, fnam); if fnam<>fail and IsReadableFile(fnam) then
TRANSAVAILABLE[tradeg]:=true; fi;
od; end,[]);
MakeImmutable(TRANSAVAILABLE);
MakeReadOnlyGlobal("TRANSAVAILABLE");
BindGlobal("TransGrpLoad",function(deg,nr)
local Tbak,Fbak,flg,sel,i,fname,block,transdir;
block:=300; if deg=32 or deg=36 or deg=40 then block:=5000;fi; if deg=32 then
transdir:= DirectoriesPackageLibrary( "transgrp", "dat32" ); elif deg=48 then
atomic TRANSREGION do
TRANSLENGTHS[48]:=195826352;
od;
return; else
transdir:= DirectoriesPackageLibrary( "transgrp", "data" ); fi;
atomic readonly TRANSREGION do if IsBound(TRANSGRP[deg]) and (nr=0 or IsBound(TRANSGRP[deg][nr])) then
return; fi;
od;
atomic TRANSREGION do if not IsBound(TRANSAVAILABLE[deg]) or TRANSAVAILABLE[deg]=false then
Error("transitive groups of degree ",deg," are unavailable"); else
fname:=Concatenation("trans",String(deg)); if (deg>15 and not IsPrime(deg)) or deg>30 then if not IsBound(TRANSGRP[deg]) then
Read(Filename(transdir,Concatenation( fname, ".grp" ) )); if IsHPCGAP then
MigrateObj(TRANSGRP[deg], TRANSREGION);
MigrateObj(TRANSPROPERTIES[deg], TRANSREGION);
MigrateObj(TRANSSIZES[deg], TRANSREGION);
MigrateObj(TRANSSELECT[deg], TRANSREGION); fi; if nr=0 then
return; fi; else # the groups to be thrown away
sel:=Difference(Filtered([1..Length(TRANSGRP[deg])],
i->IsBound(TRANSGRP[deg])),TRANSSELECT[deg]); if Length(TRANSSELECT[deg])>block then
flg:=TRANSSELECT[deg]{[1..Length(TRANSSELECT[deg])-block/2]};
sel:=Union(flg,sel);
TRANSSELECT[deg]:=Difference(TRANSSELECT[deg],flg); if IsHPCGAP then
MigrateObj(TRANSSELECT[deg], TRANSREGION); fi; fi; for i in sel do
Unbind(TRANSGRP[deg][i]);
Unbind(TRANSPROPERTIES[deg][i]);
od; fi;
Append(fname,WordAlp("abcdefghijklmnopqrstuvwxyz",Int((nr-1)/block)+1)); fi;
IsString(fname);
Read(Filename(transdir,Concatenation( fname, ".grp" ) )); if IsHPCGAP then
MigrateObj(TRANSGRP[deg], TRANSREGION);
MigrateObj(TRANSPROPERTIES[deg], TRANSREGION); fi;
if deg>31 and not IsBound(TRANSMINIMALS[32]) then
Read(Filename(DirectoriesPackageLibrary("transgrp","data"), "transminimals.grp")); if IsHPCGAP then for i in [32..Length(TRANSMINIMALS)] do
MigrateObj(TRANSMINIMALS[i],TRANSREGION);
od; fi; fi;
if (deg>15 and not IsPrime(deg)) or deg>30 then
sel:=Difference(Filtered([1..Length(TRANSGRP[deg])],
i->IsBound(TRANSGRP[deg][i])),TRANSSELECT[deg]); else
TRANSLENGTHS[deg]:=Length(TRANSGRP[deg]);
TRANSSIZES[deg]:=List(TRANSPROPERTIES[deg],i->i[1]);
sel:=[1..TRANSLENGTHS[deg]]; fi; # make blists those which are
ForAll(TRANSPROPERTIES[deg]{sel},i->IsBound(i[5]) and IsBlist(i[5])); fi; for i in sel do
MakeImmutable(TRANSGRP[deg][i]);
MakeImmutable(TRANSPROPERTIES[deg][i]);
od;
TRANSPARTNUM[deg]:=NrPartitions(deg);
od; end);
InstallGlobalFunction(TransitiveGroupsAvailable,function(deg) if not IsPosInt(deg) then
Error("degree must be a positive integer"); fi; if not IsBound(TRANSAVAILABLE[deg]) or TRANSAVAILABLE[deg]=false then
return false; fi;
TransGrpLoad(deg,0); # to set up variables
return true; end);
BindGlobal("TRANSGrp",function(deg,nr) if not TransitiveGroupsAvailable(deg) then
Error("Transitive Groups of degree ",deg," are not available"); fi;
atomic TRANSREGION do if not IsBound(TRANSGRP[deg]) or not IsBound(TRANSGRP[deg][nr]) then
TransGrpLoad(deg,nr); fi; if (deg>15 and not IsPrime(deg)) or deg>30 then
AddSet(TRANSSELECT[deg],nr); fi; if nr>TRANSLENGTHS[deg] then
return "fail"; fi;
return TRANSGRP[deg][nr];
od; end);
BindGlobal("TRANSProperties",function(deg,nr)
local l; if not TransitiveGroupsAvailable(deg) then
Error("Transitive Groups of degree ",deg," are not available"); fi;
atomic TRANSREGION do if not IsBound(TRANSPROPERTIES[deg]) or
not IsBound(TRANSPROPERTIES[deg][nr]) then
TransGrpLoad(deg,nr); fi; if (deg>15 and not IsPrime(deg)) or deg>30 then
AddSet(TRANSSELECT[deg],nr); fi; if nr>TRANSLENGTHS[deg] then
return "fail"; fi;
l:=TRANSPROPERTIES[deg][nr]; if IsBound(l[5]) and IsString(l[5]) then if l[5]<>"false"then # translate string to blist
l:=ShallowCopy(l);
l[5]:=BlistStringDecode(l[5],TRANSPARTNUM[deg]-1);
MakeImmutable(l);
TRANSPROPERTIES[deg][nr]:=l; else
l:=ShallowCopy(l);
Unbind(l[5]); fi; fi;
return l;
od; end);
InstallGlobalFunction(NrTransitiveGroups, function(deg) if deg=1 then
return 0; fi; if not IsPosInt(deg) then
Error("degree must be a positive integer"); fi; if not TransitiveGroupsAvailable(deg) then
return fail; fi;
return TRANSLENGTHS[deg]; end);
# This function is mostly due to Jesse Lansdown and Gordon F. Royle
BindGlobal("TransitiveGroup48",function(id)
local file_number, pos, strm, i, x, g;
file_number := QuoInt(id-1, 100000)+1;;
pos := (id-1) mod 100000 + 1;
strm:=Filename(DirectoriesPackageLibrary( "transgrp", "dat48" ),
Concatenation("TransitiveGroupsOfDegree48_", String(file_number), ".gz"));
strm := InputTextFile(strm); for i in [1 .. pos+14] do
x:=ReadLine(strm);;
od;
x:=EvalString(x);;
CloseStream(strm);; if x[1] <> id then
Error("Somehow we got the wrong group!!!\n"); else
g:=Group(x[2]);;
SetTransitiveIdentification(g, id);;
return g; fi; end);
InstallGlobalFunction( TransitiveGroup, function(deg,num)
local gens,i,l,g,s; if deg=1 then
return fail; elif not TransitiveGroupsAvailable(deg) then
Error("Transitive Groups of degree ",deg," are not available"); fi; if deg=48 then
return TransitiveGroup48(num); fi;
atomic TRANSREGION do if not (num in [1..TRANSLENGTHS[deg]]) then
Error("maximal number of groups of degree ",deg," is ",
TRANSLENGTHS[deg]); fi;
# special case: Symmetric and Alternating Group
s:=Factorial(deg); if TRANSProperties(deg,num)[1]=s then if deg=1 then
g:=GroupByGenerators( [], () ); else
g:=SymmetricGroup(deg); fi;
SetName(g,Concatenation("S",String(deg))); elif TRANSProperties(deg,num)[1]*2=s then
g:=AlternatingGroup(deg);
SetName(g,Concatenation("A",String(deg))); else
l:=TRANSGrp(deg,num);
s:=Length(l);
gens:=[]; for i in l{[1..s]} do if IsPerm(i) then
Add(gens,i); elif not IsString(i) then if Length(i)=2 then
Add(gens,TRANSGrp(i[1],i[2])[1]); else
Add(gens,TRANSGrp(i[1],i[2])[i[3]]); fi; fi;
od;
g:= GroupByGenerators( gens, () ); if IsString(l[s]) and l[s]<>""then
SetName(g,l[s]); else
SetName(g,Concatenation("t",String(deg),"n",String(num))); fi; fi;
SetTransitiveIdentification(g,num);
return g;
od; end );
InstallGlobalFunction(MinimalTransitiveIndices,function(deg)
local l; if deg=1 then
return fail; fi; if not TransitiveGroupsAvailable(deg) then
Error("Transitive Groups of degree ",deg," are not available"); fi;
TransGrpLoad(deg,1);
atomic TRANSREGION do
l:=TRANSMINIMALS[deg];
od;
return Immutable(l); end );
InstallFlushableValue(TRANSCOMBCACHE,[[0],[0],[0]]); if IsHPCGAP then
LockAndMigrateObj(TRANSCOMBCACHE, TRANSREGION); fi;
BindGlobal("TransCombinat",function(m,n)
local i,l;
atomic readonly TRANSREGION do for i in [1..3] do if TRANSCOMBCACHE[i][1]=m and TRANSCOMBCACHE[i][2]=n then
return TRANSCOMBCACHE[i][3]; fi;
od;
od;
atomic TRANSREGION do
TRANSCOMBCACHE[3]:=TRANSCOMBCACHE[2];
TRANSCOMBCACHE[2]:=TRANSCOMBCACHE[1];
l:=Combinations(m,n); for i in l do MakeImmutable(i);od;
Sort(l);
IsSet(l);
TRANSCOMBCACHE[1]:=[m,n,l];
return l;
od; end);
InstallFlushableValue(TRANSARRCACHE,[[0],[0],[0]]); if IsHPCGAP then
LockAndMigrateObj(TRANSARRCACHE, TRANSREGION); fi;
BindGlobal("TransArrange",function(m,n)
local i,l;
atomic readonly TRANSREGION do for i in [1..3] do if TRANSARRCACHE[i][1]=m and TRANSARRCACHE[i][2]=n then
return TRANSARRCACHE[i][3]; fi;
od;
od;
atomic TRANSREGION do
TRANSARRCACHE[3]:=TRANSARRCACHE[2];
TRANSARRCACHE[2]:=TRANSARRCACHE[1];
l:=Arrangements(m,n); for i in l do MakeImmutable(i);od;
Sort(l);
IsSet(l);
TRANSARRCACHE[1]:=[m,n,l];
return l;
od; end);
BindGlobal("CntOp",function(grp,orb,op)
local l,i,j,sgn;
l:=[]; for i in orb do
i:=Set(Immutable(i));
sgn:=1;
j:=1; while sgn=1 and j<=Length(GeneratorsOfGroup(grp)) do if SignPerm(Permutation(GeneratorsOfGroup(grp)[j],i,op))<0 then
sgn:=-1; fi;
j:=j+1;
od;
Add(l,sgn*Length(i));
od;
l:=Collected(l); for i in [1..Length(l)] do
l[i]:=SignInt(l[i][1])*(1000*(l[i][2]-1)+AbsInt(l[i][1]));
od;
Sort(l);
return l; end);
BindGlobal("NumBol",function(b) if b then return 1; else return 0; fi; end);
BindGlobal("SetsOrbits",function(g,n)
local l,i;
l:=TransCombinat(MovedPoints(g),n); for i in l do MakeImmutable(i);od;
Sort(l);
return OrbitsDomain(g,l,OnSets); end);
BindGlobal("SeqsOrbits",function(g,n)
local l,i;
l:=TransArrange(MovedPoints(g),n); for i in l do MakeImmutable(i);od;
Sort(l);
return OrbitsDomain(g,l,OnTuples); end);
# the (undocumented) `cheap' parameter has the following function: # not set -> proper test # true -> return `fail' if not unique ID # 1 -> ID list if no cheap unique ID # 2 -> as 1, but do not compute classes (expensive if big!)
InstallMethod(TransitiveIdentification,"generic",true,[IsPermGroup],0, function(ogrp)
local dom,p,s,t,a,cand,i,grp,deg,aiso,piso,co,cheap;
cheap:=ValueOption("cheap");
grp:=ogrp;
dom:=MovedPoints(grp); if not IsTransitive(grp,dom) then
Error("Group must operate transitively"); fi;
deg:=Length(dom); if deg=48 then
Error("Identification of the groups of degree 48 is not available"); fi;
atomic TRANSREGION do if not IsBound(TRANSLENGTHS[deg]) then
TransGrpLoad(deg,0); fi;
s:=Size(grp); if deg>15 then
cand:=Filtered([1..TRANSLENGTHS[deg]],i->TRANSSIZES[deg][i]=s); else
cand:=Filtered([1..TRANSLENGTHS[deg]],i->TRANSProperties(deg,i)[1]=s); fi; if Length(cand)>1 and deg>4 then
co:=CntOp(grp,OrbitsDomain(grp,TransCombinat(dom,2),OnSets),OnSets);
cand:=Filtered(cand,i->TRANSProperties(deg,i)[6]=co); if Length(cand)>1 then
co:=CntOp(grp,OrbitsDomain(grp,TransArrange(dom,2),OnTuples),OnTuples);
cand:=Filtered(cand,i->TRANSProperties(deg,i)[7]=co); fi; if Length(cand)>1 then
co:=CntOp(grp,OrbitsDomain(grp,TransCombinat(dom,3),OnSets),OnSets);
cand:=Filtered(cand,i->TRANSProperties(deg,i)[8]=co); fi; fi;
Pcgs(grp); # try to enforce solvable calculations further on. # if Length(cand)>1 and IsSolvableGroup(grp) # and not HasConjugacyClasses(grp) then # t:=[]; # aiso:=IsomorphismPcGroup(grp); # a:=Image(aiso,grp); # for i in ConjugacyClasses(a) do # s:=ConjugacyClass(grp,PreImagesRepresentative(aiso,Representative(i))); # SetStabilizerOfExternalSet(s,PreImage(aiso,Centralizer(i))); # Add(t,s); # od; # SetConjugacyClasses(grp,t); # fi;
if Length(cand)>1 and cheap<>2 and
ForAll(cand,i->IsBound(TRANSProperties(deg,i)[5])) then
s:=List(CycleStructuresGroup(grp),i->i=1);
cand:=Filtered(cand,i->TRANSProperties(deg,i)[5]=s); fi; if Length(cand)>1 then
p:=List(cand,i->TransitiveGroup(deg,i));
# DerivedSubgroups + Frattini Subgroups
s:=Filtered([1..Length(cand)],i->
Size(DerivedSubgroup(p[i]))=Size(DerivedSubgroup(grp))); if Length(Factors(Size(grp)))=1 then
s:=Filtered(s,i->
Size(FrattiniSubgroup(p[i]))=Size(FrattiniSubgroup(grp))); fi;
cand:=cand{s};
p:=p{s}; fi;
od;
if Length(cand)>1 then # Blockl"angen
t:=List(p,i->Collected(List(AllBlocks(i),Length)));
s:=Collected(List(AllBlocks(grp),Length));
s:=Filtered([1..Length(cand)],i->s=t[i]);
cand:=cand{s};
p:=p{s}; fi;
if Length(cand)>1 then # 4-sets
t:=[4,CntOp(grp,SetsOrbits(grp,4),OnSets)];
s:=Filtered([1..Length(cand)],i->t in TRANSProperties(deg,cand[i])
or ForAll(TRANSProperties(deg,cand[i]){
[9..Length(TRANSProperties(deg,cand[i]))]},j->j[1]<>4));
cand:=cand{s};
p:=p{s}; fi;
if Length(cand)>1 and cheap<>2 then # As all computations, which follow involve only the groups, convert # them to PcGroups if possible if IsSolvableGroup(grp) then
s:=Filtered([1..Length(cand)],i->IsSolvableGroup(p[i]));
cand:=cand{s}; # aiso:=IsomorphismPcGroup(grp); # grp:=Image(aiso,grp); # # piso:=List(p{s},IsomorphismPcGroup); # p:=List([1..Length(s)],i->Image(piso[i],p[s[i]]));
p:=p{s};
List(p,Pcgs); # enforce Pcgs use # else # aiso:=IdentityMapping(grp); # piso:=List(p,IdentityMapping); fi;
# maximal subgroups if cheap=fail and IsSolvableGroup(grp) and Length(cand)>1 then
t:=Collected(List(MaximalSubgroupClassReps(grp),
i->[Size(i),Collected(List(OrbitsDomain(i,MovedPoints(grp)),Length))]));
s:=Filtered([1..Length(cand)],k->
Collected(List(MaximalSubgroupClassReps(p[k]),
i->[Size(i),Collected(List(OrbitsDomain(i,MovedPoints(grp)),Length))]))=t);
cand:=cand{s};
p:=p{s}; if Length(cand)>1 then
a:=Filtered(t,i->i[2]<=5 and Length(i[1][2])=1 and i[1][2][1][2]=1);
a:=List(a,i->i[1][1]);
t:=Collected(List(Filtered(MaximalSubgroupClassReps(grp),
i->Size(i) in a and Length(OrbitsDomain(i,MovedPoints(grp)))=1),
x->TransitiveIdentification(x:cheap)));
s:=Filtered([1..Length(cand)],
k->Collected(List(Filtered(MaximalSubgroupClassReps(p[k]),
i->Size(i) in a and Length(OrbitsDomain(i,MovedPoints(p[k])))=1),
x->TransitiveIdentification(x:cheap)))=t);
cand:=cand{s};
p:=p{s}; fi; fi;
if cheap=fail and Length(cand)>1 and not IsSolvableGroup(grp) then # NormalSubgroups (some solvable groups have too many)
t:=Collected(List(NormalSubgroups(grp),Size));
s:=Filtered([1..Length(cand)],
i->Collected(List(NormalSubgroups(p[i]),Size))=t);
cand:=cand{s};
p:=p{s}; fi;
if cheap=fail and Length(cand)>1 and Size(grp)<3000 then # Subgroups
Info(InfoWarning,2,"TransId: test Subgroups ",cand);
t:=Collected(List(ConjugacyClassesSubgroups(Group(GeneratorsOfGroup(grp))),
i->[Size(Representative(i)),Size(i)]));
s:=Filtered([1..Length(cand)],i->Collected(List(
ConjugacyClassesSubgroups(Group(GeneratorsOfGroup(p[i]))),
i->[Size(Representative(i)),Size(i)]))=t);
cand:=cand{s};
p:=p{s}; fi;
if cheap=fail and Length(cand)>1 then # two special cases in degree 30 if Length(dom)=30 and 2230 in cand or 4335 in cand then
Info(InfoWarning,2,"TransId: Isomorphism Test",cand);
cand:=First(cand,i->IsomorphismGroups(grp,
TransitiveGroup(30,i):nogensyssearch:=true)<>fail);
return cand; fi; # now finally the hard test: Test for conjugacy
Info(InfoWarning,2,"TransId: Conjugacy Test",cand);
s:=SymmetricGroup(Maximum(dom)); # if IsSolvableGroup(grp) then # grp:=PreImage(aiso,grp); # p:=List([1..Length(p)],i->PreImage(piso[i],p[i])); # fi;
grp:=AsSubgroup(s,grp);
p:=List(p,i->AsSubgroup(s,i));
s:=Filtered([1..Length(cand)],i->IsConjugate(s,grp,p[i]));
cand:=cand{s};
p:=p{s}; fi;
if Length(cand)=1 then
return cand[1]; elif cheap=true then
return cand; elif cheap<>fail then
return cand; else
Error("Uh-Oh, this should never happen ",cand); fi; end);
############################################################################# ## #F SelectTransitiveGroups(arglis,alle,whine) . . . . . selection function ##
InstallGlobalFunction(SelectTransitiveGroups,function(arglis,alle,whine)
local i,j,a,b,l,p,deg,gut,g,grp,nr,f;
l:=Length(arglis)/2; if not IsInt(l) then
Error("wrong arguments"); fi;
atomic TRANSREGION do
deg:=Filtered([1..Length(TRANSAVAILABLE)],x->IsBound(TRANSAVAILABLE[x])
and TRANSAVAILABLE[x]=true);
p:=Position(arglis,NrMovedPoints); if p<>fail then
p:=arglis[p+1]; if IsInt(p) then
p:=[p]; fi; if IsList(p) then
f:=not IsSubset(deg,p);
deg:=Intersection(deg,p); else
f:=true;
deg:=Filtered(deg,p); fi; else
f:=true; #warnung weil kein Degree angegeben ? fi;
gut:=[]; if 48 in deg then
Info(InfoWarning,1,"Selection of groups of degree 48 is not available");
deg:=Filtered(deg,x->x<>48); fi; for i in deg do if not IsBound(TRANSLENGTHS[i]) then
TransGrpLoad(i,0); fi;
gut[i]:=[1..TRANSLENGTHS[i]];
od;
# special treatment for Size for degrees larger than 15
a:=Position(arglis,Size); if a<>fail then
a:=arglis[a+1]; for i in Filtered(deg,i->(i>15 and not IsPrime(i)) or i>30) do if IsFunction(a) then
gut[i]:=Filtered(gut[i],j->a(TRANSSIZES[i][j])); elif IsList(a) then
gut[i]:=Filtered(gut[i],j->TRANSSIZES[i][j] in a); else
gut[i]:=Filtered(gut[i],j->TRANSSIZES[i][j]=a); fi;
od; fi;
# find the properties we have not stored
p:=[]; for i in [1..l] do if not arglis[2*i-1] in
[NrMovedPoints,Size,Transitivity,SignPermGroup,IsPrimitive] then
Add(p,arglis{[2*i-1,2*i]}); fi;
od;
for i in [1..l] do
a:=arglis[2*i-1];
b:=arglis[2*i];
# get all cheap properties first if a=NrMovedPoints then
f:=false; if IsInt(b) then
b:=[b]; fi; if IsList(b) then
b:=Set(b); if not IsSubset(deg,b) then
f:=true; fi;
deg:=Intersection(deg,b); else # b is a function (wondering, whether anyone will ever use it...)
f:=true;
deg:=Filtered(deg,b); fi; elif a=Size or a=Transitivity or a=SignPermGroup then if a=Size then
nr:=1; elif a=Transitivity then
nr:=3; else
nr:=4; fi; for i in deg do
gut[i]:=Filtered(gut[i],j->STGSelFunc(TRANSProperties(i,j)[nr],b));
od; elif a=IsPrimitive then
b:=NumBol(b); for i in deg do
gut[i]:=Filtered(gut[i],j->TRANSProperties(i,j)[2]=b);
od; fi;
od;
od;
if f and whine then
IsRange(deg); # display nicer
Info(InfoWarning,1,"AllTransitiveGroups: Degree restricted to ",deg); fi;
# the rest is hard:
grp:=[]; for i in deg do for nr in gut[i] do
g:=TransitiveGroup(i,nr); if ForAll(p,i->STGSelFunc(i[1](g),i[2])) then if alle then
Add(grp,g); else
return g; fi; fi;
od;
od;
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.