GAP 4.8.9 installation with standard packages -- copy to your CoCalc project to get it
#(C) Graham Ellis, 2005-2006
#####################################################################
InstallGlobalFunction(IdentityAmongRelatorsDisplay,
function(arg)
local
R,idnum,
Dimension,
Boundary,
Elts, Mult, Inv,
Frels, rels,
Fgens,gens,
FirstBoundaryHomomorphism,
Boundary2Relator,
start,
ActWord,
idnt,
Edges,
Color,
COLOURS,
tmpDir,tmpInlog,tmpIn2log,tmpIngif,
b, r, x,i,X;
tmpDir:=DirectoryTemporary();
tmpInlog:=Filename(tmpDir,"tmpInlog");
tmpIn2log:=Filename(tmpDir,"tmpIn2log");
tmpIngif:=Filename(tmpDir,"tmpIngif");
R:=arg[1];
idnum:=arg[2];
if not (IsHapResolution(R) or IsHapNonFreeResolution(R)) then
Print("This function must be applied to a resolution. \n");
return fail;
fi;
if not EvaluateProperty(R,"reduced")=true then
if R!.dimension(0)>1 then
Print("This function must be applied to a REDUCED resolution. \n");
return fail; fi;
fi;
if not EvaluateProperty(R,"characteristic")=0 then
Print("This function only works in characteristic 0. \n");
return fail;
fi;
Dimension:=R!.dimension;
Boundary:=R!.boundary;
Elts:=R!.elts;
Frels:=[];
start:=List([1..Dimension(2)],x->List(Boundary(2,x),y->y[2]));
start:=SortedList(Intersection(start))[1];
gens:=[];
#####################################################################
Mult:=function(g,h);
return Position(Elts,Elts[g]*Elts[h]);
end;
#####################################################################
#####################################################################
Inv:=function(g);
return Position(Elts,Elts[g]^-1);
end;
#####################################################################
#####################################################################
FirstBoundaryHomomorphism:=function(x)
local r;
r:=Boundary(1,x[1]);
r:=List(r,y->Mult(x[2],y[2]));
if x[1]>0 then return r;
else return Reversed(r); fi;
end;
#####################################################################
#####################################################################
Boundary2Relator:=function(b)
local c, rel, w;
b:=SortedList(AlgebraicReduction(b));
rel:=[start];
while Length(b)>0 do
for x in b do
w:=FirstBoundaryHomomorphism(x);
if w[1]= rel[Length(rel)] then
Append(rel, [w[2]]); RemoveSet(b,x); break;
else
if w[2]= rel[Length(rel)] then
Append(rel, [w[1]]); RemoveSet(b,x); break;
fi;
fi;
od;
od;
return rel;
end;
#####################################################################
for r in [1..Dimension(2)] do
Append(Frels,[Boundary2Relator(Boundary(2,r))]);
od;
for r in Frels do
if (not Inv(r[2]) in gens) then AddSet(gens,r[2]);fi;
if (not Inv(r[Length(r)-1]) in gens) then AddSet(gens,r[Length(r)-1]);fi;
od;
COLOURS:=["blue","red","green","yellow","brown","black"];
#####################################################################
Color:=function(r)
local g,h;
for g in gens do
if Mult(r[1],g)=r[2] then h:=Position(gens,g); break; fi;
if Mult(r[1],Inv(g))=r[2] then h:=Position(gens,g); break; fi;
od;
h:=(h-1) mod 6;
h:=h+1;
return COLOURS[h];
end;
#####################################################################
#####################################################################
idnt:=[];
for b in Boundary(3,idnum) do
x:=Boundary(2,AbsInt(b[1]));
x:=Boundary2Relator(x);
if SignInt(b[1])=-1 then x:=Reversed(x); fi;
x:=List(x,t->Mult(b[2],t));
Add(idnt,x);
od;
Edges:=[];
for b in idnt do
for x in [1..Length(b)-1] do
if b[x]<b[x+1] then r:=[b[x],b[x+1]];
else r:=[b[x+1],b[x]]; fi;
#AddSet(Edges,r);
Add(Edges,r);
od;
od;
Edges:=SortedList(Edges);
Edges:=List([1..Length(Edges)/2],i->Edges[2*i]);
################ WRITE TO TMPIN.LOG #################################
AppendTo(tmpInlog," graph G { \n size=\"4,4\" \n subgraph cluster0 {\n node [shape=ellipse, width=.2,height=.2,fixedsize=true,style=filled, color=gray35,label=\"\"] \n edge [style=\"setlinewidth(2)\"] \n");
for x in Edges do
AppendTo(tmpInlog,x[1]," -- ", x[2], "[color=",Color(x), "] \n");
od;
####
X:=FreeGroup(Length(gens));
X:=GeneratorsOfGroup(X);
AppendTo(tmpInlog," }\n subgraph cluster1 {\n node [shape=box, width=2,height=1,fixedsize=true,style=filled, color=white,fillcolor=white] \n ");
if Maximum(List(X,x->Length(String(x))))<20 then
for i in [1..Length(X)] do
AppendTo(tmpInlog,-i," [fontcolor= ",COLOURS[i],",label=\"", X[i],"\" ] \n");
od;
fi;
####
AppendTo(tmpInlog,"}\n }\n");
############### WRITTEN ############################################
Exec(Concatenation(NEATO_PATH,"-Tgif ",tmpInlog," > ",tmpIngif));
if Length(arg)=2 then
Exec(Concatenation(DISPLAY_PATH,tmpIngif));
Exec(Concatenation("rm ",tmpInlog,"; rm ",tmpIngif));
else
AppendTo(tmpIn2log, "Browser=",arg[3],"\n");
AppendTo(tmpIn2log,"$Browser ",tmpIngif);
Exec(Concatenation("chmod a+x ",tmpIn2log,"; ",tmpIn2log));
Exec(Concatenation("rm ",tmpInlog,"; rm ",tmpIngif,"; rm ",tmpIn2log,";"));
fi;
end);
#####################################################################