GAP 4.8.9 installation with standard packages -- copy to your CoCalc project to get it
##########################################################
##########################################################
InstallMethod(HAP_MultiplicativeGenerators,
" internal method for expresing a basis in terms of ring generators",
[IsAlgebra],
function(A)
local gensA, BasA, BasAexp, grgensA, x, i, W, n, P, w, v,
AsGens, mx, AsPolys;
#A:=ModPCohomologyRing(G,n) for some p-group G
gensA:=ModPRingGenerators(A);
BasA:=Filtered(gensA,x->A!.degree(x)=0);
BasAexp:=[[BasA[1]]];
mx:=Maximum(List(gensA,A!.degree));
grgensA:=List([1..Maximum(List(gensA,A!.degree))],i->[]);
for x in gensA do
i:=A!.degree(x);
if i>0 then Add(grgensA[i],x); fi;
od;
W:=Submodule(A,BasA);
n:=0;
while Dimension(W)<Dimension(A) do
n:=n+1;
for P in Partitions(n) do
if Maximum(Flat(P)) <= mx then
for w in Cartesian(grgensA{P}) do
v:=Product(w);
if not v in W then Add(BasA,v); W:=Submodule(A,BasA);
Add(BasAexp,w); fi;
od;
fi;
od;
od;
BasA:=Basis(A,BasA);
###################################
AsGens:=function(v)
local w,u;
w:=Coefficients(BasA,v);
u:=Filtered([1..Length(BasA)],i->not IsZero(w[i]));
u:=List(u,i->w[i]*BasA[i]);
return u;
end;
###################################
###################################
AsPolys:=function(v)
local w,u,z,i;
w:=Coefficients(BasA,v);
u:=Filtered([1..Length(BasA)],i->not IsZero(w[i]));
z:=List(u,i->1*BasAexp[i]);
for i in [1..Length(u)] do
z[i][1]:=w[u[i]]*z[i][1];
od;
return z;
end;
###################################
return [BasAexp,AsGens,AsPolys];
end);
##################################################################
##################################################################