GAP 4.8.9 installation with standard packages -- copy to your CoCalc project to get it
#(C) Graham Ellis, 2005-2006 HapConstantPolRing:=PolynomialRing(Rationals,1); #Sloppy!!! Should tidy this up. ##################################################################### ##################################################################### InstallGlobalFunction(PoincareSeries, function(arg) local G,dim, R,Rdim, L, TrialPoly, Dcoeffs, Ncoeffs, PolRing, x, k,bool; PolRing:=HapConstantPolRing; x:=GeneratorsOfAlgebra(PolRing)[2]; if Length(arg)=1 then if IsGroup(arg[1]) then if IsPrimePowerInt(Order(arg[1])) then return PoincareSeriesApproximation(arg[1],x); else Print("The group is not a p-group.\n"); return fail; fi; fi; fi; bool:=true; dim:=arg[2]; if IsGroup(arg[1]) then if IsPrimePowerInt(Order(arg[1])) then G:=arg[1]; #R:=ResolutionPrimePowerGroup(G,dim); Rdim:=RankPrimeHomology(G,dim); bool:=false; fi; fi; if IsHapResolution(arg[1]) then R:=arg[1]; Rdim:=R!.dimension; G:=R!.group; if IsPrimeInt(EvaluateProperty(R,"characteristic")) then bool:=false;fi; fi; L:=[]; if IsList(arg[1]) then L:=arg[1]; bool:=false; fi; if bool then return fail; fi; if Length(L)=0 then L:=List([0..dim],i->Rdim(i)); fi; #################################################################### TrialPoly:=function(L,k) local M,i; M:=[]; for i in [1..dim-k] do Add(M,L{[i..i+k]}); od; M:=TransposedMat(M); return NullspaceMat(M); end; #################################################################### Dcoeffs:=[]; for k in [1..dim] do Dcoeffs:=TrialPoly(L,dim-k); if Length(Dcoeffs)=1 then break; fi; od; if not Length(Dcoeffs)=1 then #Print("Poincare series was not computed. \n"); return fail; fi; Dcoeffs:=Reversed(Dcoeffs[1]); Ncoeffs:=[]; for k in [1..Length(Dcoeffs)-1] do Ncoeffs[k]:=Reversed(Dcoeffs{[1..k]})*L{[1..k]}; od; return ValuePol(Ncoeffs,x)/ValuePol(Dcoeffs,x); end); ##################################################################### ##################################################################### ##################################################################### ##################################################################### InstallGlobalFunction(PoincareSeriesApproximation, function(arg) local G,kk,H,Hilbert,factos,x; G:=arg[1];x:=arg[2]; factos:=DirectFactorsOfGroup(G); if Length(factos)>1 then ; factos:=List(factos,g-> PoincareSeries(g)); return Product(factos); else return RankPrimeHomology(G,-1); ########################################################### #Hilbert:=function(G,n,k) #local P,R,i,B,PolRing,H; #R:=ResolutionPrimePowerGroup(G,n); #P:=[]; #for i in [1..k] do #P[i]:=PoincareSeries(R,n+1-i); #od; #B:=List([1..k-1],i-> P[i] = P[i+1]); #if not false in B then return P[1]; #else return fail; fi; #end; ########################################################## #kk:=10; #H:=Hilbert(G,kk,2); #while H=fail do #kk:=kk+3;H:=Hilbert(G,kk,3); #od; #return H; fi; end); ##################################################################### ##################################################################### ##################################################################### ##################################################################### InstallGlobalFunction(ExpansionOfRationalFunction, function(p,deg) local k, Ncoeffs, Dcoeffs, Expansion; if not (IsRationalFunction(p) and IsInt(deg)) then Print("The input must be a rational function follwed by a positive integer. \n"); return fail; fi; Ncoeffs:=NumeratorOfRationalFunction(p); Ncoeffs:=CoefficientsOfUnivariatePolynomial(Ncoeffs); Ncoeffs:=MutableCopyMat([Ncoeffs])[1]; Dcoeffs:=DenominatorOfRationalFunction(p); Dcoeffs:=CoefficientsOfUnivariatePolynomial(Dcoeffs); Dcoeffs:=MutableCopyMat([Dcoeffs])[1]; #for k in [1..deg-Length(Ncoeffs)+1] do for k in [1..deg+2] do Append(Ncoeffs,[0]); Append(Dcoeffs,[0]); od; Expansion:=[]; Expansion[1]:=Ncoeffs[1]/Dcoeffs[1]; for k in [2..deg+1] do Expansion[k]:= (Ncoeffs[k] - Dcoeffs{[2..k]}*Reversed(Expansion{[1..k-1]}))/Dcoeffs[1]; od; return Expansion; end); ##################################################################### ##################################################################### ##################################################################### ##################################################################### if true then InstallGlobalFunction(PoincareSeriesPrimePart, function(G,p,n) local P,R,L,F; P:=SylowSubgroup(G,p); #R:=ResolutionFiniteGroup(P,n+1,false,p); R:=ResolutionPrimePowerGroup(P,n+1); #################################################################### F:=function(R); return TensorWithIntegersModP(R,p); end; #################################################################### L:=List([1..n],i->Length(PrimePartDerivedFunctor(G,R,F,i))); L:=Reversed(L); Add(L,1); L:=Reversed(L); return(PoincareSeries(L,n)); end); fi; ##################################################################### #####################################################################