GAP 4.8.9 installation with standard packages -- copy to your CoCalc project to get it
#(C) Graham Ellis, 2005-2006
#####################################################################
#####################################################################
InstallGlobalFunction(PoincareSeriesPrimePart,
function(G,p,n)
local
PrimePart,
PSeries,
Resolutions,ResIndex,
EqChnMps,EqChnMpsIndex,
DCRSpruned;
ResIndex:=[];
Resolutions:=[];
EqChnMps:=[];
EqChnMpsIndex:=[];
#####################################################################
PrimePart:=
function(G,R,F,n)
local
C,P, DCRS, DCRS1, L,Y,GroupL,
X, K, gensK, S, f,fx, P1,
HP, HK, HPK, HKhomHPK, HPKhomHP, HKhomHP,
HKx,HPKx,
HKxhomHPKx, HPKxhomHP, HKxhomHP, HKhomHKx, HKhomHP2,
HPrels, x, y, i,prime, core, conjs, conjelt,CentP,
HPpres,G1,epi,HPP,
Pos;
HP:=HomologyVectorSpace(F(R),n);
HPrels:=[Zero(HP)];
if Dimension(HP)=0 then return []; fi;
P:=StructuralCopy(R!.group);
prime:=Factors(Order(P))[1];
if not IsBound(DCRSpruned) then
###############################################
P1:=Normalizer(G,P);
core:=[];
for x in P do
if Order(x)=prime then AddSet(core,x); fi;
od;
if not IsPrimeInt(Order(P)) then
DCRS1:=List(DoubleCosetRepsAndSizes(G,P1,P1),x->x[1]);
else
DCRS1:=[];
fi;
if Order(P1)>Order(P) then
Append(DCRS1,Filtered(ReduceGenerators(GeneratorsOfGroup(P1),P1),
x->not x in P));
fi;
DCRS:=[];
for x in DCRS1 do
for y in core do
if x*y*x^-1 in core then Append(DCRS,[x]); break; fi;
od;od;
DCRSpruned:=[];
conjs:=[];
conjelt:=[];
for x in DCRS do
Y:=Intersection(P,P^x);
AddSet(conjs,Y);
Append(conjelt,[[x,Y]]);
od;
for Y in conjs do
L:=Filtered(conjelt,x->x[2]=Y);
L:=List(L,x->x[1]);
GroupL:=Group(L);
Append(DCRSpruned,[ReduceGenerators(L,GroupL)]);
od;
DCRSpruned:=Filtered(DCRSpruned,x->Length(x)>0);
############################################################
fi;
for L in DCRSpruned do
K:=Intersection(P,P^L[1]);
gensK:=ReduceGenerators(GeneratorsOfGroup(K),K);
G1:=Group(Concatenation(gensK,[Identity(P)]));
Pos:=Position(ResIndex,G1);
if Pos=fail then
S:=ResolutionPrimePowerGroup(G1,n+1);
Add(ResIndex,G1);
Add(Resolutions,S);
Pos:=Length(ResIndex);
fi;
S:=Resolutions[Pos];
if not Dimension(HomologyVectorSpace(F(S),n))=0 then
f:=GroupHomomorphismByFunction(K,P,x->x);
Pos:=Position(EqChnMpsIndex,[IdGroup(S!.group),IdGroup(R!.group),f]);
if Pos=fail then
Add(EqChnMpsIndex,[IdGroup(S!.group),IdGroup(R!.group),f]);
Add(EqChnMps,F(ModularEquivariantChainMap(S,R,f)));
Pos:=Length(EqChnMps);
fi;
HKhomHPK:=HomologyVectorSpace(EqChnMps[Pos],n);
HK:=Source(HKhomHPK);
HPK:=Range(HKhomHPK);
HPKhomHP:=LeftModuleGeneralMappingByImages(HPK,HP,
#HPKhomHP:=LeftModuleHomomorphismByImagesNC(HPK,HP,
Elements(Basis(HPK)),
Elements(Basis(HP)));
HKhomHP:=LeftModuleGeneralMappingByImages(HK,HP,
#HKhomHP:=LeftModuleHomomorphismByImagesNC(HK,HP,
Elements(Basis(HK)),
List(Elements(Basis(HK)),x->
ImagesRepresentative(HPKhomHP, ImagesRepresentative(HKhomHPK,x) )) );
for X in L do
fx:=GroupHomomorphismByFunction(K,P,g->Image(f,g)^(X^-1));
Pos:=Position(EqChnMpsIndex,[IdGroup(S!.group),IdGroup(R!.group),f,X]);
if Pos=fail then
Add(EqChnMpsIndex,[IdGroup(S!.group),IdGroup(R!.group),f,X]);
Add(EqChnMps,F(ModularEquivariantChainMap(S,R,fx)));
Pos:=Length(EqChnMps);
fi;
HKxhomHPKx:=HomologyVectorSpace(EqChnMps[Pos],n);
HKx:=Source(HKxhomHPKx);
HPKx:=Parent(Range(HKxhomHPKx));
HPKxhomHP:=LeftModuleGeneralMappingByImages(HPKx,HP,
#HPKxhomHP:=LeftModuleHomomorphismByImagesNC(HPKx,HP,
Elements(Basis(HPKx)),
Elements(Basis(HP)));
HKxhomHP:=LeftModuleGeneralMappingByImages(HKx,HP,
#HKxhomHP:=LeftModuleHomomorphismByImagesNC(HKx,HP,
Elements(Basis(HKx)),
List(Elements(Basis(HKx)),x->
ImagesRepresentative(HPKhomHP, ImagesRepresentative(HKxhomHPKx,x) )) );
HKhomHKx:=LeftModuleGeneralMappingByImages(HK,HKx,
#HKhomHKx:=LeftModuleHomomorphismByImagesNC(HK,HKx,
Elements(Basis(HK)),
Elements(Basis(HKx)) );
HKhomHP2:=LeftModuleGeneralMappingByImages(HK,HP,
#HKhomHP2:=LeftModuleHomomorphismByImagesNC(HK,HP,
Elements(Basis(HK)),
List(Elements(Basis(HK)),x->
ImagesRepresentative(HKxhomHP, ImagesRepresentative(HKhomHKx,x) )) );
for x in Elements(Basis(HK)) do
Append(HPrels, [ImagesRepresentative(HKhomHP,x)-ImagesRepresentative(HKhomHP2,x)]);
od;
od;
fi;
od;
HPP:=HP/VectorSpace(GF(prime),HPrels);
return Dimension(HPP);;
end;
#####################################################################
#####################################################################
PSeries:=
function(G,p,n)
local
P,R,L,F;
P:=SylowSubgroup(G,p);
R:=ResolutionPrimePowerGroup(P,n+1);
####################################################################
F:=function(R);
return TensorWithIntegersModP(R,p);
end;
####################################################################
L:=List(Reversed([1..n]),i->PrimePart(G,R,F,i));
Add(L,1);
L:=Reversed(L);
return(PoincareSeries(L,n));
end;
#####################################################################
return PSeries(G,p,n);
end);
#####################################################################
#####################################################################