Goto Chapter: Top 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 Ind
 [Top of Book]  [Contents]   [Previous Chapter]   [Next Chapter] 

15 Graphs and isomorphisms
 15.1 Which graph package should be used?
 15.2 Incidence graph
 15.3 Chamber adjacency graph
 15.4 Edge and Face Graph
 15.5 Isomorphism testing
 15.6 Automorphism groups of polygonal complexes
 15.7 Action on paths

15 Graphs and isomorphisms

This chapter is concerned with different graphs associated to (twisted) polygonal complexes, as well as isomorphisms and automorphisms.

A twisted polygonal complex can be completely described by its chamber adjacencies, which can be encoded as an edge-coloured graph. A polygonal complex is completely determined by its incidence structure, which can be encoded as a vertex-coloured graph. Thus, the isomorphism problem between (twisted) polygonal complexes reduces to the graph isomorphism problem.

Most of the methods in this chapter need access to one of the graph packages in GAP (check the method descriptions to see whether a certain graph package is sufficient to execute the method). Currently supported are the packages Digraphs, GRAPE and NautyTracesInterface. A discussion of their individual merits is postponed to Section 15.1.

Sections 15.2 and 15.3 introduce the incidence graph and the chamber adjacency graph. Although isomorphism testing and automorphism computation relies on them, these sections are in general not necessary in practice.

Section 15.4 describes the edge graph and the face graph of a polygonal complex. They are used in practice like in 15.4-3.

Section 15.5 contains the isomorphism method IsIsomorphic (15.5-1).

Section 15.6 explains in detail how to use the automorphism group of (twisted) polygonal complexes. Section 15.7 explores the action of automorphisms on paths.

15.1 Which graph package should be used?

The SimplicialSurface-package supports three different graph packages: Digraphs, GRAPE and NautyTracesInterface.

They have different benefits and disadvantages and are therefore recommended for different uses:

To get information about a graph is for NautyTracesInterface and GRAPE not so nice as for Digraphs. The different ways to get the information are shown in section 15.2.

15.2 Incidence graph

The incidence relation (which is central to our concept of polygonal complexes, compare chapter 2) can be interpreted as a coloured undirected graph, the incidence graph of the polygonal complex.

The vertices of this incidence graph consist of all vertices (colour 0), edges (colour 1) and faces (colour 2) of the polygonal complex. The edges of the incidence graph are given by pairs of vertices-edges and edges-faces that are incident to each other.

As an example, consider the polygonal surface from section 3.2:

Unfortunately the vertex labels of the graph in GAP have to be distinct, which is not guaranteed in general. Therefore we shift the labels of the edges by the maximal vertex label and the face labels by the sum of the maximal vertex and edge labels. In the example above the maximal vertex label is 11 and the maximal edge label is 13. It would be modified like this:

The incidence graph is given as a GAP-graph. Currently these packages are supported: Digraphs, GRAPE and NautyTracesInterface.

15.2-1 IncidenceDigraphsGraph
‣ IncidenceDigraphsGraph( complex )( attribute )
‣ IncidenceGrapeGraph( complex )( attribute )
‣ IncidenceNautyGraph( complex )( attribute )

Returns: a graph as defined in the package Digraphs,GRAPE or NautyTracesInterface

Return the incidence graph (a coloured, undirected graph) of the given polygonal complex. The incidence graph is defined as follows:

The returned graph can be given in three different formats, corresponding to different graph packages: Digraphs, GRAPE and NautyTracesInterface.

Note that if IncidenceDigraphsGraph is used the output is a list, where the first entry is a digraph and the second a list of vertex colours, with the colours 1...4. There are isolated vertices of the digraph which correspond to labels of vertices, edges and faces that do not exists in the given polygonal complex. These are coloured with colour 4 and the other vertices are coloured as described above but increased by one.

Consider the polygonal complex at the begin of section 15.2:

