RAMP Manual
RAMP Manual
Gabe Cunningham
Mark Mixer
Gordon Williams
Gabe Cunningham
Email: [email protected]
Homepage: http://www.gabrielcunningham.com
Mark Mixer
Email: [email protected]
Gordon Williams
Email: [email protected]
Homepage: http://williams.alaska.edu
Address: PO Box 756660
Department of Mathematics and Statistics
University of Alaska Fairbanks
Fairbanks, AK 99775-6660
RAMP 2
Copyright
© 1997-2022 by Gabe Cunningham, Mark Mixer, and Gordon Williams
RAMP package is free software; you can redistribute it and/or modify it under the terms of the GNU
General Public License as published by the Free Software Foundation; either version 2 of the License, or (at
your option) any later version.
Acknowledgements
We appreciate very much all past and future comments, suggestions and contributions to this package and its
documentation provided by GAP users and developers.
Contents
1 Installation 6
1.1 Basics . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
2 Using RAMP 7
2.1 Assumptions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
2.2 Extending RAMP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
3 Group Constructors 9
3.1 Ggis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
3.2 Sggis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
3.3 String rotation groups . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
4 Maniplex Constructors 18
4.1 Maniplexes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
4.2 Reflexible Maniplexes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
4.3 Rotary Maniplexes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
4.4 Subclasses of maniplex . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
5 Families of Polytopes 25
5.1 Classical polytopes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
5.2 Flat and tight polytopes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
5.3 The Tomotope . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
5.4 Toroids . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
5.5 Uniform and Archimedean polyhedra . . . . . . . . . . . . . . . . . . . . . . . . . 34
3
RAMP 4
7.4 Faithfulness . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55
7.5 Flag orbits . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56
8 Comparing maniplexes 59
8.1 Quotients and covers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59
10 Stratified Operations 74
10.1 Computational tools . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74
11 Maps On Surfaces 77
11.1 Bicontactual regular maps . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77
11.2 Operations on reflexible maps . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79
11.3 Map properties . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79
11.4 Operations on maps . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79
11.5 Conway polyhedron operator notation . . . . . . . . . . . . . . . . . . . . . . . . . 82
11.6 Extended operations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84
12 Posets 87
12.1 Poset constructors . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87
12.2 Poset attributes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91
12.3 Working with posets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 96
12.4 Element constructors . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99
12.5 Element operations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101
12.6 Product operations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102
15 Databases 119
15.1 Regular polyhedra . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 119
15.2 System internal representations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 123
References 133
Index 134
Chapter 1
Installation
1.1 Basics
Some quick notes on installation:
• RAMP is confirmed to work with version 4.11.1 of GAP, but is known not to work with some
earlier versions.
• Copy the RAMP folder and its contents to your GAP /pkg folder.
6
Chapter 2
Using RAMP
2.1 Assumptions
There are a few assumptions that many methods make.
1. The connection group of a maniplex with N flags is often assumed to act on [1..N]. This is
gradually being rewritten to allow any set of integers as flags, but use caution when working with such
connection groups.
2. When working with a connection group ⟨r0 , . . . , rn−1 ⟩, some methods may have strange behavior
if any ri or ri r j has any fixed points. Indeed, Sggis of that type define pre-maniplexes rather than
maniplexes. Eventually, the methods that build maniplexes will verify that no ri or ri r j has fixed
points.
Finally, we need to make sure that these new files are read when RAMP is loaded up. Open up init.g
(in the root RAMP directory) and add the line
Example
ReadPackage( "ramp", "lib/stretch.gd" );
7
RAMP 8
(We recommend that you put that line in alphabetical order with the rest.) Similarly, open up read.g
and add the line
Example
ReadPackage( "ramp", "lib/stretch.gi" );
If any tests fail (that is, if the output from GAP does not match the expected output from your test
file), then GAP will alert you to the discrepancies. Otherwise, when the tests are complete, there will
be no output and you will just see the gap> prompt again.
You can also call TEST_RAMP() to run all of the tests in the /tst directory.
Finally, you should document your operation! Take a look at one of the .gd files included with
RAMP to see what you should include. To actually build the documentation, you will need the package
AutoDoc. For example, the following will rebuild the documentation:
Example
gap> LoadPackage("AutoDoc");
gap> AutoDoc("ramp", rec( scaffold := true, autodoc := true));
To see your updated documentation, you can either navigate to the html file in the doc/ directory, or
you can quit GAP and restart it, and then your documentation will be available in the inline help. If
you have LaTeX set up properly, then it will also build a pdf manual.
Chapter 3
Group Constructors
3.1 Ggis
3.1.1 UniversalGgi
▷ UniversalGgi(n) (operation)
▷ UniversalGgi(cox) (operation)
Returns: IsFpGroup
In the first form, returns the universal Coxeter Group of rank n. In the second form, returns the
Coxeter Group with the given Coxeter diagram. The diagram is given as a list with the order of r0 r1,
r0 r2, ..., r0 r_{n-1}, r_1 r_2, etc.
Example
gap> g := UniversalGgi(3);
<fp group of size infinity on the generators [ r0, r1, r2 ]>
gap> RelatorsOfFpGroup(g);
[ r0^2, r1^2, r2^2 ]
gap> q := UniversalGgi([3,3,3]);
<fp group on the generators [ r0, r1, r2 ]>
gap> RelatorsOfFpGroup(q);
[ r0^2, r1^2, r2^2, (r0*r1)^3, (r0*r2)^3, (r1*r2)^3 ]
3.1.2 Ggi
▷ Ggi(cox[, relations]) (operation)
▷ Ggi(cox, words, orders) (operation)
Returns: IsFpGroup
Returns the ggi defined by the given Coxeter diagram and with the given relations. The relations
can be given by a list of Tietze words or as a string of relators or relations that involve r0 etc. If
no relations are given, then returns the universal ggi with the given Coxeter diagram. This method
automatically calls InterpolatedString on the relations, so you may use $variable in the relations,
and it will be replaced with the value of variable (but for global variables only).
Example
gap> g := Ggi([3,3,3], "(r0 r1 r2 r1)^3");;
gap> Size(g);
54
gap> n := 5;;
9
RAMP 10
The second form takes the Coxeter diagram cox , a list of words in the generators r0 etc, and a list
of orders . It returns the ggi that is the quotient of the universal ggi with that Coxeter diagram by
the relations obtained by setting each word[i] to have order order[i] . This is primarily useful for
quickly constructing a family of related Ggis.
Example
gap> L := List([1..5], k -> Ggi([3,3,3], ["r0 r1 r2 r1"], [k]));;
gap> List(L, Size);
[ 6, 24, 54, 96, 150 ]
Example
gap> g := Ggi([3,3,3], "(r0 r1 r2 r1)^4");;
gap> SimplifiedGgiElement(g, "(r0 r1)^4");
r0*r1
3.2 Sggis
3.2.1 UniversalSggi
▷ UniversalSggi(n) (operation)
▷ UniversalSggi(sym) (operation)
Returns: IsFpGroup
In the first form, returns the universal Coxeter Group of rank n. In the second form, returns the
Coxeter Group with Schlafli symbol sym.
Example
gap> g:=UniversalSggi(3);
<fp group of size infinity on the generators [ r0, r1, r2 ]>
gap> q:=UniversalSggi([3,4]);
<fp group of size 48 on the generators [ r0, r1, r2 ]>
gap> IsQuotient(g,q);
true
3.2.2 Sggi
▷ Sggi(symbol[, relations]) (operation)
▷ Sggi(sym, words, orders) (operation)
Returns: IsFpGroup
Returns the sggi defined by the given Schlafli symbol and with the given relations. The relations
can be given by a list of Tietze words or as a string of relators or relations that involve r0 etc. If
no relations are given, then returns the universal sggi with the given Schlafli symbol. This method
automatically calls InterpolatedString on the relations, so you may use $variable in the relations,
and it will be replaced with the value of variable (but for global variables only).
Example
gap> g := Sggi([4,3,4], "(r0 r1 r2)^3, (r1 r2 r3)^3");;
gap> h := Sggi([4,4], "r0 = r2");;
gap> k := Sggi([infinity, infinity], [[1,2,1,2,1,2], [2,3,2,3,2,3]]);;
gap> k = Sggi([3,3]);
true
gap> n := 3;;
gap> Size(Sggi([4,4], "(r0 r1 r2 r1)^$n"));
72
The second form takes the Schlafli Symbol sym , a list of words in the generators r0 etc, and a list
of orders . It returns the Sggi that is the quotient of the universal Sggi with that Schlalfi Symbol by
the relations obtained by setting each word[i] to have order order[i] . This is primarily useful for
quickly constructing a family of related Sggis.
RAMP 12
Example
gap> L := List([1..5], k -> Sggi([4,4], ["r0 r1 r2"], [2*k]));;
gap> List(L, Size);
[ 16, 64, 144, 256, 400 ]
Example
gap> IsFixedPointFreeSggi(Group((1,2)(3,4), (1,3)(2,4) ,(1,4)(2,3)));
true
gap> IsFixedPointFreeSggi(Group((1,2)(3,4), (1,2)(3,4), (1,4)(2,3)));
false
(1,3,2)
gap> n := 2;;
gap> SggiElement(g, "(r0 r1)^$n");
(1,2,3)
For convenience, you can also use a reflexible maniplex M in place of g, in which case
AutomorphismGroup(M) is used for g.
For convenience, you can also use a rotary maniplex M in place of g, in which case
RotationGroup(M) is used for g.
Given a parent group and a list of strings that represent words in r0, r1, etc, returns a function.
That function accepts a list of positive integers L, and returns the quotient of parent by the relations
that set the order of each words[i] to L[i].
Example
gap> f := SggiFamily(Sggi([4,4]), ["r0 r1 r2 r1"]);
function( orders ) ... end
gap> g := f([3]);
<fp group on the generators [ r0, r1, r2 ]>
gap> Size(g);
72
gap> h := f([6]);
<fp group on the generators [ r0, r1, r2 ]>
gap> IsQuotient(h,g);
true
One of the advantages of building an SggiFamily is that testing whether one member of the family is
a quotient of another member can be done quite quickly.
Returns the rotation subgroup of the Coxeter Group with Schlafli symbol sym.
Example
gap> UniversalRotationGroup([4,4]);
<fp group of size infinity on the generators [ s1, s2 ]>
gap> UniversalRotationGroup([3,3,3]);
<fp group of size 60 on the generators [ s1, s2, s3 ]>
Chapter 4
Maniplex Constructors
4.1 Maniplexes
4.1.1 Maniplex (for IsPermGroup)
▷ Maniplex(G) (operation)
Returns: IsManiplex
Given a permutation group G on the set [1..N], returns a maniplex with N flags with connection
group G . This function first checks whether g is an Sggi. Use ManiplexNC to bypass that check.
Example
gap> G := Group([(1,2)(3,4)(5,6), (2,3)(4,5)(1,6)]);;
gap> M := Maniplex(G);
Pgon(3)
gap> c := ConnectionGroup(Cube(3));
<permutation group with 3 generators>
gap> Maniplex(c) = Cube(3);
true
18
RAMP 19
This function first checks whether g is an Sggi. Use ReflexibleManiplexNC to bypass that check.
Note, however, that this function does not check whether the generators are all nontrivial and pairwise
distinct, and so the output could be a pre-maniplex that is incorrectly labeled as a maniplex. For
most purposes, this is relatively harmless, since most functions treat maniplexes and pre-maniplexes
in roughly the same way.
For more information on relators, see the documentation on ParseGgiRels. The second form re-
turns the universal reflexible maniplex with Schlafli symbol sym . If the optional argument relations
is given, then we return the reflexible maniplex with the given defining relations. The relations can be
given by a list of Tietze words or as a string of relators or relations that involve r0 etc. This method
automatically calls InterpolatedString on the relations, so you may use $variable in the relations,
and it will be replaced with the value of variable (but for global variables only).
Example
gap> q := ReflexibleManiplex([4,3,4], "(r0 r1 r2)^3, (r1 r2 r3)^3");;
gap> q = ReflexibleManiplex([4,3,4], "(r0 r1 r2)^3 = (r1 r2 r3)^3 = 1");
true
gap> p := ReflexibleManiplex([infinity], "r0 r1 r0 = r1 r0 r1");;
gap> n := 3;;
gap> Size(ReflexibleManiplex([4,4], "(r0 r1 r2 r1)^$n"));
72
The third form takes the Schlafli Symbol sym , a list of words in the generators r0 etc, and a list of
orders . It returns the reflexible maniplex that is the quotient of the universal maniplex with that
Schlalfi Symbol by the relations obtained by setting each word[i] to have order order[i] . This is
primarily useful for quickly constructing a family of related maniplexes.
Example
gap> L := List([1..5], k -> ReflexibleManiplex([4,4], ["r0 r1 r2 r1"], [k]));;
gap> List(L, IsPolytopal);
[ false, true, true, true, true ]
The fourth form accepts common names for reflexible 3-maniplexes that specify the lengths of
holes and zigzags. That is, "{p, q | h2, \ldots, hk\}_z1, ..., zL" is the quotient of {p, q} by the
relations that make the 2-holes have length h2, ..., and the 1-zigzags have length z1, etc.
RAMP 21
Example
gap> ReflexibleManiplex("{4,4 | 6}") = ToroidalMap44([6,0]);
true
gap> ReflexibleManiplex("{4,4}_4") = ToroidalMap44([2,2]);
true
gap> M := ReflexibleManiplex("{6,6 | 6,2}_4");;
gap> HoleLength(M,2);
6
gap> HoleLength(M,3);
2
gap> ZigzagLength(M,1);
4
In the second and third forms, if the option set_schlafli is set, then we set the Schlafli symbol to
the one given. This may not be the correct Schlafli symbol, since the relations may cause a collapse,
so this should only be used if you know that the Schlafli symbol is correct.
The abbreviations RefMan and RefManNC are also available for all of these usages.
This function first checks whether g is an Sggi. Use ReflexiblePremaniplexNC to bypass that
check.
In the first form, given a group g (which should be a string rotation group), returns the rotary
maniplex with that rotation group, where the privileged generators are those returned by Generator-
sOfGroup(g). This function first checks whether g is a StringRotationGroup. Use RotaryManiplexNC
to bypass that check.
Example
gap> M := RotaryManiplex(UniversalRotationGroup([3,3]));;
gap> M = Simplex(3);
true
RAMP 22
The second form returns the universal rotary maniplex (in fact, regular polytope) with Schlafli
symbol sym .
Example
gap> M := RotaryManiplex([4,3]);;
gap> M = Cube(3);
true
The third form returns the rotary maniplex with the given Schlafli symbol and with the given
relations. The relations are given by a string that refers to the generators s1, s2, etc. This method
automatically calls InterpolatedString on the relations, so you may use $variable in the relations,
and it will be replaced with the value of variable (but for global variables only).
Example
gap> M := RotaryManiplex([4,4], "(s2^-1 s1)^6");;
gap> M = ToroidalMap44([6,0]);
true
The fourth form takes the Schlafli Symbol sym , a list of words in the generators r0 etc, and a
list of orders . It returns the rotary maniplex that is the quotient of the universal maniplex with that
Schlalfi Symbol by the relations obtained by setting each word[i] to have order order[i] . This is
primarily useful for quickly constructing a family of related maniplexes.
Example
gap> L := List([1..5], k -> RotaryManiplex([4,4], ["s1 s2^-1"], [k]));;
gap> List(L, IsPolytopal);
[ false, true, true, true, true ]
In the last two forms, if the option set_schlafli is set, then we set the Schlafli symbol to the one
given. This may not be the correct Schlafli symbol, since the relations may cause a collapse, so this
should only be used if you know that the Schlafli symbol is correct.
Example
gap> M := RotaryManiplex([6,6], "(s1^2 s2^2)^8");;
gap> SchlafliSymbol(M);
#I Coset table calculation failed -- trying with bigger table limit
... eventually give up with CTRL-C
gap> M := RotaryManiplex([6,6], "(s1^2 s2^2)^8" : set_schlafli);;
gap> SchlafliSymbol(M);
[6, 6]
The enantiomorphic form of a rotary maniplex is the same maniplex, but where we choose the
new base flag to be one of the flags that is adjacent to the original base flag. If M is reflexible, then
this choice has no effect. Otherwise, if M is chiral, then the enantiomorphic form gives us a different
presentation for the rotation group.
Example
gap> M := ToroidalMap44([1,2]);;
gap> g := AutomorphismGroup(M);
<fp group of size 20 on the generators [ s1, s2 ]>
RAMP 23
gap> RelatorsOfFpGroup(g);
[ (s1*s2)^2, s1^4, s2^4, s2^-1*s1*(s2*s1^-1)^2 ]
gap> h := AutomorphismGroup(EnantiomorphicForm(M));
<fp group of size 20 on the generators [ s1, s2 ]>
gap> RelatorsOfFpGroup(h);
[ (s1*s2)^2, s1^4, s2^4, s2^-1*s1^-1*s2*s1^3*s2*s1 ]
true
gap> q:=CartesianProduct(Simplex(2),Cube(2));
CartesianProduct(Pgon(3), Pgon(4))
gap> IsRegularPolytope(q);
false
Chapter 5
Families of Polytopes
5.1.2 Edge
▷ Edge() (operation)
Returns: IsPolytope
Returns the universal 1-polytope.
Example
gap> Edge();
UniversalPolytope(1)
25
RAMP 26
Example
gap> Fvector(Cube(4));
[ 16, 32, 24, 8 ]
5.1.7 Octahedron
▷ Octahedron() (operation)
Returns: IsPolytope
Returns the octahedron (3-cross-polytope).
Example
gap> Octahedron() = CrossPolytope(3)
true
5.1.10 Tetrahedron
▷ Tetrahedron() (operation)
Returns: IsPolytope
Returns the tetrahedron (3-simplex).
Example
gap> Tetrahedron() = Simplex(3)
true
5.1.12 Dodecahedron
▷ Dodecahedron() (operation)
Returns: IsPolytope
Returns the dodecahedron, {5, 3}.
Example
gap> Dual(Dodecahedron());
Icosahedron()
5.1.13 HemiDodecahedron
▷ HemiDodecahedron() (operation)
Returns: IsPolytope
Returns the hemi-dodecahedron, {5, 3}_5.
Example
gap> Dual(HemiDodecahedron());
ReflexibleManiplex([ 3, 5 ], "(r2*r1*r0)^5")
5.1.14 Icosahedron
▷ Icosahedron() (operation)
Returns: IsPolytope
Returns the icosahedron, {3, 5}.
Example
gap> Dual(Icosahedron());
Dodecahedron()
RAMP 28
5.1.15 HemiIcosahedron
▷ HemiIcosahedron() (operation)
Returns: IsPolytope
Returns the hemi-icosahedron, {3, 5}_5.
Example
gap> Fvector(HemiIcosahedron());
[ 6, 15, 10 ]
5.1.16 SmallStellatedDodecahedron
▷ SmallStellatedDodecahedron() (operation)
Returns: IsPolytope
Constructs the small stellated dodecahedron combinatorially. This is the same combinatorial ob-
ject as the great dodecahedron. You may also use the command GreatDodecahedron();.
Example
gap> SmallStellatedDodecahedron()=GreatDodecahedron();
true
gap> Size(GreatDodecahedron());
120
5.1.17 24Cell
▷ 24Cell() (operation)
Returns: IsPolytope
Returns the 24-cell, {3, 4, 3}.
Example
gap> SchlafliSymbol(24Cell());
[ 3, 4, 3 ]
5.1.18 Hemi24Cell
▷ Hemi24Cell() (operation)
Returns: IsPolytope
Returns the hemi-24-cell, {3, 4, 3}_6.
Example
gap> SchlafliSymbol(Hemi24Cell());
[ 3, 4, 3 ]
5.1.19 120Cell
▷ 120Cell() (operation)
Returns: IsPolytope
Returns the 120-cell, {5, 3, 3}.
Example
gap> NumberOfIFaces(120Cell(),3);
120
RAMP 29
5.1.20 Hemi120Cell
▷ Hemi120Cell() (operation)
Returns: IsPolytope
Returns the hemi-120-cell, {5, 3, 3}_15.
Example
gap> NumberOfIFaces(Hemi120Cell(),3);
60
5.1.21 600Cell
▷ 600Cell() (operation)
Returns: IsPolytope
Returns the 600-cell, {3, 3, 5}.
Example
gap> Dual(600Cell());
120Cell()
5.1.22 Hemi600Cell
▷ Hemi600Cell() (operation)
Returns: IsPolytope
Returns the hemi-600-cell, {3, 3, 5}_15.
Example
gap> Dual(Hemi600Cell())=Hemi120Cell();
true
5.1.23 BrucknerSphere
▷ BrucknerSphere() (operation)
Returns: IsPoset
Returns Bruckner’s sphere.
Example
gap> IsLattice(BrucknerSphere());
true
5.1.26 GrandAntiprism
▷ GrandAntiprism() (operation)
Returns: IsPolytope
Returns the Grand Antiprism.
Returns a list of all flat, orientably regular polyhedra with Schlafli symbol sym .
Example
ap> FlatOrientablyRegularPolyhedraOfType([6,6]);
[ FlatOrientablyRegularPolyhedron(6,6,3,1), FlatOrientablyRegularPolyhedron(6,6,-1,1),
FlatOrientablyRegularPolyhedron(6,6,-1,3) ]
Returns a list of all tight, orientably regular polytopes with Schlafli symbol sym . When sym has
length 2, this just calls FlatOrientablyRegularPolyhedraOfType(sym ).
Example
gap> TightOrientablyRegularPolytopesOfType([6,6]);
[ FlatOrientablyRegularPolyhedron(6,6,3,1), FlatOrientablyRegularPolyhedron(6,6,-1,1),
FlatOrientablyRegularPolyhedron(6,6,-1,3) ]
RAMP 32
5.4 Toroids
5.4.1 ToroidalMap44
▷ ToroidalMap44(u[, v]) (function)
Returns: IsManiplex
Returns the toroidal map {4, 4}⃗u,⃗v . If only u is given, then v is taken to be u rotated 90 degrees,
in which case the resulting map is either reflexible or chiral.
Example
gap> ToroidalMap44([3,0]) = ARP([4,4], "(r0 r1 r2 r1)^3");
true
gap> M := ToroidalMap44([1,2]);; IsChiral(M);
true
gap> ToroidalMap44([5,0]) = SmallestReflexibleCover(M);
true
gap> M := ToroidalMap44([2,0],[0,3]);; NumberOfFlagOrbits(M);
2
gap> M = ARP([4,4]) / "(r0 r1 r2 r1)^2, (r1 r0 r1 r2)^3";
true
gap> SmallestReflexibleCover(M) = ToroidalMap44([6,0]);
true
gap> ToroidalMap44([2,3],[4,1]) = ToroidalMap44([-3,2],[-1,4]);
true
5.4.2 ToroidalMap36
▷ ToroidalMap36(u[, v]) (function)
Returns: IsManiplex
Returns the toroidal map {3, 6}⃗u,⃗v . If only u is given, then we return the corresponding reflexible
map (if u is [a, 0] or [a, a]) or chiral map.
Example
gap> Size(ToroidalMap36([3,0])) = 108;
true
gap> SmallestReflexibleCover(ToroidalMap36([2,3])) = ToroidalMap36([19,0]);
true
gap> ToroidalMap36([3,0]) = ToroidalMap36([3,0],[0,3]);
true
gap> ToroidalMap36([2,3]) = ToroidalMap36([2,3],[-3,5]);
RAMP 33
true
gap> NumberOfFlagOrbits(ToroidalMap36([3,0],[-2,4]));
3
gap> NumberOfFlagOrbits(ToroidalMap36([4,3],[5,0]));
6
5.4.3 ToroidalMap63
▷ ToroidalMap63(u[, v]) (function)
Returns: IsManiplex
Returns the toroidal map {6, 3}⃗u,⃗v . If only u is given, then we return the corresponding reflexible
map (if u is [a, 0] or [a, a]) or chiral map.
Example
gap> Size(ToroidalMap63([3,0])) = 108;
true
gap> SmallestReflexibleCover(ToroidalMap63([2,3])) = ToroidalMap63([19,0]);
true
gap> ToroidalMap63([3,0]) = ToroidalMap63([3,0],[0,3]);
true
gap> ToroidalMap63([2,3]) = ToroidalMap63([2,3],[-3,5]);
true
gap> NumberOfFlagOrbits(ToroidalMap63([3,0],[-2,4]));
3
gap> NumberOfFlagOrbits(ToroidalMap63([4,3],[5,0]));
6
5.5.1 Cuboctahedron
▷ Cuboctahedron() (operation)
Returns: maniplex
Constructs the cuboctahedron.
Example
gap> SchlafliSymbol(Cuboctahedron());
[ [ 3, 4 ], 4 ]
5.5.2 TruncatedTetrahedron
▷ TruncatedTetrahedron() (operation)
Returns: maniplex
Constructs the truncated tetrahedron.
Example
gap> SchlafliSymbol(TruncatedTetrahedron());
[ [ 3, 6 ], 3 ]
RAMP 35
5.5.3 TruncatedOctahedron
▷ TruncatedOctahedron() (operation)
Returns: maniplex
Constructs the truncated octahedron.
Example
gap> Fvector(TruncatedOctahedron());
[ 24, 36, 14 ]
5.5.4 TruncatedCube
▷ TruncatedCube() (operation)
Returns: maniplex
Constructs the truncated octahedron.
Example
gap> Fvector(TruncatedCube());
[ 24, 36, 14 ]
gap> SchlafliSymbol(TruncatedCube());
[ [ 3, 8 ], 3 ]
5.5.5 Icosadodecahedron
▷ Icosadodecahedron() (operation)
Returns: maniplex
Constructs the icosadodecahedron.
Example
gap> VertexFigure(Icosadodecahedron());
Pgon(4)
gap> Facets(Icosadodecahedron());
[ Pgon(5), Pgon(3) ]
5.5.6 TruncatedIcosahedron
▷ TruncatedIcosahedron() (operation)
Returns: maniplex
Constructs the truncated icosahedron.
Example
gap> Facets(TruncatedIcosahedron());
[ Pgon(6), Pgon(5) ]
5.5.7 SmallRhombicuboctahedron
▷ SmallRhombicuboctahedron() (operation)
Returns: maniplex
Constructs the small rhombicuboctahedron.
Example
gap> ZigzagVector(SmallRhombicuboctahedron());
[ 12, 8 ]
RAMP 36
5.5.8 Pseudorhombicuboctahedron
▷ Pseudorhombicuboctahedron() (operation)
Returns: maniplex
Constructs the pseudorhombicuboctahedron.
Example
gap> Size(ConnectionGroup(Pseudorhombicuboctahedron()));
16072626615091200
5.5.9 SnubCube
▷ SnubCube() (operation)
Returns: maniplex
Constructs the snub cube.
Example
gap> IsEquivelar(PetrieDual(SnubCube()));
true
gap> SchlafliSymbol(PetrieDual(SnubCube()));
[ 30, 5 ]
gap> Size(ConnectionGroup(PetrieDual(SnubCube())));
3804202857922560
gap> Size(AutomorphismGroup(PetrieDual(SnubCube())));
24
5.5.10 SmallRhombicosidodecahedron
▷ SmallRhombicosidodecahedron() (operation)
Returns: maniplex
Constructs the small rhombicosidodecahedron.
Example
gap> Facets(SmallRhombicosidodecahedron());
[ Pgon(5), Pgon(4), Pgon(3) ]
5.5.11 GreatRhombicosidodecahedron
▷ GreatRhombicosidodecahedron() (operation)
Returns: maniplex
Constructs the great rhombicosidodecahedron.
Example
gap> Facets(GreatRhombicosidodecahedron());
[ Pgon(10), Pgon(4), Pgon(6) ]
5.5.12 SnubDodecahedron
▷ SnubDodecahedron() (operation)
Returns: maniplex
Constructs the small snub dodecahedron.
RAMP 37
Example
gap> Facets(SnubDodecahedron());
[ Pgon(5), Pgon(3) ]
gap> IsEquivelar(PetrieDual(SnubDodecahedron()));
true
5.5.13 TruncatedDodecahedron
▷ TruncatedDodecahedron() (operation)
Returns: maniplex
Constructs the truncated dodecahedron.
Example
gap> Facets(TruncatedDodecahedron());
[ Pgon(10), Pgon(3) ]
5.5.14 GreatRhombicuboctahedron
▷ GreatRhombicuboctahedron() (operation)
Returns: maniplex
Constructs the great rhombicuboctahedron.
Example
gap> Size(ConnectionGroup(GreatRhombicuboctahedron()));
5308416
Chapter 6
6.1 Basics
6.1.1 Size (for IsPremaniplex)
▷ Size(M) (attribute)
Returns: The number of flags of the premaniplex M .
Synonym: NumberOfFlags.
6.2 Faces
6.2.1 NumberOfIFaces (for IsManiplex, IsInt)
▷ NumberOfIFaces(M, i) (operation)
38
RAMP 39
6.2.7 Section(s)
▷ Section(M, j, i) (operation)
▷ Section(M, j, i, k) (operation)
▷ Sections(M, j, i) (operation)
Section(M,j,i) returns the section F_j / F_i, where F_j is the j-face of the base flag of M
and F_i is the i-face of the base flag. Section(M,j,i,k) returns the section F_j / F_i, where F_j
is the j-face of flag number k of M and F_i is the i-face of the same flag. Sections(M,j,i) returns
all sections of type F_j / F_i, where F_j is a j-face and F_i is an incident i-face.
RAMP 40
Example
gap> Section(ToroidalMap44([2,2]),3,0);
Pgon(4)
gap> Section(Cuboctahedron(),2,-1,1);
Pgon(4)
gap> Section(Cuboctahedron(),2,-1,4);
Pgon(3)
gap> Sections(Cuboctahedron(),2,-1);
[ Pgon(4), Pgon(3) ]
6.2.8 Facet(s)
▷ Facets(M) (attribute)
▷ Facet(M, k) (operation)
▷ Facet(M) (attribute)
Returns the facet-types of M (i.e. the maniplexes corresponding to the facets). Returns the facet of
M that contains the flag number k (that is, the maniplex corresponding to the facet). Returns the facet
of M that contains flag number 1 (that is, the maniplex corresponding to the facet).
Example
gap> Facets(Cuboctahedron());
[ Pgon(4), Pgon(3) ]
gap> Facet(Cuboctahedron(),4);
Pgon(3)
gap> Facet(Cuboctahedron());
Pgon(4)
Returns the types of vertex-figures of M (i.e. the maniplexes corresponding to the vertex-figures).
Returns the vertex-figure of M that contains flag number k . Returns the vertex-figure of M that contains
the base flag.
Example
gap> p:=Dual(SmallRhombicosidodecahedron());
Dual(3-maniplex)
gap> VertexFigures(p);
[ Pgon(5), Pgon(4), Pgon(3) ]
gap> VertexFigure(p,4);
Pgon(4)
gap> VertexFigure(p);
Pgon(5)
RAMP 41
Example
gap> m:=Cuboctahedron();
3-maniplex
gap> VertexList(m);
[ [ 1, 3, 4, 8, 9, 15, 17, 26 ], [ 2, 5, 6, 11, 12, 20, 22, 31 ], [ 7, 13, 14, 23, 24, 33, 35, 44
[ 10, 18, 19, 28, 29, 38, 40, 50 ], [ 16, 21, 27, 32, 37, 42, 48, 54 ],
[ 25, 34, 36, 45, 46, 56, 58, 67 ], [ 30, 39, 41, 51, 52, 61, 63, 72 ],
[ 43, 49, 55, 60, 65, 70, 76, 81 ], [ 47, 57, 59, 68, 69, 78, 79, 87 ],
[ 53, 62, 64, 73, 74, 83, 84, 90 ], [ 66, 75, 77, 85, 86, 91, 92, 95 ],
[ 71, 80, 82, 88, 89, 93, 94, 96 ] ]
6.3 Flatness
6.3.1 Flatness
▷ IsFlat(M) (property)
▷ IsFlat(M, i, j) (operation)
Returns: true or false
In the first form, returns true if every vertex of the maniplex M is incident to every facet. In the
second form, returns true if every i-face of the maniplex M is incident to every j-face.
Example
gap> IsFlat(HemiCube(3));
true
gap> IsFlat(Simplex(3),0,2);
false
RAMP 43
Returns the Schlafli symbol of the maniplex M . Each entry is either an integer or a set of integers,
where entry number i shows the polygons that we obtain as sections of (i+1)-faces over (i-2)-faces.
Example
gap> SchlafliSymbol(SmallRhombicosidodecahedron());
[ [ 3, 4, 5 ], 4 ]
Sometimes when we make a maniplex, we know that the Schlafli symbol must be a quotient of
some symbol. This most frequently happens because we start with a maniplex with a given Schlafli
symbol and then take a quotient of it. In this case, we store the given Schlafli symbol and call it a
pseudo-Schlafli symbol of M . Note that whenever we compute the actual Schlafli symbol of M , we
update the pseudo-Schlafli symbol to match.
Example
gap> M := ReflexibleManiplex([4,4], "(r0 r1)^2");;
gap> PseudoSchlafliSymbol(M);
[4, 4]
gap> SchlafliSymbol(M);
[2, 4]
gap> PseudoSchlafliSymbol(M);
[2, 4]
6.5 Orientability
6.5.1 IsOrientable (for IsManiplex)
▷ IsOrientable(M) (property)
Returns: true or false
A maniplex is orientable if its flag graph is bipartite.
RAMP 46
Example
gap> IsOrientable(HemiCube(3));
false
gap> IsOrientable(Cube(3));
true
For a subset I of {0, ..., n-1}, a maniplex is I-orientable if every closed path in its flag graph
contains an even number of edges with colors in I.
Example
gap> IsIOrientable(HemiCube(3),[1,2]);
true
Example
gap> p:=PetrieRelation(3,3);
"(r0r1r2)^3"
gap> q:=Cube(3)/p;
3-maniplex
gap> Size(q);
24
Returns the automorphism group of M . This group is not guaranteed to be in any particular form.
For particular permutation representations you should consider the various AutomorphismGroupOn...
functions, or AutomorphismGroupFpGroup. Returns the automorphism group of M as a finitely pre-
sented group. If M is reflexible, then this is guaranteed to be the standard presentation. Returns the
automorphism group of M as a permutation group. This group is not guaranteed to be in any particular
form. For particular permutation representations you should consider the various Automorphism-
GroupOn... functions. Returns the automorphism group of M as a permutation group action on the
flags of M .
Example
gap> s0 := (3,7)(4,8)(5,6);;
gap> s1 := (2,3)(4,6)(5,7);;
gap> s2 := (1,2)(3,6)(4,8)(5,7);;
gap> poly := Group([s0,s1,s2]);;
gap> p:=ARP(poly);
regular 3-polytope
gap> AutomorphismGroup(p);
Group([ (3,7)(4,8)(5,6), (2,3)(4,6)(5,7), (1,2)(3,6)(4,8)(5,7) ])
gap> AutomorphismGroupFpGroup(p);
<fp group on the generators [ r0, r1, r2 ]>
gap> AutomorphismGroupPermGroup(Cube(3));
Group([ (3,4), (2,3)(4,5), (1,2)(5,6) ])
gap> AutomorphismGroupOnFlags(Cube(3));
<permutation group with 3 generators>
gap> GeneratorsOfGroup(last);
[ (1,20)(2,13)(3,10)(4,34)(5,35)(6,7)(8,27)(9,28)(11,23)(12,24)(14,44)(15,45)(16,18)(17,19)(21,40
(1,11)(2,18)(3,4)(5,26)(6,41)(7,8)(9,33)(10,45)(12,15)(13,31)(14,25)(16,28)(17,27)(19,22)(20,38
49
RAMP 50
(1,3)(2,7)(4,25)(5,28)(6,13)(8,32)(9,35)(10,20)(11,14)(12,17)(15,47)(16,40)(18,21)(19,24)(22,48
Returns the connection group of the premaniplex M as a permutation group. We may eventually
allow other types of connection groups. Synonym: MonodromyGroup
Example
gap> ConnectionGroup(HemiCube(3));
Group([ (1,8)(2,7)(3,14)(4,13)(5,20)(6,19)(9,16)(10,15)(11,22)(12,21)(17,24)(18,23), (1,3)(2,5)
(4,6)(7,9)(8,11)(10,12)(13,15)(14,17)(16,18)(19,21)(20,23)(22,24), (1,2)(3,4)(5,6)(7,8)(9,10)
(11,12)(13,14)(15,16)(17,18)(19,20)(21,22)(23,24) ])
Returns the rotation group of M . This group is not guaranteed to be in any particular form.
Example
gap> RotationGroup(HemiCube(3));
Group([ r0*r1, r1*r2 ])
Returns the rotation group of M , as a finitely presented group on the standard generators.
Example
gap> RotationGroupFpGroup(ToroidalMap44([1,2]));
<fp group on the generators [ s1, s2 ]>
gap> RelatorsOfFpGroup(last);
[ (s1*s2)^2, s1^4, s2^4, s2^-1*s1*(s2*s1^-1)^2 ]
RAMP 51
Returns the chirality group of the rotary maniplex M . This is the kernel of the group epimorphism
from the rotation group of M to the rotation group of its maximal reflexible quotient. In particular, the
chirality group is trivial if and only if M is reflexible.
Example
gap> M := ToroidalMap44([1,2]);
ToroidalMap44([ 1, 2 ])
gap> G := ChiralityGroup(M);
Group([ s2^-1*s1^-1*s2*s1^3*s2*s1 ])
gap> Size(G);
5
For a reflexible maniplex M , returns the relators needed to define its automorphism group as a quo-
tient of the string Coxeter group given by its Schlafli symbol. Not particularly robust at the moment.
Example
gap> ExtraRelators(HemiCube(3));
[ (r0*r1*r2)^3 ]
For a reflexible maniplex M , returns the relators needed to define its rotation group as a quotient
of the rotation group of a string Coxeter group given by its Schlafli symbol. Not particularly robust at
the moment.
Example
gap> ExtraRotRelators(HemiCube(3));
[ (F2^-1*F1^-1)^2, (F2*F1^2*F2^-1*F1^-1)^2 ]
Example
gap> AutomorphismGroupOnFacets(HemiCube(5));
Group([ (), (4,5), (3,4), (2,3), (1,2) ])
7.4 Faithfulness
7.4.1 IsVertexFaithful (for IsManiplex)
▷ IsVertexFaithful(M) (property)
Returns: true or false
Returns whether the reflexible maniplex M is vertex-faithful; i.e., whether the action of the auto-
morphism group on the vertices is faithful.
Example
gap> IsVertexFaithful(HemiCube(3));
true
gap> M:=Cube(3);;
gap> A:=AutomorphismGroupOnFlags(M);;
gap> B:=Group(A.1,A.2*A.3);;
gap> SymmetryTypeGraph(M,B);
Edge labeled graph with 2 vertices, and edge labels [ 0, 1, 2 ]
Returns one flag from each orbit under the action of AutomorphismGroup(M ).
Example
gap> FlagOrbitRepresentatives(Prism(Simplex(3)));
[ 1, 49, 97, 145 ]
Returns a list of lists of flags, representing the orbits of flags under the action of
AutomorphismGroup(M ).
Example
gap> FlagOrbits(ToroidalMap44([3,2]));
[ [ 1, 9, 7, 33, 15, 63, 5, 65, 39, 23, 13, 71, 61, 101, 3, 89, 47, 37, 95, 21, 11, 79, 69, 29, 5
[ 2, 10, 8, 34, 16, 64, 6, 66, 40, 24, 14, 72, 62, 102, 4, 90, 48, 38, 96, 22, 12, 80, 70, 30,
Chapter 8
Comparing maniplexes
8.1.1 IsQuotient
▷ IsQuotient(M1, M2) (operation)
▷ IsQuotient(g, h) (operation)
Returns: IsBool
Returns whether M2 is a quotient of M1 . Returns whether h is a quotient of g . That is, whether
there is a homomorphism sending each generator of g to the corresponding generator of h.
Example
gap> IsQuotient(Cube(3),HemiCube(3));
true
gap> IsQuotient(UniversalSggi([4,3]),AutomorphismGroup(HemiCube(3)));
true
59
RAMP 60
Returns the smallest regular cover of M , which is the maniplex whose automorphism group is
isomorphic to the connection group of M .
Example
gap> SmallestReflexibleCover(ToroidalMap44([2,3],[3,2]));
reflexible 3-maniplex
gap> last=ToroidalMap44([5,0]);
true
64
RAMP 65
9.2 Duality
9.2.1 Dual (for IsManiplex)
▷ Dual(M) (operation)
Returns: The maniplex that is dual to M .
Example
gap> Dual(CrossPolytope(3));
Cube(3)
gap> g := AutomorphismGroup(M);;
gap> IsInternallySelfDual(M, (g.1*g.3*g.2)^6);
true
Returns whether this rooted maniplex is improperly self-dual, meaning that it is self-dual, but
there is no isomorphism of M to its dual that preserves the flag-orbits. Equivalent to IsSelfDual(M)
and not(IsProperlySelfDual(M)).
Example
gap> IsImproperlySelfDual(Cube(4));
false
gap> IsImproperlySelfDual(Simplex(4));
false
gap> IsImproperlySelfDual(ToroidalMap44([1,2]));
true
gap> IsImproperlySelfDual(RotaryManiplex([4,4,4],"(s2^-1 s1) (s2 s1^-1)^3, (s2 s3^-1) (s2^-1 s3)^
false
gap> IsImproperlySelfDual(RotaryManiplex([4,4,4],"(s2^-1 s1)^3 (s2 s1^-1), (s2 s3^-1) (s2^-1 s3)^
true
Returns a list of the direct derivates of M , which are the images of M under duality and Petriality.
A 3-maniplex has up to 6 direct derivates, and an n-maniplex with n ≥ 4 has up to 8. If the option
’polytopal’ is set, then only returns those direct derivates that are polytopal.
RAMP 69
Example
gap> DirectDerivates(Cube(3));
[ Cube(3), CrossPolytope(3), ReflexibleManiplex([ 6, 3 ], "z1^4"),
ReflexibleManiplex([ 6, 4 ], "z1^3"), ReflexibleManiplex([ 3, 6 ], "(r2*r1*r0)^4"),
ReflexibleManiplex([ 4, 6 ], "(r2*r1*r0)^3") ]
Given a map M with constant valency q, returns a list of those integers e in {1, ..., q − 1} such that
M e is isomorphic to M. That is, such that Hole(M,e) is isomorphic to M as a rooted map. Note that
despite the name, this is simply a list and not a group.
Example
gap> ExponentGroup(ToroidalMap44([3,0]));
[ 1, 3 ]
gap> ExponentGroup(ToroidalMap44([1,2]));
[ 1 ]
gap> ExponentGroup(ReflexibleManiplex([10,10], "(r0 r1 r2)^2"));
[ 1, 3, 7, 9 ]
Given a list of maniplexes L , returns a sublist such that every maniplex in the list is unique and if
a non-self-dual maniplex is in the list, then its dual is not in the list. In the case where two or more
elements of L are duals of each other, we keep the earliest one.
Example
gap> UpToDuality([Cube(3), Simplex(3), CrossPolytope(3)]);
[ Cube(3), Simplex(3) ]
gap> UpToDuality([CrossPolytope(3), Simplex(3), Cube(3)]);
[ CrossPolytope(3), Simplex(3) ]
RAMP 70
gap> IsReflexible(R);
true
gap> R = ToroidalMap44([5,0]);
true
9.3.4 Comix
▷ Comix(fpgroup, fpgroup) (operation)
▷ Comix(maniplex, maniplex) (operation)
Returns: IsReflexibleManiplex .
Returns the comix of two Finitely Presented groups gp and gq. Given maniplexes returns the
IsReflexibleManiplex from the comix of their connection groups
9.4 Products
9.4.1 Pyramids
▷ Pyramid(M) (operation)
▷ Pyramid(k) (operation)
In the first form, returns the pyramid over M . In the second form, returns the pyramid over a
k -gon.
Example
gap> SchlafliSymbol(Pyramid(Cube(3)));
[ [ 3, 4 ], [ 3, 4 ], 3 ]
gap> SchlafliSymbol(Pyramid(4));
[ [ 3, 4 ], [ 3, 4 ] ]
RAMP 72
9.4.2 Prisms
▷ Prism(M) (operation)
▷ Prism(k) (operation)
In the first form, returns the prism over M . In the second form, returns the prism over a k -gon.
Example
gap> Cube(3)=Prism(Cube(2));
true
gap> Prism(4)=Cube(3);
true
9.4.3 Antiprisms
▷ Antiprism(M) (operation)
▷ Antiprism(k) (operation)
In the first form, returns the antiprism over M . In the second form, returns the antiprism over a
k -gon.
Example
gap> SchlafliSymbol(Antiprism(Dodecahedron()));
[ [ 3, 5 ], [ 3, 5 ], 4 ]
gap> SchlafliSymbol(Antiprism(5));
[ [ 3, 5 ], 4 ]
Stratified Operations
74
RAMP 75
for some groups this function will behave poorly because GAP won’t recognize equivalent represen-
tations of a group element. If so, try again with a permutation representation and let us know so we
can modify the code to handle this problem better (didn’t show up in our testing, but is a theoretical
possibility).
Example
gap> p:=Simplex(2);; a:=AutomorphismGroup(p);
<fp group of size 6 on the generators [ r0, r1 ]>
gap> e:=One(a);
<identity ...>
gap> AssignGeneratorVariables(a);
#I Assigned the global variables [ r0, r1 ]
gap> s0:=[(3,4),[r0,r0,e,e,r0,r0]];
[ (3,4), [ r0, r0, <identity ...>, <identity ...>, r0, r0 ] ]
gap> s1:=[(2,3)(4,5),[r1,e,e,e,e,r1]];
[ (2,3)(4,5), [ r1, <identity ...>, <identity ...>, <identity ...>, <identity ...>, r1 ] ]
gap> s2:=[(1,2)(5,6),[e,e,r1,r1,e,e]];
[ (1,2)(5,6), [ <identity ...>, <identity ...>, r1, r1, <identity ...>, <identity ...> ] ]
gap> gens:=[s0,s1,s2];
[ [ (3,4), [ r0, r0, <identity ...>, <identity ...>, r0, r0 ] ],
[ (2,3)(4,5), [ r1, <identity ...>, <identity ...>, <identity ...>, <identity ...>, r1 ] ],
[ (1,2)(5,6), [ <identity ...>, <identity ...>, r1, r1, <identity ...>, <identity ...> ] ] ]
gap> Maniplex(FullyStratifiedGroup(gens,a))=Prism(Simplex(2));
true
Chapter 11
Maps On Surfaces
77
RAMP 78
Example
gap> Mk(5);Mk(6);
ReflexibleManiplex([ 10, 5 ], "(r0 r1)^5 r0 = r2")
ReflexibleManiplex([ 12, 12 ], "(r0 r1)^6 r0 = r2")
Example
gap> MkPrime(5);MkPrime(6);
ReflexibleManiplex([ 5, 10 ], "(r2*r1*(r0 r2))^5,z1^2")
ReflexibleManiplex([ 6, 6 ], "(r2*r1*(r0 r2))^6,z1^2")
gap> IsSelfPetrial(m);
true
gap> Opp(m)=Bk2lRhoSigma(4,16,5,2);
true
gap> SchlafliSymbol(m);
[ 16, 4 ]
true
gap> Truncation(CrossPolytope(3))=TruncatedOctahedron();
true
gap> Truncation(Cube(3))=TruncatedCube();
true
Example
gap> m:=Subdivision1(Simplex(3));
3-maniplex with 48 flags
gap> SchlafliSymbol(m);
[ 6, [ 2, 3 ] ]
Posets
• If the poset is known to be atomic, then by a description of the faces in terms of the atoms...
usually we’ll just need the list of the elements of maximal rank, from which all other elements
may be obtained.
Usually, we assume that the poset will have a natural rank function on it. More information on the
poset attributes that are important in the study of abstract polytopes and maniplexes is available in
[MS02], [MPW14], and [Wil12].
87
RAMP 88
gap> FaceListOfPoset(poset);
[ [ [ 1, 2, 3, 4, 5, 6 ] ], [ [ 1, 2 ], [ 3, 6 ], [ 4, 5 ] ], [ [ 1, 4 ], [ 2, 3 ], [ 5, 6 ] ], [
Note that what we’ve accomplished here is the poset containing the elements 1, 2, 3, 4 with partial
order determined by whether the first element divides the second. The essential information about the
poset can be obtained from the Hasse diagram.
gap> Successors(last);
[ [ 2, 3, 4, 5 ], [ 6 ], [ 6 ], [ 6 ], [ 6 ], [ ] ]
gap> List( ElementsList(poset){[2,6]}, ElementObject);
[ Group([ (2,3) ]), Group([ (1,2,3), (2,3) ]) ]
Gives the list of maximal chains in a poset in terms of the elements of the poset. Syn-
onyms are FlagsList and Flags. Tends to work faster (sometimes significantly) if the poset
HasPartialOrder.
Synonym is FlagsList.
Example
gap> poset:=PosetFromManiplex(HemiCube(3));
A poset using the IsPosetOfFlags representation.
gap> MaximalChains(poset)[1];
[ An element of a poset made of flags, An element of a poset made of flags,
An element of a poset made of flags, An element of a poset made of flags,
An element of a poset made of flags ]
RAMP 92
gap> List(last,x->RankInPoset(x,poset));
[ -1, 0, 1, 2, 3 ]
If the poset IsP1, ranks are assumed to run from −1 to n, and function will return n. If
IsP1(poset)=false, ranks are assumed to run from 1 to n. In RAMP, at least currently, we are
assuming that graded/ranked posets are bounded. Note that in general what you actually want to do is
call Rank(poset). The reason is that Rank will calculate the RankPoset if it isn’t set, and then set
and store the value in the poset.
Will recover the list of faces of the poset, format may depend on type of representation of poset.
12.2.8 Lattices
▷ IsLattice(poset) (property)
▷ IsAllMeets(arg) (property)
▷ IsAllJoins(arg) (property)
Returns: IsBool
IsLattice determines whether a poset is a lattice or not. IsAllMeets determines whether all meets
in a poset are unique. IsAllJoins determines whether all joins in a poset are unique.
Example
gap> poset:=PosetFromManiplex(Cube(3));;
gap> IsLattice(poset);
true
gap> bad:=PosetFromManiplex(HemiCube(3));;
gap> IsLattice(bad);
fail
of flags Ψ = Φ0 = Φ1 = · · · = Φk = Ψ such that each Φi shares all but once face with Φi+1 , but that
each Φi ⊇ Φ ∩ Ψ.
Helper for IsP3
Example
gap> poset:=PosetFromManiplex(Simplex(5));;
A poset using the IsPosetOfFlags representation.
gap> IsSelfDual(poset);
true
gap> poset2:=PosetFromManiplex(PyramidOver(Cube(3)));;
gap> IsSelfDual(poset2);
false
If your poset isn’t P4, there may be multiple adjacent maximal chains at a given rank. This function
handles that case. May substitute IsInt for flagaslistoffaces corresponding to position of flag
in list of maximal chains.
Given a poset , gives the automorphism group of the poset as an action on the maximal chains.
Given a poset , gives the automorphism group of the poset as an action on the elements.
RAMP 98
Assigns to each face of a poset (when possible) the rank of the element in the poset.
RAMP 99
Determines whether two faces are equal in a poset. Note that \= tests whether they are the identical
object or not.
13.1.2 PetersenGraph
▷ PetersenGraph() (operation)
Returns: IsGraph
Petersen Graph as described at https://www.gap-system.org/Manuals/pkg/grape/htm/CHAP002.htm
104
RAMP 105
This also works with a maniplex input. Here we build the flag graph for the cube.
Example
gap> g:= UnlabeledFlagGraph(Cube(3));
-48 ] ),
[ [ 1, 3 ], [ 1, 11 ], [ 1, 20 ], [ 2, 7 ], [ 2, 13 ], [ 2, 18 ],
[ 3, 4 ], [ 3, 10 ], [ 4, 25 ], [ 4, 34 ], [ 5, 26 ], [ 5, 28 ],
[ 5, 35 ], [ 6, 7 ], [ 6, 13 ], [ 6, 41 ], [ 7, 8 ], [ 8, 27 ],
[ 8, 32 ], [ 9, 28 ], [ 9, 33 ], [ 9, 35 ], [ 10, 20 ],
[ 10, 45 ], [ 11, 14 ], [ 11, 23 ], [ 12, 15 ], [ 12, 17 ],
[ 12, 24 ], [ 13, 31 ], [ 14, 25 ], [ 14, 44 ], [ 15, 45 ],
[ 15, 47 ], [ 16, 18 ], [ 16, 28 ], [ 16, 40 ], [ 17, 19 ],
[ 17, 27 ], [ 18, 21 ], [ 19, 22 ], [ 19, 24 ], [ 20, 38 ],
[ 21, 32 ], [ 21, 40 ], [ 22, 41 ], [ 22, 48 ], [ 23, 35 ],
[ 23, 44 ], [ 24, 34 ], [ 25, 37 ], [ 26, 38 ], [ 26, 42 ],
[ 27, 30 ], [ 29, 39 ], [ 29, 41 ], [ 29, 48 ], [ 30, 32 ],
[ 30, 47 ], [ 31, 33 ], [ 31, 39 ], [ 33, 46 ], [ 34, 37 ],
[ 36, 43 ], [ 36, 45 ], [ 36, 47 ], [ 37, 48 ], [ 38, 43 ],
[ 39, 46 ], [ 40, 42 ], [ 42, 43 ], [ 44, 46 ] ],
[ 3, 2, 1, 3, 1, 2, 2, 1, 3, 1, 2, 3, 1, 1, 3, 2, 2, 1, 3, 1, 2, 3,
3, 2, 3, 1, 2, 3, 1, 2, 2, 1, 1, 3, 1, 2, 3, 1, 2, 3, 2, 3, 2, 2,
1, 1, 3, 2, 3, 2, 1, 1, 3, 3, 2, 3, 1, 1, 2, 1, 3, 3, 3, 2, 3, 1,
2, 3, 1, 2, 1, 2 ] ]
This also works with a maniplex input. Here we build the flag graph for the cube.
Example
gap> g:= FlagGraphWithLabels(Cube(3));
This also works with a maniplex input. Here we build the graph given by the 6 faces and 12 edges of
a cube.
Example
gap> g:= LayerGraph(Cube(3),2,1);;
RAMP 108
Given a graph, its edges, and its edge labels, and a sublist of labels, this creates the underlying
simple graph of the quotient identifying vertices connected by labels not in the sublist.
Here we start with the flag graph of the 3-cube (with edge labels 1,2,3), and identify any vertices
not connected by edge by edges of label 1. We can then check that this new graph is bipartite.
Example
gap> P:=Cube(3);;
gap> f:=FlagGraphWithLabels(P);;
gap> g:=f[1];;
gap> ed:=f[2];;
gap> lab:=f[3]; #Note This triple is to be replace by a single object.
[ 3, 2, 1, 3, 1, 2, 1, 2, 3, 2, 1, 3, 2, 1, 1, 3, 2, 2, 3, 1, 3, 1, 2, 3, 2, 1, 1, 2, 2, 3, 1, 3,
3, 1, 2, 1, 3, 2, 2, 1, 2, 2, 3, 1, 1, 3, 1, 3, 3, 2, 1, 2, 1, 3, 3, 1, 3, 2, 2, 2, 2, 3, 3, 1,
gap> Q:=QuotientByLabel(g,ed,lab,[1]);
rec( adjacencies := [ [ 5, 6, 8 ], [ 3, 4, 7 ], [ 2, 6, 8 ], [ 2, 5, 8 ], [ 1, 4, 7 ], [ 1, 3, 7
isSimple := true, names := [ 1 .. 8 ], order := 8, representatives := [ 1, 2, 3, 4, 5, 6, 7, 8 ]
gap> IsBipartite(Q);
true
Example
gap> C:=ConnectionGroup(Simplex(3));;
gap> gamma:=FlagGraph(C);
Edge labeled graph with 24 vertices, and edge labels [ 0, 1, 2 ]
gap> STG3(4,1);;
gap> FlagGraph(last);
Edge labeled graph with 3 vertices, and edge labels [ 0, 1, 2, 3 ]
Example
gamma:=ConnectedComponents(FlagGraph(Cube(3)),[2]);
Example
gap> STG3(4,1);;
gap> FlagGraph(last);
Edge labeled graph with 3 vertices, and edge labels [ 0, 1, 2, 3 ]
Example
The Petrial and the dual can be built using voltage operations
Similarly for rank 3 other operations can be built this way.
See VOLTAGE OPERATIONS ON MANIPLEXES by HUBARD, MOCHÁN, MONTERO
gap> etain1:=[[[1],0],[[1],1],[[1],2],[[1],3]];;
gap> etain2:=[[[1],0],[[2],0],[[1],1],[[2],1],[[1,2],2]];;
gap> etain3:=[[[1],0],[[2],0],[[3],0],[[1],1],[[3],2],[[1,2],2],[[2,3],1]];;
gap> etaoutPetrial:="r0, r1 r3, r2, r3";;
gap> etaoutDual:="r3, r2, r1, r0";;
gap> etaoutMedial:="r1, r1, r0, r2, Id";;
gap> etaoutLeapfrog:="r1,r1,r2,r0,r0, , ";;
gap> etaoutTruncation:="r1, r1, r0, r2, r2,Id, Id";;
gap> Petrial(Cube(4)) =VoltageOperator(etain1, etaoutPetrial, Cube(4));
true
gap> Dual(Cube(4)) = VoltageOperator(etain1, etaoutDual, Cube(4));
true
gap> Medial(Dodecahedron()) = VoltageOperator(etain2, etaoutMedial, Dodecahedron());
true
gap> Leapfrog(Simplex(3)) = VoltageOperator(etain3, etaoutLeapfrog, Simplex(3));
true
114
RAMP 115
Example
gap> W:=Wythoffian([0,1],Dodecahedron());
3-maniplex with 360 flags
gap> W=Truncation(Dodecahedron());
true
gap> M := Wythoffian([1], Simplex(4));;
gap> Fvector(M);
[10, 30, 30, 10]
gap> VertexFigure(M) = Prism(3);
true
gap> Wythoffian([3], M) = Dual(M);
true
(1,3)(2,7)(4,11)(5,12)(6,13)(8,18)(9,19)(10,20)(14,25)(15,26)(16,27)(17,28)(21,32)(22,33)(23,34)(
(30,40)(31,41)(36,43)(37,44)(38,45)(42,47)(46,48) ] )
Databases
We are indebted to those who have made their data on polytopes and maps freely available. Data on
small regular polytopes is from Marston Conder:
https://www.math.auckland.ac.nz/~conder/RegularPolytopesWithUpTo4000Flags-ByOrder.txt
Data on small reflexible maniplexes was produced for RAMP by Mark Mixer.
Data on small chiral polytopes is from Marston Conder:
https://www.math.auckland.ac.nz/~conder/ChiralPolytopesWithUpTo4000Flags-ByOrder.txt
Data on small chiral maps is from Primoz Potocnik:
https://users.fmf.uni-lj.si/potocnik/work.htm
Data on small 2-orbit polyhedra in class 2_0 (available in Rank3AG_2_0.txt in the data folder)
was produced for RAMP by Mark Mixer.
Writes the data in maniplexes to the designated file, including the defining information and
the values of the attributes in attributeNames . This calls DatabaseString on each maniplex in
maniplexes to get the file representation.
15.1.2 ManiplexesFromFile
▷ ManiplexesFromFile(filename) (function)
Returns: IsList
Reads the maniplexes from filename in the data directory of RAMP and returns them as a list.
Note that for performance reasons, some safety checks are disabled for data read from a file. For exam-
ple, AbstractRegularPolytope usually checks its input to make sure that it defines a polytope, but
ManiplexesFromFile just assumes that any maniplex defined using AbstractRegularPolytope
really is a polytope.
119
RAMP 120
15.1.3 DegeneratePolyhedra
▷ DegeneratePolyhedra(sizerange) (function)
Returns: IsList
Gives all degenerate polyhedra (of type {2, q} and {p, 2}) with sizes in sizerange . Also accepts
a single integer maxsize as input to indicate a sizerange of [1..maxsize].
Example
gap> DegeneratePolyhedra(24);
[ AbstractRegularPolytope([ 2, 2 ]), AbstractRegularPolytope([ 2, 3 ]),
AbstractRegularPolytope([ 3, 2 ]), AbstractRegularPolytope([ 2, 4 ]),
AbstractRegularPolytope([ 4, 2 ]), AbstractRegularPolytope([ 2, 5 ]),
AbstractRegularPolytope([ 5, 2 ]), AbstractRegularPolytope([ 2, 6 ]),
AbstractRegularPolytope([ 6, 2 ]) ]
15.1.4 FlatRegularPolyhedra
▷ FlatRegularPolyhedra(sizerange) (function)
Returns: IsList
Gives all nondegenerate flat regular polyhedra with sizes in sizerange . Also accepts a single
integer maxsize as input to indicate a sizerange of [1..maxsize]. Currently supports a maxsize of
4000 or less.
Example
gap> FlatRegularPolyhedra([10..24]);
[ AbstractRegularPolytope([ 2, 3 ]), AbstractRegularPolytope([ 3, 2 ]),
AbstractRegularPolytope([ 2, 4 ]), AbstractRegularPolytope([ 4, 2 ]),
AbstractRegularPolytope([ 2, 5 ]), AbstractRegularPolytope([ 5, 2 ]),
AbstractRegularPolytope([ 4, 3 ], "r2 r1 r0 r1 = (r0 r1)^2 r1 (r1 r2)^1, r2 r1 r2 r1 r0 r1 = (r
r1)^3 (r1 r2)^2"),
ReflexibleManiplex([ 3, 4 ], "(r2*r1)^2*r1^2*r0*r1*r2*r1*r0,(r2*r1)^3*(r1*r0)^2*r1*r2*(r1*r0)^2
), AbstractRegularPolytope([ 2, 6 ]), AbstractRegularPolytope([ 6, 2 ]) ]
15.1.5 RegularToroidalPolyhedra44
▷ RegularToroidalPolyhedra44(sizerange) (function)
Returns: IsList
Gives all regular toroidal polyhedra of type {4, 4} with sizes in sizerange . Also accepts a single
integer maxsize as input to indicate a sizerange of [1..maxsize].
Example
gap> RegularToroidalPolyhedra44([60..100]);
[ AbstractRegularPolytope([ 4, 4 ], "(r0 r1 r2)^4"),
AbstractRegularPolytope([ 4, 4 ], "(r0 r1 r2 r1)^3") ]
15.1.6 RegularToroidalPolyhedra36
▷ RegularToroidalPolyhedra36(sizerange) (function)
Returns: IsList
Gives all regular toroidal polyhedra of type {3, 6} with sizes in sizerange . Also accepts a single
integer maxsize as input to indicate a sizerange of [1..maxsize].
RAMP 121
Example
gap> RegularToroidalPolyhedra36([100..150]);
[ AbstractRegularPolytope([ 3, 6 ], "(r0 r1 r2)^6"),
AbstractRegularPolytope([ 3, 6 ], "(r0 r1 r2 r1 r2)^4") ]
15.1.7 SmallRegularPolyhedraFromFile
▷ SmallRegularPolyhedraFromFile(sizerange) (function)
Returns: IsList
Gives all regular polyhedra with sizes in sizerange flags that are stored separately in a file.
These are polyhedra that are not part of one of several infinite families that are covered by the other
generators. The return value of this function is unstable and may change as more infinite familes of
polyhedra are identified and written as separate generators.
Example
gap> SmallRegularPolyhedraFromFile(64);
[ Simplex(3), AbstractRegularPolytope([ 3, 6 ], "(r2*r0*r1)^2*(r0*r2*r1)^2 "), CrossPolytope(3),
AbstractRegularPolytope([ 6, 3 ], "(r0*r2*r1)^2*(r2*r0*r1)^2 "), Cube(3),
AbstractRegularPolytope([ 5, 5 ], "r1*r2*r0*(r1*r0*r2)^2 "),
AbstractRegularPolytope([ 3, 5 ], "(r2*r0*r1)^3*(r0*r2*r1)^2 "),
AbstractRegularPolytope([ 5, 3 ], "(r0*r2*r1)^3*(r2*r0*r1)^2 ") ]
15.1.8 SmallRegularPolyhedra
▷ SmallRegularPolyhedra(sizerange) (function)
Returns: IsList
Gives all regular polyhedra with sizes in sizerange flags. Currently supports a maxsize of 4000
or less. You can also set options nondegenerate, nonflat, and nontoroidal.
Example
gap> L1 := SmallRegularPolyhedra(500);;
gap> L2 := SmallRegularPolyhedra(1000 : nondegenerate);;
gap> L3 := SmallRegularPolyhedra(2000 : nondegenerate, nonflat);;
gap> Length(SmallRegularPolyhedra(64));
53
15.1.9 SmallDegenerateRegular4Polytopes
▷ SmallDegenerateRegular4Polytopes(sizerange) (function)
Returns: IsList
Gives all degenerate regular 4-polytopes with sizes in sizerange flags. Currently supports a
maxsize of 8000 or less.
Example
gap> SmallDegenerateRegular4Polytopes([64]);
[ AbstractRegularPolytope([ 4, 2, 4 ]), AbstractRegularPolytope([ 2, 8, 2 ]),
regular 4-polytope of type [ 4, 4, 2 ] with 64 flags,
ReflexibleManiplex([ 2, 4, 4 ], "(r2*r1*r2*r3)^2,(r1*r2*r3*r2)^2") ]
RAMP 122
15.1.10 SmallRegular4Polytopes
▷ SmallRegular4Polytopes(sizerange) (function)
Returns: IsList
Gives all regular 4-polytopes with sizes in sizerange flags. Currently supports a maxsize of
4000 or less.
Example
gap> SmallRegular4Polytopes([100]);
[ AbstractRegularPolytope([ 5, 2, 5 ]) ]
15.1.11 SmallChiralPolyhedra
▷ SmallChiralPolyhedra(sizerange) (function)
Returns: IsList
Gives all chiral polyhedra with sizes in sizerange flags. Currently supports a maxsize of 4000
or less.
Example
gap> SmallChiralPolyhedra(100);
[ AbstractRotaryPolytope([ 4, 4 ], "s1*s2^-2*s1^2*s2^-1,(s1^-1*s2^-1)^2"),
AbstractRotaryPolytope([ 4, 4 ], "s2*s1^-1*s2*s1^2*s2^2*s1^-1,(s1^-1*s2^-1)^2"),
AbstractRotaryPolytope([ 3, 6 ], "s2^-1*s1*s2^-2*s1^-1*s2*s1^-1*s2^-2,(s1^-1*s2^-1)^2"),
AbstractRotaryPolytope([ 6, 3 ], "s1*s2^-1*s1^2*s2*s1^-1*s2*s1^2,(s2*s1)^2") ]
15.1.12 SmallChiral4Polytopes
▷ SmallChiral4Polytopes(sizerange) (function)
Returns: IsList
Gives all chiral 4-polytopes with sizes in sizerange flags. Currently supports a maxsize of 4000
or less.
Example
gap> SmallChiral4Polytopes([200..250]);
[ AbstractRotaryPolytope([ 3, 4, 4 ], "s3^-1*s2^-2*s1^-1*s3*s1,s2^-1*s3^-2*s2^2*s3,(s2^-1*s3^-1)^
AbstractRotaryPolytope([ 4, 4, 3 ], "s1*s2^2*s3*s1^-1*s3^-1,s2*s1^2*s2^-2*s1^-1,(s2*s1)^2,(s3*s
AbstractRotaryPolytope([ 4, 4, 4 ], "s2*s3^-2*s2^2*s3^-1,s3*s2*s1^-1*s3^2*s1,s3^-1*s2^-2*s1^-1*
15.1.13 SmallReflexible3Maniplexes
▷ SmallReflexible3Maniplexes(sizerange) (function)
Returns: IsList
Gives all regular 3-maniplexes with sizes in sizerange flags. Currently supports a maxsize of
2000 or less. If the option nonpolytopal is set, only returns maniplexes that are not polyhedra.
15.1.14 SmallChiral3Maniplexes
▷ SmallChiral3Maniplexes(sizerange) (function)
Returns: IsList
Gives all chiral 3-maniplexes with sizes in sizerange flags. Currently supports a maxsize of
12000 or less.
RAMP 123
15.1.15 SmallReflexibleManiplexes
▷ SmallReflexibleManiplexes(n, sizerange[, filt1, filt2, ...]) (function)
Returns: IsList
First finds a list of all reflexible maniplexes of rank n where the number of flags is in sizerange .
Then applies the given filters and returns the result. Each filter is either a function-value pair or
a boolean function. In the first case, we keep only those maniplexes such that applying the given
function returns the given value. In the second case, we keep only those maniplexes such that the
given boolean function returns true.
Example
gap> L := SmallReflexibleManiplexes(3, [100..200], IsPolytopal, [NumberOfVertices, 6]);;
gap> Size(L);
14
gap> ForAll(L, IsPolytopal);
true
gap> List(L, NumberOfVertices);
[ 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6 ]
15.1.16 SmallTwoOrbitPolyhedra
▷ SmallTwoOrbitPolyhedra(I, sizerange) (function)
Returns: IsList
Gives all two-orbit polyhedra in class 2I with sizes in sizerange flags. Currently supports a
maxsize of 1000 or less.
Example
gap> L := SmallTwoOrbitPolyhedra([0], 100);
[ TwoOrbit3ManiplexClass2_0([ 10, 4 ], " r0*a21*a101*a21^-1, r0*a21^-1*a101*r0*a101*a21 "),
TwoOrbit3ManiplexClass2_0([ 14, 3 ], " r0*a21*a101*a21^-1, r0*a101*a21*(a101*r0)^2*a21^-1 ") ]
Utility Functions
16.1 System
16.1.1 InfoRamp
▷ InfoRamp (info class)
The InfoClass for the Ramp package. This is sort of an "information channel" that functions can
send updates to, and by default, users of Ramp will see these messages. To add such a message to a
function that you are writing for Ramp, use Info(InfoRamp, 1, "This is a message!");. For
example, if you have a function f with this line, then the user will see this:
Example
gap> f(3);;
#I This is a message!
16.2 Polytopes
16.2.1 AbstractPolytope
▷ AbstractPolytope(args) (function)
Calls Maniplex(args) and verifies whether the output is polytopal. If not, this throws an error.
Use AbstractPolytopeNC to assume that the output is polytopal and mark it as such.
Example
gap> AbstractPolytope(Group([ (1,2)(3,4)(5,6)(7,8)(9,10), (1,10)(2,3)(4,5)(6,7)(8,9) ]));
Pgon(5)
16.2.2 AbstractRegularPolytope
▷ AbstractRegularPolytope(args) (function)
Calls ReflexibleManiplex(args) and verifies whether the output is polytopal. If not, this
throws an error. Use AbstractRegularPolytopeNC to assume that the output is polytopal and mark
it as such. Also available as ARP(args) and ARPNC(args).
125
RAMP 126
Example
gap> Pgon(5)=AbstractRegularPolytope(Group([(2,3)(4,5),(1,2)(3,4)]));
true
16.2.3 AbstractRotaryPolytope
▷ AbstractRotaryPolytope(args) (function)
Calls RotaryManiplex(args) and verifies whether the output is polytopal. If not, this throws an
error. Use AbstractRotaryPolytopeNC to assume that the output is polytopal and mark it as such.
Example
gap> M := AbstractRotaryPolytope(Group((1,2)(3,4), (1,4)(2,3)));
regular 3-polytope of type [ 2, 2 ] with 8 flags
gap> M := AbstractRotaryPolytope(Group((1,2,3,4), (1,2)));
Error, The given group is not a String Rotation Group...
16.3 Permutations
16.3.1 TranslatePerm
▷ TranslatePerm(perm, k) (function)
Returns a new permutation obtained from perm by adding k to each moved point.
Example
gap> TranslatePerm((1,2,3,4),5);
(6,7,8,9)
16.3.2 MultPerm
▷ MultPerm(perm, multiplier, offset) (function)
16.3.3 InvolutionListList
▷ InvolutionListList(list1, list2) (function)
Returns: involution
Construction the involution (when possible) with entries (list1[i],list2[i]).
Example
gap> InvolutionListList([3,4,5],[6,7,8]);
(3,6)(4,7)(5,8)
RAMP 127
For convenience, you may use z1, z2, etc and h1, h2, etc in relations, where zj means r0 (r1 r2)^j (the
"j-zigzag" word) and hj means r0 (r1 r2)^j-1 r1 (the "j-hole" word).
16.4.2 ParseRotGpRels
▷ ParseRotGpRels(rels, g) (function)
This helper function is used in several maniplex constructors. It is analogous to ParseGgiRels, but
for rotation groups instead.
RAMP 128
Example
gap> g := UniversalRotationGroup([4,4]);
<fp group of size infinity on the generators [ s1, s2 ]>
gap> rels := "(s1 s2^-1)^6";;
gap> newrels := ParseRotGpRels(rels, g);
[ (s1*s2^-1)^6 ]
gap> g2 := FactorGroupFpGroupByRels(g, newrels);
<fp group on the generators [ s1, s2 ]>
gap> M := RotaryManiplex(g2);
3-maniplex with 288 flags
gap> M = ToroidalMap44([6,0]);
true
16.4.3 StandardizeSggi
▷ StandardizeSggi(g) (function)
Returns: IsSggi
Takes an sggi, and returns an isomorphic sggi that is a quotient of the universal sggi of the appro-
priate rank.
Example
gap> f := FreeGroup("x","y","z");
<free group on the generators [ x, y, z ]>
gap> AssignGeneratorVariables(f);
#I Assigned the global variables [ x, y, z ]
gap> g := f / [x^2, y^2, z^2, (x*z)^2, (x*y)^4, (y*z)^4, (x*y*z)^6];
<fp group on the generators [ x, y, z ]>
gap> IsSggi(g);
true
gap> g2 := StandardizeSggi(g);
<fp group on the generators [ r0, r1, r2 ]>
gap> ReflexibleManiplex(g) = ReflexibleManiplex(g2);
true
16.4.4 AddOrAppend
▷ AddOrAppend(L, x) (function)
Given a list L and an object x , this calls Append(L, x) if x is a list; otherwise it calls Add(L,
x). Note that since strings are internally represented as lists, AddOrAppend(L, "foo") will append the
characters ’f’, ’o’, ’o’.
Example
gap> L := [1, 2, 3];;
gap> AddOrAppend(L, 4);
gap> L;
[1, 2, 3, 4]
gap> AddOrAppend(L, [5, 6]);
gap> L;
[1, 2, 3, 4, 5, 6];
RAMP 129
16.4.5 WrappedPosetOperation
▷ WrappedPosetOperation(posetOp) (function)
Given a poset operation, creates a bare-bones maniplex operation that delegates to the poset oper-
ation.
Example
gap> myjoin := WrappedPosetOperation(JoinProduct);
function( arg... ) ... end
gap> M := myjoin(Pgon(4), Vertex());
3-maniplex
gap> M = Pyramid(4);
true
Usually, you will want to eventually create a fuller-featured wrapper of the poset operation – one that
can infer more information from its arguments. But this method is a good way to quickly test whether
a poset operation works on maniplexes the way one expects.
16.4.8 ActionByGenerators
▷ ActionByGenerators(G, S, act) (function)
Returns a permutation group that represents the action of G on S as given by the action act .
Furthermore, the generators of this permutation group are the images of the generators of G .
Example
gap> g := Group([ (1,2)(3,4)(5,6)(7,8), (2,3)(6,7), (3,5)(4,6) ]);;
gap> ActionByGenerators(g, [[1,8],[2,7],[3,6],[4,5]], OnSets);
Group([ (1,2)(3,4), (2,3), (3,4) ])
16.4.9 ActionOnBlocks
▷ ActionOnBlocks(G, S, B) (function)
Given a group G acting on a set S and an initial block B , returns the action of G on the block system
induced by B . This is equivalent to ActionByGenerators(G, Blocks(G, S, B), OnSets).
RAMP 130
Example
gap> g := Group([ (1,2)(3,4)(5,6)(7,8), (2,3)(6,7), (3,5)(4,6) ]);;
gap> ActionOnBlocks(g, [1..8], [1,8]);
Group([ (1,2)(3,4), (2,3), (3,4) ])
16.4.10 VerifyProperties
▷ VerifyProperties(M) (function)
Returns: Boolean
Given a maniplex M , recalculates all of the stored properties (boolean attributes) and some of the
stored numeric attributes of M . Returns true if the recalculated values agree with the stored values.
Otherwise, outputs a list of which values had discrepancies and then returns false.
Note that the way that we recalculate the properties is to build a new maniplex from
ConnectionGroup(M ). So if this connection group is incorrect, then this method will not work as
intended.
Example
gap> M := Maniplex(ConnectionGroup(Cube(3)));;
gap> SetNumberOfFlagOrbits(M, 3);
gap> VerifyProperties(M);
Value mismatch in NumberOfFlagOrbits: stored value is 3 and real value is 1
false
Chapter 17
131
References
[BPW17] Leah Wrenn Berman, Tomaž Pisanski, and Gordon Ian Williams. Operations on ori-
ented maps. Symmetry, 9(11):274, 1–14, November 2017. 80
[CDRFHT15] Gabe Cunningham, María Del Río-Francos, Isabel Hubard, and Micael Toledo. Sym-
metry type graphs of polytopes and maniplexes. Ann. Comb., 19(2):243–268, 2015.
30, 31
[CM17] Gabe Cunningham and Mark Mixer. Internal and external duality in abstract polytopes.
Contrib. Discrete Math., 12(2):187–214, 2017. 29, 30, 66, 67
[CPW22] Gabe Cunningham, Daniel Pellicer, and Gordon Ian Williams. Stratified operations on
maniplexes. Algebr. Comb., 2022. 75
[Cun21] Gabe Cunningham. Flat extensions of abstract polytopes. Art Discrete Appl. Math.,
4(3):Paper No. 3.06, 14, 2021. 65
[dRF14] María del Río Francos. Chamfering operation on k-orbit maps. Ars Math. Contemp.,
7(2):507–524, 2014. 80
[GH18] Ian Gleason and Isabel Hubard. Products of abstract polytopes. Journal of Combina-
torial Theory, Series A, 157:287–320, jul 2018. 102
[GVH18] Jorge Garza-Vargas and Isabel Hubard. Polytopality of maniplexes. Discrete Math.,
341(7):2068–2079, 2018. 23
[HW10] Michael I. Hartley and Gordon I. Williams. Representing the sporadic archimedean
polyhedra as abstract polytopes. Discrete Mathematics, 310(12):1835–1844, jun 2010.
34
[MPW12] Barry Monson, Daniel Pellicer, and Gordon Williams. The tomotope. Ars Mathematica
Contemporanea, 5(2):355–370, jun 2012. 32
[MPW14] B. Monson, Daniel Pellicer, and Gordon Williams. Mixing and monodromy of abstract
polytopes. Transactions of the American Mathematical Society, 366(5):2651–2681,
nov 2014. 87
[MS02] Peter McMullen and Egon Schulte. Abstract Regular Polytopes. Cambridge University
Press, dec 2002. 87, 91
[Pel18] Daniel Pellicer. Cleaved abstract polytopes. Combinatorica, 38(3):709–737, mar 2018.
91
132
RAMP 133
[PW18] Daniel Pellicer and Gordon Ian Williams. Pyramids over regular 3-tori. SIAM Journal
on Discrete Mathematics, 32(1):249–265, jan 2018. 74
[Wil12] Steve Wilson. Maniplexes: Part 1: Maps, polytopes, symmetry and operators. Symme-
try, 4(2):265–275, apr 2012. 87
Index
134
RAMP 135
CartesianProduct CtoL
for IsManiplex, IsManiplex, 72 for IsInt,IsInt,IsInt,IsInt, 71
for IsPoset,IsPoset, 102 Cube
Chamfer for IsInt, 25
for IsMapOnSurface, 80 CubicTiling
ChangeVoltage for IsInt, 27
for IsVoltageGraph,IsInt,IsInt, IsObject, 117 CubicToroid
for IsVoltageGraph,IsList, IsObject, 117 for IsInt,IsInt,IsInt, 33
ChiralityGroup for IsInt,IsList, 33
for IsRotaryManiplex, 51 Cuboctahedron, 34
ChunkGeneratedGroup CyclicGgi
for IsList, IsPermGroup, 75 for IsList, IsList, 10
ChunkGeneratedGroupElements
for IsList, IsGroup, 74 DatabaseString
ChunkMultiply for IsManiplex, 123
for IsList,IsList, 74 DegeneratePolyhedra, 120
ChunkPower Deltak
for IsList,IsInt, 74 for IsInt, 77
CirculantGraph DerivedGraph
for IsInt,IsList, 104 for IsList,IsList,IsList, 112
Cleave for IsVoltageGraph, 117
for IsPoset,IsInt, 91 DirectDerivates
CombinatorialMap for IsManiplex, 68
for IsMapOnSurface, 81 DirectedGraphFromListOfEdges
Comix for IsList,IsList, 105
for IsFpGroup, IsFpGroup, 71 DirectSumOfManiplexes
for IsReflexibleManiplex, IsReflexibleMani- for IsManiplex, IsManiplex, 73
plex, 71 DirectSumOfPosets
CompleteBipartiteGraph for IsPoset,IsPoset, 102
for IsInt,IsInt, 104 Dodecahedron, 27
ConnectedComponents Dual
for IsEdgeLabeledGraph, IsList, 110 for IsManiplex, 66
ConnectionGeneratorOfPoset DualPoset
for IsPoset,IsInt, 97 for IsPoset, 90
ConnectionGroup
Edge, 25
for IsEdgeLabeledGraph, 112
EdgeLabeledGraphFromEdges
for IsPoset, 97
for IsList, IsList,IsList, 109
for IsPremaniplex, 50
EdgeLabeledGraphFromLabeledEdges
CoSkeleton
for IsList, 109
for IsManiplex, 108
EdgeLabelPreservingAutomorphismGroup
CPRGraphFromGroups
for IsEdgeLabeledGraph, 110
for IsGroup,IsGroup, 111
ElementsList
Cross
for IsPoset, 92
for IsMapOnSurface, 86
EnantiomorphicForm
CrossPolytope
for IsManiplex, 22
for IsInt, 26
Epsilonk
RAMP 136
PosetElementFromIndex QuotientManiplexByAutomorphismSubgroup
for IsObject, 100 for IsManiplex,IsPermGroup, 63
PosetElementFromListOfFlags QuotientSggi
for IsList,IsPoset,IsInt, 99 for IsGroup, IsList, 63
PosetElementWithOrder QuotientSggiByNormalSubgroup
for IsObject,IsFunction, 99 for IsGroup,IsGroup, 63
PosetElementWithPartialOrder
for IsObject, IsBinaryRelation, 100 RankedFaceListOfPoset
PosetFromAtomicList for IsPoset, 96
for IsList, 89 RankInPoset
PosetFromConnectionGroup for IsPosetElement,IsPoset, 101
for IsPermGroup, 88 RankManiplex
PosetFromElements for IsPremaniplex, 38
for IsList,IsFunction, 89 RankPoset
PosetFromFaceListOfFlags for IsPoset, 92
for IsList, 87 RankPosetElements
PosetFromManiplex for IsPoset, 98
for IsManiplex, 88 RanksInPosets
PosetFromPartialOrder for IsPosetElement, 100
for IsBinaryRelation, 88 ReallyNaturalHomomorphismByNormal-
PosetFromSuccessorList Subgroup
for IsList, 90 for IsGroup,IsGroup, 129
PosetIsomorphism Reflection
for IsPoset,IsPoset, 96 for IsManiplex, 82
Premaniplex ReflexibleManiplex
for IsEdgeLabeledGraph, 19 for IsList, 20
for IsGroup, 19 for IsList, IsList, IsList, 20
PRGraph for IsString, 20
for IsGroup, 111 ReflexiblePremaniplex
Prism for IsGroup, 21
for IsInt, 72 ReflexibleQuotientManiplex
for IsManiplex, 72 for IsManiplex, IsList, 62
Propeller RegularToroidalPolyhedra36, 120
for IsMapOnSurface, 85 RegularToroidalPolyhedra44, 120
Pseudorhombicuboctahedron, 36 RotaryManiplex
PseudoSchlafliSymbol for IsGroup, 21
for IsManiplex, 43 for IsList, 21
Pyramid for IsList, IsList, 21
for IsInt, 71 for IsList, IsList, IsList, 21
for IsManiplex, 71 RotationGroup
for IsManiplex, 50
Quinto RotationGroupFpGroup
for IsMapOnSurface, 85 for IsManiplex, 50
QuotientByLabel RotGpElement
for IsObject,IsList, IsList, IsList, 108 for IsGroup, IsString, 14
QuotientManiplex
for IsReflexibleManiplex, IsString, 62 SatisfiesPathIntersectionProperty
RAMP 141
VerifyProperties, 130
VertDegrees
for IsManiplex, 41
Vertex, 25
VertexFigure
for IsManiplex, 40
for IsManiplex, IsInt, 40
VertexFigures
for IsManiplex, 40
VertexFigureSubgroup
for IsGroup, 16
VertexList
for IsManiplex, 41
ViewGraph
for IsObject, IsString, 112
VoltageGraph
for IsGroup,IsList,IsList, 116
for IsGroup,IsPremaniplex, 117
for IsGroup,IsPremaniplex,IsList, 116
VoltageOperator
for IsList, IsString,IsEdgeLabeledGraph, 114
for IsList, IsString,IsManiplex, 114
for IsVoltageGraph, IsManiplex, 117
for IsVoltageGraph,IsEdgeLabeledGraph,
118
Volute