DEMONSTRATION OF USE OF MAGMA given by Marston Conder at SODO, Queenstown, February 2012 ........................................................................ Demonstration 1: Coset enumeration ........................................................................ //////////////////////// // Dihedral group D_5 // //////////////////////// G:=Group; print Order(G); ////////////////////////// // Free group of rank 3 // ////////////////////////// G:=FreeGroup(3); print Order(G); /////////////////////////////// // Spherical triangle groups // /////////////////////////////// for p in [2..6] do for q in [p..6] do for r in [q..6] do if (1/p)+(1/q)+(1/r) gt 1 then G:=Group; print p,q,r,":",Order(G); end if; end for;end for;end for; ////////////////////////////////////// // Modular group C2 * C3 = PSL(2,Z) // ////////////////////////////////////// G:=Group< x,y | x^2, y^3 >; print AbelianQuotient(G); print AbelianQuotientInvariants(G); H:=sub; print Index(G,H); print CosetTable(G,H); f:=CosetAction(G,H); P:=Image(f); print P; S:=SchreierGraph(G,H); print S; Edges(S); print Order(G); K:=Rewrite(G,H); print K; print AbelianQuotientInvariants(K); ///////////////////// // Mystery example // ///////////////////// G:=Group; print Order(G); n,ct:=ToddCoxeter(G,sub: CosetLimit:=2000000); Q:=CosetImage(G,sub); print Degree(Q),Order(Q); print CompositionFactors(Q); /////////////////// // Trivial group // /////////////////// G:=Group< x | x^67741 = x^84053 = 1 >; print Order(G); //////////////////////////// // (2,3,6) Triangle group // //////////////////////////// G:=Group< x,y,z | x*y*z, x^2, y^3, z^6 >; G:=Rewrite(G,G); print G; H:=sub; print Index(G,H); CosetTable(G,H); f:=CosetAction(G,H); P:=Image(f); print P; print Order(G); K:=Rewrite(G,H); print K; print AbelianQuotientInvariants(K); ........................................................................ Demonstration 2: Subgroups of small index in finitely-presented groups ........................................................................ //////////////////////////// // (2,3,6) Triangle group // //////////////////////////// G:=Group< x,y,z | x*y*z, x^2, y^3, z^6 >; L:=LowIndexSubgroups(G,18); print #L; L:=LowIndexSubgroups(G,180); print #L; for i in [1..#L] do Q:=CosetImage(G,L[i]); if Index(G,L[i]) in [15,16,17,18] then print Degree(Q), Order(Q); end if; end for; ///////////////////////////////////// // Extended (2,3,7) triangle group // ///////////////////////////////////// G:=Group< a,b,c | a^2, b^2, c^2, (a*b)^2, (b*c)^3, (a*c)^7 >; L:=LowIndexSubgroups(G,15); print #L; for i in [1..#L] do Q:=CosetImage(G,L[i]); print Degree(Q), Order(Q), FactoredOrder(Q); end for; ////////////////////////////////////// // Modular group C2 * C3 = PSL(2,Z) // ////////////////////////////////////// G:=Group< x,y | x^2, y^3 >; for n in [1..10] do L:=LowIndexSubgroups(G,n); print "Index up to",n," Number of classes of subgroups =",#L; end for; for n in [11..20] do L:=LowIndexSubgroups(G,n); print "Index up to",n," Number of classes of subgroups =",#L; end for; ........................................................................ Demonstration 3: Normal subgroups of small index ........................................................................ ////////////////////////////////////// // Modular group C2 * C3 = PSL(2,Z) // ////////////////////////////////////// G:=Group< x,y | x^2, y^3 >; n:=20; L:=LowIndexNormalSubgroups(G,n); print "Index up to",n," Number of normal subgroups =",#L; for n in [20*t : t in [1..15]] do L:=LowIndexNormalSubgroups(G,n); print "Index up to",n," Number of normal subgroups =",#L; end for; ///////////////////////////////////// // The Djokovic-Miller amalgam G_5 // ///////////////////////////////////// G5:=Group; n:=4800; L:=LowIndexNormalSubgroups(G5,n); print "Index up to",n," Number of normal subgroups =",#L; for i in [1..#L] do Q:=CosetImage(G5,L[i]`Group); print i,Order(Q),FactoredOrder(Q); end for; .......................................................................... Demonstration: Use of low index normal subgroups to generate regular maps .......................................................................... ////////////////////////////////////////////// // Reflexible regular maps of genus 2 to 15 // ////////////////////////////////////////////// maxgenus:=15; maxo:=4*maxgenus+2; for p in [2..maxo] do for q in [p..maxo] do if (1/p+1/q lt 1/2) then ratio:=(1/2-(1/p+1/q)); lcm:=LCM(2,LCM(p,q)); maxn:=(Floor(4*(maxgenus-1)/ratio) div lcm)*lcm; if maxn gt 0 then F:=Group; L:=LowIndexNormalSubgroups(F,maxn); // print p,q,":",#L,"normal subgroups of index up to",maxn; for i in [1..#L] do f:=CosetAction(F,L[i]`Group); Q:=Image(f); if [Order(f(x)) : x in [a,b,c,a*c,a*b,b*c]] eq [2,2,2,2,p,q] then if Index(Q,sub) eq 2 then n:=Order(Q); chi:=(n div (2*p)) - (n div 4) + (n div (2*q)); g:=(2-chi) div 2; print "Genus",g,"map of type",[p,q]; print FPGroup(Q); end if;end if; end for; end if; end if; end for;end for; ............................................................................. Demonstration 4: Use of low index normal subgroups to generate graphs ............................................................................. ///////////////////////////////////// // Cayley graphs of order 20 to 24 // //////////////////////////////////// F:=Group; L:=LowIndexNormalSubgroups(F,24); graphs:=[];print ""; for t in [1..#L] do rep:=L[t]`Group; f:=CosetAction(F,rep); Q:=Image(f); if (Order(Q) in [20..24]) and (#{1,1^f(a),1^f(b),1^f(c)} eq 4) then edges:={{1,1^f(u)}^g : u in [a,b,c], g in Q}; cgs:=Graph; okm:=false; for gr in graphs do if IsIsomorphic(cgs,gr) then okm:=true;break gr;end if;end for; if not(okm) then Append(~graphs,cgs); print #graphs,": Cayley graph of order",Order(cgs), "valency",Degree(Rep(VertexSet(cgs))),"girth",Girth(cgs),"diameter",Diameter(cgs); end if; end if; end for; F:=Group; L:=LowIndexNormalSubgroups(F,24); graphs2:=[];print ""; for t in [1..#L] do rep:=L[t]`Group; f:=CosetAction(F,rep); Q:=Image(f); if (Order(Q) in [20..24]) and (#{1,1^f(x),1^f(y),1^f(y^-1)} eq 4) then edges:={{1,1^f(u)}^g : u in [x,y,y^-1], g in Q}; cgs:=Graph; okm:=false; for gr in graphs2 do if IsIsomorphic(cgs,gr) then okm:=true;break gr;end if;end for; if not(okm) then Append(~graphs2,cgs); print #graphs2,": Cayley graph of order",Order(cgs), "valency",Degree(Rep(VertexSet(cgs))),"girth",Girth(cgs),"diameter",Diameter(cgs); end if; end if; end for; for i in [1..#graphs] do for j in [1..#graphs2] do if IsIsomorphic(graphs[i],graphs2[j]) then print "F1 graph",i,"of order",Order(graphs[i]), "isomorphic to F2 graph",j,"of order",Order(graphs2[j]); end if; end for;end for; //////////////////////////////// // Cayley graphs of order 128 // //////////////////////////////// graphs:=[]; F:=Group; L:=LowIndexNormalSubgroups(F,128); print ""; for t in [1..#L] do rep:=L[t]`Group; f:=CosetAction(F,rep); Q:=Image(f); if (Order(Q) eq 128) and (#{1,1^f(x),1^f(y),1^f(y^-1)} eq 4) then edges:={{1,1^f(u)}^g : u in [x,y,y^-1], g in Q}; cgs:=Graph; okm:=false; for gr in graphs do if IsIsomorphic(cgs,gr) then okm:=true;break gr;end if;end for; if not(okm) then Append(~graphs,cgs); print #graphs,": Cayley graph of order",Order(cgs), "valency",Degree(Rep(VertexSet(cgs))),"girth",Girth(cgs),"diameter",Diameter(cgs); end if; end if; end for; // Note: The analogous computation using the database of all small groups // takes about half an hour ////////////////////////////////////// // 5-arc-transitive 3-valent graphs // ////////////////////////////////////// G5:=Group; L:=LowIndexNormalSubgroups(G5,4800); graphs:=[];print ""; for t in [1..#L] do rep:=L[t]`Group; f:=CosetAction(G5,rep); Q:=Image(f); if (Order(Q) gt 100) then ff:=CosetAction(Q,sub); QQ:=Image(ff); edges:={1,1^ff(f(a))}^QQ; atg:=Graph; okm:=false; for gr in graphs do if IsIsomorphic(atg,gr) then okm:=true;break gr;end if;end for; if not(okm) then Append(~graphs,atg); print #graphs,": Symmetric graph of order",Order(atg), "valency",Degree(Rep(VertexSet(atg))),"girth",Girth(atg),"diameter",Diameter(atg); end if; end if; end for; /////////////////////////////////////////////////// // 3-arc-transitive covers of the Petersen graph // /////////////////////////////////////////////////// G3:=Group; L:=LowIndexSubgroups(G3,6); print ""; for t in [1..#L] do rep:=L[t]; f:=CosetAction(G3,rep); Q:=Image(f); if (Order(Q) eq 120) then K:=rep;end if; end for; print AbelianQuotientInvariants(Core(G3,K)); R:=Rewrite(G3,K); // print R; L:=LowIndexSubgroups(R,5); graphs:=[]; for t in [1..#L] do rep:=L[t]; f:=CosetAction(G3,rep); Q:=Image(f); if (Order(Q) in [100..15000]) then ff:=CosetAction(Q,sub); QQ:=Image(ff); edges:={1,1^ff(f(a))}^QQ; atg:=Graph; okm:=false; for gr in graphs do if IsIsomorphic(atg,gr) then okm:=true;break gr;end if;end for; if not(okm) then Append(~graphs,atg); print "Index",Index(R,L[t]),": Symmetric graph of order",Order(atg), "valency",Degree(Rep(VertexSet(atg))),"girth",Girth(atg),"diameter",Diameter(atg); end if; end if; end for;