gap> complex := PolygonalComplexByDownwardIncidence(
>        [ , , , , , [2,5], , [2,3], [3,5], [11,5], , [3,7], [7,11] ],
>        [[6,8,9], , , [9,10,12,13]]);
polygonal surface (5 vertices, 6 edges, and 2 faces)

First of all look at the graph given by Digraphs:

gap> digraph := IncidenceDigraphsGraph(complex)[1];;
gap> DigraphVertices(digraph);
[ 1 .. 28 ]
gap> DigraphEdges(digraph);
[ [ 2, 17 ], [ 2, 19 ], [ 3, 19 ], [ 3, 20 ], [ 3, 23 ], [ 5, 17 ],
 [ 5, 20 ], [ 5, 21 ], [ 7, 23 ], [ 7, 24 ], [ 11, 21 ], [ 11, 24 ],
 [ 17, 2 ], [ 17, 5 ], [ 17, 25 ], [ 19, 2 ], [ 19, 3 ], [ 19, 25 ],
 [ 20, 3 ], [ 20, 5 ], [ 20, 25 ], [ 20, 28 ], [ 21, 5 ], [ 21, 11 ],
 [ 21, 28 ], [ 23, 3 ], [ 23, 7 ], [ 23, 28 ], [ 24, 7 ], [ 24, 11 ],
 [ 24, 28 ], [ 25, 17 ], [ 25, 19 ], [ 25, 20 ], [ 28, 20 ], [ 28, 21 ],
 [ 28, 23 ], [ 28, 24 ] ]

Consider how getting information from a graph given by GRAPE looks like:

gap> grape := IncidenceGrapeGraph(complex).graph;;
gap> DirectedEdges(grape)=DigraphEdges(digraph);
true

Finally, consider how getting information from a graph given by NautyTracesInterface looks like:

gap> nauty:=UnderlyingNautyGraph(IncidenceNautyGraph(complex));;
gap> nautyEdges:=nauty!.edges;
[ [ 1, 6 ], [ 3, 6 ], [ 1, 7 ], [ 2, 7 ], [ 2, 8 ], [ 3, 8 ], [ 3, 9 ], [ 5, 9 ],
[ 2, 10 ], [ 4, 10 ], [ 4, 11 ], [ 5, 11 ], [ 6, 12 ],
[ 7, 12 ], [ 8, 12 ], [ 8, 13 ], [ 9, 13 ], [ 10, 13 ], [ 11, 13 ] ]
gap> nautyEdges=DigraphEdges(digraph);
false

The edges of the nauty incidence graph are not equal to the edges of the digraph, since the edges from the nauty graph are undirected.

15.3 Chamber adjacency graph

To describe a twisted polygonal complex (compare Section 2.2), it is sufficient to know its chambers and their adjacencies. These can be encoded as an edge-coloured graph:

In this fashion, we obtain an undirected graph whose edges are coloured with the colours 0, 1, and 2.

Unfortunately, the GAP-packages GRAPE and Digraphs do not support edge-coloured graphs. Therefore, only the graphs from the package NautyTracesInterface are supported.

15.3-1 ChamberAdjacencyGraph
‣ ChamberAdjacencyGraph( complex )( attribute )

Returns: a graph as defined in the package NautyTracesInterface

Return the chamber adjacency graph (an edge-coloured, undirected graph) of the given twisted polygonal complex. It is defined as follows:

Since GRAPE and Digraphs currently do not support edge-coloured graphs, the chamber adjacency graph can only be given as a graph from NautyTracesInterface.

Note that the vertices of graph from NautyTracesInterface have to be the integers from 1 to the number of chambers.

TODO example that also shows how we can get any information out of these graphs

15.4 Edge and Face Graph

For some purposes it is useful to work with other associated graphs of polygonal complexes. In this section the edge graph of a polygonal complex and the face graph of a polygonal surface is introduced. Both of them are implemented for all supported graph packages: Digraphs, GRAPE and NautyTracesInterface. These graphs are useful if it is not necessary to need all information of the complex. The edge graph only describes the incidence structure of vertices and edges. Instead, the face graph describes the incidence structure of edges and faces. Using method 15.4-3 it is possible to get all surfaces that have a common face graph.

