GAP 4.8.9 installation with standard packages -- copy to your CoCalc project to get it
#(C) Graham Ellis, 2005-2006 ##################################################################### ##################################################################### ##################################################################### InstallGlobalFunction(HomToIntegersModP, function(X,prime) local HomToZ_Obj, HomToZ_Arr; ##################################################################### ##################################################################### HomToZ_Obj:=function(R) local BoundaryC, LengthC, M, myOne, Charact; #One:=Elements(GaloisField(prime))[2]; myOne:=One(GF(prime)); LengthC:=EvaluateProperty(R,"length"); M:=[1..LengthC]; ##################################################################### BoundaryC:=function(N,k) local n,row, Mt, i, j, x, sum; n:=N+1; if n <0 then return false; fi; if n=0 then #return List([1..R!.dimesnion(1)],x->0); fi; return [1..R!.dimesnion(1)]*0; fi; if M[n]=n then Mt:=[]; if R!.dimension(n)>0 then for i in [1..R!.dimension(n)] do row:=[]; for j in [1..R!.dimension(n-1)] do sum:=0; for x in R!.boundary(n,i) do if AbsoluteValue(x[1])=j then sum := sum + SignInt(x[1]); fi; od; row[j]:=sum; od; Mt[i]:=row; od; M[n]:=TransposedMat(Mt); else row:=[]; for j in [1..R!.dimension(n-1)] do row[j]:=0; od; for i in [1..R!.dimension(n-1)] do Append(Mt,[row]); od; M[n]:=Mt; fi; fi; return M[n][k]*myOne; end; ##################################################################### if EvaluateProperty(R,"characteristic")=0 or EvaluateProperty(R,"characteristic")=prime then Charact:=prime; else Print("ERROR: You probably entered the wrong prime. \n"); return fail; fi; return Objectify(HapCochainComplex, rec( dimension:=R!.dimension, boundary:=BoundaryC, properties:= [["length",LengthC], ["connected",true], ["type", "cochainComplex"], ["characteristic", Charact] ])); end; ##################################################################### ##################################################################### ##################################################################### ##################################################################### HomToZ_Arr:=function(F) local R,S,RhomS, #R->S is an equivariant chain #map. C<-D is the chain map C,D,DhomC, #got by Homing. DimensionC, DimensionD, #Throughout the program we x; #identify R and S with their R:=F!.source; #duals Hom(R,Z). S:=F!.target; RhomS:=F!.mapping; C:=HomToZ_Obj(R); D:=HomToZ_Obj(S); DimensionC:=C!.dimension; DimensionD:=D!.dimension; ##################################################################### DhomC:=function(v,n) local u, i,j,temp,x; #u:=List([1..DimensionC(n)],x->0); u:=[1..DimensionC(n)]*0; for i in [1..DimensionD(n)] do for j in [1..DimensionC(n)] do temp:=0; for x in List(RhomS([[j,1]],n),y->y[1]) do if x=i then temp:=temp+1;fi; if x=-i then temp:=temp-1; fi; od; u[j]:=u[j]+temp*v[i]; od; od; return u; end; ##################################################################### return Objectify(HapCochainMap, rec( source:=D, target:=C, mapping:=DhomC, properties:=[ ["type","cochainMap"], ["characteristic", prime ] ])); end; ##################################################################### ##################################################################### if EvaluateProperty(X,"type") = "resolution" then return HomToZ_Obj(X); fi; if EvaluateProperty(X,"type") = "equivariantChainMap" then return HomToZ_Arr(X); fi; Print("This functor is not yet applicable to morphisms. \n"); return fail; #fi; Print("ERROR: Input should be a resolution or equivariant map between resolutions. \n"); end); ##################################################################### ##################################################################### #####################################################################