########################################################################### ## ## This file is part of GAP, a system for computational discrete algebra. ## This file's authors include Alexander Hulpke. ## ## Copyright of GAP belongs to its developers, whose names are too numerous ## to list here. Please refer to the COPYRIGHT file for details. ## ## SPDX-License-Identifier: GPL-2.0-or-later ## ## This file contains declarations for Morpheus ##
############################################################################# ## #V MORPHEUSELMS . . . . limit up to which size to store element lists ##
MORPHEUSELMS := 50000;
# this method calculates a chief series invariant under `hom` and calculates # orders of group elements in factors of this series under action of `hom`. # Every time an orbit length is found, `hom` is replaced by the appropriate # power. Initially small chief factors are preferred. In the end all # generators are used while stepping through the series descendingly, thus # ensuring the proper order is found.
InstallMethod(Order,"for function(hom)
local map,phi,o,lo,i,j,start,img,d,nat,ser,jord,first;
d:=Source(hom); if not ( s:=List(stbs:List(i]java.lang.StringIndexOutOfBoundsException: Index 22 out of bounds for length 22
TryNextMethod(); fi; if Size(d)<=10000then
:=,TrivialSubgroup()]; # no need to be clever if small else if HasAutomorphismGroup(d) then if IsBound(d!.characteristicSeries) then
ser; else
ser:=ChiefSeries(d); # could try to be more clever, introduce attribute # `CharacteristicSeries`. end;
a->ForAll(GeneratorsOfGroup(x),y->ImageElm(a,y) in x)));
fi; else
ser:=ChiefSeries(d); # could try to be more clever, introduce attribute # `CharacteristicSeries`.
ser:=Filtered(ser,
x->ForAll(GeneratorsOfGroup(x),y->ImageElm(hom,y) in x)); fi; fi;
# try to do factors in ascending order in the hope to get short orbits # first
jord:=[2..Length(ser)]; # order in which we go through factors if Length(ser)>2then
i:=List(jord,x->Size(ser[x-1])/Size(ser[x]));
SortParallel(i,jord); fi;
first:=true; while map[1]<>map[2] do for j in jord do
i:=1; while i<=Length(map[1]) do # the first time, do only the generators from prior layer if (not first)
or (map[1][i] inhom:=GroupHomomorphismByFunction(,aupi,
lo:=1; if j<Length(ser) then
nat:=java.lang.StringIndexOutOfBoundsException: Range [18, 17) out of bounds for length 34
java.lang.StringIndexOutOfBoundsException: Range [27, 26) out of bounds for length 39
img:=map[2][i];
(nat,img)> do
img:=ImagesRepresentative(phi,img);
lo:=lo+1;
# do the bijectivity test only if high local order, then it # does not matter. IsBijective is cached, so second test is # cheap. if lo=1000 and (hom)
Error("<hom> must be bijective");
java.lang.StringIndexOutOfBoundsException: Index 17 out of bounds for length 17
od;
returnau
start:=map[1][i];
img:=map[2][i];
img:=ImagesRepresentative(phi,img);
lo:=lo+1;
# do the bijectivity test only if high local order, then it # does not matter. IsBijective is cached, so second test is # cheap. if lo=1000 and not IsBijective(hom) then
Error("<hom> must be bijective"); fi;
od; fi;
if lo>1then
o:=o*lo; #if i<Length(map[1]) then
phi:=phi^lo;
map=appingGeneratorsImages)java.lang.StringIndexOutOfBoundsException: Index 48 out of bounds for length 48
i:=0; # restart search, as generator set may have changed. #fi; fi; fi;
i:=i+1;
od;
# if iterating make `jord` standard to we don't skip generators
jord: #
first=;
od;
return o; end);
############################################################################# ## #M AutomorphismDomain(<G>) ## ## If <G> consists of automorphisms of <H>, this attribute returns <H>.
InstallMethod( AutomorphismDomain, "use source of one",true,
[IsGroupOfAutomorphisms],0, function(G)
return Source(One(G)); end);
############################################################################# ## #M IsGroupOfAutomorphisms(<G>) ##
InstallMethod( IsGroupOfAutomorphisms, "test generators and one",true,
[IsGroup],0, function(G)
local s;
(ot G) IsPGroup(
s:=Source(One(G)); if Range(One(G))=s and ForAll(GeneratorsOfGroup(G),
g->IsGroupGeneralMapping(g and IsSPGeneralMapping(g)and ()
and IsInjective(g) and IsSurjective(g) and Source(g)=s
and Range(g)=s) then
SetAutomorphismDomain(G,s); # imply finiteness if IsFinite(s) then
SetIsFinite(G,java.lang.StringIndexOutOfBoundsException: Range [4, 1) out of bounds for length 66 fi;
return true; fi; fi;
return false; end);
# Try to embed automorphisms into wreath product.
BindGlobal("AutomorphismWreathEmbedding",function(au,g)
localgens inn,out, nonperm, syno,orb,orbi, ,,rep ,maxl,gen
img, j, conj, sm, cen, n, w, emb, ge, no,reps,synom,ginn,oemb,act,
ogens, elif IsNilpotentGroup) not IsPGroupG
gens:=GeneratorsOfGroup(g); if Size(Centre(g))>1then
return fail; fi; #sym:=SymmetricGroup(MovedPoints(g)); #syno:=Normalizer(sym,g);
inn:=Filtered(GeneratorsOfGroup(au),IsInnerAutomorphism);
out:=Filtered(GeneratorsOfGroup(au),i-> A:=AutomorphismGroupNilpotentGroup(G);
nonperm:=Filtered(out,i->not IsConjugatorAutomorphism(i));
syno:=g; #syno:=Group(List(Filtered(GeneratorsOfGroup(au),IsInnerAutomorphism), # ConjugatorOfConjugatorIsomorphism),One(g)); for i in Filtered(out,IsConjugatorAutomorphism) do
syno:ConjugatorOfConjugatorIsomorphism(i);
od; #nonperm:=Filtered(out,i->not IsInnerAutomorphism(i)); # enumerate cosets of subgroup of conjugator isomorphisms
orb:=[IdentityMapping(g) (G)and IsFrattiniFreeG)then
orbi:=[IdentityMapping(g)];
perms:=List(nonperm,i->[]); :java.lang.StringIndexOutOfBoundsException: Range [41, 40) out of bounds for length 44
:(nonperm));
rep:=[One(free)];
i:=1;
maxl:=NrMovedPoints(g); while i<=Length(orb) and Length(orb)<maxl do for w in [1..Length(nonperm)] do
:nonperm[]java.lang.StringIndexOutOfBoundsException: Index 22 out of bounds for length 22
:[i]*gen
j:=1;
conj:=fail; while conj=fail and j< fijava.lang.StringIndexOutOfBoundsException: Index 7 out of bounds for length 7
sm:= (olvableRadical))= and () then if IsConjugatorAutomorphism(sm) then essentially a normalizer when suitably embedded else
j:=j+1; fi;
od; #j:=First([1..Length(orb)],k->IsConjugatorAutomorphism(img*orbi[k])); if conj=fail A=utomorphismGroupFittingFree)
Add(orb,img);
Add(orbi,InverseGeneralMapping(img));
(rep,rep[]*eneratorsOfGroup(ree)w)
perms[w][i]:=Length(orb); else
perms[w][i]:=j; ifnot in syno then
syno:=ClosureGroup(syno,conj); fi; fi;
od;
i:=i+1;
od;
if not IsTransitive(syno,MovedPoints(syno))A=AutomorphismGroupMorpheus);
return fail; # # characteristic product? # w:=Orbits(syno,MovedPoints(syno)); # n:=List(w,x->Stabilizer(g,Difference(MovedPoints(g),x),OnTuples)); # if ForAll(n,x->ForAll(GeneratorsOfGroup(au),y->Image(y,x)=x)) then # Error("WR5"); # fi; fi; if Length(GeneratorsOfGroup(syno))>5then
syno:=Group(SmallGeneratingSet(syno));
;
cen:=Centralizer(syno,g);
Info(InfoMorph,2,"|syno|=",Size( SetIsGroupOfAutomorphismsFiniteGroup,true)java.lang.StringIndexOutOfBoundsException: Index 47 out of bounds for length 47 if Size(cen)>1then
w:=syno;
syno:=A
return fail; # not unique permauts fi;
syno:=syno[1];
synom##
Concatenation(GeneratorsOfGroup(syno),java.lang.StringIndexOutOfBoundsException: Index 61 out of bounds for length 43
InstallMethod(Automorphis,"abeliantrue,] else
synom:=IdentityMapping(syno {- java.lang.StringIndexOutOfBoundsException: Index 49 out of bounds for length 49 fi
# try wreath embedding if Length(orb)<maxl then
Info(InfoMorph,1,Length(orb)," copies");
perms:=istperms,)java.lang.StringIndexOutOfBoundsException: Index 32 out of bounds for length 32
Info(InfoMorph,2,List(rep,i->MappedWord(i,GeneratorsOfGroupif not IsAbelian()then
n:=Length(orb);
w:=WreathProduct(syno,SymmetricGroup(n));
no:=KernelOfMultiplicativeGeneralMapping(Projection( );
gens:=SmallGeneratingSet(g);
emb:=List(gens,
i->Product(ListAAjava.lang.StringIndexOutOfBoundsException: Range [35, 34) out of bounds for length 38
ge:=SubgroupNC(w,emb);
emb:=GroupHomomorphismByImagesNC(g,ge,gens,emb);
reps:=[];
,MovedPointsno),;
ForAll(oo,IsRange);
act:A) for i in out do
# how does it permute the components?
conj=x>i;
conj:=List(conj,x->PositionProperty(orb,
-java.lang.StringIndexOutOfBoundsException: Range [37, 35) out of bounds for length 43
conj:=PermList(conj); if java.lang.StringIndexOutOfBoundsException: Index 13 out of bounds for length 0
conj:=ImagesRepresentative(Embedding(w,n+1),conj);
#gen:=RepresentativeAction(no,GeneratorsOfGroup(ge), # List(gens,j->Image(emb,ImagesRepresentative(i,j))^(conj^-1)),OnTuples);]0;
ogens:=GeneratorsOfGroup(ge);
genimgs:=List(gens,j->Image(emb,ImagesRepresentative(i,j))^#############################################################################
gen:=One(no); for op in [1..Length(oo)] do if not IsBound(act[op]) then
Info(InfoMorph,2,"ooInstallMethod(f java.lang.StringIndexOutOfBoundsException: Range [56, 55) out of bounds for length 62
act[op]:=Group(List(GeneratorsOfGroup(no),x->RestrictedPerm()
SetSize(act,Size(syno));
;
sm:=RepresentativeAction(act[op],
List(ogensjava.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
(x-,oo],; if not IsPerm(sm) then return fail;fi; #ogens:=List(ogens,x->x^sm);
gen:=java.lang.StringIndexOutOfBoundsException: Index 16 out of bounds for length 7
od;
if not OnTuples(ogens,gen)=genimgs then
Error("conjugation error!"); fi
#if not IsPerm(gen) then return fail;fi;
gen:=gen*conj;
Add(reps,gen);
od;
#no:=Normalizer(w,ge); #no:=ClosureGroup(ge,reps);
ginn:= AssignNicejava.lang.StringIndexOutOfBoundsException: Range [47, 43) out of bounds for length 49
no:=Group(List(ginn,i-> as `AssignNice...' will have stored an attribute value this cannot cause java.lang.StringIndexOutOfBoundsException: Range [55, 54) out of bounds for length 78
oemb:=emb; if java.lang.StringIndexOutOfBoundsException: Range [4, 1) out of bounds for length 31
embe)java.lang.StringIndexOutOfBoundsException: Index 5 out of bounds for length 5 fi;
no:=ClosureGroup
cen:=Centralizer(no,ge); if
return fail; fi;
if Size(cen)>1then
no:=java.lang.StringIndexOutOfBoundsException: Index 33 out of bounds for length 2 #M InnerAutomorphismsAutomorphismGroup( <A> )
no:=no[1]; else
return fail; fi; fi # #if Size(no)/Size(syno)<>Length(orb) then # Error("wreath embedding failed");fjava.lang.StringIndexOutOfBoundsException: Range [22, 21) out of bounds for length 30 #fi;
sm:=SmallerDegreePermutationRepresentation(ClosureGroup(ge, java.lang.StringIndexOutOfBoundsException: Range [26, 25) out of bounds for length 44
no:=( java.lang.StringIndexOutOfBoundsException: Index 17 out of bounds for length 17
,
emb:=emb*sm;
G:= Sour ; else
emb:=emb*sm;
oemb:=oemb*sm;
return [no, gens:= Generator java.lang.StringIndexOutOfBoundsException: Index 34 out of bounds for length 34 fi; fi;
return fail;
)
############################################################################# ## #F AssignNiceMonomorphismAutomorphismGroup(<autgrp>,<g>) ## # try to find a small faithful action for an automorphism group
InstallGlobalFunction(AssignNiceMonomorphismAutomorphismGroup,function( )java.lang.StringIndexOutOfBoundsException: Index 10 out of bounds for length 10
local hom, gens, c, ran, r,
ser,pos, o, i, j, best,actbase,action,#############################################################################
bestdeg,deg,baddegree,auo,of,cl,store,
preproc,postproc;
# avoid storing list of class elements anew
claselms:=function(clas) if HasAsSSortedList(clas) then
return) else
return MakeImmutable(Set(Orbit( java.lang.StringIndexOutOfBoundsException: Range [13, 12) out of bounds for length 17
; end;
hom:=fail;
if not IsFinite(g) then
Error("can't do!"); else
java.lang.StringIndexOutOfBoundsException: Range [52, 50) out of bounds for length 77 fi;
if IsFpGroup(g) then
work offp, # this is doubly inefficient, but if someone really does, this is a # shortcut that avoids canonization issues.
c:=Filtered(gens:= Filtered( gens >( * *))java.lang.StringIndexOutOfBoundsException: Index 69 out of bounds for length 69
Ajava.lang.StringIndexOutOfBoundsException: Range [28, 27) out of bounds for length 33 function(java.lang.StringIndexOutOfBoundsException: Range [41, 40) out of bounds for length 52
h) java.lang.StringIndexOutOfBoundsException: Range [24, 23) out of bounds for length 24 elifgor(< Djava.lang.StringIndexOutOfBoundsException: Range [63, 62) out of bounds for length 82 # for close to abelian groups, just act on orbits of generators if IsAbelian(g)java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
gens:=IndependentGeneratorsOfAbelianGroup(g); else
gens:=SmallGeneratingSet(g); fi;
c:=[]; for i in gens do
c:=Union(c,Orbit(au,i) disoa,,c,,,,,,e,l,,
od;
hom:=NiceMonomorphismAutomGroup(au,c,gens);
finish(hom); rootClassesfindElm,,p; fi;
# if no centre and all automorphism conjugator, try to extend exiting permrep if :(,ajava.lang.StringIndexOutOfBoundsException: Index 30 out of bounds for length 30
ForAll(GeneratorsOfGroup(au), ,i;
ran:= Group( List( GeneratorsOfGroup( au ),
java.lang.StringIndexOutOfBoundsException: Range [56, 55) out of bounds for length 58
One( :a;
Info(InfoMorph,1java.lang.StringIndexOutOfBoundsException: Range [36, 35) out of bounds for length 44
Size(ran); #enforce size calculation
# if `ran' has a centralizing bit, we're still out of luck. # TODO: try whether there is a centralizer complement into which wei # could go.
if (,i
r:=ran; # the group of conjugating elements so far
cen:=TrivialSubgroup(r);
; function(auto) if not IsConjugatorAutomorphism( java.lang.StringIndexOutOfBoundsException: Index 7 out of bounds for length 7
return fail; fi;
img:=ConjugatorOfConjugatorIsomorphism( img:=ConjugatorOfConjugatorIsomorphism( auto if not img in ran then
is still left. if not img in r then # get the cenralizing bit
r:=ClosureGroup(r,img);
cen:=Centralizer(r ,java.lang.StringIndexOutOfBoundsException: Index 12 out of bounds for length 12 fi; # get the right coset element
img:=First(List(Enumerator(cen),i->i*img),i->i in ran); fi;
return; end, function(elm)
return ConjugatorAutomorphismNC( g, elm );
a:=Psjava.lang.StringIndexOutOfBoundsException: Range [24, 23) out of bounds for length 28
SetRange( hom,ran );
finish(hom); return;
; fi;
actbase:=ValueOption( e
bestdeg:=infinity; # what degree would we consider immediately acceptable? if actbase<>fail then if(x-IsSubsetx)
Error("illegal actbase given!"); fi;
:a)23; else
baddegree:=RootInt(Size(g)^3,4); fi; if IsPermGroup()then :Minimum(2000,()*0);i;
Info(InfoMorph,4,"degree limit ",baddegree);
ser:=StructuralSeriesOfGroup(g); # eliminate very small subgroups -- there are just very few elements in
r:= ;
ser:=Filtered(ser,x->Size(x)= java.lang.StringIndexOutOfBoundsException: Index 16 out of bounds for length 16
ser:=List(ser,x->SubgroupNC(g,java.lang.StringIndexOutOfBoundsException: Index 35 out of bounds for length 0
pos=;
# try action on elements, through orbits on classes
=Gau,-nx)();
if IsPermGroup(g) and Size(SolvableRadical(g))^2 and java.lang.StringIndexOutOfBoundsException: Range [32, 31) out of bounds for length 72
FittingFreeLiftSetup(g);
lClassRepresentative(,R(x][1]2]
postproc:=rep->ConjugacyClass(g,rep);
action:=function(crep,aut) end; end; else
action:=function(class,aut)
local c,s;
c:=java.lang.StringIndexOutOfBoundsException: Index 18 out of bounds for length 0 if HasSize(class) then
SetSize(c,Size(class)); fi; if HasStabilizerOfExternalSet(class) then
Size(StabilizerOfExternalSet(class)); # force size known to transfer
s:=Image(aut,StabilizerOfExternalSet(class));
SetStabilizerOfExternalSet(c,s); fi;
return c; end;
preproc:=fail;
postproc:=fail; fi;
# first try classes that generate, starting with small ones if actbase<>fail then
c:=Concatenation(List(actbase,GeneratorsOfGroup)); else
c:=GeneratorsOfGroup(g); fi; # split c into prime power parts
c:=Concatenation(List(c,PrimePowerComponents));
c:=Unique(List(c,x->ConjugacyClass(g,x)));
SortBy(c,Size);
r:java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
c:= if not(Size(g)=ize (g)and (h) then
o:=[];
fix:=Filtered(List(c,Representative),
x>(GeneratorsOfGroup(u)z-ImagesRepresentative(zx=x))java.lang.StringIndexOutOfBoundsException: Index 69 out of bounds for length 69
u: fi
while Size(u)<Size(g) do if Size()1 SortBycSize)fi# once an outside class is known, sort
of:=First(c,x->not Representative(x if i>java.lang.StringIndexOutOfBoundsException: Range [38, 37) out of bounds for length 54
if of=fail then # rarely reps are in u
of:=First(c,
fi; if MemoryUsage( :IsPermGroup() andIsTransitive(MovedPoints(g)); # if a single class only requires
<10000 # for element storage, just store its elements then
of=(,claselms(O)java.lang.StringIndexOutOfBoundsException: Index 41 out of bounds for length 41 elif preproc<>fail then
of:=List(Orbit( # is a standard generator finder known? else
of:=Orbit(auo,of,action); fi;
IsPackageMarkedForLoading"")true
Append(o,of);
u:=and ValueOption)<>
u:=NormalClosure(g,u);
od;
# fuse classes under g if actbase<> :=allFuncList("esultOfBBoxProgram",p.rogramg])java.lang.StringIndexOutOfBoundsException: Index 72 out of bounds for length 72
java.lang.StringIndexOutOfBoundsException: Range [26, 6) out of bounds for length 34
cl:=Filtered(ConjugacyClasses(g),x->ForAny(actbase,y- iso=(g,,,b; else
cl:=Concatenation(List(actbase,x-> (,IsMapping(iso)java.lang.StringIndexOutOfBoundsException: Index 31 out of bounds for length 31
o: SetIsInjectivei,);
cl:=[]; for i in o do # test to avoid duplicates is more expensive than it is worth # if not ForAny(cl,x->Order(Representative(i))=Order(Representative(x)) # and (Size(x) mod Size(i)=0) and Representative(i) in x) then
r:=ConjugacyClass(g,Representative(i));
Add(cl,r); # fi;
od;
Info(InfoMorph,2,"actbase ",Length(cl), " classes"); fijava.lang.StringIndexOutOfBoundsException: Index 7 out of bounds for length 7 else
cl:ShallowCopyConjugacyClasses();
Info(InfoMorph,2,Length(cl)," classes"); fi;
SortBy(cl,Size);
# split classes in patterns
o:=[];
offset:=0;# degree that comes for minimum generating just factor
i:=First([1..Length(cl)],x->not Representative(cl[x]) in ser[pos]); while i<fail do
r:=[Order(Representative(cl[i])),Size(cl[i])];
u:=Filtered([1 c>then
x->[Order(Representative(cl[x])),Size(cl[x (,1,Isimple ";
c:=cl{u};
cl:=cl{Difference([1..Length( :OrdersClassRepresentatives)java.lang.StringIndexOutOfBoundsException: Index 39 out of bounds for length 39
()0 # no need to process classes that will not improve
and Size(c[1])<bestdeg-offset then if Length # order two, unique class order, smallest if Size(c[1])<250 and
MemoryUsageRepresentative([1]*([1)*engthc) # at most
<10^7 # bytes storage
a:=s{two:s};
c:=List(c,claselms);
Sort(c);
Info(InfoMorpha=(a) if actbase<>fail then
ForAnyax>]1)then else
of:=OrbitsDomain(auo a:List((,-x2=)x>[1) fi; else
actbasef then if preproc<>fail then
of:=List(Orbits(auo,List(c,preproc),action),
x->List(x,java.lang.StringIndexOutOfBoundsException: Index 34 out of bounds for length 26 else
of:Orbits(,,action;# not necc. domain fi; else ifpreproc<fail then
of:=List(OrbitsDomain(auo,List(c,preproc),action),
x->List r=rootClasses(c,wo; else
of:=OrbitsDomain(auo,c,action);
:Set{r}) fi; fi;
e:=f;
of:=[c]; fi;
u:=List(of,x->rec
closure:=NormalClosure(g,SubgroupNC(g,
Concatenation(List(x,Representativea=() # orders
of:=[]; for j in u do if j.siz>1 and j.siz<bestdeg
and ForAll(o,x->x.siz>j.siz or x.closure<>j.closure)
and ForAll(of,x->x.siz>j.siz (Filtereda,x-not IsPrimeInt()and x<100)),
Add(of,j); fi;
od;
of:=Filtered(of,x->x.siz<bestdeg and x.siz>1);
java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0 " sizes=",Collected gens=ailjava.lang.StringIndexOutOfBoundsException: Index 24 out of bounds for length 24
# combine with previous
u:=[];
a[.java.lang.StringIndexOutOfBoundsException: Range [31, 30) out of bounds for length 46 for r :={[..(); if j.siz+r.siz<bestdeg
and notForAny(.,- in.closure)
and not ForAny(r.reps,x-> x in j.closure) then
new:rec(iz:j+.,las=(j.clasrclas)java.lang.StringIndexOutOfBoundsException: Index 77 out of bounds for length 77
reps:=Concatenation(j.reps,r.reps),
ureGroup(.losure,closure); # don't add if known closure but no better price if ForAll( (ength({a}=1 Size()Sum({}<100
and ForAll(of,x->x.siz>new.siz or x.closure<>new.closure)
and ForAll(u,x->x.siz>new.siz or x.closure<>new.closure) then
Add(u,); fi; fi;
od;
od;
);
SortBy(of,x->x.siz);
:=irst(of,x->Size(x.closure)=Size(g));
if u<>fail and u.siz<bestdeg then if u.siz<baddegree then
:[findElmg,z,)findElmgey,)];
finish(hom); return; else
store:=u;
best:=[function() return Union(List(store.clas,claselms));end,
OnPoints];
bestdeg:=u.siz;
Info(InfoMorph,4,"Improved bestdeg to ",bestdeg); fi; fi;
Append(o,of);
SortBy(o,x->x.siz); fi;
not Representativec[x)in ser[os]; while i=fail and bestdeg>10*baddegree and pos<Length(ser) do
u:=First(o,x-> else if u<>fail then
offset:=.siz; fi;
pos:=pos+1;
i:=First([1..Length(cl)],x->not Representative(cl fi; if (bestdeg-offset)/bestdeg< # don't bother if all but 1/4 # of the points are needed anyhow for the factor. In that case abort then i:=fail; fi;
;
od;
;
if Size(SolvableRadical( ;
Info(InfoMorph,2,"Try ARG");
:=(gGeneratorsOfGroup); # make a hom from auts to perm group
ran:=Image(img[2],g);
deg:=java.lang.StringIndexOutOfBoundsException: Index 18 out of bounds for length 5 if deg<bestdeg then
bestdeg:=deg;
r=istGeneratorsOfGroupg),-Imageimg2]i)java.lang.StringIndexOutOfBoundsException: Index 55 out of bounds for length 55
store# not found by table or other -- try a 2/something ad-hoc
hom:=GroupHomomorphismByFunction(au,img[1],
java.lang.StringIndexOutOfBoundsException: Range [17, 16) out of bounds for length 22
)
return Image(img[2],ConjugatorOfConjugatorIsomorphism(auto)); fi;
RepresentativeAction(img[],tore[],
List(GeneratorsOfGroup(g),i->Image(img[2],Image(auto,i))),
OnTuples); end, function(perm) if perm in store[1] then
return ConjugatorAutomorphismNC(g,
PreImagesRepresentativeimg]perm)java.lang.StringIndexOutOfBoundsException: Index 60 out of bounds for length 60 fi;
return java.lang.StringIndexOutOfBoundsException: Index 31 out of bounds for length 10
List(store[2] 2:findElmmfail,,*..g]; end); ifisFullSubgroupNCg,)
finish(hom); return;
:gensjava.lang.StringIndexOutOfBoundsException: Index 16 out of bounds for length 16
best:y=ize(Centralizer(gens2); fi; fi;
if IsPermGroup(g) then
img:=AutomorphismWreathEmbeddingjava.lang.StringIndexOutOfBoundsException: Index 9 out of bounds for length 9 else
= fi; if img<>fail and NrMovedPoints(img[4])<java.lang.StringIndexOutOfBoundsException: Index 44 out of bounds for length 35
Info(InfoMorph,2,"AWE succeeds"); # make a hom from auts to perm group
ran:=img[4];
deg:=NrMovedPoints(ran);
bestdeg:=deg
r:=List(GeneratorsOfGroup(g),i->Image(img[3],i));
store:=[img[1],img[2],img[3],r,ran];
hom(au,[] function(auto) if IsConjugatorAutomorphism(auto) and
ConjugatorOfConjugatorIsomorphism(auto) in Source(store[2]) then
Image2,ConjugatorOfConjugatorIsomorphism) fi;
return RepresentativeAction(store[1],store[4],
List(GeneratorsOfGroup(g),i->Image(img[3],Image(auto,i))),OnTuples); end, function(perm) if in store[]then
return ConjugatorAutomorphismNC(g,
java.lang.StringIndexOutOfBoundsException: Index 27 out of bounds for length 9 fi;
return GroupHomomorphismByImagesNC(g,g,GeneratorsOfGroup(g),
List(store[4],i->PreImagesRepresentative(store[3],i^perm)) :SizeCentralizerg,[]); end); if bestdeg<baddegree then
finish(hom); return; fi;
gens:b fi;
# if no centre and permgroup, try to blow up perm rep if Size( :=e2e..(g);
# we act on lists of [orbits,group]. This way comparison becomes # cheap, as typically the orbits suffice to identify
if IsPermGroup(,,)
action:=function(obj,hom)
;
img:=Image(hom,obj[2]);
(imgo[])
return Immutable([OrbitsMovedPoints(img),img]); end; else
actionfajava.lang.StringIndexOutOfBoundsException: Index 33 out of bounds for length 33
local img;
img:=Image(autom,sub);
SetSize(img,Size(sub));
# now try at end; fi;
for o in orbs do
r:=Stabilizer(g,o,OnTuples);
and
not ForAll(GeneratorsOfGroup(au),x->Image:2,rt)java.lang.StringIndexOutOfBoundsException: Index 25 out of bounds for length 25
Difference(java.lang.StringIndexOutOfBoundsException: Index 29 out of bounds for length 10
u:=Size(r);
ismore
SetSize(r,u),b=findElmhe,,)java.lang.StringIndexOutOfBoundsException: Index 32 out of bounds for length 32 if IsPermGroup( :=+1;
r:=Orbit(au,Immutable([OrbitsMovedPoints(r),r]),action);
r:=List(r,x->x[2]); else
r=a,,ctionjava.lang.StringIndexOutOfBoundsException: Index 32 out of bounds for length 32 fi;
u:=Stabilizer(g,o[1]); if Size(Intersection(r))=1 and
< # be used to represent automorphisms
u (InfoMorph2"." # point stabilizer is self-normalizing, so action on # cosets=action by conjugation
u:=Group(SmallGeneratingSet(u)); if IsPermGroup(g) then
u:=Orbit(au,Immutable([OrbitsMovedPoints(u),u]),action); else
u=(u,,ction); fi;
deg:=Length(u);
<bestdegthen
bestdeg:=deg; if bestdeg<baddegree return isojava.lang.StringIndexOutOfBoundsException: Index 21 out of bounds for length 21
hom:=ActionHomomorphism ;
finish(hom); return; fi;
store:=u;
best:=[function() return store;end,action]; fi;
fi; fi;
od; fi;
#if bestdeg>10*baddegree then Error("bad degree");fi;
(nfoMorph,,Go backtobestrepso far "b) # go back to what we had before if IsList(java.lang.StringIndexOutOfBoundsException: Index 15 out of bounds for length 0
:ActionHomomorphisma,[(,[]""; else
hom:=best; fi;
finish(hom);return;
# # fall back on element sets # Info(InfoMorph,1,"General Case"); # # # # general case: compute small domain # gens:=[]; # dom:=[]; # u:=TrivialSubgroup(g); # subs:=[]; # orbs:=[]; # while Size(u)<Size(g) do # # find a reasonable element # cnt:=0; # br:=false; # bv:=0; # # # use classes from before -- # #if HasConjugacyClasses(g) then # for r in cl do # if IsPrimePowerInt(Order(Representative(r))) and # not Representative(r) in u then # v:=ClosureGroup(u,Representative(r)); # if allinner then # val:=Size(Centralizer(r))*Size(NormalClosure(g,v)); # else # val:=Size(Centralizer(r))*Size(v); # fi; # if val>bv then # br:=Representative(r); # bv:=val; # fi; # fi; # od; # ## else ## if actbase=fail then ### actbase:=[g]; ## fi; ## repeat ## cnt:=cnt+1; ## repeat ## r:=Random(Random(actbase)); ## until not r in u; ## # force small prime power order ## if not IsPrimePowerInt(Order(r)) then ## v:=List(Collected(Factors(Order(r))),x->r^(x[1]^x[2])); ## v:=Filtered(v,x->not x in u);; ## v:=List(v,x->x^First(Reversed(DivisorsInt(Order(x))), ## y->not x^y in u)); # small order power not in u ## SortBy(v,Order); ## r:=First(v,x->not x in u); # if all are in u, r would be as well ## fi; ## ## v:=ClosureGroup(u,r); ## #if allinner then ## # val:=Size(Centralizer(g,r))*Size(NormalClosure(g,v)); ## #else ## val:=Size(Centralizer(g,r)); ## #fi; ## if val>bv then ## br:=r; ## bv:=val; ## fi; ## until bv>Size(g)/2^Int(cnt/50); ## fi; # # r:=br; # Info(InfoMorph,4,"Element class length ",Index(g,Centralizer(g,r))," after ",cnt); # # #if Index(g,Centralizer(g,r))>2*10^4 then Error("big degree debug");fi; # # if allinner then # u:=NormalClosure(g,ClosureGroup(u,r)); # else # u:=ClosureGroup(u,r); # fi; # # #calculate orbit and closure # o:=Orbit(au,r); # v:=TrivialSubgroup(g); # i:=1; # while i<=Length(o) do # if not o[i] in v then # if allinner then # v:=NormalClosure(g,ClosureGroup(v,o[i])); # else # v:=ClosureGroup(v,o[i]); # fi; # if Size(v)=Size(g) then # i:=Length(o); # fi; # fi; # i:=i+1; # od; # u:=ClosureGroup(u,v); # # i:=1; # while Length(o)>0 and i<=Length(subs) do # if IsSubset(subs[i],v) then # o:=[]; # elif IsSubset(v,subs[i]) then # subs[i]:=v; # orbs[i]:=o; # gens[i]:=r; # o:=[]; # fi; # i:=i+1; # od; # if Length(o)>0 then # Add(subs,v); # Add(orbs,o); # Add(gens,r); # fi; # od; # # # now find the smallest subset of domains # comb:=Filtered(Combinations([1..Length(subs)]),i->Length(i)>0); # bv:=infinity; # for i in comb do # val:=Sum(List(orbs{i},Length)); # if val<bv then # v:=subs[i[1]]; # for r in [2..Length(i)] do # v:=ClosureGroup(v,subs[i[r]]); # od; # if Size(v)=Size(g) then # best:=i; # bv:=val; # fi; # fi; # od; # gens:=gens{best}; # dom:=Union(orbs{best}); # Unbind(orbs); # # if Length(dom)>bestdeg then # # go back to what we had before # if IsList(best) then # hom:=ActionHomomorphism(au,best[1](),best[2],"surjective"); # else # hom:=best; # fi; # finish(hom);return; # fi; # # u:=SubgroupNC(g,gens); # while Size(u)<Size(g) do # repeat # r:=Random(dom); # until not r in u; # Add(gens,r); # u:=ClosureSubgroupNC(u,r); # od; # Info(InfoMorph,1,"Found generating set of ",Length(gens)," elements", # List(gens,Order)); # hom:=NiceMonomorphismAutomGroup(au,dom,gens); # # finish(hom); # end:java.lang.StringIndexOutOfBoundsException: Range [34, 31) out of bounds for length 74
############################################################################# ## #F NiceMonomorphismAutomGroup ##
InstallGlobalFunction(NiceMonomorphismAutomGroup, function(aut,elmselmsgens)
local xset,fam,hom;
One(aut); # to avoid infinite recursion once the niceo is set
elmsgens:=Filtered(elmsgens,i->i in elms); # safety feature #if Size(Group(elmsgens))<>Size(Source(One(aut))) then Error("holler1"); fi;
xset:=ExternalSet(aut,elms);
SetBaseOfGroup,(pc;
fam := GeneralMappingsFamily( ElementsFamily( FamilyObj( aut ) ),
java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
hom := rec( );
hom > then:;
IsActionHomomorphismAutomGroup and IsSurjective ),hom);
SetIsInjective post>java.lang.StringIndexOutOfBoundsException: Range [16, 15) out of bounds for length 57
AsGroupGeneralMappingByImages()java.lang.StringIndexOutOfBoundsException: Index 38 out of bounds for length 38
hom!.basepos
SetRange( hom, Image( hom ) );
Setter(SurjectiveActionHomomorphismAttr)(xset,hom);
Setter(IsomorphismPermGroup)(aut,ActionHomomorphism(xset,"surjective"));
hom:=ActionHomomorphism(xset,"surjective");
SetFilterObj(hom,IsNiceMonomorphism);
return hom;
end##
############################################################################# ## #M PreImagesRepresentative for OpHomAutomGrp ##
InstallMethod(PreImagesRepresentative,"AutomGroup Niceomorphism",
FamRangeEqFamElm,[IsActionHomomorphismAutomGroup,IsPerm],0, function(hom,elm)
local xset,g,imgs;
xset:= UnderlyingExternalSet( hom );
g:=Source(One(ActingDomain(xset)java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
(hom.basepos,)
imgs:=Enumerator(xset){imgs}; if g<>Group(BaseOfGroup(xset)) then Error("holler"); fi;
elm:=GroupHomomorphismByImagesNC(g,g,BaseOfGroup(xset),imgs);
SetIsBijective(elm (Gjava.lang.StringIndexOutOfBoundsException: Index 16 out of bounds for length 16
return elm; end);
############################################################################# ## #F MorFroWords(<gens>) . . . . . . create some pseudo-random words in <gens> ## featuring the MeatAxe's FRO
InstallGlobalFunction(MorFroWords,function(gens)
local list,a,b,ab,i;
:=[;
ab:=gens[1]; for i in [2..Length(gens)] do
a:=ab;
b:=gens[i;
ab:=a*b;
list:java.lang.StringIndexOutOfBoundsException: Index 29 out of bounds for length 29
[ab,ab^2*b,ab^3*b,ab^4*b, Sizethen
()>
od;
return fail; end);
############################################################################# ## #F MorRatClasses(<G>) . . . . . . . . . . . local rationalization of classes ##
InstallGlobalFunction(MorRatClasses,function(GR)
,jijava.lang.StringIndexOutOfBoundsException: Index 16 out of bounds for length 16
InfoInfoMorph,,RationalizeClasses";
r:=[]; for c in RationalClasses(GR) do
u:=Subgroup(GR,[Representative( ;
j:=DecomposedRationalClass(c);
java.lang.StringIndexOutOfBoundsException: Range [38, 37) out of bounds for length 43
;
classes:=j,
size:=Sizeif()>(H
od;
for i in r do
i.size:=Sum(i.classes,Size);
od;
return r; end);
############################################################################# ## #F MorMaxFusClasses(<l>) . . maximal possible morphism fusion of classlists ##
InstallGlobalFunction(MorMaxFusClasses,function(r)
local i,j,flag,cl; # cl is the maximal fusion among the rational classes.
cl:=[]; for i in r do
j:0
flag:=true; while flag andfi;
j:=j+1;
flag:=notjava.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
i.size=cl[j][1].size and
Size(.=([[]representative
od; if flag then
Add(cl,[i]); else
Add(cl[j],i); fi;
od;
# sort classes by size
SortBy(cl,a->Sum(a,i->i.size));
; end);
############################################################################# ## #F SomeVerbalSubgroups ## ## correspond simultaneously some verbal subgroups in g and h
(SomeVerbalSubgroups,functiong)
local l,m,i,j,cg,ch,pg;
:[]
m:=[h];
i:=1; while i<=Length(l) do for j in [1.. java.lang.StringIndexOutOfBoundsException: Index 74 out of bounds for length 74
cg:=CommutatorSubgroup(l[i],l[j]);
:=[ij)java.lang.StringIndexOutOfBoundsException: Index 40 out of bounds for length 40
pg:= "java.lang.StringIndexOutOfBoundsException: Range [32, 31) out of bounds for length 43
=
Add(l,cg);
Add(m# else while m[pg]<>ch do
pg:=Position(l,cg,pg+1)return java.lang.StringIndexOutOfBoundsException: Range [31, 30) out of bounds for length 36 if pg=fail then ifjava.lang.StringIndexOutOfBoundsException: Range [18, 17) out of bounds for length 34
,chjava.lang.StringIndexOutOfBoundsException: Index 22 out of bounds for length 22
pg:= (nfoPerformance2"Small Library"java.lang.StringIndexOutOfBoundsException: Index 57 out of bounds for length 57 fi;
od; fi;
od;
i=i+;
od;
return [l,m]; end);
############################################################################# ## #F MorClassLoop(<range>,<classes>,<params>,<action>) loop over classes list ## to find generating sets or Iso/Automorphisms up to inner automorphisms ## ## classes is a list of records like the ones returned from ## MorMaxFusClasses. ## ## params is a record containing optional components: ## gens generators that are to be mapped ## from preimage group (that contains gens) ## to image group (as it might be smaller than 'range') ## free free generators ## rels some relations that hold in from, given as list [word,order] ## dom a set of elements on which automorphisms act faithful ## aut Subgroup of already known automorphisms ## condition function that must return `true' on the homomorphism. ## setrun If set to true approximate a run through sets by having the ## class indices increasing. ## ## action is a number whose bit-representation indicates the action to be ## taken: ## 1 homomorphism ## 2 injective ## 4 surjective ## 8 find all (in contrast to one) ##
BindGlobal( :MorphiumG,
local i,cl,cls,rep,x,xp,p,b,g;
=IndexGC; if i>20000 or i<Size(D) then
return List(DoubleCosetRepsAndSizes(G,C,D),j->j[1]); else if not IsBound(C!.conjclass) then
cl:=[R];
cls:=[R];
rep:=[One(G)]; fi while i<=Length(cl) do for g in GeneratorsOfGroup(G) do
x:cli^java.lang.StringIndexOutOfBoundsException: Index 21 out of bounds for length 21 if not x in cls then
Add(cl,x);
AddSet(cls,x);
## fi;
od;
i:=i+1;
od;
SortParallel(cl,rep);
C!.conjclass:=cl;
C!.conjreps:=rep;
;
cl:=C!.conjclass;
rep:=[];
b:=BlistList([1..Length(cl)],[]);
p:=1; 1,
repeat while p<=java.lang.StringIndexOutOfBoundsException: Index 16 out of bounds for length 14
p:=p+1;
od;
th)
b[p]:=true;
Add(rep,p);
cls:=[cl[p]]; for i in cls , for g in GeneratorsOfGrouppimgs,# possible images
x:=i^g;
xp:=PositionSorted(cl,x); if not b[xp] then
(clsx)
b[xp]:=true; fi;
od;
od; fi;
p:=p+1;
until p>Length(cl);
return C!.conjreps{rep}; fi; end );
InstallGlobalFunction(MorClassLoop,function(range,clali,params,action)
local id,result,rig,dom,tall,tsur,tinj,thom,gens,free,rels cntjava.lang.StringIndexOutOfBoundsException: Index 38 out of bounds for length 38
mp,cen,i,j,imgs,ok,size,l,hom,cenis,java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
e,offset,pows, # if we have a pontentiallinfinite fp group java.lang.StringIndexOutOfBoundsException: Range [51, 50) out of bounds for length 67
finsrc;
paramsfrom HasIsFinite.)
and IsFinite(params.from);
len:=Length(clali); if ForAny(clali,i->Length(i)=0) then
return []; # trivial case: no images for generator fi;
id:=Fgens(F; if IsBound(params.aut) then
result:=params.aut;
rig:=true; if IsBound(params.dom) then
dom:=params.dom; else
dom:=false; fi; else
result:=[];
rig:=false; fi;
if IsBound(params.outerorder) then
outerorder:= vsu:=vsu[1]{Filtered.2,java.lang.StringIndexOutOfBoundsException: Range [56, 55) out of bounds for length 69
outerorder:=false; fi;
if IsBound(params.setrun) then
setrun:=params.setrun; else for [.Lengthvsu]do fi;
# extra condition? if IsBound(params.condition) java.lang.StringIndexOutOfBoundsException: Index 7 out of bounds for length 7
:paramscondition; else
cond:=fail;
;
tall:=action>7; # try all if tall then
action:=action-8; fi;
derhom:=fail;
tsur:=action>3; # test surjective if tsur then
size:=Size(params.to);
action:=action-4;
:=Quotients;
derhom:=NaturalHomomorphismByNormalSubgroup(range,DerivedSubgroup(range)); fi; fi;
tinj:=action>1; # test injective if tinj then
action:=action-2; fi;
thom:=action>0; # test homomorphism
ifIsBound(params.ens)then
gens:=params.gens; fi;
if IsBound(params.rels) then
free:=params.free;
rels:=params.rels; if Length( ;
rels:=false; fi; elif thom then
free:=GeneratorsOfGroup(FreeGroup(Length(gens)));
mfw:=MorFroWords(free); # get some more if finsrc and Product(List(gens,java.lang.StringIndexOutOfBoundsException: Index 39 out of bounds for length 19 for i in Cartesian(List(gens,i->[1..Order(i)])) do
Add(mfw,ProductList[1..Length(gens)]z>free[z]^i[]));
od; fi;
rels:=[]; for i in mfw do
p:=Order(MappedWord(i,free,gens)); ifp> then
Add(rels,[i,p]); fijava.lang.StringIndexOutOfBoundsException: Index 9 out of bounds for length 9
od; if Length(rels)=0then
rels:=false;
else
rels:=false; fi;
pows:=[];
# sort the relators according to the generators they contain
genums:=Listh:=(()i>()=Size();
genums:=List([1..Length(genums)],i # just map them
sortrels:= return [Grou(,,u,h)]
pows:=List([1..len],i->[]); for i in rels do
l:=len;
wert ;
m:=[]; for j in [1..NrSyllables(i[1])] do
p:=genums[GeneratorSyllable(i[1],j)];
e:=ExponentSyllable(i[1],j);
Append(m,[p,e]); # modified extrep
AddSet(pows[p],e); if p<len then
wert:=wert+2; # conjugation: 2 extra images
l:=Minimum(l,p); fi;
wert:=wert+AbsInt(e);
od;
Add(sortrels[l],[m,i[2],i[2]*wert,[1,3..Length(m) fi;
od; # now sort by the length of the relators if IsFinite(F) and not IsPerfectGroup(G) and
SortBy(sortrels[i],x->xaanMapFiniteAbelianInvariants((F),
od; if Length)> then
offset:=1-Minimum(List(Filtered(pows,i->Length(i)>0),
i->i[1])); # smallest occurring index fi; # test the relators at level tlev and set imgs
TestRels:=function(tlev)
local rel,k,j,p,start,gn,ex;
if Length(java.lang.StringIndexOutOfBoundsException: Index 18 out of bounds for length 0
imgs:=List( :5
imgs[Length(java.lang.StringIndexOutOfBoundsException: Index 24 out of bounds for length 6 50java.lang.StringIndexOutOfBoundsException: Index 12 out of bounds for length 12 fi;
if IsPermGroup(range) then # test by tracing points
trels[lev] do
start:=1;
p
k:=0;
repeat for j in rel[4] do
gnbest:;
ex:=rel[1][j+1]; if gn=len then
p=^epspows[gn][x+ffset] else
p:=p/m[gn][mp[gn]];
p:=p^repspows[gn][ex+offset];
p:=p^m[gn][mp[gn]]; fi;
od;
k:=k+1; # until we have the power or we detected a smaller potential order.
until k>=rel[2] or (p=start and IsInt(rel[2]/k)); if p<startthen
return false; fi;
od; fi;
imgs:=List( else
imgs[Length(imgs =;
if tinj then
return ForAll(sortrels[tlev] fi
free{[tlev..len]}, imgs))); else
return (ortrelstlev]
i->IsInt(i[2]/Order(MappedWord(i[5],
free{[)1then fi;
end; else
TestRels:=x->true; # to satisfy the code below. fi;
pop:=false; # just to initialize
# backtrack over all classes in clali
calEntries,;
ind:=len; while ind>0do
=;
Info(InfoMorph,3,"step ",l); # test class combination indicated by l:
cla:=List([1..len],i-> java.lang.StringIndexOutOfBoundsException: Index 9 out of bounds for length 9
reps:=List(cla,Representative);
skip:=false; if derhom<>ailthen if not Size(Group(List(reps,i->Image(derhom,i))))=Size(Image(derhom)) then #T The group `Image( derhom )' is abelian but initially does not know this; #T shouldn't this be set? #T Then computing the size on the l.h.s. may be sped up using `SubgroupNC' #T w.r.t. the (abelian) group.
skip:=true Sum(,)Sum(,ize;
Info(InfoMorph,3,"skipped"); fi; fi;
if pows<>fail and java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0 if<>and ()then # and precompute the powers
repspows:=List([1.. <estval then for i in [1..len] do for j inpows[] do
repspows[i][j+offset]:=reps[i]^j;
odjava.lang.StringIndexOutOfBoundsException: Index 13 out of bounds for length 13
od; fi;
#cenis:=List(cla,i->Intersection(range,Centralizer(i))); # make sure we get new groups (we potentially add entries)
cenis:=[]; for i in cla do
cen:=Intersection(range,Centralizer(i));
cnt:cnt+1java.lang.StringIndexOutOfBoundsException: Index 15 out of bounds for length 15
m:=Size(cen);
cen:=SubgroupNC(range,GeneratorsOfGroup(cen));
SetSize(cen,m); fi;
Add(cenis,cen);
od;
# test, whether a gen.sys. can be taken from the classes in <cla> # candidates. This is another backtrackjava.lang.StringIndexOutOfBoundsException: Index 7 out of bounds for length 7
m[len]:=[id]; # positions
mp:=[];
mp[len]:=1;
mp[len+1]: if ("findall")false then # centralizers
cen:=[];
cen[len]:=cenis[len];
cen[len+1]:=range; # just for the recursion
:len-;
# set up the lists while i>0do #m[i]:=List(DoubleCosetRepsAndSizes(range,cenis[i],cen[i+1]),j->j[1]);
[ijava.lang.StringIndexOutOfBoundsException: Range [27, 26) out of bounds for length 60
mp[i]:=1;
pop:=true; while pop and i<=len do
pop:=false; while mp[i]<=Length(m[i]) and TestRels(i)=false do
mp[i]:=mp[i]+1; #increment because of relations
Info(InfoMorph
od; if i<=enandmp[i>Length([])
Info(InfoMorph,3,"early pop");
pop:=true;
i:=i+1; if i<=len then
mp[i]:=mp[i]+1; #increment because of pop fi; fi;
od;
if pop java.lang.StringIndexOutOfBoundsException: Index 19 out of bounds for length 19
i:= Addu,ernelOfMultiplicativeGeneralMapping()java.lang.StringIndexOutOfBoundsException: Index 53 out of bounds for length 53 elif i>1 Add(cl,i)java.lang.StringIndexOutOfBoundsException: Index 16 out of bounds for length 16
cen[i]:=Centralizer(cen[i+1],reps[i]^(m[i][mp[i]])); fi;
i:=i-1;
od;
java.lang.StringIndexOutOfBoundsException: Index 8 out of bounds for length 0
Info,)
i:=len+2; # to avoid the following `while' loop else
i:=1;
Info(InfoMorph,3,"loop"); fi;
while i<len do if rels= if rels=false then # otherwise the images are set by `TestRels' as a side effect.
imgs:=List([1..len-1],i->reps[i]^(m[i][mp[i]]));
imgs[len]:=reps[len]; fi;
Info(InfoMorph,4,"orders: ",List(imgs,Order));
# computing the size can be nasty. Thus try given relations first.
ok:true
if rels<>false then if
ok:=ForAll(rels,i-> java.lang.StringIndexOutOfBoundsException: Index 47 out of bounds for length 47 else
(Hjava.lang.StringIndexOutOfBoundsException: Index 13 out of bounds for length 13 fi; fi;
# check surjectivity if tsur and ok then
ok:= Size( SubgroupNC( java.lang.StringIndexOutOfBoundsException: Index 40 out of bounds for length 0
Size/H)
if ok and thom then
(3"esting";
imgs:=GroupGeneralMappingByImagesNC(params.from, return []
SetIsTotal(imgs,true); if tsur then
SetIsSurjective(imgs,java.lang.StringIndexOutOfBoundsException: Index 35 out of bounds for length 0 fi;
ok:=IsSingleValued(imgs); if ok and tinj then return [GroupHomomorphismByImagesNC(H,G,[],[])];
ok:=IsInjective(imgs); fi; fi;
if ok and cond<>fail then
ok:=cond(imgs); fi;
if ok then
Info(InfoMorph,2,"found"); # do we want one or all? if tall then if rig then if not imgs in result then
result: GroupByGenerators( Concatenation(
GeneratorsOfGroup( result ), [ imgs ] ),
One( result ) ); # note its niceo
hom:=NiceMonomorphismAutomGroup(result,dom,gens);
SetNiceMonomorphism(result,hom);
SetIsHandledByNiceMonomorphismresult,true);
Size(result);
Info(java.lang.StringIndexOutOfBoundsException: Index 24 out of bounds for length 10 fi; else
Add(result,imgs); # can we deduce we got all? if outerorder<>false and Lcm( fi;
Filtered(result,x->not IsInnerAutomorphism(x) fi;
x->First([2..outerorder],y->IsInnerAutomorphism(x^y)))))
=outerorder then
Info(InfoMorph,1,"early break");
return result; fi; fi; else
imgs fi; fi; fi;
mp[i ; while i<=len and mp[i]>Length(m[i]) java.lang.StringIndexOutOfBoundsException: Index 45 out of bounds for length 26
mp[i]:=1;
i:=i#java.lang.StringIndexOutOfBoundsException: Index 43 out of bounds for length 43 if i<=len then
mp[]=[]1; fi;
od;
while i>1 and i<= ForAny,iO()=bg)then while i<=len and TestRels(i)=false do
Info(InfoMorph,4,"intermediate break ",i);
mp[i]:=mp while i<=len and mp[i]>Length(m[i]) do
Info(InfoMorph,3,"intermediate pop ",i);
i:=i+1; if i<=len then
mp[i]:=mp[i]+1; fi;
od;
od;
if i<=len then# i>len means we completely popped. This will then # also pop us out of both `while' loops.
cen[i]:=Centralizer(cen[i+1],reps[i]^(m[i][mp[i]]));
i:=i-1; #m[i]:=List(DoubleCosetRepsAndSizes(range,cenis[i],cen[i+1]),j->j[1]);
[i:MorClassOrbs(range,enis],eps[],en[+];
mp[i]:=1;
else
Info vsu:Filteredvsux>H) fi;
od SizeNormalClosure(H,(H,[epresentative(x)]))));
od; fi;
# 'free for increment'
l[ind]:=l[ind]+1; while ind>0 and l[ind]>Length(clali[ind]) do if setrun and ind>1then # if we are running through sets, approximate by having the # l-indices increasing
l[ind]:=Minimum(l[ind- =xjava.lang.StringIndexOutOfBoundsException: Index 25 out of bounds for length 25 else
l[ind]:=1;returnvsu[.Random[..(])) fi;
ind:=ind-1; fi;
l[ind]:=l[ind]+1; fi;
od;
od;
return result; end);
############################################################################# ## #F MorFindGeneratingSystem(<G>,<cl>) . . find generating system with as few ## as possible generators from the first classes in <cl> ##
InstallGlobalFunctioncnt:=;
local G,cl,lcl,len,comb,combc,com,a,alltwo;
G:=arg[1];
cl:=arg[2];
Info(InfoMorph,1,"FindGenerators"); # throw out the 1-Class
cl:=Filtered(cl,i->Length(i)>1 or Size(i[1].representative)>1);
alltwo:=PrimeDivisors(Size(G gens:SmallGeneratingSet(H);
#create just a list of ordinary classes.
lcl:=List(cl,i->java.lang.StringIndexOutOfBoundsException: Index 26 out of bounds for length 23
len:=1;
len:=Maximum(1,AbelianRank else while true do
len:=len+1;
Info(InfoMorph,2,"Trying length ",len); # now search for <len>-generating systems
comb Length(gens)2and Random(,2)1then
combc:=List(comb,i->List(i,j->lcl[j]));
# test all <comb>inations
com:=0; while com<Length(comb) do
com:=com+1; # don't try only order 2 generators unless it's a 2-group if Set( gens:=ist[1.sg]i>ranfun();
alltwo then
a:=MorClassLoop(G,combc[com],rec(to:=G),4); if Length(a)>0then
a; fi; fi;
odjava.lang.StringIndexOutOfBoundsException: Index 7 out of bounds for length 7
od; end);
############################################################################# ## #F Morphium(<G>,<H>,<DoAuto>) . . . . . . . .Find isomorphisms between G and H ## modulo inner automorphisms. DoAuto indicates whether all ## automorphism are to be found ## This function thus does the main combinatoric work for creating ## Iso- and Automorphisms. ## It needs, that both groups are not cyclic. ##
InstallGlobalFunction(Morphium,function(G,H,DoAuto)
local combi,Gr,Gcl,Ggc,Hr,Hcl,bg,bpri,x,dat,
gens,i,c,hom,elms,price,result,inns,bcl,vsu;
if IsSolvableGroup(G) and CanEasilyComputePcgs(G) then
gens:=MinimalGeneratingSet go=List(Order); else
gens:=SmallGeneratingSet(G); fi;
Gr:= imgs:Listgo->iltered(cl,-Order(Representativej)=i));
Gcl:=MorMaxFusClasses(Gr);
Ggc:=List(gens,i->First(Gcl,j->ForAny(j,j->ForAny(j.classes,k->java.lang.StringIndexOutOfBoundsException: Range [0, 66) out of bounds for length 58
combi:=List(Ggc,i->Concatenation(List(i,i->i.classes)));
price:=Product(combi,i->Sum(i, if ,->um,ize)bw then
Info(InfoMorph,1,"generating system ",Sum(Flat(combi),Size), " of price:",price,"");
if ((not HasMinimalGeneratingSet(G) and java.lang.StringIndexOutOfBoundsException: Index 45 out of bounds for length 15
Sum,)/ IsSolvableGroupjava.lang.StringIndexOutOfBoundsException: Index 63 out of bounds for length 63
and ValueOption("nogensyssearch")<>true then if IsSolvableGroup(G) then
gens:=IsomorphismPcGroup(G);
gens:=List# completely off track
i->PreImagesRepresentative(gens,i));
Ggc:=List( cnt:=cnt+Int(b/Size(G/20;
combi:=List(Ggc,i->Concatenation(List(i,i->i.classes)));
bcl:=ShallowCopy(combi);
SortBy(bcl,a->Sum(a,Size));
bg:=gens;
bpri:=Product(combi,i->Sum(i,Size));
i [.7Length()12 java.lang.StringIndexOutOfBoundsException: Range [40, 41) out of bounds for length 40
repeat for c in [1..Length(gens)] do
bw
gens[c]:=Random(G); else
x:=java.lang.StringIndexOutOfBoundsException: Index 20 out of bounds for length 5
gens[c]:=Random(Random(x));
fi
od;
until Index(G,SubgroupNC(G,gens))=1;
Ggc:= #filter subgroups
j->ForAny(j,j->ForAny(j.classes,k->i infor in[.Lengthbg
combi:=List(Ggc,i->Concatenation(List(i,i->i.classes :=Filtered[..ength(su]]j>bg[] in vsu[1]j)java.lang.StringIndexOutOfBoundsException: Index 59 out of bounds for length 59
Append(bcl,combi);
SortBy(bcl,a->java.lang.StringIndexOutOfBoundsException: Index 25 out of bounds for length 21
price:=Product(combi# [.([]]j-(k vsu2[),\"
Info(InfoMorph,3,"generating system of price:",price,"");
if price< clFiltered(bi[],-ForAll,j-Representative(k vsu[2[]);
bpri:=price;
bg:=gens;
fi;
;
gens:=bg;
else
gens:=MorFindGeneratingSystem(G,Gcl);
fi;
Ggc:=ist(gens,->Gcl->(,j>ForAnyjclasses,-> k)));
combi:=List(Ggc,i->Concatenation(List(i,i->i.classes)));
price:=Product(combi,i->Sum(i,Size));
Info(InfoMorph,1,"generating java.lang.StringIndexOutOfBoundsException: Index 35 out of bounds for length 7
fi;
if not DoAuto then
Hr:=MorRatClasses(H InfoInfoMorph2" ,bw, from ,);
Hcl:=MorMaxFusClasses(Hr);
fi;
vsu:SomeVerbalSubgroupsGH;
if List(vsu[1],Size)<>List(vsu[2],Size) then
# cannot be candidates" generators` n,
return [];
fi
# now test, whether it is worth, to compute a finer congruence fijava.lang.StringIndexOutOfBoundsException: Index 5 out of bounds for length 5
# then ALSO COMPUTE NEW GEN SYST!
[..java.lang.StringIndexOutOfBoundsException: Index 9 out of bounds for length 9
if not DoAuto find allembeddings
combi:=[];
for i in Ggc do c:=Filtered(Hcl,
j->Set(j,k->k.size)=Set(i #only
and Length(j[1].classes)=Length(i[1].classes)
and Size(j[1].class)=Size(i[1].class)
and Size(j[1].representative #one homs 1+2
# This test assumes maximal fusion among the rat.classes. If better
# congruences are used, they MUST be checked here also!
)java.lang.StringIndexOutOfBoundsException: Index 10 out of bounds for length 10
if Length(c)<>1 then emb;
# Both groups cannot be isomorphic, since they lead to different
# congruences!
(,2," congruences";
return fail;
else
:embjava.lang.StringIndexOutOfBoundsException: Index 15 out of bounds for length 15
fi;
od;
combi:=List(combi,i->Concatenation(List(i,i->i.classes)));
;
# filter by verbal subgroups)
for i in [fi; c:=Filtered([1..Length(vsu[1])],j->gens[i] in vsu[1][j]); c:=Filtered(combi[i],k-> c=Filtered([1..Length( cl:=]
if Length(c)<clg[;
Info(InfoMorph,1,"images improved by verbal subgroup:",
(combi[]Size"- "SumcSize);
combibg=H;
fi;
od;
# combi contains the classes, from which the
# generators areAdd(,k;
#free:=GeneratorsOfGroup(FreeGroup(Length(gens)));
(clgbg);
#rels:=List(rels,i->[i,Order(MappedWord(i,free,gens))]);
#=(:gens,rom=,:H:free,els=)java.lang.StringIndexOutOfBoundsException: Index 63 out of bounds for length 63
result:=rec(gens:=gens,from:=G,to:=H);
if DoAuto then
cl
if Sum(Flat(combi),Size)<=MORPHEUSELMS then
elms=];
for i in Flat(combi) do
if not ForAny(elms,j->Representative(i)=Representative(j)) then
# avoid duplicate classes
Add(elms,i);
fi;
od;
elms:=Union(List(elms,AsList));
Info(InfoMorph,1,"permrep on elements: ",Length(elms));
Assert(2,ForAll(GeneratorsOfGroup(G),i->ForAll(elms,j->j^i in elms)));
result.dom:=elms;
inns:= GroupByGenerators( inns, IdentityMapping( G ) );
# catch case of simple groups to get outer automorphism orders
# automorphism suffices.
if IsNonabelianSimpleGroup(H) then
dat:=DataAboutSimpleGroup(H);
if IsBound(dat.fullAutGroup) then
if dat.fullAutGroup[1]=1 then
# all automs are inner.
result:=rec(aut:=result.aut);
else
result.outerorder:=dat.fullAutGroup[1];
result:=rec(aut:=MorClassLoop(H,combi,result,15));
fi;
else
result:=rec(aut:=MorClassLoop(H,combi,result,15));
fi;
else
result:=rec(aut:=MorClassLoop(H,combi,result,15));
fi;
if elms<>false then
result.elms:=elms;
result.elmsgens:=Filtered(gens,i->i<>One(G));
inns:=SubgroupNC(result.aut,GeneratorsOfGroup(inns));
fi;
result.inner:=inns;
else
result:=MorClassLoop(H,combi,result,7);
fi;
return result;
end);
#############################################################################
##
#F AutomorphismGroupAbelianGroup(<G>)
##
InstallGlobalFunction(AutomorphismGroupAbelianGroup,function(G)
local i,j,k,l,m,o,nl,nj,max,r,e,au,p,gens,offs;
# trivial case
if Size(G)=1 then au:= GroupByGenerators( [], IdentityMapping( G ) );
i:=NiceMonomorphismAutomGroup(au,[One(G)],[One(G)]);
SetNiceMonomorphism(au,i);
SetIsHandledByNiceMonomorphism(au,true);
SetIsAutomorphismGroup( au, true );
SetIsFinite(au,true);
return au;
fi;
# get standard generating system
gens:=IndependentGeneratorsOfAbelianGroup(G);
au:=[];
# run by primes
p:=PrimeDivisors(Size(G));
for i in p do l:=Filtered(gens,j->IsInt(Order(j)/i));
nl:=Filtered(gens,i->not i in l);
#sort by exponents
o:=List(l,j->LogInt(Order(j),i));
e:=[];
for j in Set(o) do
Add(e,[j,l{Filtered([1..Length(o)],k->o[k]=j)}]);
od;
# construct automorphisms by components
for j in e do
nj:=Concatenation(List(Filtered(e,i->i[1]<>j[1]),i->i[2]));
r:=Length(j[2]);
# the permutations and addition
if r>1 then
Add(au,GroupHomomorphismByImagesNC(G,G,Concatenation(nl,nj,j[2]), #(1,2)
Concatenation(nl,nj,j[2]{[2]},j[2]{[1]},j[2]{[3..Length(j[2])]})));
Add(au,GroupHomomorphismByImagesNC(G,G,Concatenation(nl,nj,j[2]), #(1,..,n)
Concatenation(nl,nj,j[2]{[2..Length(j[2])]},j[2]{[1]}))); #for k in [0..j[1]-1] do
k:=0;
Add(au,GroupHomomorphismByImagesNC(G,G,Concatenation(nl,nj,j[2]), #1->1+i^k*2
Concatenation(nl,nj,[j[2][1]*j[2][2]^(i^k)],
j[2]{[2..Length(j[2])]}))); #od; fi;
# multiplications
for k in List( Flat( GeneratorsPrimeResidues(i^j[1])!.generators ),
Int ) do
# the mixing ones for j in [1..Length(e)] do for k in [1..Length(e)] do if k<>j then
nj:=Concatenation(List(e{Difference([1..Length(e)],[j,k])},i->i[2]));
offs:=Maximum(0,e[k][1]-e[j][1]); if Length(e[j][2])=1 and Length(e[k][2])=1then
max:=Minimum(e[j][1],e[k][1])-1; else
max:=0; fi; for m in [0..max] do
Add(au,GroupHomomorphismByImagesNC(G,G,
Concatenation(nl,nj,e[j][2],e[k][2]),
Concatenation(nl,nj,[e[j][2][1]*e[k][2][1]^(i^(offs+m))],
e[j][2]{[2..Length(e[j][2])]},e[k][2])));
od; fi;
od;
od;
od;
if IsFpGroup(G) and IsWholeFamily(G) then # rewrite to standard generators
gens:=GeneratorsOfGroup(G);
au:=List(au,x->GroupHomomorphismByImagesNC(G,G,gens,List(gens,y->Image(x,y)))); fi;
for i in au do
SetIsBijective(i,true);
j:=MappingGeneratorsImages(i); if j[1]<>j[2] then
SetIsInnerAutomorphism(i,false); fi;
SetFilterObj(i,IsMultiplicativeElementWithInverse);
od;
au:= GroupByGenerators( au, IdentityMapping( G ) );
SetIsAutomorphismGroup(au,true);
SetIsFinite(au,true);
BindGlobal("OuterAutomorphismGeneratorsSimple",function(G)
local d,id,H,iso,aut,auts,i,all,hom,field,dim,P,diag,mats,gens,gal; if not IsNonabelianSimpleGroup(G) then
return fail; fi;
gens:=GeneratorsOfGroup(G);
d:=DataAboutSimpleGroup(G);
id:=d.idSimple; all:=false; if id.series="A"then if id.parameter=6then # A6 is easy enough
return fail; else
H:=AlternatingGroup(id.parameter); if G=H then
iso:=IdentityMapping(G); else
iso:=IsomorphismGroups(G,H); fi;
aut:=GroupGeneralMappingByImages(G,G,gens,
List(gens,
x->PreImagesRepresentative(iso,Image(iso,x)^(1,2))));
auts:=[aut]; all:=true; fi;
elif id.series in ["L","2A"] or (id.series="C" and id.parameter[1]>2) then
hom:=EpimorphismFromClassical(G); if hom=fail then return fail;fi;
field:=FieldOfMatrixGroup(Source(hom));
dim:=DimensionOfMatrixGroup(Source(hom));
auts:=[]; if Size(field)>2then
gal:=GaloisGroup(field); # Diagonal automorphisms if id.series="L"then
P:=GL(dim,field); elif id.series="2A"then
P:=GU(dim,id.parameter[2]); #gal:=GaloisGroup(GF(GF(id.parameter[2]),2)); elif id.series="C"then if IsEvenInt(Size(field)) then
P:=Source(hom); else
P:=List(One(Source(hom)),ShallowCopy); for i in [1..Length(P)/2] do
P[i][i]:=PrimitiveRoot(field);
od;
P:=ImmutableMatrix(field,P); if not ForAll(GeneratorsOfGroup(Source(hom)),
x->x^P in Source(hom)) then
Error("changed shape!"); elif P in Source(hom) then
Error("P is in!"); fi;
P:=Group(Concatenation([P],GeneratorsOfGroup(Source(hom))));
SetSize(P,Size(Source(hom))*2); fi; else
Error("not yet done"); fi; # Sufficiently many elements to get the mult. group
aut:=Size(P)/Size(Source(hom));
P:=GeneratorsOfGroup(P); if id.series="C"then # we know it's the first
mats:=P{[1]};
P:=P{[2..Length(P)]}; else
diag:=Group(One(field));
mats:=[]; while Size(diag)<aut do if not DeterminantMat(P[1]) in diag then
diag:=ClosureGroup(diag,DeterminantMat(P[1]));
Add(mats,P[1]); fi;
P:=P{[2..Length(P)]};
od; fi;
auts:=Concatenation(auts,
List(mats,s->GroupGeneralMappingByImages(G,G,gens,List(gens,x->
Image(hom,PreImagesRepresentative(hom,x)^s)))));
else
gal:=Group(()); # to force trivial fi;
if Size(gal)>1then # Galois
auts:=Concatenation(auts,
List(MinimalGeneratingSet(gal),
s->GroupGeneralMappingByImages(G,G,gens,List(gens,x->
Image(hom,
List(PreImagesRepresentative(hom,x),r->List(r,y->Image(s,y)))))))); fi;
# graph if id.series="L" and id.parameter[1]>2then
Add(auts, GroupGeneralMappingByImages(G,G,gens,List(gens,x->
Image(hom,Inverse(TransposedMat(PreImagesRepresentative(hom,x))))))); all:=true; elif id.series="L" and id.parameter[1]=2then # note no graph all:=true; elif id.series in ["2A","C"] then # no graph all:=true; fi;
else
return fail; fi;
for i in auts do
SetIsMapping(i,true);
SetIsBijective(i,true);
od;
return [auts,all]; end);
BindGlobal("AutomorphismGroupMorpheus",function(G)
local a,b,c,p; if IsNonabelianSimpleGroup(G) then
c:=DataAboutSimpleGroup(G);
b:=List(GeneratorsOfGroup(G),x->InnerAutomorphism(G,x));
a:=OuterAutomorphismGeneratorsSimple(G); if IsBound(c.fullAutGroup) and c.fullAutGroup[1]=1then # no outer automorphisms
a:=rec(aut:=[],inner:=b,sizeaut:=Size(G));
elif a=fail then
a:=Morphium(G,G,true); else if a[2]=true then
a:=a[1];
a:=rec(aut:=a,inner:=b,sizeaut:=Size(G)*c.fullAutGroup[1]); else
Info(InfoWarning,1,"Only partial list given");
a:=Morphium(G,G,true); fi; fi; else
a:=Morphium(G,G,true); fi; if IsList(a.aut) then
a.aut:= GroupByGenerators( Concatenation( a.aut, a.inner ),
IdentityMapping( G ) ); if IsBound(a.sizeaut) then SetSize(a.aut,a.sizeaut);fi;
a.inner:=SubgroupNC(a.aut,a.inner); elif HasConjugacyClasses(G) then # test whether we really want to keep the stored nice monomorphism
b:=Range(NiceMonomorphism(a.aut));
p:=LargestMovedPoint(b); # degree of the nice rep.
# first class sizes for non central generators. Their sum is what we # admit as domain size
c:=Filtered(List(ConjugacyClasses(G),Size),i->i>1);
Sort(c);
c:=c{[1..Minimum(Length(c),Length(GeneratorsOfGroup(G)))]};
if p>100 and ((not IsPermGroup(G)) or (p>4*LargestMovedPoint(G)
and (p>1000 or p>Sum(c)
or ForAll(GeneratorsOfGroup(a.aut),IsConjugatorAutomorphism)
or Size(a.aut)/Size(G)<p/10*LargestMovedPoint(G)))) then # the degree looks rather big. Can we do better?
Info(InfoMorph,2,"test automorphism domain ",p);
c:=GroupByGenerators(GeneratorsOfGroup(a.aut),One(a.aut));
AssignNiceMonomorphismAutomorphismGroup(c,G:autactbase:=fail); if IsPermGroup(Range(NiceMonomorphism(c))) and
LargestMovedPoint(Range(NiceMonomorphism(c)))<p then
Info(InfoMorph,1,"improved domain ",
LargestMovedPoint(Range(NiceMonomorphism(c))));
a.aut:=c;
a.inner:=SubgroupNC(a.aut,GeneratorsOfGroup(a.inner)); fi; fi; fi;
SetInnerAutomorphismsAutomorphismGroup(a.aut,a.inner);
SetIsAutomorphismGroup( a.aut, true ); if HasIsFinite(G) and IsFinite(G) then
SetIsFinite(a.aut,true);
SetIsGroupOfAutomorphismsFiniteGroup(a.aut,true); fi;
return a.aut; end);
InstallGlobalFunction(AutomorphismGroupFittingFree,function(g)
local s, c, acts, ttypes, ttypnam, act, t, j, iso, w, wemb, a, au,
auph, aup, n, wl, genimgs, thom, ahom, emb, lemb, d, ge, stbs, orb, base,
newbas, obas, p, r, orpo, imgperm, invmap, hom, i, gen,gens,tty,count; #write g in a nice form
count:=ValueOption("count");if count=fail then count:=0;fi;
s:=Socle(g); if IsNonabelianSimpleGroup(s) then
return AutomorphismGroupMorpheus(g); fi;
c:=ChiefSeriesThrough(g,[s]);
acts:=[];
ttypes:=[];
ttypnam:=[]; for i in [1..Length(c)-1] do if IsSubset(s,c[i]) and not HasAbelianFactorGroup(c[i],c[i+1]) then
act:=WreathActionChiefFactor(g,c[i],c[i+1]);
Add(acts,act);
t:=act[4];
tty:=IsomorphismTypeInfoFiniteSimpleGroup(t);
j:=1; while j<=Length(ttypes) do if ttypnam[j]=tty then
iso:=IsomorphismGroups(t,acts[ttypes[j][1]][4]);
Add(ttypes[j],[Length(acts),iso]);
j:=Length(ttypes)+10; fi;
j:=j+1;
od; if j<Length(ttypes)+2then
Add(ttypes,[Length(acts)]);
Add(ttypnam,tty);
Info(InfoMorph,1,"New isomorphism type: ",
Last(ttypnam).name); fi; fi;
od;
# now build the wreath products
w:=[];
wemb:=[]; for i in ttypes do
t:=acts[i[1]][4];
a:=acts[i[1]][3];
au:=AutomorphismGroupMorpheus(t);
auph:=IsomorphismPermGroup(au);
aup:=Image(auph);
n:=acts[i[1]][5]; for j in [2..Length(i)] do
n:=n+acts[i[j][1]][5];
od; #T replace symmetric group by a suitable wreath product
wl:=WreathProduct(aup,SymmetricGroup(n)); # now embed all
n:=1; # first is slightly special
genimgs:=[]; for gen in GeneratorsOfGroup(a) do
thom:=GroupHomomorphismByImagesNC(t,t,GeneratorsOfGroup(t),
List(GeneratorsOfGroup(t),j->j^gen));
thom:=Image(auph,thom);
Add(genimgs,thom);
od;
for j in [2..Length(i)] do
a:=acts[i[j][1]][3];
genimgs:=[]; for gen in GeneratorsOfGroup(a) do
thom:=i[j][2];
thom:=GroupHomomorphismByImagesNC(t,t,GeneratorsOfGroup(t),
List(GeneratorsOfGroup(t),
j->Image(thom,PreImagesRepresentative(thom,j)^gen)));
thom:=Image(auph,thom);
Add(genimgs,thom);
od;
od; # now map into wl by combining
emb:=[]; for gen in GeneratorsOfGroup(g) do
Add(emb,Product(lemb,i->Image(i,gen)));
od;
emb:=GroupHomomorphismByImagesNC(g,wl,GeneratorsOfGroup(g),emb);
Add(w,wl);
Add(wemb,emb);
od;
# finally form a direct product for the different types
d:=DirectProduct(w);
emb:=[]; for gen in GeneratorsOfGroup(g) do
Add(emb,
Product([1..Length(w)],i->Image(Embedding(d,i),Image(wemb[i],gen))));
od;
emb:=GroupHomomorphismByImagesNC(g,d,GeneratorsOfGroup(g),emb);
aup:=Normalizer(d,Image(emb,g));
#reduce degree -- avoid redundant fixed points if count>1then
p:=aup;
s:=IdentityMapping(p);
repeat
i:=SmallerDegreePermutationRepresentation(p); if NrMovedPoints(Range(i))<NrMovedPoints(p) then
p:=Image(i,p);
s:=s*i; fi;
until NrMovedPoints(Source(i))=NrMovedPoints(Range(i)); else
s:=SmallerDegreePermutationRepresentation(aup:cheap); fi;
emb:=emb*s;
aup:=Image(s,aup);
ge:=Image(emb,g);
# translate back into automorphisms
a:=[];
gens:=SmallGeneratingSet(aup); for i in gens do
au:=GroupHomomorphismByImages(g,g,GeneratorsOfGroup(g),
List(GeneratorsOfGroup(g),
j->PreImagesRepresentative(emb,Image(emb,j)^i)));
Add(a,au);
od;
au:=Group(a);
# produce data to map from au to aup:
lemb:=MovedPoints(aup);
stbs:=[];
orb:=Orbits(aup,MovedPoints(aup));
base:=BaseStabChain(StabChainMutable(aup));
newbas:=[]; for i in orb do
obas:=Filtered(base,x->x in i);
Append(newbas,obas);
p:=obas[1]; # get a set of elements that uniquely describes the point p
s:=SmallGeneratingSet(Stabilizer(ge,p)); if ForAny(Difference(i,[p]),j->ForAll(s,x->j^x=j)) then # try once more -- there is some randomeness involved if count<10then
return AutomorphismGroupFittingFree(g:count:=count+1); fi;
Error("repeated further fixpoint -- ambiguity"); fi;
stbs[p]:=s; for j in [2..Length(obas)] do
r:=RepresentativeAction(aup,p,obas[j]);
stbs[obas[j]]:=List(s,i->i^r);
od;
od;
orpo:=List(MovedPoints(aup),x->First([1..Length(orb)],y->x in orb[y]));
imgperm:=function(autom)
local bi, s, i;
bi:=[]; for i in newbas do
s:=List(stbs[i],
x->Image(emb,Image(autom,PreImagesRepresentative(emb,x))));
s:=First(orb[orpo[i]],x->ForAll(s,j->x^j=x));
Add(bi,s);
od;
return RepresentativeAction(aup,newbas,bi,OnTuples); end;
############################################################################# ## #M AutomorphismGroup(<G>) . . group of automorphisms, given as Homomorphisms ##
InstallMethod(AutomorphismGroup,"finite groups",true,[IsGroup and IsFinite],0, function(G)
local A; # since the computation is expensive, it is worth to test some properties first, # instead of relying on the method selection if IsAbelian(G) then
A:=AutomorphismGroupAbelianGroup(G); elif (not HasIsPGroup(G)) and IsPGroup(G) then #if G did not yet know to be a P-group, but is -- redispatch to catch the #`autpgroup' package method. This will be called at most once. #LoadPackage("autpgrp"); # try to load the package if it exists
return AutomorphismGroup(G); elif IsNilpotentGroup(G) and not IsPGroup(G) then #LoadPackage("autpgrp"); # try to load the package if it exists
A:=AutomorphismGroupNilpotentGroup(G); elif IsSolvableGroup(G) then if HasIsFrattiniFree(G) and IsFrattiniFree(G) then
A:=AutomorphismGroupFrattFreeGroup(G); else # currently autactbase does not work well, as the representation might # change.
A:=AutomorphismGroupSolvableGroup(G); fi; elif Size(SolvableRadical(G))=1 and IsPermGroup(G) then # essentially a normalizer when suitably embedded
A:=AutomorphismGroupFittingFree(G); elif Size(SolvableRadical(G))>1 and CanComputeFittingFree(G) then
A:=AutomGrpSR(G); else
A:=AutomorphismGroupMorpheus(G); fi;
SetIsAutomorphismGroup(A,true);
SetIsGroupOfAutomorphismsFiniteGroup(A,true);
SetIsFinite(A,true);
SetAutomorphismDomain(A,G);
return A; end);
############################################################################# ## #M AutomorphismGroup(<G>) . . abelian case ##
InstallMethod(AutomorphismGroup,"test abelian",true,[IsGroup and IsFinite],
{} -> RankFilter(IsSolvableGroup and IsFinite), function(G)
local A; if not IsAbelian(G) then
TryNextMethod(); fi;
A:=AutomorphismGroupAbelianGroup(G);
SetIsAutomorphismGroup(A,true);
SetIsGroupOfAutomorphismsFiniteGroup(A,true);
SetIsFinite(A,true);
SetAutomorphismDomain(A,G);
return A; end);
# just in case it does not know to be finite
RedispatchOnCondition(AutomorphismGroup,true,[IsGroup],
[IsGroup and IsFinite],0);
############################################################################# ## #M NiceMonomorphism ##
InstallMethod(NiceMonomorphism,"for automorphism groups",true,
[IsGroupOfAutomorphismsFiniteGroup],0, function( A )
local G;
if not IsGroupOfAutomorphismsFiniteGroup(A) then
TryNextMethod(); fi;
G := Source( Identity(A) );
# this stores the niceo
AssignNiceMonomorphismAutomorphismGroup(A,G);
# as `AssignNice...' will have stored an attribute value this cannot cause # an infinite recursion:
return NiceMonomorphism(A); end);
############################################################################# ## #M InnerAutomorphismsAutomorphismGroup( <A> ) ##
InstallMethod( InnerAutomorphismsAutomorphismGroup, "for automorphism groups",
true,
[ IsAutomorphismGroup and IsFinite ], 0, function( A )
local G, gens;
G:= Source( Identity( A ) );
gens:= GeneratorsOfGroup( G ); # get the non-central generators
gens:= Filtered( gens, i -> not ForAll( gens, j -> i*j = j*i ) );
return SubgroupNC( A, List( gens, i -> InnerAutomorphism( G, i ) ) ); end );
############################################################################# ## #M InnerAutomorphismGroup( <G> ) ##
InstallMethod( InnerAutomorphismGroup, "for groups",
true,
[ IsGroup and HasGeneratorsOfGroup ], 0, function( G )
local gens, A; if HasAutomorphismGroup( G ) or IsTrivial( G ) then
return InnerAutomorphismsAutomorphismGroup( AutomorphismGroup( G ) ); fi;
gens:= GeneratorsOfGroup( G ); # get the non-central generators
gens:= Filtered( gens, i -> not ForAll( gens, j -> i*j = j*i ) );
A := Group( List( gens, i -> InnerAutomorphism( G, i ) ) );
SetIsGroupOfAutomorphismsFiniteGroup( A, true );
return A; end );
InstallGlobalFunction(IsomorphismSimpleGroups,function(g,h)
local d,iso,a,b,c,o,s,two,rt,r,z,e,y,re,m,gens,cnt,lim,p,
rootClasses,findElm,isFull,trans,prim;
rootClasses:=function(tbl,a)
local p,r,i,j;
p:=List(Set(Factors(Size(tbl))),x->PowerMap(tbl,x));
r:=[a]; for i in [1..NrConjugacyClasses(tbl)] do for j in p do if j[i] in r then
AddSet(r,i); fi;
od;
od;
return r; end;
findElm:=function(gp,o,z,r)
local a,e;
repeat if IsSubgroupFpGroup(gp) then
a:=Random(gp); else
a:=PseudoRandom(gp); fi;
e:=Order(a); if e in r then
a:=a^QuoInt(e,o); if z=fail or Size(Centralizer(gp,a))=z then
return a; fi; fi;
until false; end;
isFull:=function(gp) if trans and not IsTransitive(gp,MovedPoints(g)) then return false;fi; if prim and not IsPrimitive(gp,MovedPoints(g)) then return false;fi;
return Size(gp)=Size(g); end;
# work in perm if possible if IsPermGroup(h) and not IsPermGroup(g) then
iso:=IsomorphismSimpleGroups(h,g); if iso<>fail then iso:=InverseGeneralMapping(iso);fi;
return iso; fi;
if not (Size(g)=Size(h) and IsSimpleGroup(g) and IsSimpleGroup(h)) then
return fail; fi;
d:=DataAboutSimpleGroup(g); if d.idSimple<>DataAboutSimpleGroup(h).idSimple then
return false; fi;
trans:=IsPermGroup(g) and IsTransitive(g,MovedPoints(g));
prim:=IsPermGroup(g) and IsPrimitive(g,MovedPoints(g));
# is a standard generator finder known? if IsPackageMarkedForLoading("atlasrep","")=true
and ValueOption(NO_PRECOMPUTED_DATA_OPTION)<>true then
p:=CallFuncList(ValueGlobal("AtlasProgram"),[d.tomName,1,"find"]); if p<>fail then
Info(InfoMorph,1,"Isomorphism simple: Atlas");
a:=CallFuncList(ValueGlobal("ResultOfBBoxProgram"),[p.program,g]);
b:=CallFuncList(ValueGlobal("ResultOfBBoxProgram"),[p.program,h]);
iso:=GroupHomomorphismByImagesNC(g,h,a,b);
Assert(2,IsMapping(iso));
SetIsInjective(iso,true);
SetIsSurjective(iso,true);
return iso; fi; fi;
gens:=fail; if IsPackageMarkedForLoading("ctbllib","")=true then
c:=CharacterTable(d.tomName); if c<>fail then
Info(InfoMorph,1,"Isomorphism simple: ctbl");
o:=OrdersClassRepresentatives(c);
s:=SizesConjugacyClasses(c); # order two, unique class order, smallest
two:=Filtered([1..Length(o)],x->o[x]=2);
a:=s{two};
a:=Collected(a); if ForAny(a,x->x[2]=1) then
a:=List(Filtered(a,x->x[2]=1),x->x[1]);
two:=Filtered(two,x->s[x] in a); fi;
SortBy(two,x->s[x]);
two:=two[1];
z:=Size(c)/s[two]; # centralizer order
r:=rootClasses(c,two);
rt:=Set(o{r});
e:=fail;
a:=Set(o); # orders
m:=Concatenation(Reversed(Filtered(a,x->IsPrimeInt(x) and x<100)),
Reversed(Filtered(a,x->not IsPrimeInt(x) and x<100)),
Filtered(a,x->x>100));
while gens=fail do
e:=m[1];
a:=Filtered([1..Length(o)],x->o[x]=e);
m:=m{[2..Length(m)]}; # only largest class order for this element order
SortBy(a,x->-s[x]);
a:=Filtered(a,x->s[x]=s[a[1]]); if (Length(Set(s{a}))=1 and Size(c)/Sum(s{a})<100) then
y:=Size(c)/s[a[1]]; # centralizer order
r:=rootClasses(c,a[1]);
re:=Set(o{r});
gens:=[findElm(g,2,z,rt),findElm(g,e,y,re)];
cnt:=0; while not isFull(SubgroupNC(g,gens)) and cnt<20do if IsSubgroupFpGroup(g) then
gens[2]:=gens[2]^Random(g); else
gens[2]:=gens[2]^PseudoRandom(g); fi;
cnt:=cnt+1;
od; if cnt=20then gens:=fail;fi; fi;
od; fi; fi; if gens=fail then
Info(InfoMorph,1,"Isomorphism simple: ad-hoc"); # not found by table or other -- try a 2/something ad-hoc
rt:=[2,4..Size(g)];
gens:=[findElm(g,2,fail,rt)];
z:=Size(Centralizer(g,gens[1]));
# try a larger, but not huge prime. Thus avoid Singer cycles # which have small centralizers and thus long orbits
m:=Maximum(Filtered(Factors(Size(g)),x->x<100));
cnt:=0;
repeat
gens[2]:=findElm(g,m,fail,[m,2*m..Size(g)]); if isFull(SubgroupNC(g,gens)) then
b:=gens;
y:=Size(Centralizer(g,gens[2])); else
b:=fail; fi;
cnt:=cnt+1;
until b<>fail or 2^cnt>Size(g);
cnt:=2; while b=fail or y>z*2^(QuoInt(cnt,2)) do
cnt:=cnt+1; if IsSubgroupFpGroup(g) then
gens[2]:=Random(g); else
gens[2]:=PseudoRandom(g); fi; if isFull(SubgroupNC(g,gens)) then
b:=gens;
y:=Size(Centralizer(g,gens[2])); fi;
od;
gens:=b;
e:=Order(gens[2]);
re:=[e,2*e..Size(g)];
y:=Size(Centralizer(g,gens[2])); fi;
Info(InfoMorph,1,"generators ",List(gens,Order));
o:=List(MorFroWords(gens),Order);
lim:=QuoInt(Size(g),z*y); # how many try unless fails if e>100then
lim:=lim*QuoInt(e,100)*Phi(e); fi;
# now try at most 10 times for a pair as given for cnt in [1..4*LogInt(Size(g),10)] do
Info(InfoMorph,1,"Try pair ",cnt);
a:=findElm(h,2,z,rt);
c:=0;
repeat
repeat # the centralizer test is more expensive than element orders
b:=findElm(h,e,fail,re);
c:=c+1;
m:=MorFroWords([a,b]);
until (ForAll([1..Length(o)],x->Order(m[x])=o[x])
and Size(Centralizer(h,b))=y) or c>lim; if c<=lim then
Info(InfoMorph,2,"testing ...");
iso:=GroupHomomorphismByImages(g,h,gens,[a,b]); if IsMapping(iso) then
SetIsInjective(iso,true);
SetIsSurjective(iso,true);
return iso; fi; elif lim<2000then
lim:=lim*2; fi;
until c>lim;
od;
return fail; end);
BindGlobal("IsomorphismPGroups",function(G,H)
local s,p,eG,eH,fG,fH,pc,imgs,pre,post;
s:=Size(G); if Size(H)<>s then return fail;fi;
p:=Collected(Factors(s)); if Length(p)>1then TryNextMethod();fi;
p:=p[1][1]; if IsFpGroup(G) then
pre:=fail; else
pre:=IsomorphismFpGroup(G);
G:=Image(pre,G); fi;
if IsFpGroup(H) then
post:=fail; else
post:=IsomorphismFpGroup(H);
H:=Image(post,H); fi;
s:=eG*InverseGeneralMapping(eH); if pre<>fail then s:=pre*s;fi; if post<>fail then s:=s*InverseGeneralMapping(post);fi;
s:=AsGroupGeneralMappingByImages(s);
return s; end);
############################################################################# ## #F IsomorphismGroups(<G>,<H>) . . . . . . . . . . isomorphism from G onto H ##
InstallGlobalFunction(IsomorphismGroups,function(G,H)
local m;
if not HasIsFinite(G) or not HasIsFinite(H) then
Info(InfoWarning,1,"Forcing finiteness test");
IsFinite(G);
IsFinite(H); fi; if not IsFinite(G) and not IsFinite(H) then
Error("cannot test isomorphism of infinite groups"); fi; if IsFinite(G) <> IsFinite(H) then
return fail; fi;
#AH: Spezielle Methoden ? if Size(G)=1then if Size(H)<>1then
return fail; else
return GroupHomomorphismByImagesNC(G,H,[],[]); fi; fi; if IsAbelian(G) then if not IsAbelian(H) then
return fail; else
return IsomorphismAbelianGroups(G,H); fi; fi;
if Size(G)<>Size(H) then
return fail; fi;
if IsSimpleGroup(G) then
m:=IsomorphismSimpleGroups(G,H); if m=false then return fail;fi; if m<>fail then return m;fi; fi;
# 2000 is the limit for using the small groups code if Size(G)>2000 and IsPGroup(G) and
IsPackageMarkedForLoading("anupq","")=true then
return IsomorphismPGroups(G,H); fi;
if Size(SolvableRadical(G))>1 and CanComputeFittingFree(G)
and not (IsSolvableGroup(G) and Size(G)<=2000
and ID_AVAILABLE(Size(G))<>fail)
and (AbelianRank(G)>2 or Length(SmallGeneratingSet(G))>2 # the solvable radical method got better, so force if the radical of # the group is a good part # sizeable radical
or Size(SolvableRadical(G))^2>Size(G)
or ValueOption("forcetest")=true) and
ValueOption("forcetest")<>"old"then # In place until a proper implementation of Cannon/Holt isomorphism is # done
return PatheticIsomorphism(G,H); fi;
if ID_AVAILABLE(Size(G)) <> fail
and ValueOption(NO_PRECOMPUTED_DATA_OPTION)<>true then
Info(InfoPerformance,2,"Using Small Groups Library"); if IdGroup(G)<>IdGroup(H) then
return fail; elif ValueOption("hard")=fail
and IsSolvableGroup(G) and Size(G) <= 2000then
return IsomorphismSolvableSmallGroups(G,H); fi; elif AbelianInvariants(G)<>AbelianInvariants(H) then
return fail; elif Collected(List(ConjugacyClasses(G),
x->[Order(Representative(x)),Size(x)]))
<>Collected(List(ConjugacyClasses(H),
x->[Order(Representative(x)),Size(x)])) then
return fail; fi;
m:=Morphium(G,H,false); if IsList(m) and Length(m)=0then
return fail; else
return m; fi;
end);
############################################################################# ## #F GQuotients(<F>,<G>) . . . . . epimorphisms from F onto G up to conjugacy ##
InstallMethod(GQuotients,"for groups which can compute element orders",true,
[IsGroup,IsGroup and IsFinite], # override `IsFinitelyPresentedGroup' filter. 1, function (F,G)
local Fgens, # generators of F
cl, # classes of G
u, # trial generating set's group
vsu, # verbal subgroups
pimgs, # possible images
val, # its value
best, # best generating set
bestval, # its value
sz, # |class|
i, # loop
h, # epis
len, # nr. gens tried
fak, # multiplication factor
cnt; # countdown for finish
# if we have a pontentially infinite fp group we cannot be clever if IsSubgroupFpGroup(F) and
(not HasSize(F) or Size(F)=infinity) then
TryNextMethod(); fi;
Fgens:=GeneratorsOfGroup(F);
# if a verbal subgroup is trivial in the image, it must be in the kernel
vsu:=SomeVerbalSubgroups(F,G);
vsu:=vsu[1]{Filtered([1..Length(vsu[2])],j->IsTrivial(vsu[2][j]))};
vsu:=Filtered(vsu,i->not IsTrivial(i)); if Length(vsu)>1then
fak:=vsu[1]; for i in [2..Length(vsu)] do
fak:=ClosureGroup(fak,vsu[i]);
od;
Info(InfoMorph,1,"quotient of verbal subgroups :",Size(fak));
h:=NaturalHomomorphismByNormalSubgroup(F,fak);
fak:=Image(h,F);
u:=GQuotients(fak,G);
cl:=[]; for i in u do
i:=GroupHomomorphismByImagesNC(F,G,Fgens,
List(Fgens,j->Image(i,Image(h,j))));
Add(cl,i);
od;
return cl; fi;
if Size(G)=1then
return [GroupHomomorphismByImagesNC(F,G,Fgens,
List(Fgens,i->One(G)))]; elif IsCyclic(F) then
Info(InfoMorph,1,"Cyclic group: only one quotient possible"); # a cyclic group has at most one quotient if not IsCyclic(G) or not IsInt(Size(F)/Size(G)) then
return []; else # get the cyclic gens
u:=First(AsList(F),i->Order(i)=Size(F));
h:=First(AsList(G),i->Order(i)=Size(G)); # just map them
return [GroupHomomorphismByImagesNC(F,G,[u],[h])]; fi; fi;
if IsFinite(F) and not IsPerfectGroup(G) and
CanMapFiniteAbelianInvariants(AbelianInvariants(F),
AbelianInvariants(G))=false then
return []; fi;
if IsAbelian(G) then
fak:=5; else
fak:=50; fi;
cl:=ConjugacyClasses(G);
# first try to find a short generating system
best:=false;
bestval:=infinity; if Size(F)<10000000 and Length(Fgens)>2then
len:=Maximum(2,Length(SmallGeneratingSet(
Image(NaturalHomomorphismByNormalSubgroup(F,
DerivedSubgroup(F)))))); else
len:=2; fi;
cnt:=0;
repeat
u:=List([1..len],i->Random(F)); if Index(F,Subgroup(F,u))=1then
# find potential images
pimgs:=[]; for i in u do
sz:=Index(F,Centralizer(F,i));
Add(pimgs,Filtered(cl,j->IsInt(Order(i)/Order(Representative(j)))
and IsInt(sz/Size(j))));
od;
# sort u in descending order -> large reductions when centralizing
SortParallel(pimgs,u,function(a,b)
return Sum(a,Size)>Sum(b,Size); end);
val:=Product(pimgs,i->Sum(i,Size)); if val<bestval then
Info(InfoMorph,2,"better value: ",List(u,Order), "->",val);
best:=[u,pimgs];
bestval:=val; fi;
fi;
cnt:=cnt+1; if cnt=len*fak and best=false then
cnt:=0;
Info(InfoMorph,1,"trying one generator more");
len:=len+1; fi;
until best<>false and (cnt>len*fak or bestval<3*cnt);
if ValueOption("findall")=false then # only one
h:=MorClassLoop(G,best[2],rec(gens:=best[1],to:=G,from:=F),5); # get the same syntax for the object returned if IsList(h) and Length(h)=0then
return h; else
return [h]; fi; else
h:=MorClassLoop(G,best[2],rec(gens:=best[1],to:=G,from:=F),13); fi;
cl:=[];
u:=[]; for i in h do if not KernelOfMultiplicativeGeneralMapping(i) in u then
Add(u,KernelOfMultiplicativeGeneralMapping(i));
Add(cl,i); fi;
od;
Info(InfoMorph,1,Length(h)," found -> ",Length(cl)," homs");
return cl; end);
############################################################################# ## #F IsomorphicSubgroups(<G>,<H>) ##
InstallMethod(IsomorphicSubgroups,"for finite groups",true,
[IsGroup and IsFinite,IsGroup and IsFinite], # override `IsFinitelyPresentedGroup' filter. 1, function(G,H)
local cl,cnt,bg,bw,bo,bi,k,gens,go,imgs,params,emb,clg,sg,vsu,c,i,ranfun;
if not IsInt(Size(G)/Size(H)) then
Info(InfoMorph,1,"sizes do not permit embedding");
return []; fi;
if IsTrivial(H) then
return [GroupHomomorphismByImagesNC(H,G,[],[])]; fi;
if IsAbelian(G) then if not IsAbelian(H) then
return []; fi; if IsCyclic(G) then if IsCyclic(H) then
return [GroupHomomorphismByImagesNC(H,G,[MinimalGeneratingSet(H)[1]],
[MinimalGeneratingSet(G)[1]^(Size(G)/Size(H))])]; else
return []; fi; fi; fi;
cl:=ConjugacyClasses(G); if IsCyclic(H) then
cl:=List(RationalClasses(G),Representative);
cl:=Filtered(cl,i->Order(i)=Size(H));
return List(cl,i->GroupHomomorphismByImagesNC(H,G,
[MinimalGeneratingSet(H)[1]],
[i])); fi;
cl:=ConjugacyClasses(G);
# test whether there is a chance to embed
cnt:=0; while cnt<20do
bg:=Order(Random(H)); if not ForAny(cl,i->Order(Representative(i))=bg) then
return []; fi;
cnt:=cnt+1;
od;
# "random element" function, possibly biased towards smaller orders
ranfun:=x->Random(H); if Size(H)<10^5 and Length(AbelianInvariants(H))<4then # classes that are not contained in normal
vsu:=ConjugacyClasses(H);
vsu:=Filtered(vsu,x->Size(H)
=Size(NormalClosure(H,SubgroupNC(H,[Representative(x)])))); if Length(vsu)>0then
SortBy(vsu,x->Order(Representative(x)));
ranfun:=function(x) # random element of a class, selected with bias for smaller orders
return Random(vsu[Random([1..Random([1..Length(vsu)])])]); end; fi; fi;
# find a suitable generating system
bw:=infinity;
bo:=[0,0];
cnt:=0;
repeat if cnt=0then # first the small gen syst.
gens:=SmallGeneratingSet(H);
sg:=Length(gens); else # then something random
repeat if Length(gens)>2 and Random(1,2)=1then # try to get down to 2 gens
gens:=List([1,2],i->ranfun(1)); else
gens:=List([1..sg],i->ranfun(1)); fi; # try to get small orders for k in [1..Length(gens)] do
go:=Order(gens[k]); # try a p-element if Random(1,3*Length(gens))=1then
gens[k]:=gens[k]^(go/(Random(Factors(go)))); fi;
od;
until Index(H,SubgroupNC(H,gens))=1; fi;
go:=List(gens,Order);
imgs:=List(go,i->Filtered(cl,j->Order(Representative(j))=i));
Info(InfoMorph,3,go,":",Product(imgs,i->Sum(i,Size))); if Product(imgs,i->Sum(i,Size))<bw then
bg:=gens;
bo:=go;
bi:=imgs;
bw:=Product(imgs,i->Sum(i,Size)); elif Set(go)=Set(bo) then # we hit the orders again -> sign that we can't be # completely off track
cnt:=cnt+Int(bw/Size(G)/20); fi;
cnt:=cnt+1;
until bw/Size(G)*3<cnt;
if bw=0then
return []; fi;
vsu:=SomeVerbalSubgroups(H,G); # filter by verbal subgroups for i in [1..Length(bg)] do
c:=Filtered([1..Length(vsu[1])],j->bg[i] in vsu[1][j]);
#Print(List(bi[i],k-> # Filtered([1..Length(vsu[2])],j->Representative(k) in vsu[2][j])),"\n");
cl:=Filtered(bi[i],k->ForAll(c,j->Representative(k) in vsu[2][j])); if Length(cl)<Length(bi[i]) then
Info(InfoMorph,1,"images improved by verbal subgroup:",
Sum(bi[i],Size)," -> ",Sum(cl,Size));
bi[i]:=cl; fi;
od;
Info(InfoMorph,2,"find ",bw," from ",cnt);
if Length(bg)>2 and cnt>Size(H)^2 and Size(G)<bw then
Info(InfoPerformance,1, "The group tested requires many generators. `IsomorphicSubgroups' often\n", "#I does not perform well for such groups -- see the documentation."); fi;
params:=rec(gens:=bg,from:=H); # find all embeddings if ValueOption("findall")=false then # only one
emb:=MorClassLoop(G,bi,params, # one injective homs = 1+2 3); if IsList(emb) and Length(emb)=0then
return emb; fi;
emb:=[emb]; else
emb:=MorClassLoop(G,bi,params, # all injective homs = 1+2+8 11); fi;
Info(InfoMorph,2,Length(emb)," embeddings");
cl:=[];
clg:=[]; for k in emb do
bg:=Image(k,H); if not ForAny(clg,i->RepresentativeAction(G,i,bg)<>fail) then
Add(cl,k);
Add(clg,bg); fi;
od;
Info(InfoMorph,1,Length(emb)," found -> ",Length(cl)," homs");
return cl; end);
Messung V0.5 in Prozent
¤ 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.0.104Bemerkung:
(Wie Sie bei der Firma Beratungs- und Dienstleistungen beauftragen können 2026-10-13)
¤
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.