The face graph and the edge graph of a polygonal complex are dual graphs of each other. The dual graph of a planar graph G is a graph that has a vertex for each face of G and an edge for each pair of faces that intersect in at least one edge. For example, consider the ocathedron. The following graph is the face graph of the octahedron: The edge graph of the octahedron, i.e. the dual of the face graph, is the following graph:

The face graph of the octahedron is equivalent to the edge graph of the cube and vice versa. That means the dual polyhedron of the cube is the octahedron. In section 15.4-1 and 15.4-2 is an example, where the edge graph respectively the face graph is self dual. That means that the edge graph and the face graph of a polygonal complex are equal.

15.4-1 EdgeDigraphsGraph
‣ EdgeDigraphsGraph( complex )( attribute )
‣ EdgeGrapeGraph( complex )( attribute )
‣ EdgeNautyGraph( complex )( attribute )

Returns: a graph as defined in the package Digraphs/GRAPE/NautyTracesInterface

Return the edge graph of the given polygonal complex. The vertices of the edge graph are the vertices of complex and for every edge in complex there is a corresponding edge in the edge graph.

The vertices of the resulting graph are always numbered from 1 to n, where n is the number of the vertices. That means if the vertex list of surface is not bounded, the vertices in the graph will have a different number than the vertices of surface. The same hold for the edges in Nauty. Since the edges in Digraphs are directed but the edge graph is undirected, each edge of the edge graph is represented by two directed edges in the Digraphs package.

For example, consider the edge graph of the tetrahedron:

gap> digraph:=EdgeDigraphsGraph(Tetrahedron());
<immutable digraph with 4 vertices, 12 edges>
gap> DigraphEdges(digraph);
[ [ 1, 2 ], [ 2, 1 ], [ 1, 3 ], [ 3, 1 ], [ 1, 4 ], [ 4, 1 ], [ 2, 3 ], [ 3, 2 ], 
[ 2, 4 ], [ 4, 2 ], [ 3, 4 ], [ 4, 3 ] ] 

This is the edge graph of the tetrahedron with undirected edges:

15.4-2 FaceDigraphsGraph
‣ FaceDigraphsGraph( complex )( attribute )
‣ FaceNautyGraph( complex )( attribute )

Returns: a graph as defined in the package Digraphs/NautyTracesInterface

Return the face graph of a given polygonal complex. The vertices of the face graph are the faces of complex and for every edge in complex there is a corresponding edge in the face graph.

The returned graph can be given in two different formats, corresponding to different graph packages: Digraphs and NautyTracesInterface

The returned graph cannot be given as a grape graph because the GRAPE package does not allow multiple edges.

The vertices of the resulting graph are always numbered from 1 to n, where n is the number of the faces. That means if the face list of complex is not bounded, the vertices in the graph will have a different number than the faces of complex. The same hold for the edges in Nauty. Since the edges in Digraphs are directed but the face graph is undirected, each edge of the face graph is represented by two directed edges in the Digraphs package.

For example, consider the face graph of the tetrahedron:

gap> digraph:=FaceDigraphsGraph(Tetrahedron());
<immutable digraph with 4 vertices, 12 edges>
gap> digraphEdges:=DigraphEdges(digraph);
[ [ 1, 2 ], [ 2, 1 ], [ 1, 4 ], [ 4, 1 ], [ 2, 4 ], [ 4, 2 ], [ 1, 3 ], [ 3, 1 ],
[ 2, 3 ], [ 3, 2 ], [ 3, 4 ], [ 4, 3 ] ]

This is the face graph of the tetrahedron with undirected edges:

15.4-3 AllSimplicialSurfacesOfDigraph
‣ AllSimplicialSurfacesOfDigraph( digraph[, vertexfaithful] )( operation )

Returns: a list

