diff --git a/posts/pentagons/1/index.qmd b/posts/pentagons/1/index.qmd
index 21b1689..73edb33 100644
--- a/posts/pentagons/1/index.qmd
+++ b/posts/pentagons/1/index.qmd
@@ -53,6 +53,14 @@ class PolyData:
vertex_count: int
edge_count: int
+ @classmethod
+ def from_hexagons(cls, hexagon_count: int):
+ return cls(
+ hexagon_count=hexagon_count,
+ vertex_count=2*hexagon_count + 20,
+ edge_count=3*hexagon_count + 30,
+ )
+
@dataclass
class GoldbergData:
@@ -151,6 +159,11 @@ Thus, by asserting that the figure is composed of pentagons and hexagons,
This is the case even if there are no hexagons, in which case we are describing a dodecahedron
(which, incidentally, has 20 vertices).
+Consequently, we get an expression for the number of vertices and edges in terms of the number of hexagons.
+
+- $3V = 6F_6 + 5 F_5 = 6F_6 + 60 = 3V \implies V = 2F_6 + 20$
+- $2V = 6F_6 + 5 F_5 \implies E = 3F_6 + 30$
+
### Duality
@@ -417,7 +430,7 @@ $$
\end{align*}
$$
-Giving an equal share of triangles to each pentagon as before, each has $\|(a, b)\|$ triangles.
+Giving an equal share of triangles to each pentagon as before, each has $\|a + bu\|$ triangles.
### Triangles to Hexagons
@@ -455,8 +468,8 @@ Beyond Soccer Balls
-------------------
The three cases of paths as described above are also used to delineate classes of Goldberg polyhedra.
-Only class I and II polyhedra produce figures which are mirror-symmetric.
-Class III polyhedra come in chiral pairs, due to the choice of a clockwise turn in their construction.
+Only class I and II polyhedra produce figures which are mirror-symmetric ($I_h$, which contains $I$).
+Class III polyhedra lack this; they come in chiral pairs due to the choice of a clockwise turn in their construction.
### Basic Conway Operators
@@ -630,12 +643,7 @@ goldberg_classes = {
def poly_from_dodecahedral_goldberg_parameter(parameter: tuple[int, int]):
a, b = parameter
hexagon_count = 10*(a*a + a*b + b*b - 1)
- vertex_count = (60 + 6*hexagon_count) // 3
- return PolyData(
- hexagon_count=hexagon_count,
- vertex_count=vertex_count,
- edge_count=(vertex_count * 3) // 2,
- )
+ return PolyData.from_hexagons(hexagon_count)
def goldberg_table_row(data: GoldbergData) -> list[str]:
@@ -655,7 +663,7 @@ def goldberg_table_row(data: GoldbergData) -> list[str]:
Markdown(tabulate(
[
- ([class_] if i == 0 else [""]) + goldberg_table_row(item)
+ ([class_ if i == 0 else ""]) + goldberg_table_row(item)
for class_, items in goldberg_classes.items()
for i, item in enumerate(items)
],
diff --git a/posts/pentagons/2/primitive e2 net.png b/posts/pentagons/2/edge_chamfer2_net.png
similarity index 100%
rename from posts/pentagons/2/primitive e2 net.png
rename to posts/pentagons/2/edge_chamfer2_net.png
diff --git a/posts/pentagons/2/primitive e2 graph.png b/posts/pentagons/2/edge_chamfer2_planar.png
similarity index 100%
rename from posts/pentagons/2/primitive e2 graph.png
rename to posts/pentagons/2/edge_chamfer2_planar.png
diff --git a/posts/pentagons/2/penta edge 2 net.png b/posts/pentagons/2/edge_chamfer3_net.png
similarity index 100%
rename from posts/pentagons/2/penta edge 2 net.png
rename to posts/pentagons/2/edge_chamfer3_net.png
diff --git a/posts/pentagons/2/penta edge 2 graph.png b/posts/pentagons/2/edge_chamfer3_planar.png
similarity index 100%
rename from posts/pentagons/2/penta edge 2 graph.png
rename to posts/pentagons/2/edge_chamfer3_planar.png
diff --git a/posts/pentagons/2/edge_solution_triangles.png b/posts/pentagons/2/edge_solution_triangles.png
new file mode 100644
index 0000000..ca47957
Binary files /dev/null and b/posts/pentagons/2/edge_solution_triangles.png differ
diff --git a/posts/pentagons/2/edge_whirl_net.png b/posts/pentagons/2/edge_whirl_net.png
new file mode 100644
index 0000000..570ac2c
Binary files /dev/null and b/posts/pentagons/2/edge_whirl_net.png differ
diff --git a/posts/pentagons/2/penta edge whirl net.png b/posts/pentagons/2/edge_whirl_net_bad.png
similarity index 100%
rename from posts/pentagons/2/penta edge whirl net.png
rename to posts/pentagons/2/edge_whirl_net_bad.png
diff --git a/posts/pentagons/2/edge_whirl_paths.png b/posts/pentagons/2/edge_whirl_paths.png
new file mode 100644
index 0000000..5692e2c
Binary files /dev/null and b/posts/pentagons/2/edge_whirl_paths.png differ
diff --git a/posts/pentagons/2/edge_whirl_planar.png b/posts/pentagons/2/edge_whirl_planar.png
new file mode 100644
index 0000000..49cf456
Binary files /dev/null and b/posts/pentagons/2/edge_whirl_planar.png differ
diff --git a/posts/pentagons/2/goldberg_triangles.py b/posts/pentagons/2/goldberg_triangles.py
new file mode 120000
index 0000000..84f40de
--- /dev/null
+++ b/posts/pentagons/2/goldberg_triangles.py
@@ -0,0 +1 @@
+../1/goldberg_triangles.py
\ No newline at end of file
diff --git a/posts/pentagons/2/index.qmd b/posts/pentagons/2/index.qmd
index ba3a4a4..89ab12e 100644
--- a/posts/pentagons/2/index.qmd
+++ b/posts/pentagons/2/index.qmd
@@ -1,237 +1,556 @@
---
+title: "12 Pentagons, Part 2"
+description: |
+ There are 12 pentagons. Why stop at dodecahedra?
format:
html:
html-math-method: katex
jupyter: python3
+date: "2021-06-04"
+date-modified: "2025-03-16"
+categories:
+ - geometry
+ - combinatorics
+ - symmetry
+# Get rid of the figure label
+crossref:
+ fig-title: ""
+ fig-labels: " "
+ tbl-title: ""
+ tbl-labels: " "
+ title-delim: ""
+ custom:
+ - key: fig
+ kind: float
+ reference-prefix: Figure
+ space-before-numbering: false
+ - key: tbl
+ kind: float
+ reference-prefix: Table
+ space-before-numbering: false
---
+```{python}
+#| echo: false
-12 Pentagons, Part 2
-====================
+from dataclasses import dataclass, field
+import itertools
+from typing import Literal
+
+from IPython.display import Markdown
+import matplotlib.pyplot as plt
+import numpy as np
+from tabulate import tabulate
+
+import goldberg_triangles
+
+polyhedronisme = lambda x, y: f"[{x}](https://levskaya.github.io/polyhedronisme/?recipe={y})"
+
+@dataclass
+class PolyData:
+ hexagon_count: int
+ vertex_count: int
+ edge_count: int
+
+ @classmethod
+ def from_hexagons(cls, hexagon_count: int):
+ return cls(
+ hexagon_count=hexagon_count,
+ vertex_count=2*hexagon_count + 20,
+ edge_count=3*hexagon_count + 30,
+ )
+
+
+@dataclass
+class GoldbergData:
+ parameter: tuple[int, int]
+ conway: str
+
+ parameter_link: str | None = None
+ conway_recipe: str | None = None
+
+ extra: list = field(default_factory=list)
+```
This is the second part in an investigation into answering the following question:
-> A soccer ball is a (roughly spherical) figure made of pentagons and hexagons, each meeting 3 at a point. [T]here are 12 pentagons...how many hexagons can there be?
+> A soccer ball is a (roughly spherical) figure made of pentagons and hexagons, each meeting 3 at a point.
+ [T]here are 12 pentagons...how many hexagons can there be?
-The [post prior to this one]() proved the 12 pentagons portion as well as outlined an entire solution class: (dodecahedral) Goldberg polyhedra. However, there exist more obscure solutions missed by this construction.
+The [post prior to this one](../1) proved the 12 pentagons portion
+ as well as outlined an entire solution class: (dodecahedral) Goldberg polyhedra.
+
+Despite these solutions being interesting in their own right, I grew preoccupied
+ with finding other, more obscure solutions missed by this construction.
Twelve is Four Triples
----------------------
-A key characteristic of the solution polyhedra is that each vertex is of degree three. It would be extraordinarily convenient if The post prior to this one proved the 12 pentagons portion as well as outlined an entire solution class: (dodecahedral) Goldberg polyhedra. However, there exist more obscure solutions missed by this construction.three pentagons came together at a vertex, or in the parlance of the previous post, a $V_3$. There are four triples, so there are four vertices. Fortunately, there exists a Platonic solid with four vertices whose symmetries we can exploit: the tetrahedron.
+A key characteristic of the solution polyhedra is that each vertex is of degree three ($3V = 2E$).
+It would be extraordinarily convenient if three pentagons came together at a vertex,
+ or in the parlance of the previous post, a $V^3$.
+Since there are 12 pentagons, there must be four vertices.
+
+Fortunately, there exists a Platonic solid with four vertices whose symmetries we can exploit: the tetrahedron.
### Extended Goldberg Polyhedra
-The tetrahedron's vertex configuration ($3V = 2E$) qualifies it to undergo Goldberg construction. Recall the triangular plane and hexagonal paths from the previous part (presented again here for convenience)
+All vertices in the tetrahedron are of degree 3.
+This qualifies it to undergo Goldberg construction[^1].
+Recall the triangular plane and hexagonal paths from the previous part
+ (presented again here for convenience):
-::: {}
-
+[^1]:
+
+ The equation we used to obtain the "12 pentagons" figure also applies
+ to the tetrahedron, with some adjustments:
+
+ $$
+ \begin{align*}
+ \chi &= V - E + F_3 + F_n \\
+ 2n\chi
+ &= 2nV - \textcolor{red}{2nE} + 2nF_3 + 2nF_n + \textcolor{blue}{0}\\
+ &= 2nV
+ - \textcolor{red}{\stackrel{3V = 2E}{3nV}}
+ + 2nF_3
+ + 2nF_n
+ + \textcolor{blue}{\stackrel{3V = 3F_3 + nF_n}{
+ 6V
+ - 6F_3
+ - 2nF_n
+ }} \\
+ &= (6 - n)V + (2n - 6)F_3 \\
+ &= 4n
+ \end{align*}
+ $$
+
+ From this, it is discerned that there are 4 vertices ($n = 3$)
+ or 4 trianglar faces ($n = 6$), with the rest of the faces being hexagons.
+
+
+::: {.row width="100%"}
+```{python}
+#| echo: false
+
+goldberg_triangles.draw_sector((4, 2), path=True)
+plt.show()
+```
:::
-Instead of the red, green, and blue triangles being part of a larger pentagon, they can also be considered as whole triangles with a sector on each edge. Supposing a tetrahedron is made into a Goldberg polyhedron, where does that get us? Well for starters, we know there are:
+When applying the construction to the dodecahedron, the red, green, and blue triangles were
+ supposed to be part of a pentagon.
+Instead, the triangles can also be considered as whole triangles bordering a sector.
+Just like in the dodecahedral case,
+ Class I polyhedra build hexagons in the shape of gnomons of centered hexagonal numbers,
+ Class II polyhedra build them in the shape of triangular numbers,
+ and Class III build them in the shape of figures with triangular symmetry.
+
+Supposing a tetrahedron is made into a Goldberg polyhedron, where does that get us?
+Well for starters, we know there are:
$$
\begin{gather*}
-{\|a +bu\| – 1 \over 6} \scriptsize {\text{hexagons} \over \text{sector}} \normalsize \cdot 3 \scriptsize {\text{sectors} \over \text{triangle}} \normalsize \cdot 4 \scriptsize \text{ triangles} \normalsize \\ \\
-= 2(\|a +bu\| – 1) \text{ hexagons}
+ {\|a + bu\|\ –\ 1 \over 6}
+ \scriptsize {\text{hexagons} \over \text{sector}}
+ \normalsize \cdot 3
+ \scriptsize {\text{sectors} \over \text{triangle}}
+ \normalsize \cdot 4 \scriptsize \text{ triangles}
+ \normalsize \\[4pt]
+ = 2(\|a +bu\|\ –\ 1) \text{ hexagons}
\end{gather*}
$$
-Next, cap each triangular face by extending the non-coplanar edges into a vertex. This transforms the 3 hexagons around each of the 4 triangles into pentagons. There are now 12 pentagons and $2(\|a +bu\| – 1) - 12 = 2\|a +bu\| – 14$ hexagons. This is a sort of "antitruncation", since the process in reverse is truncation. Rather than selecting for the degree, this type of truncation selects for the vertex configuration: that of having three pentagons meeting at it.
+The figure produced by this construction also must have
+ [tetrahedral symmetry](https://en.wikipedia.org/wiki/Tetrahedral_symmetry) ($T$),
+ since it was constructed from the tetrahedron.
+This symmetry occurs within icosahedral symmetry, which we've already explored.
+
+To transform this figure into a true solution, recognize that each triangle shares an edge with 3 hexagons.
+If the triangle is "capped" such that all three adjacent faces are made to meet at a vertex,
+ then the hexagons turn into pentagons.
+There are now 12 pentagons and 12 fewer hexagons than there were previously, or $2\|a +bu\|\ –\ 14$.
+
+This can be considered an opposite process to truncation, or "antitruncation".
+Rather than selecting for the degree, this type of truncation selects for the vertex configuration:
+ that of having three pentagons meeting at it ($V^3$).
-### Problems and Solutions
+### Negative Hexagons?
-There is a slight problem with the expression for the number of hexagons: the norms of (1, 0), (1, 1), (2, 0), and (2, 1) are all less than or equal to 7. This is because the antitruncations correspond to one of the three Platonic solids with 3 faces to an vertex:
+There is a slight problem with the above expression.
+The norms of (1, 0), (1, 1), (2, 0), and (2, 1) are all less than or equal to 7,
+ which implies a negative number of hexagons.
+This is because the antitruncations correspond to one of the three Platonic solids with 3 faces to an vertex:
-::: {}
-
+::: {layout-ncol="2"}
+
-(1, 0): T
-Antitruncation: dT = T
-:::
+
-::: {}
-
+
-(1, 1): tT
-Antitruncation: T
-:::
-
-::: {}
-
-
-(2, 0): cT
-Antitruncation: C
-:::
-
-::: {}
-
-
-(2, 1): wT
-Antitruncation: D
+
:::
With these exceptional cases taken care of, the table of solution polyhedra of this form is as follows:
```{python}
-#| label: tbl-antitruncation
#| echo: false
+#| label: tbl-antitruncation
+#| classes: plain
+#| tbl-cap: \\\* higher-order whirl needed
\\\*\\\* Unknown. Possibly nonexistent under standard operators
-from IPython.display import Markdown
-from tabulate import tabulate
-polyhedronisme = lambda x, y: f"[{x}](https://levskaya.github.io/polyhedronisme/?recipe={y})"
+norm = lambda a, b: a**2 + a*b + b**2
+count_dodecahedral = lambda a, b: 10*norm(a, b) - 10
+count_tetrahedral = lambda a, b: 2*norm(a, b) - 14
+
+tetrahedral_goldberg_classes = {
+ "I": [
+ GoldbergData(
+ parameter=(1, 0),
+ extra=[polyhedronisme("T", "T")],
+ conway="dT",
+ conway_recipe="dT",
+ ),
+ GoldbergData(
+ parameter=(2, 0),
+ extra=[polyhedronisme("cT", "K300cT")],
+ conway="C",
+ conway_recipe="C",
+ ),
+ GoldbergData(
+ parameter=(3, 0),
+ extra=[polyhedronisme("du3T = tkT", "K300tkT")],
+ conway="t6kT",
+ conway_recipe="K300t6kT",
+ ),
+ GoldbergData(
+ parameter=(4, 0),
+ extra=[polyhedronisme("duuT = ccT", "K300duC30uT")],
+ conway="t6juT",
+ conway_recipe="C300t6juT",
+ ),
+ GoldbergData(
+ parameter=(5, 0),
+ extra=[polyhedronisme("du5T", "K300duC30uT")],
+ conway="**",
+ ),
+ GoldbergData(
+ parameter=(6, 0),
+ extra=[polyhedronisme("duu3T = ctkT", "K300duK300dtkT")],
+ conway="K300",
+ conway_recipe="K300t6kcT",
+ ),
+ ],
+ "II": [
+ GoldbergData(
+ parameter=(1, 1),
+ extra=[polyhedronisme("tT", "tT")],
+ conway="T",
+ conway_recipe="T",
+ ),
+ GoldbergData(
+ parameter=(2, 2),
+ extra=[polyhedronisme("ctT", "K300duK30dtT")],
+ conway="t6uT",
+ conway_recipe="K300t6uT",
+ ),
+ GoldbergData(
+ parameter=(3, 3),
+ extra=[polyhedronisme("tktT", "K300tktT")],
+ conway="t6ktT",
+ conway_recipe="K30t6ktT",
+ ),
+ GoldbergData(
+ parameter=(4, 4),
+ extra=[polyhedronisme("duuT = cctT", "K300duC30uT")],
+ conway="t6uuT",
+ conway_recipe="K300t6uK30dK30duT",
+ ),
+ ],
+ "III": [
+ GoldbergData(
+ parameter=(2, 1),
+ extra=[polyhedronisme("wT", "K300wT")],
+ conway="D",
+ conway_recipe="D",
+ ),
+ GoldbergData(
+ parameter=(3, 1),
+ extra=["*"],
+ conway="*",
+ ),
+ GoldbergData(
+ parameter=(3, 2),
+ extra=["*"],
+ conway="*",
+ ),
+ GoldbergData(
+ parameter=(4, 1),
+ extra=[polyhedronisme("wtT", "K300wK30tT")],
+ conway="t6gtT",
+ conway_recipe="K300t6gK30tT",
+ ),
+ GoldbergData(
+ parameter=(4, 2),
+ extra=[polyhedronisme("wcT", "K300wK30cT")],
+ conway="t6guT = t6gcT",
+ conway_recipe="K300t6gK30cT",
+ ),
+ ],
+}
+
+
+def poly_from_tetrahedral_goldberg_parameter(parameter: tuple[int, int]):
+ a, b = parameter
+ hexagon_count = count_tetrahedral(a, b)
+ return PolyData.from_hexagons(hexagon_count)
+
+
+def tetrahedral_goldberg_table_row(data: GoldbergData) -> list[str]:
+ poly_data = poly_from_tetrahedral_goldberg_parameter(data.parameter)
+ return [
+ str(data.parameter),
+ *map(str, data.extra),
+ str(poly_data.hexagon_count),
+ str(poly_data.vertex_count),
+ str(poly_data.edge_count),
+ polyhedronisme(data.conway, data.conway_recipe)
+ if data.conway_recipe is not None
+ else str(data.conway)
+ ]
-class1 = [
- ["(1, 0)", polyhedronisme("T", "T"), -12, "-", "-", polyhedronisme("dT", "dT")],
- ["(2, 0)", polyhedronisme("cT", "K300cT"), -6, "-", "-", polyhedronisme("C", "C")],
- ["(3, 0)", polyhedronisme("du3T = tkT", "K300tkT"), 4, 28, 42, polyhedronisme("t6kT", "K300t6kT")],
- ["(4, 0)", polyhedronisme("duuT = ccT", "K300duC30uT"), 18, 56, 84, polyhedronisme("t6juT", "C300t6juT")],
- ["(5, 0)", polyhedronisme("du5T", "K300duC30uT"), 36, 92, 138, "**"],
- ["(6, 0)", polyhedronisme("duu3T = ctkT", "K300duK300dtkT"), 58, 136, 204, polyhedronisme("t6kcT", "K300t6kcT")],
-]
-class2 = [
- ["(1, 1)", polyhedronisme("tT", "T"), -8, "-", "-", polyhedronisme("T", "T")],
- ["(2, 2)", polyhedronisme("ctT", "K300duK30dtT"), 10, 40, 60, polyhedronisme("t6uT", "K300t6uT")],
- ["(3, 3)", polyhedronisme("tktT", "K300tktT"), 40, 100, 150, polyhedronisme("t6ktT", "K30t6ktT")],
- ["(4, 4)", polyhedronisme("cctT", "K300duC30uT"), 82, 184, 276, polyhedronisme("t6uuT", "K300t6uK30dK30duT")],
-]
-class3 = [
- ["(2, 1)", polyhedronisme("wT", "K300wT"), 0, "-", "-", polyhedronisme("D", "D")],
- ["(3, 1)", "*", 12, 44, 66, "*"],
- ["(3, 2)", "*", 24, 48, 102, "*"],
- ["(4, 1)", polyhedronisme("wtT", "K300wK30tT"), 28, 76, 114, polyhedronisme("t6gtT", "K300t6gK30tT")],
- ["(4, 2)", polyhedronisme("wcT", "K300wK30cT"), 42, 104, 156, polyhedronisme("t6guT = t6gcT", "K300t6gK30cT")],
-]
Markdown(tabulate(
[
- [class_name if i == 0 else ""] + row
- for class_, class_name in zip([class1, class2, class3], ["I", "II", "III"])
- for i, row in enumerate(class_)
+ ([class_ if i == 0 else ""]) + tetrahedral_goldberg_table_row(item)
+ for class_, items in tetrahedral_goldberg_classes.items()
+ for i, item in enumerate(items)
],
- headers=["Class","Tuple", "Conway", "$F_6$", "V", "E", "Conway"],
- numalign="center",
- stralign="center",
+ headers=["Class", "Parameter", "Conway (Trunc)", "$F_6$", "V", "E", "Conway"],
+ numalign="left",
))
```
-::: {}
-\* higher-order whirl needed
-\*\* Unknown. Possibly nonexistent under standard operators
-:::
-Note that the links in the above table may have recipes do not match their entry. Rather, the recipe is equivalent to the simpler string given to ensure the viewer can stably generate the output shape. The operators g and j, which I did not introduce previously, were also used; rather than explaining their intuitive meaning, see [the Wikipedia article](https://en.wikipedia.org/wiki/Conway_polyhedron_notation) instead.
+The operators *g* and *j*, which I did not introduce previously, appear in the above table.
+Rather than explaining their intuitive meaning, see
+ [the Wikipedia article](https://en.wikipedia.org/wiki/Conway_polyhedron_notation)
+ instead.
-The smallest "real" tetrahedral solution has 4 hexagonal faces. This is the [(order-6) truncated triakis tetrahedron](https://en.wikipedia.org/wiki/Truncated_triakis_tetrahedron), which can be discerned by reading its Conway notation. The $V_3$s are arranged on the faces of a tetrahedron owing to the construction, and the hexagons are arranged on the vertices. Alternatively, on the dual to this imaginary tetrahedron, the faces map to faces and the vertices to vertices.
+Note also that the links in the above table may have recipes do not match their entry.
+Rather, the recipe is equivalent to the simpler string in the table to ensure the viewer
+ can stably generate the output shape.
-::: {}
-
+The smallest "real" tetrahedral solution has 4 hexagonal faces.
+This is the
+ [(order-6) truncated triakis tetrahedron](https://en.wikipedia.org/wiki/Truncated_triakis_tetrahedron),
+ which corresponds nicely with its Conway notation $t_6kT$.
-Truncated triakis tetrahedron, t6kT
-:::
-
-It can be observed that higher-order class I polyhedra expand these hexagons into larger hexagons as in the centered hexagonal numbers. Similarly, higher-order class II polyhedra form triples of triangular numbers. Other figures made of hexagons with triangular symmetry fall under class III.
+
### Solution Non-Exclusivity
-Is it possible for any of these tetrahedral Goldberg solutions to also be dodecahedral Goldberg solutions? For this to be the case,
+Is it possible for the number of hexagons in a tetrahedral Goldberg solutions
+ to coincide with that of a dodecahedral Goldberg solutions?
+For this to be the case,
$$
\begin{align*}
-2\|m + nu\| - 14 &= 10\|a + bu\| - 10 \\
-\|m + nu\| - 2 &= 5\|a + bu\|, \text{ for } a, b, m, n \in \mathbb{Z} \\
-\|m + nu\| &\equiv 2\ (\text{mod } 5)
+ \stackrel{\text{Tetrahedral}}{2\|m + nu\| - 14}
+ &= \stackrel{\text{Dodecahedral}}{10\|a + bu\| - 10}
+ , \text{ for } a, b, m, n \in \mathbb{Z} \\
+ \|m + nu\| - 2 &= 5\|a + bu\| \\
+ \|m + nu\| &\equiv 2\ (\text{mod } 5)
\end{align*}
$$
-Class I tetrahedral antitruncations have a norm which is a square number, but 2 is not among the squares mod 5, so they will never intersect dodecahedral solutions. However, class II and III solutions congruent to (2, 2) or (3, 3) (mod 5) have the correct multiplicity, the former of which is reflected in the solution table above. Class II solutions turn out to be a red herring, since $5\|a, b\|$ is never congruent to 1 (= -2, mod 3). Only tetrahedral class III collisions exist, either congruent to the pairs above or to (1, 2), (2, 1), (3, 4), or (4, 3) (mod 5). The equivalent pairs for the first few solution parameters are:
+Class I parameters have a norm which is a square number,
+ but 2 is not among the squares mod 5,
+ so the tetrahedral solutions will never intersect dodecahedral solutions.
- Dodecahedral Parameter | Tetrahedral Parameter | $F_6$
-------------------------|-----------------------|-------
-(1, 0) | (2, 1) | 0
-(2, 1) | (4, 3) | 60
-(3, 1) | (7, 2) | 120
-(3, 2) | (8, 3) | 180
-(5, 0) | (7, 6) | 240
-(5, 1) | (12, 1) | 300
-(6, 1) | (9, 8)
(13, 3) | 420
-(5, 3)
(7, 0) | (11, 7)
(14, 3) | 480
-(17, 1) | (17, 1) | 600
+Tetrahedral Class II coincidences such as (2, 2) and (3, 3) seem more plausible,
+ but this turns out to be a red herring.
+First, note that the norms on either side of the equation must be congruent to 0 or 1 (mod 3)[^2].
+In particular, $\|m + mu\|$ is always congruent to 0 (mod 3)
+ and $5\|a + bu\|$ is congruent to 0 or 2 (mod 3).
+But -2 is congruent to 1, so equality is impossible.
+
+[^2]:
+
+ Consider the equation $a^2 + ab + b^2 = 2$.
+ Since 0 and 1 are the only squares mod 3, we can build a table out of each possibility:
+
+ | $a^2$ | $b^2$ | $a^2 + ab + b^2 = 2$ | Possible? |
+ |-------|-------|-------------------------------------------------------------|-----------|
+ | 0 | 0 | $ab \equiv 2$, but *a* and *b* must be multiples of 3 | No |
+ | 0 | 1 | $ab \equiv 1$, but *a* is a multiple of 3 | No |
+ | 1 | 0 | Same as in the above case, but for *b* | No |
+ | 1 | 1 | $ab \equiv 0$, but neither of *a* or *b* is a multiple of 3 | No |
+
+ On the other hand, if $b \equiv 0$, then the norm is $a^2$, which is either 0 or 1.
+
+
+Only tetrahedral Class III collisions exist, and they must be congruent to the pairs
+ (1, 2), (2, 1), (2, 2), (3, 3), (3, 4), or (4, 3) (mod 5).
+Some of these can be found in the table below.
+
+```{python}
+#| echo: false
+#| classes: plain
+
+grouped = lambda x, f: {i: list(j) for i, j in itertools.groupby(sorted(x, key=f), key=f)}
+
+dodecahedrals = grouped(
+ [
+ ((a, b), count_dodecahedral(a, b))
+ for a in range(8)
+ for b in range(5)
+ if a > b
+ ],
+ lambda x: x[1]
+)
+
+tetrahedrals = grouped(
+ [
+ ((m, n), count_tetrahedral(m, n))
+ for m in range(18)
+ for n in range(9)
+ if m > n
+ ],
+ lambda x: x[1]
+)
+
+Markdown(tabulate(
+ [
+ [
+ "
".join([str(j) for j, _ in dodecahedrals[i]]),
+ "
".join([str(j) for j, _ in tetrahedrals[i]]),
+ i,
+ ]
+ for i in sorted(dodecahedrals.keys()) if tetrahedrals.get(i) is not None
+ ],
+ headers=["Dodecahedral Parameter", "Tetrahedral Parameter", "$F_6$"],
+ numalign="left",
+))
+```
Twelve is Six Pairs
-------------------
-The truncated triakis tetrahedron also reveals another possible set of solution polyhedra: those formed by maintaining six $E_2$s rather than four $V_3$s. By no small coincidence, the tetrahedron has six edges onto which these edges can be arranged. Unfortunately, this selective edge preservation makes it difficult to write solution polyhedra in Conway notation using the standard operators.
+The truncated triakis tetrahedron (for simplicity, TTT) also reveals
+ another possible set of solution polyhedra.
+It not only has four $V^3$s -- which are produced by the antitruncation -- but also six $E^2$s.
+These edges align with the six edges of the original tetrahedron.
+Unfortunately, selectively preserving these edges by using standard Conway operators is difficult,
+ and the only recourse is to develop solutions by hand.
-It is easiest to see solutions take form on a tetrahedral net. Every face and every vertex of a tetrahedron must be invariant under thirds of a turn, so the shape of the tiling of hexagons at these objects on the net must also be symmetric. Since each face of a tetrahedron is a triangle, arguably the simplest solution is by arranging hexagons in the same way.
-::::: {}
-:::: {layout-ncol="2"}
-::: {}
-
+### Hexagons in Triangles
-Order-2 solution on tetrahedral net (faces separated by interior dotted lines) with identical points identified (exterior dotted lines).
+It is easiest to see solutions take form on a tetrahedral net.
+Every face and every vertex of a tetrahedron must be invariant under thirds of a turn,
+ so when we interpolate with hexagons,
+ the shape they form near those regions must be symmetric in the same way.
+The easiest way to do this is by arranging hexagons in triangles.
+
+::: {#fig-pair-solution layout-ncol="2"}
+
+
+
:::
-::: {}
-
+Here, a triangle of 3 red hexagons lives at the center of each face of the original tetrahedron.
+The pairs of pentagons are colored in green and live at the center of every original edge.
+The remaining hexagons are colored in blue, and must be symmetric about the original vertices.
+In this case, they turn out to be arranged in the same figures as the face-centered hexagons.
-Equivalent planar graph. External face is colored blue.
-:::
-::::
+Like Goldberg polyhedra, we can denote this solution by a path between pentagons.
+The path between those sharing an edge will always be (1, 0), so this path is unremarkable.
+There also exists a path from one pentagon of a pair to another of a pair,
+ starting from the edges which border the face of the base tetrahedron.
+In the TTT, we get to another pentagon after crossing one edge without turning, and in the new solution,
+ we get to another pentagon after crossing two edges without turning.
+Thus, the former can be parametrized by (1, 0) and the latter by (2, 0).
-Pairs of pentagons (green) at the center of every edge. Hexagons symmetric about a face are colored red, those symmetric about a vertex are colored blue.
-:::::
+Let's extend the figure once more before generalizing.
+The hexagons in the center of the face are arranged in triangles with two at an edge, bordering a pentagon.
+Keeping the pentagon in the center of the edge, we can extend the triangle of hexagons
+ so that there are four at an edge:
-Though it first appears as if the figure made by the face hexagons and the vertex hexagons (see footnote above) is the same, recall that the base case (truncated triakis tetrahedron) has no face hexagons and a hexagon at each vertex. The pattern does not become clearer until examining larger graphs. Let the even triangular numbers be formed at the center of the figure, so that the pentagons meet at the midpoint of the figure. Then the next-highest order net looks like this
+::: {layout-ncol="2"}
+
-::::: {}
-:::: {layout-ncol="2"}
-::: {}
-
-
-Order-3 solution on tetrahedral net with identical points identified.
+
:::
-::: {}
-
+The left and right diagrams have slightly different colorings -- some red hexagons
+ are changed into blue ones so that the blue hexagons form triangles, like in previous figures.
+This makes it easier to generalize solutions, since the vertex figures steadily increase
+ along triangular numbers.
+However, the face figures have gone from a triangular arrangement to a hexagonal one.
+Despite this, the figure does indeed have a (3, 0) path.
-Equivalent planar graph. In this diagram, certain elements have been recolored from the diagram to the left to better indicate membership
-:::
-::::
-:::::
-
-Much like Goldberg polyhedra, it is easier to understand these figures if they are parameterized by a path between pentagons on a face (of the base tetrahedron). In what I called the order-2 solution, there are two edges that must be crossed to get from pentagon to pentagon; in the order-3 solution, there are three. In the equivalent figure on the right, while the corner figures have steadily increased along triangular numbers (1, 3, 6...), the face figures have gone from a triangular arrangement to a hexagonal arrangement.
-
-The means of generating the figure for each face is as follows. For triangular numbers $\Delta_n$, the number of points on the edge of the figure is simply n. If the three corner points are turned into pentagons and the remaining points are turned into hexagons, then there will be $n - 1$ edges to traverse. Reorganizing, this means that an order-*n* solution has $\Delta_{n+1} - 3$ hexagons per face, $\Delta_n$ hexagons per edge, and $4(\Delta_{n + 1} + \Delta_{n - 3}) = 4((n+1)^2 - 3)$ hexagons in total.
+For a path $(n, 0)$, there are $n + 1$ polygons (both hexagons and pentagons) on the edge of a face figure.
+With the pentagons, these figures make up triangles,
+ so there are $\Delta_{n + 1} - 3$ hexagons on every face, where $\Delta_n$ is a triangular number.
+On the vertices, every edge we cross along the path corresponds to a hexagon
+ also on the edge of a triangular vertex figure, giving $\Delta_{n}$ more hexagons.
+This means that a solution has $4(\Delta_{n + 1} + \Delta_{n} - 3) = 4((n + 1)^2 - 3)$ hexagons.
:::: {layout-ncol="2"}
-::: {}
-
-
-First three face figures as a series of triangular numbers.
-:::
+
::: {}
- Parameter | $F_6$ | V | E
-------------------------|-------|-----|-----
-(1, 0) | 4 | 28 | 42
-(2, 0) | 24 | 68 | 102
-(3, 0) | 52 | 124 | 186
-(4, 0) | 88 | 196 | 294
-(5, 0) | 132 | 284 | 426
+| Parameter | $F_6$ | V | E |
+|-------------------------|-------|-----|-----|
+| (1, 0) | 4 | 28 | 42 |
+| (2, 0) | 24 | 68 | 102 |
+| (3, 0) | 52 | 124 | 186 |
+| (4, 0) | 88 | 196 | 294 |
+| (5, 0) | 132 | 284 | 426 |
:::
::::
@@ -239,100 +558,252 @@ First three face figures as a series of triangular numbers.
### Whirled Solutions
-The entries of the parameter column are 2-tuples for two reasons: one, to be parallel to the previous tables, and two, because there is an additional parameter. When drawing points on the tetrahedral net, there was no need to place the pentagons at on the midpoints of the triangular figures. While the triangular figures were the wrong direction to take, the possibility remains to choose another facet to (symmetrically) fit the pentagons into. Since $\Delta_3$ was skipped in the above diagrams, consider arranging hexagons like this and placing pentagons on one side of the "middle" hexagon in a rotationally symmetric way.
+In the above solutions, we never had to turn to complete our paths.
+This may leave one wondering whether the parameters are written as 2-tuples to match the other tables,
+ or if we can truly create solutions that incorporate turns.
+One of the assumptions we made when building face figures was that there was
+ an even triangular number of hexagons, with a pentagon at the center of the edges of the figure.
+But the pentagons could easily border any of the other hexagons, as long as the figure had triangular symmetry.
-:::: {layout-ncol="2"}
-::: {}
-
+{.image-wide}
-Tetrahedral net with $\Delta_3$ on faces and offset pentagons.
+As shown on the above diagram, we get a figure on the faces which is similar to Class III Goldberg sectors.
+This is reinforced by showing the "whirled" (2, 1) path.
+Just as before (1, 2) path is also possible on this figure, if the path is taken counterclockwise.
+
+We can indeed assemble these figures into a solution:
+
+::: {layout-ncol="2"}
+
+
+
:::
-::: {}
-
+Similarly to the (3, 0) solution, the face and vertex figures in the recoloring are hexagons and triangles.
+However, their roles have swapped; this time, the faces are the former and the vertices are the latter.
+This yields $4(7 + 3) = 40$ hexagons in total,
+ which coincides with the tetrahedral antitruncation (3, 3) from earlier.
-Equivalent planar graph. External face is colored blue.
-:::
-
-::: {}
-
-
-Planar graph with recolored faces and path between pentagons identified.
-:::
-
-::: {}
-
-
-Single rotationally symmetric section with paths (and parameters) identified.
-:::
-::::
-
-There are $4(6 + 4) = 40$ hexagons in total, which coincides with the earlier tetrahedral antitruncation (3, 3). To attempt to parametrize this figure, start from a pentagon facing a red hexagon and cross two edges. Then, turn 60 degrees and cross a final edge, completing the path (2, 1). If the previous solutions are similar to class I Goldberg solutions, then these are similar to class III Goldberg solutions. Each edge of the pentagon can be characterized in the following way:
-
-1. The "constrained" edge shared between two pentagons. Crossing this edge always gives the path (1, 0)
-2. The "canonical" edge on the face of the tetrahedral net. The shortest paths across any two of these are (2, 1) and (1, 2)
-3. The edge which shares a vertex with a (b) edge, but not an (a) edge. The paths (3, 0) and (2, 1) link up to a (d) edge.
-4. The edge which shares a vertex with a (b) edge and an (a) edge. The paths (1, 2) and (3, 0) link up to a (c) edge, and (1, -1) always links it to an (e) edge.
-5. The last edge, which does not share a vertex with a (b) edge, but does with an (a) edge. Links up to other (e) edges along the path (2, 2) and to (d) edges always along (1, -1).
-
-The canonical path (2, 1), the constrained path (1, 0) (which comes from preserving $E_2$s), and the auxiliary path (1, -1) combine to create the noncanonical paths, (2, 2) and (3, 0). I have yet to prove this construction works consistently, but I suspect that this can be generalized and that a parallel to class II Goldberg solutions also exists.
+I suspect that this can be generalized, but I have yet to prove this construction works consistently.
-Symmetry and Other Tetrahedral Solutions
-----------------------------------------
+### What about Class II?
-All of these figures have [tetrahedral symmetry](https://en.wikipedia.org/wiki/Tetrahedral_symmetry) ($T$) by construction, at least rotationally. This is possible because the base case, the dodecahedron, has icosahedral symmetry, which contains tetrahedral symmetry. Class I and II Goldberg antitruncations and non-whirled edge-constrained cases also have mirror symmetry about three axes/planes ($T_d$). The order-2 edge-constrained case appears to be even better, since all 8 of the "interpolating" regions containing hexagons are the same. This perhaps implies octahedral symmetry ($O$), though I have not verified this.
+A parallel to Class II Goldberg solution likely does *not* exist.
+For both arms of the path to be equal, the hexagon we turn on must be at the center of a face.
+The center of the face is equidistant from the midpoints of edges and from the vertices making it up.
+The former case is the Class I solutions, which have no turn.
+The latter case is impossible, because the pentagons must be placed along an edge.
-### Double-Goldberg
+Double-Goldberg
+---------------
-Every one of these solution figures, both constructed and otherwise, can be extended using one of the previously-discussed Goldberg-Coxeter Conway operators ($dk$, $tk$, $c_n = du_nd$, and $w$) to create another solution while preserving tetrahedral symmetry. Effectively, this combines antitruncations (which expand the pairs of pentagons, but preserve the triples) and the edge-constrained solutions (which expand the triples, but preserve the pairs) based on the truncated triakis tetrahedron. Some of the easily-constructible solutions based on Goldberg polyhedra are accumulated in the table below.
+Every one of these solution figures, both constructed and otherwise,
+ can be extended using one of the previously-discussed Goldberg-Coxeter Conway operators
+ ($dk$, $tk$, $c_n = du_nd$, and $w$) to create another solution while preserving tetrahedral symmetry.
+Some of the easily-constructible solutions based on Goldberg polyhedra are accumulated in the table below.
```{python}
-#| label: tbl-double-goldberg
#| echo: false
+#| label: tbl-double-goldberg
+#| classes: plain
-# from IPython.display import Markdown
-# from tabulate import tabulate
-#
-# polyhedronisme = lambda x, y: f"[{x}](https://levskaya.github.io/polyhedronisme/?recipe={y})"
+double_goldberg: dict[Literal["c", "dk", "tk", "w"], list[GoldbergData]] = {
+ "c": [
+ GoldbergData(
+ parameter=(3, 0),
+ conway=("ct6kT"),
+ conway_recipe=("K300dudt6kT"),
+ extra=[(3, 0), (2, 2), (4, 0)],
+ ),
+ GoldbergData(
+ parameter=(2, 2),
+ conway=("ct6uT"),
+ conway_recipe=("K300duK30dt6uT"),
+ extra=[(2, 2), (2, 0), (4, 2)],
+ ),
+ GoldbergData(
+ parameter=(4, 1),
+ conway=("ct6gtT"),
+ conway_recipe=("K300duK50dt6gtT"),
+ extra=[(4, 2), (2, 0), (6, 0)],
+ ),
+ ],
+ "dk": [
+ GoldbergData(
+ parameter=(3, 0),
+ conway=("dkt6kT"),
+ conway_recipe=("K300dkt6kT"),
+ extra=[(1, 1), (2, 2)],
+ ),
+ GoldbergData(
+ parameter=(2, 2),
+ conway=("dkt6uT"),
+ conway_recipe=("K300dkK30t6uT"),
+ extra=[(1, 1), (3, 0), (3, 3)],
+ ),
+ GoldbergData(
+ parameter=(4, 1),
+ conway=("dkt6gtT"),
+ conway_recipe=("K300dkK50t6gtT"),
+ extra=[(1, 1), (3, 3), (4, 1)],
+ ),
+ ],
+ "tk": [
+ GoldbergData(
+ parameter=(3, 0),
+ conway=("tkt6kT"),
+ conway_recipe=("K300tkt6kT"),
+ extra=[(3, 0), (3, 3)],
+ ),
+ GoldbergData(
+ parameter=(2, 2),
+ conway=("tkt6uT"),
+ conway_recipe=("K300tkK30t6uT"),
+ extra=[(3, 0), (3, 3), (6, 0)],
+ ),
+ GoldbergData(
+ parameter=(4, 1),
+ conway=("tkt6gtT"),
+ conway_recipe=("K300tkK50t6gtT"),
+ extra=[(3, 0), (6, 3), (9, 0)],
+ ),
+ ],
+ "w": [
+ GoldbergData(
+ parameter=(3, 0),
+ conway=("wt6kT"),
+ conway_recipe=("K300wK30t6kT"),
+ extra=[(2, 1), (4, 1)],
+ ),
+ GoldbergData(
+ parameter=(2, 2),
+ conway=("wt6uT"),
+ conway_recipe=("K300wK100t6uT"),
+ extra=[(2, 1), (3, 0), (4, 1)],
+ ),
+ GoldbergData(
+ parameter=(4, 1),
+ conway=("wt6gtT"),
+ conway_recipe=("K300wK50t6gtT"),
+ extra=[(2, 1), (5, 3), (6, 3)],
+ ),
+ ],
+}
+# TODO: add assertions around recipe/conway from earlier table
-table = [
- ["c(2, 0)", polyhedronisme("ct6kT", "K300dudt6kT"), "(2, 0), (2, 2), (4, 0)", 46, 112, 168],
- ["c(2, 2)", polyhedronisme("ct6uT", "K300duK30dt6uT"), "(2, 2), (2, 0), (4, 2)", 70, 160, 240],
- ["c(4, 1)", polyhedronisme("ct6gtT", "K300duK50dt6gtT"), "(4, 2), (2, 0), (6, 0)", 142, 304, 456],
+# matrices applied over column vectors of the form [v, e, f]
+goldberg_operators = {
+ "dk": np.array([
+ [0, 2, 0],
+ [0, 3, 0],
+ [1, 0, 1],
+ ]),
+ "c": np.array([
+ [1, 2, 0],
+ [0, 4, 0],
+ [0, 1, 1],
+ ]),
+ "w": np.array([
+ [1, 4, 0],
+ [0, 7, 0],
+ [0, 2, 1],
+ ]),
+}
+goldberg_operators["tk"] = goldberg_operators["dk"] @ goldberg_operators["dk"]
- ["dk(2, 0)", polyhedronisme("dkt6kT", "K300dkt6kT"), "(1, 1), (2, 2)", 32, 84, 126],
- ["dk(2, 2)", polyhedronisme("dkt6uT", "K300dkK30t6uT"), "(1, 1), (3, 0), (3, 3)", 50, 120, 180],
- ["dk(4, 1)", polyhedronisme("dkt6gtT", "K300dkK50t6gtT"), "(1, 1), (3, 3), (4, 1)", 104, 228, 342],
+def apply_goldberg_operator(
+ poly: PolyData,
+ operator: Literal["c", "dk", "tk", "w"],
+ other_face_count: int = 0,
+) -> PolyData:
+ v, e, f = goldberg_operators[operator] @ np.array([
+ poly.vertex_count,
+ poly.edge_count,
+ poly.hexagon_count + other_face_count,
+ ]).T
+ return PolyData(
+ vertex_count=v,
+ edge_count=e,
+ hexagon_count=f - other_face_count,
+ )
- ["tk(2, 0)", polyhedronisme("tkt6kT", "K300tkt6kT"), "(3, 0), (3, 3)", 116, 252, 378],
- ["tk(2, 2)", polyhedronisme("tkt6uT", "K300tkK30t6uT"), "(3, 0), (3, 3), (6, 0)", 170, 360, 540],
- ["tk(4, 1)", polyhedronisme("tkt6gtT", "K300tkK50t6gtT"),"(3, 0), (6, 3), (9, 0)", 332, 684, 1026],
+# XXX: This fails to construct correct data when data.parameter gives a negative number of hexagons!
+def tetrahedral_double_goldberg_table_row(
+ data: GoldbergData,
+ operator: Literal["c", "dk", "tk", "w"],
+) -> list[str]:
+ poly_data = poly_from_tetrahedral_goldberg_parameter(data.parameter)
+ doubled = apply_goldberg_operator(poly_data, operator, other_face_count=12)
+ return [
+ operator + str(data.parameter),
+ polyhedronisme(data.conway, data.conway_recipe)
+ if data.conway_recipe is not None
+ else str(data.conway),
+ ", ".join(map(str, data.extra)),
+ str(doubled.hexagon_count),
+ str(doubled.vertex_count),
+ str(doubled.edge_count),
+ ]
- ["w(2, 0)", polyhedronisme("wt6kT", "K300wK30t6kT"), "(2, 1), (4, 1)", 88, 196, 294],
- ["w(2, 2)", polyhedronisme("wt6uT", "K300wK100t6uT"), "(2, 1), (3, 0), (4, 1)", 130, 280, 420],
- ["w(4, 1)", polyhedronisme("wt6gtT", "K300wK50t6gtT"), "(2, 1), (5, 3), (6, 3)", 256, 532, 798],
-]
Markdown(tabulate(
- table,
+ [
+ tetrahedral_double_goldberg_table_row(data, operator)
+ for operator, datas in double_goldberg.items()
+ for data in datas
+ ],
headers=["(Tetrahedral Goldberg) Parameter", "Conway", "Paths Between Pairs", "$F_6$", "V", "E"],
- numalign="center",
- stralign="center",
+ numalign="left",
))
```
-Note that higher-order subdivisions (chamfers) and higher-order whirls are still possible.
-The same operators can be applied to the edge-constrained cases (and may intersect with the above table in a truly topologically equivalent sense), but owing to the difficulties in generating these, I will not attempt to tabulate them. Before I consider doing so, I would need to formalize the construction of the graph (or attempt to write a program which identifies identical vertices, as I did manually to sketch the figures initially), canonicalize and tweak the graph into a closed 3D figure, and use the result as a seed in a viewer which supports (importing figures and) interpreting Conway notation.
+Note that higher-order chamfers (dual, subdivide, dual) and higher-order whirls are possible.
+
+The same operators can also be applied to the edge-based cases,
+ but since I have not computationally generated these, I will not attempt to tabulate them.
+Doing so would require that I:
+
+- Formalize the construction of the graph,
+ preferably by writing a program which can identify identical vertices.
+ - I did this step manually to sketch the figures
+- Find good planar and spherical embeddings of the graph.
+- (Optionally,) import and display the result in a polyhedron viewer,
+ preferably one which can apply Conway notation to an arbitrary figure
Closing
-------
-Tetrahedral solutions are vastly more complicated. In decreasing the specificity of symmetry, the amount of free parameters increases. Despite claiming existence of these tetrahedral solutions topologically, actual geometric construction of some is difficult. Pentagons are no longer regular, any(?) arrangement with thrice-rotational symmetry per face is valid, and I am unsure whether the resultant polyhedra can even be made equilateral.
+Tetrahedral solutions are vastly more complicated since we not restricted to
+ corresponding pentagons with faces on a dodecahedron,
+In decreasing the amount of symmetry, the amount of free parameters increases.
+Pentagons are no longer regular, any(?) arrangement with thrice-rotational symmetry per face is valid,
+ and I am unsure whether the resultant polyhedra can even be made equilateral.
-As you may be able to guess, not even specifying tetrahedral symmetry is enough to completely classify every solution either. The [next post]() will discuss additional solutions, some of whose members *cannot* be constructed using common seed polyhedra.
+Despite claiming existence of these tetrahedral solutions topologically,
+ actual geometric construction of some is difficult.
+In fact, I made an error while constructing one of the edge-based solutions:
-Polyhedron images were generated using [*polyHédronisme*](https://levskaya.github.io/polyhedronisme/), nets and graphs were created with GeoGebra.
+{.image-wide}
+
+The face in the center is actually a horizontal reflection of how it should be.
+You can check this by trying to consistently follow the path (2, 1) --
+ along the center face, you need follow (1, 2) instead.
+
+As you may be able to guess, not even specifying tetrahedral symmetry is enough
+ to completely classify every solution.
+The [next post](../3) will discuss additional solutions, some of whose members *cannot*
+ be constructed using common seed polyhedra.
+
+Polyhedron images were generated using [*polyHédronisme*](https://levskaya.github.io/polyhedronisme/).
+Nets and graphs were created with GeoGebra.
diff --git a/posts/pentagons/2/penta edge whirl graph with path.png b/posts/pentagons/2/penta edge whirl graph with path.png
deleted file mode 100644
index edce72e..0000000
Binary files a/posts/pentagons/2/penta edge whirl graph with path.png and /dev/null differ
diff --git a/posts/pentagons/2/penta edge whirl graph.png b/posts/pentagons/2/penta edge whirl graph.png
deleted file mode 100644
index 713e7af..0000000
Binary files a/posts/pentagons/2/penta edge whirl graph.png and /dev/null differ
diff --git a/posts/pentagons/2/triangular number diagram.png b/posts/pentagons/2/triangular number diagram.png
deleted file mode 100644
index c77c4bb..0000000
Binary files a/posts/pentagons/2/triangular number diagram.png and /dev/null differ
diff --git a/posts/pentagons/2/whirl path.png b/posts/pentagons/2/whirl path.png
deleted file mode 100644
index 9bcba29..0000000
Binary files a/posts/pentagons/2/whirl path.png and /dev/null differ