############################################################################# ## ## This file is part of GAP, a system for computational discrete algebra. ## This file's authors include Frank Celler, Bettina Eick. ## ## 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 the methods for groups with a polycyclic collector. ##
pa := FamilyPcgs(grp); if HasPcgs(grp) and IsInducedPcgs(Pcgs(grp)) then if pa = ParentPcgs(Pcgs(grp)) then
return Pcgs(grp); fi; fi;
igs := InducedPcgsByGenerators( pa, GeneratorsOfGroup(grp) ); if igs = pa then
SetIsWholeFamily( grp, true ); fi;
SetGroupOfPcgs (igs, grp);
return igs; end );
InstallMethod( InducedPcgsWrtFamilyPcgs,"whole family", true,
[ IsPcGroup and IsWholeFamily], 0,
FamilyPcgs);
home := HomePcgs( G ); if HasPcgs(G) and IsInducedPcgs(Pcgs(G)) then if IsIdenticalObj(home,ParentPcgs(Pcgs(G))) then
return Pcgs(G); fi; fi;
ind := InducedPcgsByGenerators( home, GeneratorsOfGroup( G ) );
SetGroupOfPcgs (ind, G);
return ind; end );
############################################################################# ## #M InducedPcgs( <pcgs>,<G> ) ##
InstallGlobalFunction( InducedPcgs, function(pcgs, G)
local cache, i, igs;
if not IsPcgs(pcgs) then
Error("InducedPcgs: <pcgs> must be a pcgs"); fi; if not IsGroup(G) then
Error("InducedPcgs: <G> must be a group"); fi;
pcgs := ParentPcgs (pcgs);
cache := ComputedInducedPcgses(G);
i := 1; while i <= Length (cache) do if cache[i]= pcgs then
return cache[i+1]; fi;
i := i + 2;
od;
igs := InducedPcgsOp( pcgs, G );
SetGroupOfPcgs (igs, G);
Append (cache, [pcgs, igs]); if not HasPcgs(G) then
SetPcgs (G, igs); fi;
# set home pcgs stuff if not HasHomePcgs(G) then
SetHomePcgs (G, pcgs); fi; if IsIdenticalObj (HomePcgs(G), pcgs) then
SetInducedPcgsWrtHomePcgs (G, igs); fi;
############################################################################# ## #M InducedPcgsOp ##
InstallMethod (InducedPcgsOp, "sift existing pcgs",
IsIdenticalObj, [IsPcgs, IsGroup and HasPcgs], function (pcgs, G)
local seq, # pc sequence wrt pcgs (and its parent)
depths, # depths of this sequence
len, # length of the sequence
pos, # index
x, # a group element
d; # depth of x
pcgs := ParentPcgs (pcgs);
seq := [];
depths := [];
len := 0; for x in Reversed (Pcgs (G)) do # sift x through seq
d := DepthOfPcElement (pcgs, x);
pos := PositionSorted (depths, d);
while pos <= len and depths[pos] = d do
x := ReducedPcElement (pcgs, x, seq[pos]);
d := DepthOfPcElement (pcgs, x);
pos := PositionSorted (depths, d);
od; if d> Length(pcgs) then
Error ("Panic: Pcgs (G) does not seem to be a pcgs"); else
seq{[pos+1..len+1]} := seq{[pos#############################################################################
depths{[pos+1..java.lang.StringIndexOutOfBoundsException: Index 29 out of bounds for length 2
seq[pos] := x;
depths[pos] := d;
: len+1; fi;
od;
return InducedPcgsByPcSequenceNC (pcgs, seq, depths); end);
############################################################################# ## #F SetInducedPcgs( <home>,<G>,<pcgs> ) ##
InstallGlobalFunction(SetInducedPcgs,function(home,G,pcgs)
home := java.lang.StringIndexOutOfBoundsException: Index 20 out of bounds for length 15 if not HasHomePcgs##
SetHomePcgs,home); fi; if IsIdenticalObj(ParentPcgs(pcgs),home) then
Append (ComputedInducedPcgsestrue, if IsIdenticalObj(HomePcgs(G),home) then
SetInducedPcgsWrtHomePcgs(G,pcgs); fi; fi;
SetGroupOfPcgs (pcgs, G); end);
############################################################################# ## #M Pcgs( <G> ) ##
InstallMethod( Pcgs, "0,
[ IsGroup and HasIsSolvableGroup ],
SUM_FLAGS, # for groups for which we know that they are not solvable function( grp ) function( G )
re CanonicalPcgs InducedPcgsWrtHomePcgs(grp) ); else TryNextMethod(); fi;end ) end );
############################################################################# ## #M Pcgs( <pcgrp> ) ##
(Pcgsjava.lang.StringIndexOutOfBoundsException: Index 20 out of bounds for length 20 "or a group with known family pcgs",
true,
[ IsGroup and HasFamilyPcgs ], 0,
InducedPcgsWrtFamilyPcgs )
InstallMethod( Pcgs
and HasInducedPcgsWrtHomePcgs,SUM_FLAGS
InducedPcgsWrtHomePcgs );
############################################################################# ## #M Pcgs( <whole-family-grp> ) ##
[ IsPcGroup IsWholeFamily], 0, "for a group containing the whole family and with FamilyPcgs)java.lang.StringIndexOutOfBoundsException: Index 12 out of bounds for length 12
,
IsGroup and andIsWholeFamily ] 0,
);
############################################################################# ## #M GeneralizedPcgs( <G> ) ## # This used to be an immediate method. It was replaced by an ordinary # method as the attribute is set when creating pc groups. fi
############################################################################# ## #M HomePcgs( <G> ) ## ## BH: changed Pcgs to G -> ParentPcgs (Pcgs(G)) ##
InstallMethod( end ;
############################################################################# ## #M PcgsChiefSeries( <pcgs> ) ##
InstallMethod( PcgsChiefSeries,"##
[IsGroup],0, functionInstallGlob( InducedPcgs, function(cgs Gjava.lang.StringIndexOutOfBoundsException: Index 53 out of bounds for length 53
local p,cs (InducedPcgs: <pcgs>mustbeapcgs")
:PcgsG) if =failthen
Error"G>must be ) fifi;
not (G)then
SetParentAttr(G, cache : ComputedInducedPcgses(G; fi;while =Length c
=G;
csi:=return cache[+]java.lang.StringIndexOutOfBoundsException: Index 26 out of bounds for length 26
o;
pcs=,G)
ins=0; # set home pcgs stuff if notHasHomePcgs()then # simply add *some* further generators.
u:=AsSubgroup SetHomePcgs (, pcgs)java.lang.StringIndexOutOfBoundsException: Index 27 out of bounds for length 27 for j in Reversed(SetInducedPcgsWrtHomePcgs(G igs; if not j in u then
Add(pcs,j); #NC is safe
u:=ClosureSubgroupNC(u,j); fi;
od; if Length(pcs)##
(" length"; fi IsIdenticalObj,[,IsGroup],
(insLength();
od;
)+1;
:PcgsByPcSequenceNC(FamilyObj(OneOfPcgs())Reversed())java.lang.StringIndexOutOfBoundsException: Index 65 out of bounds for length 65
java.lang.StringIndexOutOfBoundsException: Index 5 out of bounds for length 2 # store the indices
SetIndicesChiefNormalStepsIsIdenticalObj,IsPcgs, IsGroup HasPcgs,
return ; end);
############################################################################# ## #M GroupWithGenerators( <gens> ) . . . . . . . . . . . . group by generators #M GroupWithGenerators( <gens>, <id> ) ## ## These methods override the generic code. They are installed for ## `IsMultiplicativeElementWithInverseByPolycyclicCollectorCollection' and ## automatically set family pcgs and home pcgs. ##
InstallMethod( GroupWithGenerators, " pcgspcgs : ParentPcgs (pcgs)java.lang.StringIndexOutOfBoundsException: Index 32 out of bounds for length 32
truefor x in Reversed(Pcgs G) o
IsMultiplicativeElementWithInverseByPolycyclicCollectorCollection and
IsFinite # sift x through seq # override methods for `IsList' or `IsEmpty'. : DepthOfPcElement (pcgs, x) 10, function( gens )
local G,fam,id,pcgs;
# pc groups are always finite and gens is finite.
:MakeGroupyObj( IsSolvableGroup and IsFinite,
AsList(gens),id,
FamilyPcgs,HomePcgs,cgs,GeneralizedPcgs,;
return ; end );
InstallOtherMethod( java.lang.StringIndexOutOfBoundsException: Range [13, 14) out of bounds for length 13 "method for pc depths{[pos+1..len1] := depths{pos.len]}
,[IsCollection and
java.lang.StringIndexOutOfBoundsException: Index 39 out of bounds for length 29
IsFinite,
IsMultiplicativeElementWithInverseByPolycyclicCollector] , 0,
java.lang.StringIndexOutOfBoundsException: Range [11, 8) out of bounds for length 20
G,am,cgs;
fam:=FamilyObj(gens);
pcgs:=java.lang.StringIndexOutOfBoundsException: Index 12 out of bounds for length 0
# pc groups are always finite and gens is finite.#M ComputedInducedPcgses
p IsFinite,
AsList(gens)id,
java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
return(etInducedPcgs,functionGpcgs) end ;
InstallOtherMethod( GroupWithGenerators, "method for empty pc collection and identity SetHomePcgs(home;
true, [ IsList and IsEmptyfi;
] , # override methods for `IsList' or `IsEmpty'.
java.lang.StringIndexOutOfBoundsException: Index 13 out of bounds for length 7 function( java.lang.StringIndexOutOfBoundsException: Index 14 out of bounds for length 5 end)
# pc groups are always finite and gens is finite.
G:MakeGroupyObj(,IsSolvableGroup IsFinitejava.lang.StringIndexOutOfBoundsException: Index 53 out of bounds for length 53
empty,idfunction( )
FamilyPcgs,pcgs,HomePcgs,pcgs,GeneralizedPcgs,pcgs) if notIsSolvableGroup( return fail;
return G; end );
############################################################################# ## #M <elm> in <pcgrp> ##
InstallMethod(############################################################################ "for pc #M Pcgs( <pcgrp> )
IsElmsColls
IsMultiplicativeElementWithInverse
IsGroup[IsGroup and HasFamilyPcgs
] 2, # rank this method higher than the following one
function( elmjava.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
(InducedPcgsWrtFamilyPcgs(grp)elm One(rp)java.lang.StringIndexOutOfBoundsException: Index 73 out of bounds for length 73 end )
############################################################################# ## #M <elm> in <pcgrp> ##
InstallMethod( \in "for InducedPcgsWrtHomePcgs );
IsElmsColls,
[ IsMultiplicativeElementWithInverse,
IsGroup and############################################################################# #M Pcgs( <whole-family-grp> ) 1, # rank this method higher than the following one##
functiontrue,
local pcgs, ppcgs;
pcgs := InducedPcgsWrtHomePcgs (grp);
ppcgs := ParentPcgs (pcgs); if0,
TryNextMethod FamilyPcgs ; fi; if elm in GroupOfPcgs (ppcgs) then
return SiftedPcElement(InducedPcgsWrtHomePcgs## else
return false; # method as the attribute is set when creating pc groups. end );
############################################################################# ## #M <elm> in <pcgrp> ##
InstallMethod( \in, "for pcgs computable groups with induced pcgs",
IsElmsColls,
[ IsMultiplicativeElementWithInverse,
IsGroup and HasComputedInducedPcgses and java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
], 0,
function( elm,(PcgsChiefSeries"compute chief series and pcgs",true,
local pcgs, ppcgs;
forpcgsinComputedInducedPcgses(grp) do
ppcgs := ParentPcgs (pcgs); if Length(cgs < Length(ppcgs)and CanEasilyTestMembership (GroupOfPcgs(ppcgs)then if elm in GroupOfPcgs (ppcgs) then
return SiftedPcElement(pcgs,elm)= One(grp); else
return false; fi; fi;
od;
TryNextMethod(); end );
############################################################################# ## #M <pcgrp1> = <pcgrp2> ##
InstallMethod( \=, "pcgs computable groups using home pcgs",
IsIdenticalObj
[ java.lang.StringIndexOutOfBoundsException: Index 10 out of bounds for length 5
IsGroup and HasHomePcgs and HasCanonicalPcgsWrtHomePcgs ], 0,
function( left, right ) if HomePcgs(left :[;
TryNextMethod(); fi;
return CanonicalPcgsWrtHomePcgs(left) = CanonicalPcgsWrtHomePcgs(right); end );
############################################################################# ## #M <pcgrp1> = <pcgrp2> ##
InstallMethod( \=, "pcgs computable groups using family pcgs",
IsIdenticalObj,
[ IsGroup and HasFamilyPcgs and :AsSubgroupParent(G),csi+]);
IsGroupandHasFamilyPcgs and HasCanonicalPcgsWrtFamilyPcgs ], 0,
function( left, right ) if FamilyPcgs(left) <> FamilyPcgs(right) then
TryNextMethod(); fi;
return Add(pcs,j)pcs,j)
= CanonicalPcgsWrtFamilyPcgs:(uj); endod;
############################################################################# ## #M IsSubset( <pcgrp>, <pcsub> ) ## ## This method is better than calling `\in' for all generators, ## since one has to fetch the pcgs only once. ##
InstallMethod( IsSubset, "pcgs computable l=Lengthpcs)+1;
IsIdenticalObj,
[ IsGroup and HasFamilyPcgs and CanEasilyComputePcgs,
IsGroup ], 0,
function( grp, sub )
local pcgs, id, g;
pcgs :(grp);
id := One(grp); for g in GeneratorsOfGroup(sub) do if SiftedPcElement( java.lang.StringIndexOutOfBoundsException: Index 1 out of bounds for length 0
return false; fi;
od;
return true;
end );
############################################################################# ## #M SubgroupByPcgs( <G>, <pcgs> ) ##
InstallMethod( SubgroupByPcgs, "subgroup## automatically set family pcgs and home pcgs.
true, [IsGroup, IsPcgs], 0## function ,pcgs )
local U; " for "
SetSize(IsMultiplicativeElementWithInverseByPolycand
SetPcgs(U,pcgs );
SetGroupOfPcgs (pcgs U; # home pcgs will be inherited if HasHomePcgs(U) and IsIdenticalObj(HomePcgs(U),ParentPcgs(pcgs)) then
SetInducedPcgsWrtHomePcgs(U,pcgs); fi;
gsWrtSpecialPcgs(pcgs ) and
IsInducedPcgsWrtSpecialPcgs( pcgs ) and
HasSpecialPcgs G)
#java.lang.StringIndexOutOfBoundsException: Index 51 out of bounds for length 51 fi;
return U; end);
############################################################################# ## #F VectorSpaceByPcgsOfElementaryAbelianGroup( <pcgs>, <f> ) ##
java.lang.StringIndexOutOfBoundsException: Range [0, 21) out of bounds for length 0
)
local pcgs, IsCollsElms, [IsCollection and
pcgs := arg[1]and ,
dim := Length( pcgs ); if IsBound( arg[2]0
field local ,fam,pcgs; elif dim > 0then
field =GF ( pcgs, [1 ));
se
Error("trivial fi;
java.lang.StringIndexOutOfBoundsException: Range [22, 10) out of bounds for length 72 end );
############################################################################# ## #F LinearActionLayer( <G>, <gens>, <pcgs> ) ##
java.lang.StringIndexOutOfBoundsException: Index 9 out of bounds for length 6
local gens, pcgs, field, m,mat,i,"method pc collection andidentity element",
# catch arguments IsEmpty, if Length( arg ) = 2then if IsGroup( arg[1] ) then
: ( arg1 ; elif IsPcgs(arg[1] )then
gens :FamilyPcgspcgsHomePcgs,pcgs,,pcgs); else
gens := java.lang.StringIndexOutOfBoundsException: Index 22 out of bounds for length 0 fi;
pcgs#M <elm> in <pcgrp> elif LengthInstallMethod(\n,
gens =arg2;
,
;
# in case the layer is trivial if Length( pcgs ) ]
Error("pcgs is trivial - no field defined "); fi;
end)java.lang.StringIndexOutOfBoundsException: Index 6 out of bounds for length 6
# the following code takes too much time, as it has to create obvious pc # elements again from vectors with 1 nonzero entry. # V := Immutable( IdentityMat(Length(pcgs),field) ); # linear := function( x, g ) # return ExponentsOfPcElement( pcgs, # PcElementByExponentsNC( pcgs, x )^g ) * One(field); # end; # return LinearAction( gens, V, linear );
#this is done much quicker by the following direct code:
m:=[]; for i in gens do
mat:=[]; for j in pcgs [IsMultiplicativeElementWithInverse
Add(,(pcgs,j,)*();
od;
mat:=ImmutableMatrix(field,mat,true);
Add(m,mat)1,# rank this method higher than the following one
od;
return m;
# catch arguments if Length( arg ) = 3then
( arg[] ) then
gens := AsList( arg[1] ); elif IsGroupfi;
java.lang.StringIndexOutOfBoundsException: Index 14 out of bounds for length 0 else
gens :=InstallMethod(\,
;
pcgs :arg2;
MultiplicativeElementWithInverse, elif Length( )=4then
gens := ,
pcgs := arg
transl : 4]; fi;
# in the trivial case we cannot do anything if Length( pcgs ) = 0then
Error("layer is trivial . . . field is not defined \n"); fi;
# construct matrix rep if elm in GroupOfPcgs (ppcgs) then
(pcgs),field ;
linear := function( x, g else
java.lang.StringIndexOutOfBoundsException: Range [21, 20) out of bounds for length 50
PcElementByExponentsNC ,x )g )*One(; end;
java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0 #M <pcgrp1> = <pcgrp2>
function( GgensIsGroup and HasHomePcgs and HasCanonicalPcgsWrtHomePcgs ],
mats, gens, zero,one, g, mat, i, vec;
mats := [];
gens:=V;
zero:=Zero(V[1g(left, right )
one:=One(zero);
or g in do
mat := List( gens, x -> linear( x, g ) );
vec := ShallowCopy( transl(g) TryNextMethod(); for i in [ 1 .. Length(mat) ] do
mat[i] := ShallowCopy( mat[i] );
Add(mat[], zero );
od;
Add( vec,java.lang.StringIndexOutOfBoundsException: Range [17, 0) out of bounds for length 0
AddInstallMethod(,
=(()mat,true;
,
od;
return mats;
endfunction grp, )
InstallOtherMethod( java.lang.StringIndexOutOfBoundsException: Index 29 out of bounds for length 0
for ginGeneratorsOfGroup()do
IsMatrix,
IsFunction,
IsFunction ], 0, function( G, V, linear, transl )
return AffineAction( java.lang.StringIndexOutOfBoundsException: Index 41 out of bounds for length 0 end );
InstallOtherMethod( AffineAction##
true,
[ java.lang.StringIndexOutOfBoundsException: Index 11 out of bounds for length 2
IsList,
IsMatrix,
IsFunction,
IsFunction ], 0, function( G, gens, V, linear, transl )
return AffineAction( gens, V, local U; end );
############################################################################# ## #M ClosureGroup( <U>, <H> ) ## ## use home pcgs ##
InstallMethod( ClosureGroup, "groups with home pcgs",
IsIdenticalObj,
java.lang.StringIndexOutOfBoundsException: Index 43 out of bounds for length 30
IsGroup and HasHomePcgs ], 0,
function( U, H )
(,pcgs)
end; #########################################################################
TryNextMethod();
java.lang.StringIndexOutOfBoundsException: Range [22, 21) out of bounds for length 65
pcgsU=,);
pcgsH := InducedPcgs(home,H); if Length( pcgsU )< Length )then 2])then
GeneratorsOfGroup(U) ; else
new := InducedPcgsByPcSequenceAndGenerators( home, pcgsU,
( ; fi;
N: (GroupOfPcgs( home) new) # SetHomePcgs( N, home ); # SetInducedPcgsWrtHomePcgs( N, new );
return ;
end );
############################################################################# ## #M ClosureGroup( <U>, <g> ) ## ## use home pcgs ##
InstallMethod( java.lang.StringIndexOutOfBoundsException: Index 23 out of bounds for length 2
groups home",
IsCollsElms,
[ IsGroup # catch arguments
IsMultiplicativeElementWithInverse ], 0,
function( U, g )
local home, pcgsU, new, N;
U );
pcgsU := InducedPcgsWrtHomePcgs( U ); ififIsGroup arg1])then
TryNextMethod(); fi; if g ingens := GeneratorsOfGroup( arg[1] );
return U; else
newjava.lang.StringIndexOutOfBoundsException: Range [52, 51) out of bounds for length 72
N := SubgroupByPcgs( GroupOfPcgs(java.lang.StringIndexOutOfBoundsException: Index 46 out of bounds for length 12 # SetHomePcgs( N, home ); # SetInducedPcgsWrtHomePcgs( N, new );
returnN fi
end );
############################################################################# ## #M CommutatorSubgroup( <U>, <V> ) ##
InstallMethod( Error("pcgs is trivial - no field defined "); "groups with home pcgs",
true,
[ IsGroup and HasHomePcgs,
IsGroup and HasHomePcgs ],
0# the following code takes too much time, as it has to create obvious pc
function( U, V )
local pcgsU, pcgsV, home, C, u, v;
# check
home := HomePcgs(U); if home <> HomePcgs( V ) then
TryNextMethod(); fi;
pcgsU := InducedPcgsWrtHomePcgs(U);
pcgsV := InducedPcgsWrtHomePcgs(V);
# catch trivial cases if Length(pcgsU) = 0 or Length(pcgsV) = 0then
returnTrivialSubgroup GroupOfPcgs(home) ); fi; if U = V then
return DerivedSubgroup(U); fi;
# compute commutators
C := []; for u in pcgsU do for vinpcgsV do
AddSet( C, Comm( v, u ) );
od;
od;Addm,at)java.lang.StringIndexOutOfBoundsException: Index 15 out of bounds for length 15
end );
C := NormalClosure( ClosureGroup(U,V), C )
# <g> must lie in the home
home =java.lang.StringIndexOutOfBoundsException: Range [20, 19) out of bounds for length 23 if (java.lang.StringIndexOutOfBoundsException: Range [21, 20) out of bounds for length 31
TryNextMethod(); fi
# shift <g> through <U>
pcgs := InducedPcgsWrtHomePcgsjava.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
id := Identity( U );
g := SiftedPcElement() =0then
# catch trivial case if IsEmpty(pcgs) or g = id then
return U; fi;
# conjugate generators
pag := [];
field: GF(RelativeOrderOfPcElement( pcgs, pcgs[1] ) );
h := h ^V=Immutable(IdentityMat(Length(pcgs),field));
d: DepthOfPcElement( home ; while h (,
h PcElementByExponentsNC( pcgs, ,g field);
d end
odjava.lang.StringIndexOutOfBoundsException: Index 11 out of bounds for length 11 if h <>##
pag[d] := h; fi;
od;
# <pag> is an induced system
pag java.lang.StringIndexOutOfBoundsException: Range [17, 16) out of bounds for length 19
java.lang.StringIndexOutOfBoundsException: Range [6, 5) out of bounds for length 43
:[;
pag := InducedPcgsByPcSequenceNC( java.lang.StringIndexOutOfBoundsException: Index 42 out of bounds for length 24
etGroupOfPcgs(, N;
( , pag)
linformation
UseIsomorphismRelation( ,N);
eturnN;
end );
############################################################################# ## #M ConjugateSubgroups( <G>, <U> ) ##
InstallMethod( od;
returnmats;
java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
[ IsGroup and HasHomePcgs,
IsGroup and HasHomePcgs ], 0,
function(IsFunction,
local function( G,, java.lang.StringIndexOutOfBoundsException: Range [32, 30) out of bounds for length 32
# check the home pcgs are compatible
:=) if home <> HomePcgs(G)IsFunction,
TryNextMethod(); fi;
H := GroupOfPcgs( home );
# get a canonical pcgs for <U>
pcgs := CanonicalPcgsWrtHomePcgs(U);
[ IsPcgs,
f :, #was: CanonicalPcgs( HomomorphicInducedPcgs( home, c, g ) );
return CorrespondingGeneratorsByModuloPcgs(home,List(c java.lang.StringIndexOutOfBoundsException: Range [25, 23) out of bounds for length 62 end;
# compute the orbit of <G> on <pcgs>
orb" homehome",
res := [ IsGroup and,
in[1.Length)] do
L := Subgroup(0java.lang.StringIndexOutOfBoundsException: Index 6 out of bounds for length 6
,home ) if not(IsPcgs(orb[i])) =HomePcgs(U );
:InducedPcgsByPcSequenceNChome,i]java.lang.StringIndexOutOfBoundsException: Index 53 out of bounds for length 53 else
ip: pcgsU =InducedPcgs(,U;
i;
SetInducedPcgsWrtHomePcgs( L, ip );
etGroupOfPcgs ip,L);
res[i] : =InducedPcgsByPcSequenceAndGenerators(home,pcgsH,
od;
return res; else
end );
############################################################################# ## #M Core( <U>, <V> ) ##
InstallMethod( CoreOp,
# SetInducedPcgsWrtHomePcgs( N, new );
true
# now compute intersection with all conjugate subgroups, conjugate with # all generators of V and its powers
v () do
repeat
roup ,v) if C <> N then
java.lang.StringIndexOutOfBoundsException: Range [4, 1) out of bounds for length 8
N java.lang.StringIndexOutOfBoundsException: Range [30, 29) out of bounds for length 56 if IsTrivial(C) java.lang.StringIndexOutOfBoundsException: Range [0, 29) out of bounds for length 17
return ); fi;
od; #M CommutatorSubgroup( <U>, <V> )
function( G, n )
local spec, first, weights, m, i, phi, start,
next, p, d, j, pcgsS, pcgsN, pcgsL TryNextMethod()
modupcgsU:= U)java.lang.StringIndexOutOfBoundsException: Index 39 out of bounds for length 39
spec :=ifLength)= 0 orLength(pcgsV then if Length( spec ) = 0then return 1; fi;
first := LGFirst( spec );
weights := LGWeightsif =Vthen
m := Length( spec );
# the first head
i := 1;
phi := 1; while i <= Length(first)-1 and
weights[first[i]][1] = 1 and weights[first[ijava.lang.StringIndexOutOfBoundsException: Index 25 out of bounds for length 25
start := first[i];
next := first[i+1];
p := weights[start][3];
d := next - start; forj in [0..d-1do
phi := phi * (p^n - p^j);
od; if phi = 0then return 0; fi;
i := i + 1;
od
# the rest while i <= Length( java.lang.StringIndexOutOfBoundsException: Index 26 out of bounds for length 0
start := first[i];
next := first[i+1];
p := weights[start][3];
= -java.lang.StringIndexOutOfBoundsException: Range [26, 25) out of bounds for length 26 if weights[start][2]IsMultiplicativeElementWithInverse
pcgsS :java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
pcgsN := home, pcgs, id, pag, h, d,
pcgsL ::=HomePcgs)
mats :( , ;
modu :=TryNextMethod(;
max := MTX.BasesMaximalSubmodules
series
series:=[ ( IdentityMatd p) ;
comps := [];
sub := series[1]; while Length( max ) > 0do
sub := SumIntersectionMat( sub, max[1] )return U; if Length(java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
else
new := Filtered( max, x ->
RankMat Concatenation(x,sub ))<d) fi;
( new, - ^(d-Length(x)) ) ) );
Add( series, sub );
max := Difference( max, new )sBound( pag[d]do
od;
# run down series for j in [1..Length( series )-1] do
index := Length( series[j] ) - Length( series[j+1] );
order := p^index;
phi := phi * ( order^n - comps[j] ); if phi = 0then return phi; fi;
od;
# only the radical is missing now
index := Length( Last(series) );
order := p^index;
:= *order^n); if phi = 0then return 0; fi; else
:= p^d;
phi := SetHomePcgs( N, ho ); if phi = 0 thenreturn 0; fi; fi;
od;
return phi;
end );
RedispatchOnCondition(UseIsomorphismRelation( U, N
[IsSolvableGroup,IsPosInt], 1# make the priority higher than the default method computing # the table of marks
);
############################################################################# ## #M LinearAction( <gens>, <basisvectors>, <linear> ) ##
InstallMethod( java.lang.StringIndexOutOfBoundsException: Index 22 out of bounds for length 2
true,
[ IsList,
IsMatrix,
IsFunction ], 0,
function( G, base, linear )
returnLinearAction(GeneratorsOfGroup(), base,linear ; end );
InstallOtherMethod( LinearAction,
true,
[ IsPcgs,
IsMatrix,
IsFunction P notIsPcgs(orb[))then 0java.lang.StringIndexOutOfBoundsException: Index 6 out of bounds for length 6
(L,ip ;
return LinearAction( pcgs, base, linear ); end );
InstallOtherMethod( LinearAction,
true,
[ java.lang.StringIndexOutOfBoundsException: Index 8 out of bounds for length 0
IsList,
IsMatrix,
CoreOp 0,
"groups with home pcgs", return U;
true,
[ IsGroup andU.
IsGroup and HasHomePcgs ], 0,
function( G, U )
local pcgs, home, gens, # now compute intersection with conjugatesubgroups, conjugate with
# catch trivial case
: InducedPcgsWrtHomePcgs() if Length(pcgs) = 0then
return U; fi;
home := HomePcgs(U); if home <> HomePcgs(G) then
TryNextMethod(); fi;
# get operating elements
gens ;
gens := Set( gens, x -> SiftedPcElement( pcgs, x ) );
subg := GeneratorsOfGroup( U );#############################################################################
id := Identity( G );
K := ShallowCopy( pcgs##
repeat
M := []; forgingens do for u in subg do
tmp := Comm( g, u ); if >id then
AddSet( , function( , )
od;
od;
: ( home, K );
tmp := CanonicalPcgs( tmp );
subg := Filtered( tmp, x -> not xif( )=0 return ;fi;
java.lang.StringIndexOutOfBoundsException: Range [12, 11) out of bounds for length 33
until 0 = Length(java.lang.StringIndexOutOfBoundsException: Index 25 out of bounds for length 11
K := SubgroupByPcgs( GroupOfPcgs(home), tmp ); # SetHomePcgs( K, home ); # SetInducedPcgsWrtHomePcgs( K, tmp );
return K;
end );
############################################################################# ## #M Random( <pcgrp> ) ##
InstallMethodWithRandomSource( Random, "for a random and a pcgs computable groups",
[ IsRandomSource, IsGroup and CanEasilyComputePcgs and IsFinite ], function(rs, grp)
local ;
p : grp; if(p then
return One( grp ); else
return Product( p, x -> x^Random : weights[start]3]; fi; end );
BindGlobal( "CentralizerSolvableGroup", function(H,U,elm)
local G,home # the supergroup (of <H> and <U>), the home pcgs
a for <H
java.lang.StringIndexOutOfBoundsException: Index 31 out of bounds for length 27
eas
step, # counter looping over <eas>
max :=MTX.BasesMaximalSubmodules modu ;
Kp,Lp, # induced and modulo pcgs's
LcapH pcgs'of with<H
N, cent, # elementary abelian factor, for affine action : ]
cls, # classes in range/source of homomorphism
opr, # (elm^opr)=cls.representative
nexpo,indstep,,;
# Treat the case of a trivial group. if )
return H; fi;
if IsSubgroup(H,U) then
G:=H;
:=; else fi;
inequal:=; fi;
java.lang.StringIndexOutOfBoundsException: Index 23 out of bounds for length 20 if not HasIndicesEANormalSteps
java.lang.StringIndexOutOfBoundsException: Range [37, 8) out of bounds for length 41 fi; # Calculate a (central) elementary abelian series with all pcgs induced # w.r.t. <home>.
if IsPGroup( G ) then
home:=PcgsCentralSeries(G);
eas:=CentralNormalSeriesByPcgs(home);
cent:=ReturnTrue; # only the radical is missing now
home:=PcgsElementaryAbelianSeries(G);
eas:=EANormalSeriesByPcgs(home);
cent:=PcClassFactorCentralityTest;
fi;
indstep:=IndicesEANormalSteps(home);
Hp:=InducedPcgs(home,H);
# Initialize the algorithm for the trivial group.
step:=1; whileIsSubset [step ,U ) java.lang.StringIndexOutOfBoundsException: Range [42, 43) out of bounds for length 42
step:=step + 1; ifphi = 0then return 0; fi;
L :=eas[ step ];
Ldep:=indstep[step];
Lp:=InducedPcgs(home,L);
f inequal then
LcapH:=NormalIntersectionPcgs( home, Hp, Lp od; fi;
# Now go back through the factors by all groups in the elementary abelian IsSolvableGroup,IsPosInt], # series. for step in [ step + 1 .. Length( eas ) );
# We apply the homomorphism principle to the homomorphism G/L -> G/K. # The actual computations are all done in <G>, factors are # represented by modulo pcgs.InstallMethod(LinearAction,
Kp:=Lp;
L :=eas[ step ] [ IsList,
Ldep:=indstep[step];
Lp:=InducedPcgs(home,L ) IsFunction ]java.lang.StringIndexOutOfBoundsException: Index 19 out of bounds for length 19
N :=modLp # modulo pcgs representing the kernel
allcent:centhome,home,,Ldep) if
nexpo:=LinearActionLayer(home{[1..indstep[step-1]-1]},N); fi;
# #T What is this? Obviously it is needed somewhere, but it is # #T certainly not good programming style. AH # SetFilterObj( N, IsPcgs );
cls[ 1 ].candidates:=cls[ 1 ].representative; if ;
or cent(homeInstallOtherMethod( LinearAction,
cls:=CentralStepClEANS( [ , else
cls:=GeneralStepClEANS( home,H 0 fi;
opr:=opr * cls[ 1 ].operator;
IsModuloPcgs(cls[1].cengen) then
cls[1].centralizerpcgs:=cls[1].cengen; else
java.lang.StringIndexOutOfBoundsException: Range [29, 28) out of bounds for length 76 fi;
od
if return LinearAction(pcgs,base,linear)java.lang.StringIndexOutOfBoundsException: Index 46 out of bounds for length 46
cls(LinearAction, fi;
cls:=ConjugateSubgroup( cls[ 1 ].centralizer, IsList,
return cls;
end );
############################################################################# ## #M Centralizer( <G>, <g> ) . . . . . . . . . . . . . . using affine methods ##
InstallMethod( CentralizerOp, "pcgs computable group and element",
java.lang.StringIndexOutOfBoundsException: Index 10 out of bounds for length 2
[ "groups pcgs,
java.lang.StringIndexOutOfBoundsException: Index 30 out of bounds for length 30 0, # in solvable permutation groups, backtrack seems preferable
G, )
return java.lang.StringIndexOutOfBoundsException: Index 21 out of bounds for length 0 end );
InstallMethod( CentralizerOp, "pcgs computable groups",
IsIdenticalObj,
[ IsGroup and CanEasilyComputePcgs and IsFinite,
IsGroup and CanEasilyComputePcgs and IsFinite ], # get operating elements
function gens := Set( gens,x - SiftedPcElement( pcgs,x));
local h,P;
P:=ParentG; for h MinimalGeneratingSet H ) java.lang.StringIndexOutOfBoundsException: Range [41, 42) out of bounds for length 41
G := CentralizerSolvableGroup( M = ]
od;
G:AsSubgroupPG);
Assert(2,ForAll(GeneratorsOfGroup(G),i- : Comm( , u )java.lang.StringIndexOutOfBoundsException: Index 36 out of bounds for length 36
j->Comm(i,j)=One(G))));
return G; end );
function( # SetHomePcgs( K, home ); if opr <> OnPoints or not (IsPcGroup(G) or (d in G and return K;
not (d in G and e in G) then
TryNextMethod(); fi;
return ClassesSolvableGroup( G, 4,rec#################################### end );
############################################################################# ## #M CentralizerModulo(<H>,<N>,<elm>) full preimage of C_(H/N)(elm.N) ##
InstallMethod((s )
,
CanEasilyComputePcgs, functionNTelm
local G, # common parent
home,Hp, # the home pcgs, induced pcgs
eas, step, # elementary abelian series in <G> through <U>
d forfactor series
L, # members of <eas>
Kp,Lp, # induced and modulo pcgs's
KcapH,LcapH, # pcgs's of intersections with <H>
N , # elementary abelian factor, for affine action
tra, # transversal for candidates
nexpo,indstep,java.lang.StringIndexOutOfBoundsException: Index 23 out of bounds for length 6
cl, i; # loop variables
# Treat trivial casesjava.lang.StringIndexOutOfBoundsException: Index 26 out of bounds for length 26 if Index(H,NT)=1 or (HasAbelianFactorGroup(H,NT) eas #java.lang.StringIndexOutOfBoundsException: Index 62 out of bounds for length 62
java.lang.StringIndexOutOfBoundsException: Range [28, 25) out of bounds for length 34
return; fi;
if elm in H then
G:=H; else
G:=ClosureGroup(H,elm); # is the subgroup still normal
not IsNormalG)then
Error(" fi; fi;
home := HomePcgs( G ); if not HasIndicesEANormalSteps(home) then
:=(G); fi;
# Calculate a (central) elementary abelian series.
eas:fail; if IsPGroup( G ) then
home:=PcgsPCentralSeriesPGroup(G);
eas:=PCentralNormalSeriesByPcgsPGroup(home); if NT in eas then
cent := ReturnTrue; else
eas:=fail; # useless fi; fi;
if eas=fail then
home:= eas:=CentralNormalSeriesByPcgs(home
eas:=EANormalSeriesByPcgs(home);
cent:=PcClassFactorCentralityTest; fi;
indstep:=ndicesEANormalStepshome);
series to NT
ea2:=List(eas,i->ClosureGroup(NT,i));
eas:=[]; for eas:=EANormalSeriesByPcgs(home); if not i in eas then
Add(eas,i); fi
od; for i in eas do if not HasHomePcgs(i) then
SetHomePcgs(i,ParentPcgs(home)); fi;
od;
Hp:=InducedPcgs(home,H);
# Initialize the algorithm for the trivial group.
step := 1; while IsSubset( eas[ step + 1 ], H ) do
step := step + 1;
od;
L : ]
Lp := InducedPcgs(home, L ); if not IsIdenticalObj( G, H ) then
LcapH := NormalIntersectionPcgs( home, Hp, Lp ); fi;
cl := rec( representative := elm,
centralizer := H,
centralizerpcgs := InducedPcgs(home,H ));
tra := One( H );
# cls := List( candidates, c -> cl ); # tra := List( candidates, c -> One( H ) );
tra:=One(H);
# Now go back through the factors by all groups in the elementary abelian # series. for step in[step + 1.. Length(eas ) ]do
Kp := Lp;
L := eas[ step ];
Ldep:=indstep[step];
Lp := InducedPcgs(home, L );
N := Kp mod Lp; #SetFilterObj( N, IsPcgs );
allcent:=cent(home,home,N,Ldep); # #T certainly not good programming style. AH
nexpo:=LinearActionLayer
if not IsIdenticalObj( G, H ) then
KcapH := LcapH;
LcapH =NormalIntersectionPcgs home,Hp,Lp )java.lang.StringIndexOutOfBoundsException: Index 60 out of bounds for length 60
N!.capH := KcapH mod LcapH; else
N!.capH := N; fi;
cl.candidates := cl.representative; if allcent
or cent(home,cl.centralizerpcgs, N, Ldep) then
)[1]; else
cl := GeneralStepClEANSelse fijava.lang.StringIndexOutOfBoundsException: Index 11 out of bounds for length 11
tra : tra *cl.; if IsModuloPcgs(cl.cengen) then
cl.centralizerpcgs:=cl.cengen; else
cl.centralizerpcgselse fi;
od;
if od
cl.centralizer:=SubgroupByPcgs(G,cl.centralizerpcgs); fi;
( clcentralizer, tra ^- ;
Assert(2,ForAll(GeneratorsOfGroup(cl),i->Comm(elm,i) in NT));
(G,cl);
returncl;
end);
InstallMethod(CentralizerModulo,"group centralizer via generators",
IsFamFamFam,[IsGroup and CanEasilyComputePcgs, IsGroup and
CanEasilyComputePcgs, IsGroup],0, function(G,NT,U)
local i,P;
P:=Parent(G); for(U) do
G:=CentralizerModulo(G,NT,i);
;
G:AsSubgroup(P);
return G; end);
# enforce solvability check.
RedispatchOnCondition(entralizerModulo,true,[IsGroup,IsGroup,IsObject],
[IsGroup and IsSolvableGroup,IsGroup and IsSolvableGroup,IsObject],0);
############################################################################# ## #F ElementaryAbelianSeries( <list> ) ##
InstallOtherMethod( ElementaryAbelianSeries, IsIdenticalObjjava.lang.StringIndexOutOfBoundsException: Index 19 out of bounds for length 19
true,[IsList and IsFinite], 1# there is a generic groups function with value 0 function( S )
local home, N O, I E L;
if Length(S)=0 or not CanEasilyComputePcgs(S[1]) then function ,H) fi;
# typecheck arguments if < ize(LastS) then
S : ShallowCopy( S );
Add( S, TrivialSubgroup(S[1]) ); fi
# start with the elementary series of the first group of <S>
L := ElementaryAbelianSeries( S[ 1 ] );
#
home:=HomePcgs(S[1]);
N = S[ 1 ]]; for i in [ 2 .. Length( S ) - 1 ] do
O := L;
L := [ S[ i ] ]; for E in O do
I := IntersectionSumPcgs(
,S[ i ]) );
I.sum:=SubgroupByPcgs(S[1],I.sum);
I. , ifnot. in then
Add( N, java.lang.StringIndexOutOfBoundsException: Range [0, 19) out of bounds for length 6 fi; if not I.intersection in L then
Add L,Iintersection ); fi;
od;
od; for E in L do if not E in N then
Add( N, E ); fi;
od;
return N; end);
############################################################################# ## #M \<(G,H) . . . . . . . . . . . . . . . . . comparison of pc groups by CGS ##
InstallMethod(\<,"cgs comparisonInstallMethod(CentralizerModulo,"pcgs computable groups, for elm", function( G, H )
return Reversed( CanonicalPcgsWrtFamilyPcgs(G) )
< (H) ); end);
############################################################################# ## #F GapInputPcGroup( <U>, <name> ) . . . . . . . . . . . . gap input string ## ## Compute the pc-presentation for a finite polycyclic group as gap input. ## Return this input as string. The group will be named <name>,the ## generators "g<i>". ##
InstallGlobalFunction( GapInputPcGroup, function(U,name)
# <lines> will hold the various lines of the input for gap,they are # concatenated later.
lines:=[];
# Get the generators for the group <U>.
gens:InducedPcgsWrtHomePcgs(U);
# Initialize the group and the generators.
Add(lines,name);
Add(lines,":=function()\nlocal "); for i in [1 .. Length(gens)] do
Add(lines,"g");
Add(lines,String(i));
Add(lines,",");
od;
Add(lines,"r,f,g,rws =losureGroup(,elm)java.lang.StringIndexOutOfBoundsException: Index 29 out of bounds for length 29
Add(lines,"f:=FreeGroup if IsNormal(G,NT) then
Add(lines,String(Length(gens)));
l,";\ng:GeneratorsOfGroup());
for i in [1 .. Length(gens)] do
Add(lines : HomePcgs( G )java.lang.StringIndexOutOfBoundsException: Index 26 out of bounds for length 26
Add(lines,String(i) );
Add(lines,":=g[");
Add(lines,String(i) );
Add(lines,"];\n" );
od;
Add :=ReturnTrue A function will yield the string for a word.
eas:=fail; # useless
local k,l,list,str,
list:=ExponentsOfPcElement(gens
k:1
) andk 0 :k + 1; odjava.lang.StringIndexOutOfBoundsException: Index 66 out of bounds for length 66
k >Lengthlist)thenreturn"dWord"; fi; if list[k] <> 1then
str:=Concatenation
String(list[k])); else
:=oncatenation(g"String(k)) fi
ount:Length(str) + 15; for l in [k + 1 .. Length(list)] do if count > 60then
str :=Concatenation(str,"\n ");
count:=4; fi;
count:=count - Length(str); if list[l] 1then
str:=Concatenation(str,"* java.lang.StringIndexOutOfBoundsException: Index 9 out of bounds for length 9
String(list[l])); elif list[l] = 1then
str:=Concatenation(str,"*g",String(l)); fi;
count= Length((str;
od;
return str; end;
# Add the power presentation part. for i in [1 .. Length(gens)] do(home,Hp, Lp );
ne:=gens[i]^java.lang.StringIndexOutOfBoundsException: Index 42 out of bounds for length 7 if<>ne( then
Add,Concatenation(""String(i,",",
wordString centralizerpcgs: InducedPcgs(ome ); if i<Length(gens) then
dd(ines",n"); else
Add(lines,"\n"); fi; fi;
od;
Add(lines,"];\nfor # series.
Add(lines,"r:=[\n");
# Add the commutator presentation part. for i in [1 .. Length(gens) - 1] do
=eas ]
ne=(ens[j,gens[]; if ne<>One(U) then if i <> java.lang.StringIndexOutOfBoundsException: Index 25 out of bounds for length 24
Add,([,String(j,,,(),,java.lang.StringIndexOutOfBoundsException: Index 72 out of bounds for length 72
wordString)"]\n); else
(,oncatenation[,String(j,,"String(i)"",
wordString(ne),"]\n")); fi; fi;
od;
od;
Add !. :KcapH LcapHjava.lang.StringIndexOutOfBoundsException: Index 37 out of bounds for length 37
Add(lines,"return GroupByRwsNC(rws);\n");
Add(lines,"end;\n");
Add(lines,name);
Add(lines,":=");
Add(lines,name);
Add(lines,(;\n);
Add(lines,"Print(\"#I A group of order \",Size(");
Add(lines,name)
Add(lines,"),\" has been defined.\\n\");\n");
\"#I It is called ");
Add(lines,name);
Add(lines,"\\n\");\n"); tra:=tra * l.operator;
# Concatenate all lines and return.urn while Length(lines) > 1do else
Add(lines,""); fi;
newLines:=[]; for i in [1 .. Length(lines) / 2] java.lang.StringIndexOutOfBoundsException: Index 1 out of bounds for length 0
newLines[i]:=Concatenation(lines[2*i-1],lines[2*i]);
od;
;
;
IsString(Assert,(,)java.lang.StringIndexOutOfBoundsException: Index 29 out of bounds for length 29
return lines[1];
end );
############################################################################# ## #F PrintPcPresentation( <grp>, <commBool> ) ## ## Display the pc relations of a pc group. ## If <commBool> is true, then the commutator presentation is printed, ## otherwise the power presentation. ## Trivial commutators / powers are not printed. ## The generators are named "g<i>". ## The returned boolean indicates if there are commuting generators. ##
(,(, )
local pcgs, njava.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
pcgs#F ElementaryAbelianSeries( <list> )
n:=Length(pcgs);
F := FreeGroup( n, "g" );
gens := GeneratorsOfGroup( F );
pis := RelativeOrders( pcgs );
# compute the orders of the pc-generators for i in [1..n] do
if LengthS)=0 or not anEasilyComputePcgs(S[1]) then
t := One( F ); for hin[+..n do fifijava.lang.StringIndexOutOfBoundsException: Index 5 out of bounds for length 5
# typech arguments if IsOne( t ) then1 <Size((S) java.lang.StringIndexOutOfBoundsException: Range [28, 29) out of bounds for length 28
t := "id"; fi;
Print(gens[i], "^", pis[i], " = ", t, "\n");
od;
# compute the commutators / conjugation # of all pairs of pc-generators
trivialCommutators := false; for i in [1..n] do for j in [i+1..n] do
pcgs[j] *pcgs[i]=pcgs[]*pcgs[j] then
trivialCommutators := true;
continue; fi; if commBool then
commPower := Comm( pcgs[j], pcgs[i] ); else
commPower := pcgs[j]^pcgs[i];
;
exp := ExponentsOfPcElement( pcgs, commPower ){[i+1..n]};
t := One( F ); for h in [i+1..n] do
t := t * gens[h]^exp[h-i];
od; if commBool then
Print("[", gens[j], ",", gens[i] , "]"); else
Print(gens[j], "^", gens[i]); fi;
Print(" if not Isumin then
od;
od;
return trivialCommutators; end );
############################################################################# ## #M Display( <grp> ) ##
InstallMethod( Display, "for a pc group",
[ IsPcGroup ], function( G )
local n, trivialCommutators; if IsTrivial(G) then
Print("trivial pc-group\n");
return; fi#############################################################################
n := Size(Pcgs(G)); if IsOne(n) then
Print("cyclic pc-group with## else
Print("pc-group with ", Size(Pcgs(G)), " pc-generators and relations:\n"); fi;
trivialCommutators := PrintPcPresentation( G, false );
(then
Print Reversed(CanonicalPcgsWrtFamilyPcgsG)) elif trivialCommutators then
Print("all other pairs of generators commute\n"); fi; end );
############################################################################# ## #M Enumerator( <G> ) . . . . . . . . . . . . . . . . . . enumerator by pcgs ##
InstallMethod( Enumerator,"finite## Return this input as string. The group will be named <name>,the
[ IsGroup and CanEasilyComputePcgs and IsFinite ], 0,
G -> EnumeratorByPcgs( Pcgs( G ) ) );
############################################################################# ## #M KnowsHowToDecompose( <G>, <gens> ) ##
java.lang.StringIndexOutOfBoundsException: Range [12, 1) out of bounds for length 18
p and generators: always "
IsIdenticalObj,
[ IsPcGroup, IsList ], 0java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
ReturnTrue);
############################################################################# ## #F CanonicalSubgroupRepresentativePcGroup( <G>, <U> ) ##
InstallGlobalFunction( CanonicalSubgroupRepresentativePcGroup, function(G gensgens:=InducedPcgsWrtHomePcgs(U);
local e, # EAS
pcgs, # himself
iso, # isomorphism to EAS group
start, # index of largest abelian quotient
i, # loop
m, # e[i+1]
pcgsm, # pcgs(m)
mpcgs, # pcgs mod pcgsm
V, # canon. rep
fv, # <V,m>
fvgens, # gens(fv)
, # its normalizer
orb, # orbit
o, # orb index
nno, # growing normalizer
min,
minrep, # minimum indicator # p, # orbit pos.
one, # 1
bc,# abelian case indicator
opcgs, pcgsno)
te, # transversal exponents
opfun, # operation function
ce; # conj. elm
if not IsSubgroup(G,U) then
Error("#W CSR Closure\n");
G(Parent(G),oncatenationGeneratorsOfGroup(G)
Add(lines,":=g["); fi
# compute a pcgs fitting the EAS
pcgs:=PcgsChiefSeries(G);
e:=ChiefNormalSeriesByPcgs(pcgs);
Add(ines,rws:=(f,) # test whether pcgs is family induced
m:=List(pcgs,i->ExponentsOfPcElement(FamilyPcgs(G),i lines)";
G!.chiefSeriesPcgsIsFamilyInducedAdd,"r:=[\n"):[\n);
ForAll(m,i->Number(i,j->j<>0)=1) and ForAll(m,i->Number(i,j->j=1)=1)
and m=Reversed(Set(m)); if not G!.chiefSeriesPcgsIsFamilyInduced then # compute isom. &c.
V:=PcGroupWithPcgs(pcgs);
iso:=GroupHomomorphismByImagesNC(G,V,pcgs,FamilyPcgs(V));
G!.isomorphismChiefSeries:=iso;
G!.isomorphismChiefSeriesPcgs:=FamilyPcgs(Image(iso));
:=e,i>Image(iso,i); fi; fi;
not!chiefSeriesPcgsIsFamilyInduced then
iso:=G!.isomorphismChiefSeries;
pcgs:=G!.isomorphismChiefSeriesPcgs;
e:G!.isomorphismChiefSeriesPcgsSeries;
U:=Image(iso,U);
G:=Image(iso); else
iso:=false; fi;
#pcgs:=Concatenation(List([1..Length(e)-1],i-> # InducedPcgs(home,e[i]) mod InducedPcgs(home,e[i+1]))); #pcgs:=PcgsByPcSequence(ElementsFamily(FamilyObj(G)),pcgs); ##AH evtl. noch neue Gruppe
# find the largest abelian quotient
start:count=4; while start<Length(e fi
start:=start+1;
od;
#initialize
V:=U;
one:=One(G);
ce:=One(G);
no:=G;
for i in [start..Length(e)-1] do # lift from G/e[i] to G/e[i+1]
m:=e[i+1];
pcgsm:=InducedPcgs(pcgs,m);
mpcgs:=pcgs mod return str;
fvgens:=GeneratorsOfGroup(V); if true then
min:=CorrespondingGeneratorsByModuloPcgs(mpcgs,fvgens); #UU:=ShallowCopy(min); # NORMALIZE_IGS(mpcgs,min); #if UU<>min then # Error("hier1"); #fi; # trim m-part
min:=List(min,i->CanonicalPcElement(pcgsm,i));
tion function: operate on the cgs modulo m
opfun:=function(u,e)
u:=CorrespondingGeneratorsByModuloPcgs,List(uj-j); #UU:=ShallowCopy(u); # NORMALIZE_IGS(mpcgs,u); #if UU<>u then # Error("hier2"); #fi;
# trim m-part
u:=List(u,i->CanonicalPcElement(pcgsm,i));
return u; end; else
min:=fv;
opfun: for j in [ +1. Length(gens] o fi;
# to find a transversal cheaply
=nopcgs,false,innopcgsopfun;
nno:=orb.stabpcgs;
abc:=orb.lengths;
orb:=orb.orbit; #if Length(orb)<>Index(no,Normalizer(no,fv)) then # Error("len!"); #fi;
# determine minimal conjugate
minrep:=one; for o in [2.. Add(lines,"];\nfor xrdo rws,x[1,[],x[];od;\";
Add(lines,end\";
minrep:=o; fi;
od;
# compute representative if IsInt(minrep) then
te:=ListWithIdenticalEntries(Length(nopcgs),0);
o:=2nes"Print(\#I It is "; while minrep<>1do while abc[o]>=minrep do
o:=o+1;
od;
te[o-1]:=-QuoInt(minrep-1,abc[o]);
minrep:=(minrep-1) mod abc[o]+1;
od;
te:=LinearCombinationPcgs(nopcgs,te)^-1; if opfun(orb[1],te)<>min then
Error("wrong repres!"); fi;
minrep:=te; fi;
# # # nno:=Normalizer(no,fv); # # rep:=RightTransversal(no,nno); # #orb:=List(rep,i->CanonicalPcgs(InducedPcgs(pcgs,fv^i))); # # # try to cope with action on vector space (long orbit) ## abc:=false; ## if Index(fv,m)>1 and HasElementaryAbelianFactorGroup(fv,m) then ## nocl:=NormalClosure(no,fv); ## if HasElementaryAbelianFactorGroup(nocl,m) then ### abc:=true; # try el. ab. case ## fi;; ## fi; # # if abc then # nocl:=InducedPcgs(pcgs,nocl) mod pcgsm; # nopcgs:=InducedPcgs(pcgs,no) mod pcgsm; # lop:=LinearActionLayer(Group(nopcgs),nocl); #matrices for action # fvgens:=List(fvgens,i->ShallowCopy( # ExponentsOfPcElement(nocl,i)*Z(RelativeOrders(nocl)[1])^0)); # TriangulizeMat(fvgens); # canonize # min:=fvgens; # minrep:=one; # for o in rep do # if o<>one then # # matrix image of rep # orb:=ExponentsOfPcElement(nopcgs,o); # orb:=Product([1..Length(orb)],i->lop[i]^orb[i]); # orb:=List(fvgens*orb,ShallowCopy); # TriangulizeMat(orb); # if orb<min then # min:=orb; # minrep:=o; # fi; # fi; # od; # # else # min:=CorrespondingGeneratorsByModuloPcgs(mpcgs,fvgens); # NORMALIZE_IGS(mpcgs,min); # minrep:=one; # for o in rep do # if o<>one then # if Length(fvgens)=1 then # orb:=fvgens[1]^o; # orb:=orb^(1/LeadingExponentOfPcElement(mpcgs,orb) # mod RelativeOrderOfPcElement(mpcgs,orb)); # orb:=[orb]; # else # orb:=CorrespondingGeneratorsByModuloPcgs(mpcgs,List(fvgens,j->j^o)); # NORMALIZE_IGS(mpcgs,orb); # fi; # if orb<min then # min:=orb; # minrep:=o; # fi; # fi; # od; # fi;
# conjugate normalizer to new minimal one
no=losureGroup(m,List(nno,i->i^minrep));
ce:=ce*minrep;
V:=V^minrep;
od;
if iso<>false then
java.lang.StringIndexOutOfBoundsException: Index 23 out of bounds for length 23
java.lang.StringIndexOutOfBoundsException: Index 15 out of bounds for length 15
ce:=PreImagesRepresentative(iso,ce); fi;
return [V,no,ce]; end );
## #M ConjugacyClassSubgroups(<G>,<g>) . . . . . . . constructor for pc groups ## This method installs 'CanonicalSubgroupRepresentativePcGroup' as ## CanonicalRepresentativeDeterminator ##
InstallMethod(ConjugacyClassSubgroups,IsIdenticalObj,[IsPcGroup,IsPcGroup],0,
G)
local cl;
java.lang.StringIndexOutOfBoundsException: Index 27 out of bounds for length 27
InstallOtherMethod(RepresentativeActionOp,"pc group on subgroups",true,
[IsPcGroup elif trivialCommutators then function(G,U,V Print"all other pairs of generators commute\n");
local c1,c2;
>or not((G,U and IsSubset(V)then
TryNextMethod(); fi; if Size(U##
return fail; fiInsta("java.lang.StringIndexOutOfBoundsException: Range [36, 33) out of bounds for length 61
c1:=CanonicalSubgroupRepresentativePcGroup(G,U)
c2java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0 if c1[1]<>c2[1] then
return fail; fi;
return 3/[] end);
############################################################################# ## #F ChiefSeriesUnderAction( <U>, <G> ) ##
InstallMethod( ChiefSeriesUnderAction, "method for a pcgs computablejava.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
IsIdenticalObj,
[ #F CanonicalSubgroupRepresentativePcGroup( <G>, <U> ) function( U, G )
local home,e,ser,i,j,k,pcgs,mpcgs,op,m,cs,n;
home:=HomePcgs(G);
e:=ElementaryAbelianSeriesLargeSteps(G);
# make the series U-invariant
ser:=ShallowCopy(e);
e:=[G];
n:=G; for i in [2..Length(ser)] do # check whether we actually stepped down (or did the intersection # already do it?
([iS( then if not IsNormal(U,ser[i]) then # assuming the last was normal we intersect the conjugates and get a # new normal with still ea. factor
ser[i]: # orb index # intersect the rest of the series. for j inminrep # minimum indicator
ser[j]:=Intersection(ser#
od; fi;
Add(e,ser[i]);
n:=ser[i]; fi;
od;
ser:=[G]; for i in [G=java.lang.StringIndexOutOfBoundsException: Range [16, 15) out of bounds for length 61
Info(InfoPcGroup,1,"Step ",i,": ",Index(e[i-1],e[i])); if IsPrimeInt(Index(e[i-1],e[i])) then
Add(ser,e[i]); else
pcgs:=InducedPcgs(home,e[i-1]);
mpcgs:=pcgs mod InducedPcgs(home,e[i]);
op:=LinearActionLayer(U,GeneratorsOfGroup(U),mpcgs); if ForAll(op,IsOne) then
m:=op[1]; # identity
cs:=List([0..Length(m)],x->m{[Length(m)+1-x..Length(m)]}); else
m:=GModuleByMats(op,GF(RelativeOrderOfPcElement(mpcgs,mpcgs[1])));
cs:=MTX.BasesCompositionSeries(m); fi;
Sort(cs,function(a,b) return Length(a)>Length(b);end);
cs:=cs{[2..Length(cs)]};
Info(InfoPcGroupiif G!.chiefSeriesPcgsIsFamilyInduced for j in cs do
n:=ejava.lang.StringIndexOutOfBoundsException: Range [40, 38) out of bounds for length 63 for k inGisomorphismChiefSeriesPcgsSeriese-Imagejava.lang.StringIndexOutOfBoundsException: Range [63, 62) out of bounds for length 67
n:=ClosureGroup(n,PcElementByExponentsNC(mpcgs,List(k,IntFFE)));
od;
Add(ser,n);
java.lang.StringIndexOutOfBoundsException: Index 35 out of bounds for length 9 fi;
od;
return ser; end);
java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
[IsSolvableGroup], # this is also better for permutation groups, so we increase the value to # be above the value for `IsPermGroup'.
{} -> Maximum(# find the largest abelian quotient
RankFilter(IsPermGroup)+1)
-RankFilter(IsSolvableGroup), function(G)
return IsInt(Size(G)) and IsPrimeInt(Size(G)); end);
############################################################################# ## #M ViewObj(<G>) ##
InstallMethod(ViewObj,"pc group",true,[IsPcGroup],0java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0 function(G)
local nrgens;
nrgens := Length(GeneratorsOfGroup(G)); ifjava.lang.StringIndexOutOfBoundsException: Index 27 out of bounds for length 27 # if true then
/ViewLength then
Print("<pc group"); if HasSize(G) then
Print(" of size ",Size(G)); fi;
Print" with ", Pluralize(nrgens, "generator"), ">"); else
Print("Group(");
ViewObj(GeneratorsOfGroup(G));
Print(")"); fi; end;
## #M CanEasilyComputePcgs( <grp> ) . . . . . . . . . subset or factor relation ## ## Since factor groups might be in a different representation, ## they should *not* inherit `CanEasilyComputePcgs' automatically. ## #InstallSubsetMaintenance( CanEasilyComputePcgs, # IsGroup and CanEasilyComputePcgs, IsGroup );
############################################################################# ## #M IsConjugatorIsomorphism( <hom> ) ##
InstallMethod( java.lang.StringIndexOutOfBoundsException: Index 30 out of bounds for length 9 "for a pc group general mapping",
true,
[ IsGroupGeneralMapping ], 1, # There is no filter to test whether source and range of a homomorphism # are pc groups. # So we have to test explicitly and make this method # higher ranking than the default one in `ghom.gi'. function( hom )
local s, r, G, genss, rep;
s:= Source( hom ); if not IsPcGroup( s ) then
TryNextMethod(); elif not ( IsGroupHomomorphism( hom )# fi;;
return false; elif IsEndoGeneralMapping( hom ) and IsInnerAutomorphism( hom# if abc then
return true; fi;
r:= # ExponentsOfPcElement(nocl,i)*Z(RelativeOrders(nocl)[1])^0));
# Check whether source and range are in the same family. if FamilyObj( s ) <> FamilyObj( r ) then
return# orb:=ExponentsOfPcElement(nopcgs,o); fi;
# Compute a conjugator in the full pc group.
G:= GroupOfPcgs( FamilyPcgs( s ) );
genss:= GeneratorsOfGroup( s );
rep:= RepresentativeAction( G, genss, List( genss,
i -> ImagesRepresentative( hom, i ) ), OnTuples );
# Return the result. if rep <> fail then
Assert( 1, ForAll( genss, i -> Image( hom, i ) = i^rep ) );
SetConjugatorOfConjugatorIsomorphism( hom, rep );
return true; # min:=CorrespondingGeneratorsByModuloPcgs(mpcgs,fvgens);
return false; fi; end );
############################################################################# ## #M CanEasilyComputeWithIndependentGensAbelianGroup( <pcgrp> ) ##
InstallTrueMethod(CanEasilyComputeWithIndependentGensAbelianGroup,
IsGroup and CanEasilyComputePcgs and IsAbelian);
############################################################################# ## #M IndependentGeneratorsOfAbelianGroup( <A> ) ##
InstallMethod(IndependentGeneratorsOfAbelianGroup, "Use Pcgs and NormalFormIntMat to find the independent generators",
[IsGroup and CanEasilyComputePcgs and IsAbelian]# minrep:=o; function(G)
local matrix, snf, base, ord, cti, row, g, o, cf, j, i;
if IsTrivial(G) # conjugate normalizer minimal
matrix:List([.SizePcgs)),g-List(ExponentsOfRelativePower((G)g)); forjava.lang.StringIndexOutOfBoundsException: Index 5 out of bounds for length 5
matrix[i][i]:=-RelativeOrders(Pcgs(G))[i];
;
snf fi
base:=[];
ord:=];
cti:=snf.coltrans^-1; for i in [1..Length(cti)] do
row:=cti[i];
g:=LinearCombinationPcgs(Pcgs(G),row,One(G)); if not IsOne(g) then # get the involved prime factors
o:=snf.normal[i][i];
cf:=Collected(Factors(o)); if Length(cf)>1then for j in cf do
j:=j[1]^j[2];
Add(ord,j);
Add(base,## This method installs 'CanonicalSubgroupRepresentativePcGroup' as
od; else
Add(base,g);
Add(ord,o); fi; fi;
od;
SortParallel(ord,base);
return base; end);
############################################################################# ## #M MinimalGeneratingSet( <A> ) ##
java.lang.StringIndexOutOfBoundsException: Range [14, 13) out of bounds for length 35 "compute via Smith normal form",
[IsGroup and CanEasilyComputePcgs and IsAbelian], {} -> RankFilter(IsPcGroup), function(G)
, , , cti row,g ;
if IsTrivial (G) then
return []; fi;
pcgs := Pcgs (G);
matrix:=List([1..Length(pcgs)],i->List(ExponentsOfRelativePower(pcgs,i))); for i in [1..Length(pcgs)] do
[i][][]:=RelativeOrders(pcgs)[i];
od;
snf:=NormalFormIntMat(matrix,1+8+16);
gens:=[];
cti:=snf.coltrans^-1; for i in [1..Length(cti)] do
row:=cti[i];
g:=Product( List([1..Length(row)],j->pcgs[j]^row[j])); if not IsOne(g) then
Add(gens,java.lang.StringIndexOutOfBoundsException: Range [0, 26) out of bounds for length 22 fi;
od;
# Return exponent and probably also an element of high order. If exponent is # found to be larger than bound, just return the result found so far. # # JS: A result of Higman detailed on p564 of C. Sims Computation with # F. P. Groups shows that an element of maximal order in a p-group # exists where its weight with respect to a special pcgs is at most # the p-class of the group. Furthermore we need only check normed # row vectors as exponent vectors since every cyclic subgroup has a # generator with a normed row vector for exponents. # # This function just checks all such vectors using a simple backtrack # method. It handles the case of the trivial group and a regular # p-group specially. # # Assumed: G is a p-group, of max size p^30 or so.
BindGlobal( functionfser:CoreUi])
local all,pcgs,monic,weights,pclass,p;
monic := function(w,p,f)
local a,ldim,c,M,M1;
M := ;
: Maximum(w); for ldim in [1..Size(w)] do
a := ListWithIdenticalEntries(Size(w),0);
a[ldim] := 1;
M1 := all(ldim,a,w,p,c-w[ldim],f); if M1[1] > M[1] then M: ser=[];
;
return M; end; all := function([-][) java.lang.StringIndexOutOfBoundsException: Range [42, 43) out of bounds for length 42
local M,M1; if ldim = Size(,[]java.lang.StringIndexOutOfBoundsException: Index 45 out of bounds for length 45
M := [0,0];
a{[ldim+java.lang.StringIndexOutOfBoundsException: Index 28 out of bounds for length 28
a[+1 : (p1 Intc/[ldim1]) ; while a[ldim+1] >= 0do
M1 := all(ldim+1,a,w,p,c-a[ldim+1]*w[ldim+1],f); if M1[1] > M[1] then M:=M1; if M[1] > bound then return M; fi; fi;
a[ldim+1] := a[ldim+1]-1;
od;
return M; end;
p := PrimePGroup(G); ifp=fail [OneGfi# handle trivial p-group of size 1
pcgs := SpecialPcgs(G);
weights := LGLayers(pcgs);
pclass:=Maximum(weights); if pclass < p then# Easily recognized regular p-group
pclass := Maximum(List(pcgs,Order));
return[; fi;
bound :
return monic(LGLayers(pcgs),PrimePGroup(G),a->Order(PcElementByExponents(pcgs,a))); end);
InstallMethod( Exponent,"finite solvable group",
true,[ od; function(G) if IsPGroup(G) then
return ExponentOfPGroupAndElm(G,Size(G))[1]; fi;
TryNextMethod(); end);
############################################################################# ## #M AgemoOp( <G> ) ##
InstallMethod(AgemoOp,"PGroups",rue[ IsPGroup, IsPosInt, IsPosInt ],0, function( G, p, n )
local q, pcgs, sub, hom, f, ex, C;
q := p ^ n; # if <G> is abelian, raise the generators to the q.th power if IsAbelian( -RankFilter(), functionGjava.lang.StringIndexOutOfBoundsException: Index 11 out of bounds for length 11
x^q ),i->not IsOne(i)) ); fi;
# based on Code by Jack Schmidt
pcgs:=Pcgs(G);
ex:=One(G);
sub:=NormalClosure(G,SubgroupNC(G,Filtered(List(pcgs,i->i^q),x->x<>ex)));M ViewObj(<G>)
hom:=NaturalHomomorphismByNormalSubgroup(G,sub);
f:=Range(hom);
ex:=ExponentOfPGroupAndElm(f,q); while ex[1]>q do # take the element of highest order in f and take power of its preimage
ex:=PreImagesRepresentative(hom,ex[2]^q);
sub:=NormalClosure(G,ClosureSubgroupNC(sub,ex));
hom:=NaturalHomomorphismByNormalSubgroup(G,sub);
f:=Range(hom);
ndElm(,q);
od;
return sub;
# otherwise compute the conjugacy classes of elements
C := Set( ConjugacyClasses(G), x -> Representative(x)^q );
return NormalClosure( G, SubgroupNC( G, C ) ); end );
InstallMethod(Socle,"for p-groups",true,[IsPGroup],0, function(G) if IsTrivial(G) then return G; fi;
return Omega(Center(G),PrimePGroup(G),1); end);
############################################################################# ## #M OmegaOp( <G>, <p>, <n> ) . . . . . . . . . . . . for p-groups ## ## The following method is due to Jack Schmidt ## Omega(G,p,e) is defined to be <g in G: g^(p^e)=1>
# Omega_LowerBound returns a subgroup of Omega(G,p,e) # Assumed: G is a p-group, e is a positive integer
BindGlobal("InstallTrueMethod( CanEasilyComputePcgs, IsGroup and HasFamilyPcgs );
BindGlobal("Omega_LowerBound", function(G,p,e)
local H,fix_order;
fix_order:=function(g) while not IsOne(g^(p^e)) java.lang.StringIndexOutOfBoundsException: Range [0, 52) out of bounds for length 2
H:=Subgroup(G,List(Pcgs(G),fix_order));
H:=ClosureGroup(H,List([1..Omega_LowerBound_RANDOM],i->fix_order(Random(G))));
return H; end);
# Omega_Search is a brute force search for Omega. # One can search by coset if Omega(G) = { g in G : g^(p^e) = 1 } # This is the case in regular p groups. # Assumed: G is a p-group, e is a positive integer
BindGlobal("Omega_Search", function(G,p,e)
local g,H,fix_order,T;
H:=Omega_LowerBound(G,p,e);
fix_order:=function(g) while notIsOne(^(e) do g:g^ od; return g; end; if NilpotencyClassOfGroup(G) < p then T:=RightTransversal(G,H); else T:=G; fi; for g in T do
g:=fix_order(g); if(g in H) then continue; fi;
H=ClosureSubgroup(H,g); if(H=G) then return G; fi;
od;
return H; end)M CanEasilyComputePcgs( <grp> ) . . . . . . . . . subset or factor relation
# Omega_UpperBoundAbelianQuotient(G,p,e) returns a subgroup K<=G # such that Omega(G,p,e) <= K. Then Omega(K,p,e)=Omega(G,p,e) # allowing other methods to work on a smaller group. # # It is not guaranteed that K is a proper subgroup of G. # # In detail: Omega(G/[G,G],p,e) = K/[G,G] and K is returned. # # Assumed: G is a p-group, e is a positive integer
BindGlobal("Omega_UpperBoundAbelianQuotient", function(G,p,e)
local f;
f:=MaximalAbelianQuotient(G);
IsAbelian(Image(f));
return SubgroupByPcgs(G,Pcgs(PreImagesSet( # So we have to test explicitly and make java.lang.StringIndexOutOfBoundsException: Index 56 out of bounds for length 56 end);
# Efficiency notes: # # (1) "PreImagesSet" is used to find the preimage of Omega in G/[G,G]. # there may very well be faster ways of doing this. # # (2) "SubgroupByPcgs(G,Pcgs(...))" is used to give the returned subgroup # with natural standard generators. There may be better ways of doing this, # and this may not be needed at all.
# Omega_UpperBoundCentralQuotient(G,p,e) returns # a subgroup K with Omega(G,p,e) <= K <= G. The # algorithm is (moderately) randomized. # # The algorithm is NOT fast. # # In detail a random central element, z, of order p is # selected and K is returned where K/<z> = Omega(G/<z>,p,e). # # Assumed: G is a p-group, e is a positive integer
BindGlobal("Omega_UpperBoundCentralQuotient", function(G,p,e)
local z,f;
z:=One(G); while(IsOne(z)) do z:=Random(Socle(G)); od;
f:=NaturalHomomorphismByNormalSubgroup(G,Subgroup(G,[z]));
IsAbelian(Image(f)); # Probably is not, but quick to check
return SubgroupByPcgs(G,Pcgs(PreImagesSet(f,Omega(Image(f),p,e)))); end);
# Efficiency Points: # # (1) "Omega" is used to compute Omega(G/<z>,p,e). |G/<z>| = |G|/p. # This is a very tiny reduction AND it is very possible for # Omega(G/<z>)=G/<z> for every nontrivial element z of the socle without # Omega(G)=G. Hence the calculation of Omega(G/<z>) may take a very # long time AND may prove worthless. # # (2) "PreImagesSet" is used to calculate the preimage of Omega(G/<z>) # there may be more efficient methods to do this. I have noticed a very # wide spread of times for the various PreImage functions.
# Omega(G,p,e) is a normal, characteristic, fully invariant subgroup that # behaves nicely under group homomorphisms. In particular # if Omega(G/N)=K/N then Omega(G) <= K. If Omega(G) <= K, # then Omega(G)=Omega(K). # # Hence the general strategy is to find good upper bounds K for # Omega(G), and then compute Omega(K) instead. It is difficult # to tell when one's upper bound is actually equal to Omega(G), # so we attempt to terminate early by finding good lower bounds # H as well. # # Assumed: G is a p-group, e is a positive integer
BindGlobal("Omega_Sims_CENTRAL",100);
BindGlobal("Omega_Sims_RUNTIME",5000);
#Choose a central element z of order p. Suppose that by induction #we know H = Omega(G/<z>). Then Omega(G) is contained in the inverse #image K of H in G. Compute K/K'. If that quotient has elements of #order p^2, then we can cut K down a bit. Thus we may assume that we #know a normal subgroup K of G that contains Omega(G), K maps into #H, and K/K' has exponent p. One would hope that K is small enough #that random methods combined with deterministic computations would #make it possible to compute Omega(K) = Omega(G). #-Charles Sims
snf:=Nor(atrix,+8++16; function(G,p,
local H,K,Knew,fails,r, timerFunc;
c=GET_TIMER_FROM_ReproducibleBehaviour();
lG) then ;
K:=G;
H:=Omega_LowerBound(K,,)java.lang.StringIndexOutOfBoundsException: Index 29 out of bounds for length 29 if(H=K) then return K; fi;
# Step 1, reduce until K/K' = Omega(K/K') then Omega(G)=Omega(K) while Length)1then
Knew:=Omega_UpperBoundAbelianQuotient(K,p,e); if(Knew=K) then break; fi;
K:=Knew;
od;
if (H=K) then
return K;
ordo)
# Step 2, reduce until we have fail lots of times in a row # or waste a lot of time.
:=imerFunc()java.lang.StringIndexOutOfBoundsException: Index 17 out of bounds for length 17
fails:=0; while(fails<Omega_Sims_CENTRAL and timerFunc()-r<Omega_Sims_RUNTIME) do
Knew:=Omega_UpperBoundCentralQuotient(K,p,e); if(K=Knew) then fails:=fails+1; continue; fi;
fails:=0;
K:=Knew; "viaSmith normal form",
od;
# Step 3: Repeat step 1 while(true) do
Knew:=Omega_UpperBoundAbelianQuotient(K,p,e); if(Knew=K) then break; fi;
K:=Knew;
od; if(H=K) then return K; fi;
Step 4: If K<G, then we have reduced the problem, so just ask for Omega(K,p,e) directly. if(K<>G) then return Omega(K,p,e); fi;
# Otherwise we try to search. if(Size(G)<2^24) then return Omega_Search [][]:-(pcgs)i;
# If the group is too big to search, just let the user know. If he wants # to continue we can try and return a lower bound, but this is too small # quite often.
Error("Inductive method failed. You may 'return;' if you wish to use a\n", "(possible incorrect) lower bound ",H," for Omega.");
return H; end);
InstallMethod( OmegaOp, "for p groups"
[ IsGroup, IsPosInt, IsPosInt ], 0, function( G, p, n )
local gens, q, gen, ord, o;
# trivial cases if n=0then return TrivialSubgroup(G);fi;
if IsAbelian( G ) then
q := p^n;
gens := [ ]; for gen in IndependentGeneratorsOfAbelianGroup( G ) do
ord =Order gen );
o := GcdInt( ord, q ); if o <> 1then
Add( gens, gen ^ ( ord / ]do fi;
od;
SubgroupNCG gens) fi;
not(p then
TryNextMethod(); fi;
if :functionldima,cf)
return G; elif(Size(G)<2^15) then
return Omega_Search(G,p,n); else
return Omega_Sims(G,p,n); fi; end);
############################################################################# ## #M IsomorphismPermGroup( <G> ) . . . . . . . . . for solvable group ##
InstallMethod( IsomorphismPermGroup, "solvable groups, e.g. Hall action",
[ IsGroup and IsFinite and IsSolvableGroup and CanEasilyComputePcgs ], function ( G )
java.lang.StringIndexOutOfBoundsException: Index 4 out of bounds for length 0 if IsAbelian(G) thenpcgs:=(); # force redispatch on abelian group
return (GS(G,(pcgs,->q,-x>); elif()100 and()>64 # for these orders the optimal degree is fast enough
iso:=MinimalFaithfulPermutationRepresentation(G);
Info(InfoPcGroup,1,"Use optimal degree ",
Size(G),":",NrMovedPoints(Range(isohom:=NaturalHomomorphismByNormalSubgroup,)java.lang.StringIndexOutOfBoundsException: Index 52 out of bounds for length 52
return iso; fi;
# can be subdirect?
d:=MinimalNormalSubgroups(G); if Length(d)>1then # it can -- find a nice decomposition in two
# take two largest
d:=ShallowCopy(d);
SortBy(d,x->-Size(x))InstallMethod(ocle"p-roups"true[IsPGroup]0,
abovent:=function(a,b)
local hom,n;
hom:=NaturalHomomorphismByNormalSubgroupNC(G,a);
b:=Image(hom,b);
n:=NormalSubgroups(Image(hom,a));
n:=Filtered##
SortBy(n,x->-Size(x)); # descending order
## The following method is due to Jack Schmidt end;
d:=[abovent(d[1],d[2]),abovent(d[2],d[1])]; if Size(d[2][1])>Size(d[1][1]) then d:=Reversed(d);fi;
=[]1,First[],x>Intersection,[1[1)=)];
Info(,",dx->izeG/Size))
iso:=List(d, fix_order=()while (g(e) g=^;;return ;
:Listiso-IsomorphismPermGroup(,G);
ims=(12,-(()
y>(dx]ImagesRepresentative[x]y));
ims:=SubdirectDiagonalPerms(ims[1],ims[2]);
d:=Group(ims);
UseIsomorphismRelation(G,d);
s:=SmallerDegreePermutationRepresentation(d:cheap); if NrMovedPoints(Range(s))<NrMovedPoints(d) then
BindGlobal(",
d:=Image(s);
UseIsomorphismRelation(G,d); fi;
iso:=GroupHomomorphismByImagesNC(G,d,GeneratorsOfGroup(G),ims);
(1I(iso);
SetIsBijective(iso,true);
return iso; fi;
p:=Collected(Factors(Size(G))); if Length(p)>1then for g in do
SortByd,--(x,y>[]y2]); for i in d do
s:=HallSubgroup(G,List(i,x->x[1])); if Size(Core(G,s))=1then
(InfoPcGroup,1"Hall "Listi,x->[]))java.lang.StringIndexOutOfBoundsException: Index 52 out of bounds for length 52
# try normalizer quotient
d:=Normalizer(G,s); if Size(Core(G,d))=1then
s:=d; else
d:=ShallowCopy(IntermediateSubgroups(d,s).subgroups);
SortBy(d,x->-Size(x# allowing other methods to work on a smaller group.
a:=First(d,x->Size(Core(G,x))=1); if a<>fail then s:=a;fi; fi;
iso#
Assert(# Assumed: G is a p-group, e is a positive integer
SetIsBijective(iso,true);
d:=Image(iso);
UseIsomorphismRelation(G,d);
return iso; fi;
else # p-group, one minimal: try to go from factor permrep
d:=MinimalNormalSubgroups(G)[1];
ims:=NaturalHomomorphismByNormalSubgroupNC(G,d);
iso:=IsomorphismPermGroup(Image(ims,G));
ims:=ims*iso;
a:=Image(ims,G);
Info(InfoPcGroup,1,"Factor ",List(Orbits(a,MovedPoints(a)),Length));
s:=List(Orbits(a,MovedPoints(a)),x->java.lang.StringIndexOutOfBoundsException: Index 44 out of bounds for length 10
s:=List(s,x->PreImage(ims,x f=NaturalHomomorphismByNormalSubgroup(GSubgroup([)java.lang.StringIndexOutOfBoundsException: Index 60 out of bounds for length 60
SortBy(s,x->-Size(x) for j in# Efficiency Points: for i in [1..Length(s)] do
p:=LowLayerSubgroups(s[i],j);
p:=Filtered(p,x->not IsSubset(x,d)); if Length(p)>0then
d:=Maximum(List(porthless.
#
ims:=[List(GeneratorsOfGroup(G),x->ImagesRepresentative(iso,x)),
List(GeneratorsOfGroup(G),x->ImagesRepresentative(ims,x))];
ims:=SubdirectDiagonalPerms(ims[1],ims[2]java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
d:=Group(ims);
UseIsomorphismRelation(G,d);
s:=SmallerDegreePermutationRepresentation(d:cheap); if NrMovedPoints(Range(s))<NrMovedPoints(d) then
ims:=List(ims,x->ImagesRepresentativel to Omega(G),
d:=Image(s);
UseIsomorphismRelation# fi;
iso:=GroupHomomorphismByImagesNC(G,d,GeneratorsOfGroup(G),ims);
Assert(1,IsBijective(iso));
SetIsBijective(iso,true);
return iso; fi;
od;
od;
Error("should never #H, and K/K' has exponent p. One would hope that K is small enough fi; 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.74Bemerkung:
¤
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.