Return all (vertex-faithful) simplicial surfaces, that have digraph as face graph. If digraph is not a face graph of a (vertex-faithful) simplicial surface, the empty list is returned. The parameter vertexfaithful indicates whether only vertex-faithful simplicial surfaces are searched. The parameter vertexfaithful is by default false. digraph must be a cubic, connected, symmetric and simple digraph. The vertices of a simplicial surface can be identified with certain cycles in the face graph. This method searches possible combinations of cycles, with the cycles corresponding to the vertices of a simplicial surface.

For example, consider the complete graph on four nodes:

gap> digraph:=CompleteDigraph(4);;
gap> tet1 := AllSimplicialSurfacesOfDigraph(digraph,true);
[ simplicial surface (4 vertices, 6 edges, and 4 faces) ]
gap> IsIsomorphic(tet1[1],Tetrahedron());
true

So the only vertex-faithful simplicial surface of the digraph is the tetrahedron. But there is another simplicial surface, which is not vertex-faithful:

gap> list := AllSimplicialSurfacesOfDigraph(digraph,false);
[ simplicial surface (4 vertices, 6 edges, and 4 faces), 
simplicial surface (3 vertices, 6 edges, and 4 faces)]
gap> tet2 := Filtered(list,IsVertexFaithful);
[ simplicial surface (4 vertices, 6 edges, and 4 faces) ]
gap> IsIsomorphic(tet2[1],Tetrahedron());
true

Since it takes a long time to compute all cycles, you should only call the method for digraphs with twelve or less nodes for vertexfaithful false. For vertexfaithful true, the method needs to consider only chordless and non-separating cycles. This makes the method fast for digraphs up to 28 nodes. In general, it is much faster to only look for vertex-faithful simplicial surfaces.

15.5 Isomorphism testing

The twisted polygonal complexes from Chapter 2 can be described by their chamber adjacency structure. The chamber adjacency can be modelled as an undirected, edge-coloured graph (compare Section 15.3). Thus, the isomorphism problem for twisted polygonal complexes reduces to the graph isomorphism problem.

The graph isomorphism problem is solved by Nauty/Bliss, using the GAP-package NautyTracesInterface.

15.5-1 IsIsomorphic
‣ IsIsomorphic( complex1, complex2 )( operation )

Returns: true or false

Return whether the given twisted polygonal complexes are isomorphic, i.e. whether their chamber adjacency graphs (compare 15.3) are isomorphic. If both twisted polygonal complexes are polygonal complexes, this can equivalently be described as isomorphism between their incidence graphs (compare 15.2).

gap> IsIsomorphic( Cube(), Octahedron() );
false

15.5-2 IsomorphismRepresentatives
‣ IsomorphismRepresentatives( complexList )( operation )

Returns: a list of twisted polygonal complexes

The method IsomorphismRepresentatives takes a list of twisted polygonal complexes and returns a reduced list in which no two entries are isomorphic.

gap> complexList := [ Cube(), JanusHead(), Cube(), Cube() ];;
gap> Size(complexList);
4
gap> repList := IsomorphismRepresentatives(complexList);;
gap> Size(repList);
2
gap> Cube() in repList;
true
gap> JanusHead() in repList;
true

In many cases it is enough to know whether two twisted polygonal complexes are isomorphic. In some cases it is useful to know the concrete isomorphism between them. TODO can something be done about this? Currently the returned isomorphism does not match the labels (and group actions are hard to define);

15.5-3 CanonicalRepresentativeOfPolygonalSurface
‣ CanonicalRepresentativeOfPolygonalSurface( surface )( operation )

Returns: A list containing the canonical form of the surface and a polygonal morphism from the canonical surface to the original surface

Find the canonical representative of a polygonal surface, i.e. an isomorphic surface with the following properties:

