diff --git a/lib/autsr.gi b/lib/autsr.gi index 0a09683580..b47afc76e2 100644 --- a/lib/autsr.gi +++ b/lib/autsr.gi @@ -695,6 +695,55 @@ local fp,n,pat,pools,i,sel; return pools; end); +# form a characterististic series through radical with elab factors +BindGlobal("AGSRCharacteristicSeries",function(G,r) +local somechar,d,i,j,u,v; + d:=Filtered(StructuralSeriesOfGroup(G),x->IsSubset(r,x)); + # refine + d:=RefinedSubnormalSeries(d,Centre(G)); + d:=RefinedSubnormalSeries(d,Centre(r)); + somechar:=ValueOption("someCharacteristics"); + if somechar<>fail then + if IsRecord(somechar) then + somechar:=somechar.subgroups; + fi; + for i in somechar do + d:=RefinedSubnormalSeries(d,i); + od; + fi; + + for i in PrimeDivisors(Size(r)) do + u:=PCore(r,i); + if Size(u)>1 then + d:=RefinedSubnormalSeries(d,u); + j:=1; + repeat + v:=Agemo(u,i,j); + if Size(v)>1 then + d:=RefinedSubnormalSeries(d,v); + fi; + j:=j+1; + until Size(v)=1; + j:=1; + repeat + if Size(u)>=2^24 then + v:=u; # bail out as method for `Omega` will do so. + else + v:=Omega(u,i,j); + if Size(v)Size(d[x])<>Size(d[x+1]))); + return d; +end); + # main automorphism method -- currently still using factor groups, but # nevertheless faster.. @@ -814,64 +863,31 @@ local ff,r,d,ser,u,v,i,j,k,p,bd,e,gens,lhom,M,N,hom,Q,Mim,q,ocr,split,MPcgs, ff:=FittingFreeLiftSetup(G); r:=ff.radical; rlgf:=LGFirst(SpecialPcgs(r)); + + # find series through r + somechar:=ValueOption("someCharacteristics"); # derived and then primes and then elementary abelian d:=ValueOption("series"); if d=fail then - d:=Filtered(StructuralSeriesOfGroup(G),x->IsSubset(r,x)); - # refine - d:=RefinedSubnormalSeries(d,Centre(G)); - d:=RefinedSubnormalSeries(d,Centre(r)); - scharorb:=fail; - somechar:=ValueOption("someCharacteristics"); - if somechar<>fail then - if IsRecord(somechar) then - if IsBound(somechar.orbits) then - scharorb:=somechar.orbits; - fi; - somechar:=somechar.subgroups; - fi; - for i in somechar do - d:=RefinedSubnormalSeries(d,i); - od; - fi; - for i in PrimeDivisors(Size(r)) do - u:=PCore(r,i); - if Size(u)>1 then - d:=RefinedSubnormalSeries(d,u); - j:=1; - repeat - v:=Agemo(u,i,j); - if Size(v)>1 then - d:=RefinedSubnormalSeries(d,v); - fi; - j:=j+1; - until Size(v)=1; - j:=1; - repeat - if Size(u)>=2^24 then - v:=u; # bail out as method for `Omega` will do so. - else - v:=Omega(u,i,j); - if Size(v)Size(d[x])<>Size(d[x+1]))); - + d:=AGSRCharacteristicSeries(G,r:someCharacteristics:=somechar); d:=Reversed(d); else d:=ShallowCopy(d); SortBy(d,Size); # in case reversed order.... fi; + scharorb:=fail; + if somechar<>fail then + if IsRecord(somechar) then + if IsBound(somechar.orbits) then + scharorb:=somechar.orbits; + fi; + somechar:=somechar.subgroups; + fi; + fi; + # now go up in series if elementary abelian to avoid too many tiny steps u:=1; # last group in the series to be used i:=2;