diff --git a/lib/grppcaut.gi b/lib/grppcaut.gi index df8f7140e9..76595bf4ee 100644 --- a/lib/grppcaut.gi +++ b/lib/grppcaut.gi @@ -1228,14 +1228,42 @@ local spaceincl,outvecs,l,sub,yet,i,j,k,s,t,new,incl,min,rans,sofar,done, return a; end; - +PcgsCharacteristicTails:=function(G,aut) +local gens,ser,new,pcgs,f,mo,i,j,k,s; + gens:=GeneratorsOfGroup(aut); + ser:=InvariantElementaryAbelianSeries(G,gens); + new:=[G]; + for i in [2..Length(ser)] do + pcgs:=ModuloPcgs(ser[i-1],ser[i]); + f:=GF(RelativeOrders(pcgs)[1]); + mo:=List(gens,x->List(pcgs,y->ExponentsOfPcElement(pcgs,y^x))*One(f)); + mo:=GModuleByMats(mo,f); + for j in + Reversed(Filtered(MTX.BasesCompositionSeries(mo), + x->Length(x)10^10 then + # translate to different pcgs to make tails A-invariant + npcgs:=PcgsCharacteristicTails(F,A); + C:=GroupWithGenerators(npcgs); + SetPcgs(C,npcgs); + Assert(1,Pcgs(C)=npcgs); # ensure no magic took place + as:=GroupHomomorphismByImagesNC(F,Group(M.generators), + Pcgs(F),M.generators); + nM:=rec(field:=M.field,dimension:=M.dimension, + generators:=List(npcgs,x->ImagesRepresentative(as,x))); + C:=CompatiblePairs(C,nM,D); + else + C := CompatiblePairs( F, M, D ); + fi; else #Info( InfoAutGrp, 2,"compute reduced gl "); #B := MormalizingReducedGL( spec, s, n, M ); diff --git a/lib/grppcext.gi b/lib/grppcext.gi index e39e918183..c20ced0a96 100644 --- a/lib/grppcext.gi +++ b/lib/grppcext.gi @@ -831,6 +831,7 @@ local G, M, Mgrp, oper, A, B, D, translate, gens, genimgs, triso, K, K1, u:=SubgroupNC(G,pcgs{idx}); until ForAll(GeneratorsOfGroup(u), i->ForAll(GeneratorsOfGroup(A),j->Image(j,i) in u)); + Ggens:=InducedPcgsByPcSequence(pcgs,pcgs{idx}); tup:=M.generators{idx}; @@ -866,7 +867,7 @@ local G, M, Mgrp, oper, A, B, D, translate, gens, genimgs, triso, K, K1, # not being perfect is not likely to do a hash conflict pows:=List([0..Length(tup)],x->pows^x); - tmp:=[D, rec(hashfun:= lst->lst*pows),tup, gens,genimgs, f ]; + tmp:=[D, rec(hashfun:= lst->lst*pows),tup, gens,newimgs, f ]; # use `op' to get in the fake domain with the hashfun tmp := StabilizerOp( D, rec(hashfun:= lst->lst*pows),tup,