Also provides a polygonal morphism (compare chapter 7) from the canonical surface to the original surface. The following example illustrates the use of the CanonicalRepresentativeOfPolygonalSurface command. We define the cube, but with a labelling of larger than necessary integers. CanonicalRepresentativeOfPolygonalSurface is then used to return both the canonical representative of the cube and the maps between the cube and its canonical representative. The faces, edges and vertices are displayed and are clearly now lex least in their ordering. Some checks reveal that the cube is not identical to its canonical representative, it is however isomorphic, and mapping the canonical representative under its preimage map returns the cube again.

gap> faces := [ 20, 21, 22, 23, 24, 25 ];;
gap> edges := [ 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 ];;
gap> vertices := [ 12, 13, 14, 15, 16, 17, 18, 19 ];;
gap> edgesOfFaces := [ ,,,,,,,,,,,,,,,,,,, [ 4, 5, 6, 7 ], [ 4, 8, 11, 15 ], 
>        [ 5, 8, 9, 12 ], [ 7, 10, 11, 14 ], [ 6, 9, 10, 13 ],
>        [ 12, 13, 14, 15 ] ];;
gap> verticesOfEdges := [ ,,, [ 12, 13 ], [ 13, 14 ], [ 14, 15 ], [ 12, 15 ], 
>        [ 13, 17 ], [ 14, 18 ], [ 15, 19 ], [ 12, 16 ], [ 17, 18 ], [ 18, 19 ], 
>        [ 16, 19 ], [ 16, 17 ] ];;
gap> cube := PolygonalSurfaceByDownwardIncidence(vertices, edges, faces, 
>        verticesOfEdges, edgesOfFaces);;
gap> canonicalCube:=CanonicalRepresentativeOfPolygonalSurface(cube);;
gap> canon:=canonicalCube[1];;
gap> Faces(canon);
[ 1 .. 6 ]
gap> Edges(canon);
[ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 ]
gap> Vertices(canon);
[ 1, 2, 3, 4, 5, 6, 7, 8 ]
gap> EdgesOfFaces(canon);
[ [ 1, 2, 3, 4 ], [ 5, 6, 7, 8 ], [ 1, 5, 9, 10 ], [ 3, 7, 9, 11 ], 
[ 4, 8, 10, 12 ], [ 2, 6, 11, 12 ] ]
gap> VerticesOfEdges(canon);
[ [ 1, 2 ], [ 3, 4 ], [ 1, 3 ], [ 2, 4 ], [ 5, 6 ], [ 7, 8 ], [ 5, 7 ], [ 6, 8 ], 
[ 1, 5 ], [ 2, 6 ], [ 3, 7 ], [ 4, 8 ] ]
gap> canon=cube;
false
gap> IsIsomorphic(cube, canon);
true
gap> original := RangeSurface(canonicalCube[2]);;
gap> original=cube;
true

15.6 Automorphism groups of polygonal complexes

This section explains how to compute automorphism groups of twisted polygonal complexes. Since this computation relies on the chamber adjacency graph (compare Section 15.3), the package NautyTracesInterface has to be available.

Working with the automorphism group of a polygonal complex is complicated since any automorphism acts on vertices, edges, and faces simultaneously. In general it is not possible to define an automorphism by defining it just on the vertices (or edges, or faces). Whenever this is possible, the situation becomes much easier. This happens for example with the tetrahedron:

gap> tetra := Tetrahedron();;
gap> IsAutomorphismDefinedByFaces(tetra);
true
gap> AutomorphismGroupOnFaces(tetra);
Group([ (1,2), (2,4), (3,4) ])

For the janus-head this is not possible.

gap> janus := JanusHead();;
gap> IsAutomorphismDefinedByVertices(janus);
false
gap> IsAutomorphismDefinedByEdges(janus);
false
gap> IsAutomorphismDefinedByFaces(janus);
false

Therefore, general automorphisms are not given by their action on vertices, edges, or faces. However, each automorphism is determined uniquely by its action on the chambers of a twisted polygonal complex. Any polygonal complex can be interpreted as a twisted polygonal complex, as shown in Section 5.4.



