GAP 4.8.9 installation with standard packages -- copy to your CoCalc project to get it
#############################################################################
#0
#F EilenbergMacLaneSimplicialGroup
## Input: An abelian group A or a homomorphism of abelian groups f
## and a positive integer n, and a positive integer dim
## Output: The first 1+dim terms of K(A,n) or K(f,n) under functor
## K(-,n): (abelian groups)->(simplicial abelian groups)
##
InstallGlobalFunction(EilenbergMacLaneSimplicialGroup, function(X,n,dim)
local
EilenbergMacLane_Obj,
EilenbergMacLane_Map;
######################################################################
#1
#F EilenbergMacLane_Obj
## Input:
EilenbergMacLane_Obj:= function(A,NN,nK)
local
nn,zero,i,j,n,k,pos,tmp,x,y,
GensA,ZeroGrp,CoF,CoD,MN,
ListGensG,T,N,G,H,GensG,nG,Pro,Emb,nNumG,nNumH,
NumberFace,NumberDegen,ImgGens,
ZeroToZero,AToZero,ZeroToA,IdA,
Surjection,NumOfSur,
Faces,Degens,ListGroups,
GroupsList,FaciesList,DegeneraciesList,
AllSurjections,CompositeOfMaps,CoDegeneracies,CoFaces;
nn:=NN-1;
#################################################################
#2
#F AllSurjections
## Input: Two numbers m, n and m>=n
## Output: All surjections from [m] to [n]
AllSurjections:=function(m,n)
local
CreatCouple,Res,y,M;
if m<n then
return fail;
fi;
if m=0 then
return [[[0,0]]];
fi;
########################################################
#3
#F
##
CreatCouple:=function(m,n)
local
LA,LB,M,x,i;
if n=0 then
M:=[];
for i in [0..m] do
Add(M,[i,0]);
od;
return [M];
fi;
if m=n-1 then
M:=[];
for i in [0..m] do
Add(M,[i,i]);
od;
return [M];
fi;
LA:=CreatCouple(m-1,n-1);
for x in LA do
Add(x,[m,n-1]);
od;
LB:=CreatCouple(m-1,n);
for x in LB do
Add(x,[m,n]);
od;
return Concatenation(LA,LB);
end;
##
########################################################
Res:=CreatCouple(m-1,n);
for y in Res do
Add(y,[m,n]);
od;
return Res;
end;
#################################################################
#2
#F CoFaces
## Input: A integer number n>=0
## Output: All cofaces: [n]->[n+1]
##
CoFaces:=function(n)
local i,k,M,Res;
Res:=[];
for i in [0..n+1] do
M:=[];
for k in [0..i-1] do
Add(M,[k,k]);
od;
for k in [i..n] do
Add(M,[k,k+1]);
od;
Add(Res,M);
od;
return Res;
end;
##
########## end of CoFaces ###################################
#############################################################
#2
#F CoDegeneracies
## Input: A integer number n>=0
## Output: All codegeneracies:[n]-->[n-1]
##
CoDegeneracies:=function(n)
local i,k,M,Res;
Res:=[];
for i in [0..n-1] do
M:=[];
for k in [0..i-1] do
Add(M,[k,k]);
od;
Add(M,[i,i]);
for k in [i+1..n] do
Add(M,[k,k-1]);
od;
Add(Res,M);
od;
return Res;
end;
##
########## end of CoDegeneracies ############################
#############################################################
#2
#F CompositeOfMaps
## Input: Two maps m]->[n] and [n]->>[k]
## Output: The map [m]->>[k] if it exists or 0 for other else
##
CompositeOfMaps:=function(M,N)
local Res,k,m,Temp,i,x,y;
k:=nn;
m:=Length(M)-1;
x:=M[m+1][2];
y:=N[x+1][2];
if y<>k then
return 0;
fi;
Res:=[];
Temp:=[];
for i in [0..m] do
x:=M[i+1][2];
y:=N[x+1][2];
Add(Res,[i,y]);
Add(Temp,y);
od;
if Length(Set(Temp))<k+1 then
return 0;
fi;
return Res;
end;
##
########## end of CompositeOfMaps ###########################
Surjection:=[];
NumOfSur:=[];
for i in [nn..nK] do
Surjection[i+1]:=AllSurjections(i,nn); ##[i+1]
NumOfSur[i+1]:=Length(Surjection[i+1]); ##[i+1]
od;
zero:=Identity(A);
ZeroGrp:=Group(zero);
ListGroups:=[];
for i in [0..nn-1] do
ListGroups[i+1]:=ZeroGrp;
od;
ListGroups[nn+1]:=A;
for i in [nn+1..nK] do
ListGroups[i+1]:=DirectProduct(List([1..NumOfSur[i+1]],x->A));
od;
GensA:=GeneratorsOfGroup(A);
ZeroToZero:=GroupHomomorphismByImages(ZeroGrp,ZeroGrp,[],[]);
AToZero:=GroupHomomorphismByImages(A,ZeroGrp,GensA,List(GensA,x->zero));
ZeroToA:=GroupHomomorphismByImages(ZeroGrp,A,[],[]);
IdA:=GroupHomomorphismByImages(A,A,GensA,GensA);
########## Compute the faces map: K_n-->K_{n-1}##############
Faces:=List([1..nK],i->[]);
########### Compute the face maps d_k^i with k<n ############
for i in [1..nn-1] do
for j in [0..i] do
Faces[i][j+1]:=ZeroToZero;
od;
od;
########### Compute the face maps d_nn^i ####################
if nn>0 then
for j in [0..nn] do
Faces[nn][j+1]:=AToZero;
od;
fi;
########### Compute the face map d_n^i ######################
NumberFace:=[];
for n in [1..nK] do
NumberFace[n]:=[];
for i in [0..n] do
NumberFace[n][i+1]:=[];
od;
od;
for n in [nn+1..nK] do
CoF:=CoFaces(n-1);
MN:=Surjection[n];
for i in [0..n] do
for k in [1..NumOfSur[n+1]] do
N:=Surjection[n+1][k];
T:=CompositeOfMaps(CoF[i+1],N);
if T=0 then
NumberFace[n][i+1][k]:=0;
else
NumberFace[n][i+1][k]:=Position(MN,T);
fi;
od;
od;
od;
for n in [nn+1..nK] do
G:=ListGroups[n+1];
H:=ListGroups[n];
nNumG:=NumOfSur[n+1];
nNumH:=NumOfSur[n];
GensG:=GeneratorsOfGroup(G);
nG:=Length(GensG);
Pro:=List([1..nNumG],k->Projection(G,k));
ListGensG:=[];
for i in [1..nG] do
x:=GensG[i];
tmp:=List([1..nNumG],k->Image(Pro[k],x));
Add(ListGensG,tmp);
od;
if n=nn+1 then ## at position nn, there is only A
Emb:=[IdA];
else
Emb:=List([1..nNumH],k->Embedding(H,k));
fi;
for i in [0..n] do
ImgGens:=[];
for j in [1..nG] do
x:=Identity(H);
for k in [1..nNumG] do
pos:=NumberFace[n][i+1][k];
if pos<>0 then
x:=x*Image(Emb[pos],ListGensG[j][k]);
fi;
od;
ImgGens[j]:=x;
od;
Faces[n][i+1]:=GroupHomomorphismByImages(G,H,GensG,ImgGens);
od;
od;
########### Compute the degeneracy map s_n^i ################
Degens:=List([0..nK-1],i->[]);
########### Compute the degeneracy maps s_k^i with k<n-1 ####
for i in [0..nn-2] do
for j in [0..i] do
Degens[i+1][j+1]:=ZeroToZero;
od;
od;
########## Compute the degeneracy maps at s_{n-1}^i #########
if nn>1 then
for j in [0..nn-1] do
Degens[nn][j+1]:=ZeroToA;
od;
fi;
NumberDegen:=[]; ####[n+1][i+1][k]
for n in [0..nK-1] do
NumberDegen[n+1]:=[];
for i in [0..n] do
NumberDegen[n+1][i+1]:=[];
od;
od;
for n in [nn..nK-1] do
CoD:=CoDegeneracies(n+1);
MN:=Surjection[n+2];
for i in [0..n] do
for k in [1..NumOfSur[n+1]] do
N:=Surjection[n+1][k];
T:=CompositeOfMaps(CoD[i+1],N);
if T=0 then
NumberDegen[n+1][i+1][k]:=0;
else
NumberDegen[n+1][i+1][k]:=Position(MN,T); ##i+1
fi;
od;
od;
od;
###########################################
for n in [nn..nK-1] do
G:=ListGroups[n+1];
H:=ListGroups[n+2];
nNumG:=NumOfSur[n+1];
nNumH:=NumOfSur[n+2];
GensG:=GeneratorsOfGroup(G);
nG:=Length(GensG);
if n=nn then
Pro:=[IdA];
else
Pro:=List([1..nNumG],k->Projection(G,k));
fi;
ListGensG:=[];
for i in [1..nG] do
x:=GensG[i];
tmp:=List([1..nNumG],k->Image(Pro[k],x));
Add(ListGensG,tmp);
od;
Emb:=List([1..nNumH],k->Embedding(H,k));
for i in [0..n] do
ImgGens:=[];
for j in [1..nG] do
x:=Identity(H);
for k in [1..nNumG] do
pos:=NumberDegen[n+1][i+1][k];
if pos<>0 then
x:=x*Image(Emb[pos],ListGensG[j][k]);
fi;
od;
ImgGens[j]:=x;
od;
Degens[n+1][i+1]:=GroupHomomorphismByImages(G,H,GensG,ImgGens);
od;
od;
#######################################################
GroupsList:=function(i)
return ListGroups[i+1];
end;
#######################################################
FaciesList:=function(i,j)
return Faces[i][j+1];
end;
#######################################################
DegeneraciesList:=function(i,j)
return Degens[i+1][j+1];
end;
###########################################################
return Objectify(HapSimplicialGroup,
rec(
groupsList:=GroupsList,
boundariesList:=FaciesList,
degeneraciesList:=DegeneraciesList,
properties:=[["length",nK]]
));
end;
##
############### end of EilenbergMacLane_Obj ##########################
######################################################################
#1
#F EilenbergMacLane_Map
## Input: A homomorphism of abelian groups f:A->B and n, nK
## Output: The morphism fK:K(A,n)->K(B,n)
##
EilenbergMacLane_Map:=function(f,n,nK)
local
A,B,KA,KB,
Maps,Mapping,GrpKA,GrpKB,
Gens,Pro,Emb,ImgGens,
i,j,k,t,nGens,
h,g;
A:=f!.Source;
B:=f!.Range;
KA:=EilenbergMacLane_Obj(A,n,nK);
KB:=EilenbergMacLane_Obj(B,n,nK);
Maps:=[];
for i in [0..n-2] do
Maps[i+1]:=GroupHomomorphismByImages(Group(Identity(A)),Group(Identity(B)),[],[]);
od;
Maps[n]:=f; ##n-1
for i in [n..nK] do
GrpKA:=KA!.groupsList(i);
GrpKB:=KB!.groupsList(i);
Gens:=GeneratorsOfGroup(GrpKA);
Pro:=[];
Emb:=[];
k:=Length(GrpKA!.DirectProductInfo!.groups);
for j in [1..k] do
Pro[j]:=Projection(GrpKA,j);
Emb[j]:=Embedding(GrpKB,j);
od;
ImgGens:=[];
nGens:=Length(Gens);
for j in [1..nGens] do
h:=Gens[j];
g:=Identity(GrpKB);
for t in [1..k] do
g:=g*Image(Emb[t],Image(f,Image(Pro[t],h)));
od;
ImgGens[j]:=g;
od;
Maps[i+1]:=GroupHomomorphismByImages(GrpKA,GrpKB,Gens,ImgGens);
od;
###################
Mapping:=function(i)
return Maps[i+1];
end;
###################
return Objectify(HapSimplicialGroupMorphism,
rec(
source:=KA,
target:=KB,
mapping:=Mapping,
properties:=[["length",nK]]
));
end;
##
############### end of EilenbergMacLane_Map ##########################
if IsGroup(X) then
return EilenbergMacLane_Obj(X,n,dim);
fi;
if IsGroupHomomorphism(X) then
return EilenbergMacLane_Map(X,n,dim);
fi;
end);
##
################### end of EilenbergMacLaneSimplicialGroup ##################