GAP 4.8.9 installation with standard packages -- copy to your CoCalc project to get it
#(C) Graham Ellis, 2005-2006
cnt:=0;
#####################################################################
InstallGlobalFunction(PrimePartDerivedFunctorViaSubgroupChain,
function(GG,R,F,n)
local
G,C,P,P1, prime, AscChn, HP, HPrels, AddRels, Q,
DCRS, L, S, f,fx, imfx, bool, dcrs,
HK, HPK, HKhomHPK, HPKhomHP, HKhomHP, HKx,HPKx,
HKxhomHPKx, HPKxhomHP, HKxhomHP, HKhomHKx, HKhomHP2,
x, y, i, Cent, hh, HPpres, ord;
####################################
####################################
P:=R!.group;
prime:=PrimePGroup(P);
C:=F(R);
if IsGroup(GG) then G:=GG;
P1:=Normalizer(G,P);
AscChn:=AscendingChain(G,P1);
fi;
if IsList(GG) then G:=GG[Length(GG)];
AscChn:=GG;
P1:=Normalizer(G,P);
fi;
HP:=GroupHomomorphismByFunction(P,P,x->x);
HP:=EquivariantChainMap(R,R,HP);
HP:=F(HP);
HP:=Homology(HP,n);
HP:=Source(HP);
if Length(AbelianInvariants(HP))=0 then return []; fi;
HPrels:=[Identity(HP)];
####################################
####################################
#########################################
#########################################
AddRels:=function(Q,L) #Here P < Q < G where P=Syl_p(G)
local i, hh, Lhh, gg, g, gg1, h, sylQQ, QQ, xx;
QQ:=Intersection(Q,Q^L);
sylQQ:=SylowSubgroup(QQ,prime);
gg:=false;
for g in Q do
if IsSubgroup(P,sylQQ^g) then gg:=g; break; fi;
od;
if not Order(sylQQ)>1 then return; fi;
#########################################
#########################################
if Order(P)/Order(sylQQ)>1 then #NEED TO OPTIMIZETHIS CHOICE!!
S:=ResolutionGenericGroup(sylQQ,n+1);
else
S:=ResolutionFiniteSubgroup(R,sylQQ^gg);
S!.group:=sylQQ;
gg1:=gg^-1;
S!.elts:=List(S!.elts,x->x^(gg1));
fi;
#########################################
#########################################
hh:=Homology(F(S),n);
if IsInt(hh) then hh:=List([1..hh],i->0); fi;
if not Length(hh)>0 then return; fi;
f:=GroupHomomorphismByFunction(sylQQ,P,x->x^gg);
xx:=F(EquivariantChainMap(S,R,f));;
HKhomHPK:=Homology(xx,n);
HK:=Source(HKhomHPK);
HPK:=Range(HKhomHPK);
HPKhomHP:=GroupHomomorphismByImagesNC(HPK,HP,GeneratorsOfGroup(HPK),
GeneratorsOfGroup(HP));
HKhomHP:=GroupHomomorphismByFunction(HK,HP,x->
Image(HPKhomHP, Image(HKhomHPK,x) ) );
fx:=GroupHomomorphismByFunction(sylQQ,Q,g->g^(L^-1));
imfx:=Image(fx);
hh:=false;
for h in Q do
if IsSubgroup(P,imfx^h) then hh:=h; break; fi;
od;
Lhh:=L^-1*hh;
#fx:=GroupHomomorphismByFunction(sylQQ,P,g->(g^(L^-1))^hh);
fx:=GroupHomomorphismByFunction(sylQQ,P,g->g^Lhh);
xx:=F(EquivariantChainMap(S,R,fx));
HKxhomHPKx:=Homology(xx,n);
HKx:=Source(HKxhomHPKx);
HPKx:=Parent(Image(HKxhomHPKx));
HPKxhomHP:=GroupHomomorphismByImagesNC(HPKx,HP,GeneratorsOfGroup(HPKx),
GeneratorsOfGroup(HP));
HKxhomHP:=GroupHomomorphismByFunction(HKx,HP,x->
Image(HPKxhomHP, Image(HKxhomHPKx,x) ) );
HKhomHKx:=GroupHomomorphismByImagesNC(HK,HKx,GeneratorsOfGroup(HK),GeneratorsOfGroup(HKx));
HKhomHP2:=GroupHomomorphismByFunction(HK,HP,a->
Image(HKxhomHP, Image(HKhomHKx,a)));
for x in GeneratorsOfGroup(HK) do
Append(HPrels, [Image(HKhomHP,x)*Image(HKhomHP2,x)^-1]);
od;
end;
#############################################
#############################################
####################################
####################################
ord:=function(x,y); return Order(x)<Order(y); end;
if Order(P1)>Order(P) then
DCRS:=SmallGeneratingSet(P1);
for L in DCRS do
AddRels(P,L);
od;
fi;
for i in [2..Length(AscChn)] do
DCRS:=List(DoubleCosetRepsAndSizes(AscChn[i],AscChn[i-1],AscChn[i-1]),
x->x[1]);
Cent:=Centralizer(AscChn[i],AscChn[i-1]);
Sort(DCRS,ord);
DCRS:=Filtered(DCRS,a->not a in Cent);
dcrs:=[];
for x in DCRS do
bool:=true;
for y in dcrs do
if y^-1*x in Cent or y^-1*x in P or x in Group(y) then bool:=false; break; fi;
od;
if bool then Add(dcrs,x); fi;
od;
for L in dcrs do
cnt:=cnt+1;
AddRels(AscChn[i-1],L);
od;
od;
#########################################
#########################################
return AbelianInvariants(HP/NormalClosure(HP,Group(HPrels)));
end);
#####################################################################