gap> AutomorphismGroup(tetra);
Group([ 
  (1,2)(3,5)(4,6)(7,8)(9,11)(10,12)(13,19)(14,20)(15,21)(16,22)(17,23)(18,24), 
  (1,3)(2,4)(5,6)(7,13)(8,14)(9,15)(10,16)(11,18)(12,17)(19,20)(21,24)(22,23), 
  (1,7)(2,8)(3,9)(4,10)(5,11)(6,12)(13,15)(14,16)(17,18)(19,21)(20,22)(23,24) ])
gap> Size(last);
24
gap> AutomorphismGroup(janus);
Group([ (1,2)(3,4)(5,6)(7,8)(9,10)(11,12), (1,3)(2,4)(5,9)(6,10)(7,11)(8,12), 
   (1,5)(2,6)(3,7)(4,8)(9,11)(10,12) ])
gap> Size( last );
12

Unfortunately, this makes it more complicated to understand the automorphisms at a glance. To see the individual action on vertices, edges and faces, the method DisplayAsAutomorphism (15.6-2) can be used.

For example, the first generator of the tetrahedron automorphism group can be displayed like this:

gap> DisplayAsAutomorphism( tetra, 
>  (1,2)(3,5)(4,6)(7,8)(9,11)(10,12)(13,19)(14,20)(15,21)(16,22)(17,23)(18,24));
[ (3,4), (2,3)(4,5), (1,2) ]

The first component describes the action on the vertices, the second component shows the action on the edges and the final component represents the action on the faces.

Often, it can be avoided to calculate with such a big group representation since the automorphisms are usually determined by vertices, edges, or faces. For example, consider the open bag.

gap> openBag := SimplicialSurfaceByDownwardIncidence(
>        [[1,2],[1,3],[2,3],[2,3]], [[1,2,4],[1,2,3]]);;
gap> IsAutomorphismDefinedByVertices(openBag);
false
gap> IsAutomorphismDefinedByEdges(openBag);
true
gap> IsAutomorphismDefinedByFaces(openBag);
false

Therefore, the automorphism group is best represented by its action on the edges.

gap> AutomorphismGroupOnEdges(openBag);
Group([ (3,4), (1,2) ])

15.6-1 AutomorphismGroup
‣ AutomorphismGroup( complex )( attribute )

Returns: a permutation group

Compute the automorphism group of the twisted polygonal complex complex as a permutation group on the chambers of complex. For an introduction into the usage and conventions of automorphism groups in the SimplicialSurface-package, compare the start of section 15.6.

For the tetrahedron this gives the following result:

gap> tetra := Tetrahedron();;
gap> Vertices(tetra);
[ 1, 2, 3, 4 ]
gap> Edges(tetra);
[ 1, 2, 3, 4, 5, 6 ]
gap> Faces(tetra);
[ 1 .. 4 ]
gap> Chambers(tetra);
[ 1 .. 24 ]
gap> aut := AutomorphismGroup(tetra);
Group([ 
  (1,2)(3,5)(4,6)(7,8)(9,11)(10,12)(13,19)(14,20)(15,21)(16,22)(17,23)(18,24), 
  (1,3)(2,4)(5,6)(7,13)(8,14)(9,15)(10,16)(11,18)(12,17)(19,20)(21,24)(22,23), 
  (1,7)(2,8)(3,9)(4,10)(5,11)(6,12)(13,15)(14,16)(17,18)(19,21)(20,22)(23,24) ])



To see the action on vertices, edges, and faces simultaneously, use the method DisplayAsAutomorphism (15.6-2).

gap> DisplayAsAutomorphism( tetra, aut.1 );
[ (3,4), (2,3)(4,5), (1,2) ]
gap> DisplayAsAutomorphism( tetra, aut.2 );
[ (2,3), (1,2)(5,6), (2,4) ]
gap> DisplayAsAutomorphism( tetra, aut.3 );
[ (1,2), (2,4)(3,5), (3,4) ]

To compute the action on vertices, edges or faces individually, use the methods AutomorphismGroupOnVertices (15.6-3), AutomorphismGroupOnEdges (15.6-4) or AutomorphismGroupOnFaces (15.6-5).

