GAP 4.8.9 installation with standard packages -- copy to your CoCalc project to get it
#(C) Graham Ellis, 2005-2006
#####################################################################
InstallGlobalFunction(HomologyPb,
function(C,n)
local
M1, M2,
Dimension, Boundary,
dr, drtmp,
i,j,ans,dim1,dim2,v,x;
if n <=0 then return Homology(C,n); fi;
#if n=0 then return [0]; fi; #THIS IS MATHEMATICALLY WRONG!!!
if not "snf" in NamesOfComponents(C) then
C!.snf:=[1..EvaluateProperty(C,"length")];
fi;
Dimension:=C!.dimension;
if Dimension(n)=0 then return []; fi;
Boundary:=C!.boundary;
M1:=[];
M2:=[];ans:=[];
if IsInt(C!.snf[n]) then
drtmp:=DirectoryTemporary();
dr:=Filename(drtmp,"HAPtmp");
AppendTo(dr,Dimension(n)," ",Length(Boundary(n,1))," ","M \n");
for i in [1..Dimension(n)] do
#M1[i]:=Boundary(n,i);
v:=Boundary(n,i);
for x in [1..Length(v)] do
if not v[x]=0 then
AppendTo(dr,i," ",x," ",v[x], " \n");
fi;
od;
od;
AppendTo(dr,0," ",0," ",0, " \n");
M1:=SMInvariantFactors(dr);
dim1:=M1[1]-Sum(List([3..Length(M1)-1],a->M1[a][2]));
C!.snf[n]:=M1;
dr:=Filename(drtmp,"");
Exec(Concatenation("rm -r ",dr));
else
M1:=C!.snf[n];
dim1:=M1[1]-Sum(List([3..Length(M1)-1],a->M1[a][2]));
fi;
if IsInt(C!.snf[n+1]) then
if Dimension(n+1)=0 then M2:=[0,0]; C!.snf[n+1]:=M2;
else
drtmp:=DirectoryTemporary();
dr:=Filename(drtmp,"HAPtmp");
AppendTo(dr,Dimension(n+1)," ",Length(Boundary(n+1,1))," ","M \n");
for i in [1..Dimension(n+1)] do
#M2[i]:=Boundary(n+1,i);
v:=Boundary(n+1,i);
for x in [1..Length(v)] do
if not v[x]=0 then
AppendTo(dr,i," ",x," ",v[x], " \n");
fi;
od;
od;
AppendTo(dr,0," ",0," ",0, " \n");
M2:=SMInvariantFactors(dr);
dr:=Filename(drtmp,"");
Exec(Concatenation("rm -r ",dr));
fi;
C!.snf[n+1]:=M2;
dim2:=0;
for i in [3..Length(M2)] do
if M2[i][1]>0 then dim2:=dim2+M2[i][2]; fi;
if M2[i][1]>1 then Append(ans,List([1..M2[i][2]],x->M2[i][1])); fi;
od;
else
M2:=C!.snf[n+1];
dim2:=0;
for i in [3..Length(M2)] do
if M2[i][1]>0 then dim2:=dim2+M2[i][2]; fi;
if M2[i][1]>1 then Append(ans,List([1..M2[i][2]],x->M2[i][1])); fi;
od;
fi;
for i in [1..dim1-dim2] do
Append(ans,[0]);
od;
return ans;
end );
#####################################################################