gap> AutomorphismGroupOnVertices(tetra);
Group([ (3,4), (2,3), (1,2) ])
gap> AutomorphismGroupOnEdges(tetra);
Group([ (2,3)(4,5), (1,2)(5,6), (2,4)(3,5) ])
gap> AutomorphismGroupOnFaces(tetra);
Group([ (1,2), (2,4), (3,4) ])

For example, the automorphism group of an icosahedron (14.3-6) is the direct product of a cyclic group of order 2 and an alternating group of order 60.

gap> autIco := AutomorphismGroup( Icosahedron() );;
gap> Size(autIco);
120
gap> StructureDescription(autIco);
"C2 x A5"

15.6-2 DisplayAsAutomorphism
‣ DisplayAsAutomorphism( complex, perm )( operation )

Returns: A list of three permutations

Display an automorphism of the given complex by its individual action on vertices, edges, and faces.

An explanation for the necessity of this method is given in section 15.6.

We illustrate this on the example of a tetrahedron.

gap> tetra := Tetrahedron();;
gap> aut := AutomorphismGroup( tetra );
Group([ 
  (1,2)(3,5)(4,6)(7,8)(9,11)(10,12)(13,19)(14,20)(15,21)(16,22)(17,23)(18,24), 
  (1,3)(2,4)(5,6)(7,13)(8,14)(9,15)(10,16)(11,18)(12,17)(19,20)(21,24)(22,23), 
  (1,7)(2,8)(3,9)(4,10)(5,11)(6,12)(13,15)(14,16)(17,18)(19,21)(20,22)(23,24) ])
gap> DisplayAsAutomorphism( tetra, aut.1 );
[ (3,4), (2,3)(4,5), (1,2) ]
gap> DisplayAsAutomorphism( tetra, aut.2 );
[ (2,3), (1,2)(5,6), (2,4) ]
gap> DisplayAsAutomorphism( tetra, aut.3 );
[ (1,2), (2,4)(3,5), (3,4) ]
gap> DisplayAsAutomorphism( tetra, aut.1 );
[ (3,4), (2,3)(4,5), (1,2) ]

15.6-3 AutomorphismGroupOnVertices
‣ AutomorphismGroupOnVertices( complex )( attribute )
‣ IsAutomorphismDefinedByVertices( complex )( property )

Returns: a permutation group

The method AutomorphismGroupOnVertices returns the action of the automorphism group of complex on its vertices. If IsAutomorphismDefinedByVertices(complex) is true, this is isomorphic to the full automorphism group.

For the cube (14.3-3) we get:

gap> cube := Cube();;
gap> IsAutomorphismDefinedByVertices(cube);
true
gap> AutomorphismGroupOnVertices(cube);
Group([ (3,6)(4,5), (2,4)(6,8), (1,2)(3,4)(5,6)(7,8) ])

15.6-4 AutomorphismGroupOnEdges
‣ AutomorphismGroupOnEdges( complex )( attribute )
‣ IsAutomorphismDefinedByEdges( complex )( property )

Returns: a permutation group

The method AutomorphismGroupOnEdges returns the action of the automorphism group of complex on its edges. If IsAutomorphismDefinedByEdges(complex) is true, this is isomorphic to the full automorphism group.

For the cube (14.3-3) we get:

gap> cube := Cube();;
gap> IsAutomorphismDefinedByEdges(cube);
true
gap> AutomorphismGroupOnEdges(cube);
Group([ (2,5)(3,12)(4,8)(6,9)(7,11), (1,4)(2,3)(5,7)(9,10)(11,12), 
   (2,4)(5,8)(6,7)(9,11) ])

15.6-5 AutomorphismGroupOnFaces
‣ AutomorphismGroupOnFaces( complex )( attribute )
‣ IsAutomorphismDefinedByFaces( complex )( property )

Returns: a permutation group

The method AutomorphismGroupOnFaces returns the action of the automorphism group of complex on its faces. If IsAutomorphismDefinedByFaces(complex) is true, this is isomorphic to the full automorphism group.

For the cube (14.3-3) we get:

gap> cube := Cube();;
gap> IsAutomorphismDefinedByFaces(cube);
true
gap> AutomorphismGroupOnFaces(cube);
Group([ (1,2)(5,6), (2,4)(3,5), (3,4) ])

15.7 Action on paths

In section 15.6 the action of the automorphism group on vertices, edges, and faces was defined. Since these actions are given as permutations, they can be efficiently computed in GAP. Nevertheless, it is sometimes convenient (if slower) to act on some composite objects (like VertexEdgePaths) directly.

15.7-1 OnVertexEdgePaths
‣ OnVertexEdgePaths( vePath, aut )( operation )

Returns: a vertex-edge-path

Apply the automorphism aut to the vertex-edge-path vePath (for their definition consult section 8.1). Currently this is only implemented if vePath is defined on a polygonal complex.

The automorphism should be given in the form that is returned by AutomorphismGroup (15.6-1). If the given automorphism is not well-defined for the given vePath (as checked by DisplayAsAutomorphism, 15.6-2), fail is returned.

As an example, we consider the octahedron.

gap> oct := Octahedron();;



We compute all duplicate-free vertex-edge-paths of length 2.

gap> paths := [];
[]
gap> for v in Vertices(oct) do
>        for edgePair in Arrangements( EdgesOfVertex(oct,v), 2 ) do
>            Add( paths, VertexEdgePathByEdges(oct, edgePair) );
>        od;
>    od;
gap> Length(paths);
72

The automorphism group has exactly two orbits on this set of paths (either the two edges belong to one triangle, or they don't).

gap> autOct := AutomorphismGroup(oct);;
gap> pathOrbits := Orbits(autOct, paths, OnVertexEdgePaths);;
gap> Length(pathOrbits);
2
gap> pathOrbits[1][1];
| v2, E1, v1, E2, v3 |
gap> pathOrbits[2][1];
| v2, E1, v1, E3, v4 |
gap> List( pathOrbits, Length );
[ 48, 24 ]

15.7-2 OnEdgeFacePaths
‣ OnEdgeFacePaths( efPath, aut )( operation )

Returns: an edge-face-path

Apply the automorphism aut to the edge-face-path efPath (for their definition consult section 8.3). Currently this is only implemented if efPath is defined on a polygonal complex.

The automorphism should be given in the form that is returned by AutomorphismGroup (15.6-1). If the given automorphism is not well-defined for the given vePath (as checked by DisplayAsAutomorphism, 15.6-2), fail is returned.

As an example, we consider the octahedron.

gap> oct := Octahedron();;



We compute all duplicate-free edge-face-paths of length 2.

gap> paths := [];
[]
gap> for f in Faces(oct) do
>        for pair in Arrangements( EdgesOfFace(oct, f), 2 ) do
>            sndFace := NeighbourFaceByEdge(oct, f, pair[2]);
>            otherEdges := Difference( EdgesOfFace(oct, sndFace), [pair[2]] );
>            for finalEdge in otherEdges do
>                Add(paths, 
>                    EdgeFacePath(oct, [pair[1],f,pair[2],sndFace, finalEdge]));
>            od;
>        od;
>    od;
gap> Length(paths);
96

The automorphism group has exactly two orbits on this set of paths.

gap> autOct := AutomorphismGroup(oct);;
gap> pathOrbits := Orbits(autOct, paths, OnEdgeFacePaths);;
gap> Length(pathOrbits);
2
gap> pathOrbits[1][1];
| e1, F1, e2, F7, e3 |
gap> pathOrbits[2][1];
| e1, F1, e2, F7, e8 |
gap> List( pathOrbits, Length );
[ 48, 48 ]
 [Top of Book]  [Contents]   [Previous Chapter]   [Next Chapter] 
Goto Chapter: Top 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 Ind

generated by GAPDoc2HTML