revisions to pentagons.1

This commit is contained in:
queue-miscreant 2025-03-10 05:02:45 -05:00
parent 6ddfa44cf9
commit f040d9c222
9 changed files with 532 additions and 178 deletions

View File

@ -1,242 +1,476 @@
---
title: "12 Pentagons, Part 1"
description: |
There are 12 pentagons. How many hexagons can there be?
format:
html:
html-math-method: katex
jupyter: python3
date: "2021-05-30"
date-modified: "2025-03-10"
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
---
<style>
.figure-img {
object-fit: contain;
height: 100%;
}
</style>
12 Pentagons, Part 1
====================
```{python}
#| echo: false
from dataclasses import dataclass
Recently I've been trying my hand at a little 3D geometry. I was watching a lecture on YouTube when the presenter asked the following as an exercise:
from matplotlib import pyplot as plt
from IPython.display import Markdown
from tabulate import tabulate
> A soccer ball is a (roughly spherical) figure made of pentagons and hexagons, each meeting 3 at a point. Prove that there are 12 pentagons. If you want to explore this problem further: how many hexagons can there be?
import goldberg_triangles
While innocuous on its surface, it has occupied my thoughts for the better part of a month, as the latter question seems to have no simple answer without running into the most obvious solutions. This post will aim to summarize these "simple" answers.
@dataclass
class PolyData:
hexagon_count: int
vertex_count: int
edge_count: int
@dataclass
class GoldbergData:
parameter: tuple[int, int]
conway: str
parameter_link: str | None = None
conway_recipe: str | None = None
def polyhedronisme(recipe: str) -> str:
return f"https://levskaya.github.io/polyhedronisme/?recipe={recipe}"
```
Recently I've been trying my hand at a little 3D geometry.
I was watching [a lecture on YouTube](https://youtu.be/7F3gKKEUDz8?&t=625) where the presenter asks
the following (paraphrased) as an exercise:
> A soccer ball is a (roughly spherical) figure made of pentagons and hexagons, each meeting 3 at a point.
Prove that there are 12 pentagons.
If you want to explore this problem further: how many hexagons can there be?
Why 12? Why Hexagons?
---------------------
A 3D figure is composed of three elements in particular: vertices, edges and faces. In this problem, faces can be either pentagons or hexagons, giving an system in four unknowns.
Before counting hexagons, there are a couple of things that we should understand about the problem.
For example, if we're interested in fixing the number of pentagons, are hexagons somehow special?
Does this explain why are there 12 pentagons?
First, I would like to draw attention to the first constraint on the problem, that every vertex connects three edges (and every edge joins two vertices). If all of the faces on a polyhedron are convex polygons, then no two edges are collinear (else a face contains a 180 degree angle), and there must be at least three that meet at a point (else one of the two faces contains an angle greater than 180 degrees). Equivalently, consider the dual of the polyhedron, made by making every vertex into a face and vice versa. A vertex connected to two edges would on the dual become a digon, which cannot be made with line segments. Thus, $3V = 2E$ is the simplest class of polyhedra, whose duals are entirely triangles.
3D figures in general have three things we can count: vertices, edges and faces.
We are further interested in counting two different kinds of faces.
In the original statement of the problem, these are pentagons and hexagons,
but to understand why hexagons are important, we should consider pentagons and *n*-gons instead.
Next, rather than assuming there are only pentagons and hexagons, let us assume instead that we only have pentagons and n-gons. Every pentagon contributes 5 vertices and edges; every *n*-gon contributes *n* vertices and edges. Further, we also know that an edge joins any 2 faces, and every vertex joins exactly 3 faces. Therefore, counting every face will count every edge twice and every vertex thrice:
Since the figure's shape is roughly spherical, like a soccer ball, its
[Euler characteristic](https://en.wikipedia.org/wiki/Euler_characteristic) is 2:
$$
2E = 3V = 5F_5 + nF_n
\chi = V - E + F = V - E + F_5 + F_n = 2
$$
This gives us two equations out of the four needed to completely solve the system. We also know that the shape is like a soccer ball, so its [Euler characteristic](https://en.wikipedia.org/wiki/Euler_characteristic) is 2, which adds a third equation into the mix:
Another constraint given in the problem is that all faces meet with three at a vertex.
This is actually the minimal case -- if all of the faces on a polyhedron are convex,
then there must be at least three that meet at a vertex
(else one of the two faces sharing an edge contains an angle greater than 180 degrees).
Exactly 12
----------
This means that:
We want to annihilate $F_n$, and we are looking for integer solutions, so multiply through by *m*, which is the LCM of *n* and some other number *k*. Let the GCD of *n* and *k* be denoted l:
- An edge always ends in a pair of vertices, so counting edges double-counts vertices
- A vertex always joins three edges, so counting vertices triple-counts edges
- An *n*-face has *n* vertices and edges, so counting faces *n*-counts vertices and edges
More succinctly, these conditions can be written as:
$$
\begin{gather*}
m = {kn \over (k, n)} = {kn \over l} \implies ml = kn \\ \\
mV - mE + mF_5 + \textcolor{green}{m}F_n = 2m \\
mV - \textcolor{red}{\stackrel{3V = 2E}{V({3 \over 2}m)}}
+ mF_5 + \textcolor{green}{kn \over l}F_n \textcolor{blue}{\stackrel{3V = 5F_5 + nF_n}
{- {k \over l}nF_n - {k \over l}5F_5 + {k \over l}3V}} = 2m \\ \\
V({3k \over l} - {m \over 2}) + F_5(m - {5k \over l}) = 2m \\
V(6k - ml) + F_5(2ml - 10k) = 4ml \\
V(6k - nk) + F_5(2nk - 10k) = 4nk \\
V(6 - n) + F_5(2n - 10) = 4n
\end{gather*}
3V = 2E = 5F_5 + nF_n
$$
At this point, we would like to eliminate one of the variables, so either $n = 5$ (there are only pentagons), or $n = 6$ (the non-pentagons are hexagons).
### Exactly 12
This gives us three equations in five unknowns, which is a little daunting.
First, let's clear the equation for the Euler characteristic of $E$ and $F_n$.
$$
\begin{align*}
n &= 5 \implies V(6 - 5) + F_5(2(5) - 10) = V = 4(5) = 20 \\
n &= 6 \implies V(6 - 6) + F_5(2(6) - 10) = 2F_5 = 4(6) = 24
\chi &= V - E + F_5 + F_n \\
2n\chi
&= 2nV - \textcolor{red}{2nE} + 2nF_5 + 2nF_n + \textcolor{blue}{0}\\
&= 2nV
- \textcolor{red}{\stackrel{3V = 2E}{3nV}}
+ 2nF_5
+ 2nF_n
+ \textcolor{blue}{\stackrel{3V = 5F_5 + nF_n}{
6V
- 10F_5
- 2nF_n
}} \\
&= (6 - n)V + (2n - 10)F_5 \\
&= 4n
\end{align*}
$$
If all the faces in the figure are pentagons, then there must be 20 vertices (which also means there are 30 edges). On the other hand, if we allow hexagons, then __there are exactly 12 pentagons__. This is the case even if there are no hexagons, which together with the first solution, give the vertex, edge, and face counts for a dodecahedron.
In this form, the simplest cases of the problem become obvious:
- $n = 5$, and there are only pentagons
- $V(6 - 5) + F_5(2(5) - 10) = V = 4(5) = 20$
- In this case, all occurrences of $F_n$ above turns out to be 0,
since all of the pentagons are counted by $F_5$
- $n = 6$, and the non-pentagons are hexagons
- $V(6 - 6) + F_5(2(6) - 10) = 2F_5 = 4(6) = 24$
Thus, by asserting that the figure is composed of pentagons and hexagons,
__the figure must contain exactly 12 pentagons__.
This is the case even if there are no hexagons, in which case we are describing a dodecahedron
(which, incidentally, has 20 vertices).
### Duality
It's convenient not only to think of our target figures with pentagons and hexagons, but their *duals*.
In the equation for the Euler characteristic, vertices and faces have the same sign.
This (correctly) suggests that we can construct a new figure by replacing all faces with a vertex
and vice versa.
At the level of equations, this means that
$$
3F' = 2E' = 5V_5' + 6V_6'
$$
Or in other words, all the faces in the dual figure are triangles ($3F' = 2E'$) and vertices either join
5 or 6 edges ($2E' = 5V_5' + 6V_6'$).
We can also think of dualization as a process which transforms our vertices into triangles,
pentagonal faces into degree-5 vertices and hexagonal faces into degree-6 ones.
### Increasing Specificity
It bears repeating that there are four unknowns and we have used three equations. While one of the unknowns has been solved, the remaining three need an additional equation to produce a consistent solution.
If we know there are 12 pentagons, then the number of hexagons is the only free parameter,
since it was eliminated from the earlier equation.
Perhaps it is possible to count more precisely to produce a new equation. Each edge comes in 3 genera: it can either join 2 pentagons, 2 hexagons, or a pentagon and a hexagon each. Similarly, each vertex has 4 different arrangements: 3 pentagons, 2 pentagons and 1 hexagon, 1 pentagon and 2 hexagons, and 3 hexagons.
Perhaps we could produce a new equation by counting more precisely.
Each edge comes in 3 genera: it can either join 2 pentagons, 2 hexagons, or a pentagon and a hexagon each.
Similarly, each vertex has 4 different arrangements: 3 pentagons, 2 pentagons and 1 hexagon,
1 pentagon and 2 hexagons, and 3 hexagons.
:::{}
![](./vertices_edges.png)
Left to right, top row: $V_0, V_1, V_2, V_3$, bottom row: $E_0, E_1, E_2$. Subscripts denote number of pentagons present.
:::
![
Left to right, top row: $V^0, V^1, V^2, V^3$, bottom row: $E^0, E^1, E^2$.
Superscripts denote number of pentagons present.
](./vertices_edges.png)
Counting only pentagons, only hexagons, and only each type of vertex gives:
$$
6F_6 = 3V_0 + 2V_1 + V_2 = 2E_0 + E_1 \\
5F_5 = V_1 + 2V_2 + 3V_3 = E_1 + 2E_2
\begin{gather*}
6F_6 = 3V^0 + 2V^1 + V^2 = 2E^0 + E^1 \\
5F_5 = V^1 + 2V^2 + 3V^3 = E^1 + 2E^2
\end{gather*}
$$
When these equations are added together, they reproduce the $3V = 2E$ relationship. By adding 5 more unknowns, only a couple more equations have been added to the system, and no new information has been gained aside from the combinatorics of vertex and edge configurations. A solution for the number of hexagons must be realized by other means.
When these equations are added together, they reproduce the $3V = 2E$ relationship.
But by adding 5 more unknowns, only a couple more equations have been added to the system,
and no new information has been gained aside from the combinatorics of vertex and edge configurations.
A solution for the number of hexagons must be realized by other means.
An Argument from Symmetry
-------------------------
Having established that there are 12 pentagons, and that the base case is a dodecahedron, what next? What follows is known as the [Goldberg-Coxeter construction](https://en.wikipedia.org/wiki/Goldberg%E2%80%93Coxeter_construction), since the resultant polyhedra are known as Goldberg polyhedra.
Having established that there are 12 pentagons, and that the base case is a dodecahedron, what next?
The argument is as follows: since a dodecahedron has icosahedral symmetry, it makes sense to expand it by placing a regular pentagon (of a suitable size) at every vertex of an icosahedron. Then, hexagons are used to fill the gaps between pentagons. For regular pentagons and equilateral hexagons, this has three properties:
Well, we know that dodecahedrons have [icosahedral symmetry](https://en.wikipedia.org/wiki/Icosahedral_symmetry).
In the most naive way, we can realize this by by placing a regular pentagon (of a suitable size and orientation)
at each of the 12 vertices of the icosahedron.
If the pentagons touch one another, this is again just a dodecahedron.
However, if the pentagons are small, then we can fit equilateral hexagons in between them.
This has three properties:
1. Each pentagon is *transitive*, or equivalent to other pentagons in terms of
the way hexagons are connected to it.
2. Since each pentagon is regular, it is invariant under fifths of a turn.
3. Each triple of "adjacent" pentagons (which we'll call a "sector") is rotationally symmetric
under thirds of a turn, as in the rotation of a dodecahedron around a vertex.
This also must be the case for hexagons in the sector.
This formulation results in what is known as the
[Goldberg-Coxeter construction](https://en.wikipedia.org/wiki/Goldberg%E2%80%93Coxeter_construction),
and the resultant polyhedra are known as Goldberg polyhedra.
1. Each pentagon is *transitive*, or equivalent to other pentagons in terms of the way hexagons are connected to it.
2. Since each pentagon is regular, it is invariant under fifths of a turn. This pentagon can be thought of as the compound of 5 overlapping equilateral triangles, each of which when considered alone tessellates the plane.
3. Each triple of pentagons is rotationally symmetric under thirds of a turn, as in the rotation of a dodecahedron through two antipodal vertices. This also must be the case for the figure made by the hexagons which connect triples.
### Triangles and Honeycombs
Though it is impossible to surround a regular pentagon with hexagons without distortion in the plane, it *is* possible in 3D space. By the vertex condition, each hexagon must meet in threes, similarly to how regular hexagons tessellate the plane as in a honeycomb. The dual to this arrangement a would replace pentagons with 5 triangles and hexagons with 6 triangles.
The hexagons in our target figures cannot be regular.
By the vertex condition, each hexagon must meet with three at a point,
and regular hexagons in such an arrangement tessellate the plane like a honeycomb.
If these triangles are all equilateral, then the former can be formed into pyramids and the latter into coplanar hexagons. By virtue of being coplanar, they *also* tessellate the plane. Therefore, a fifth of this dual figure can be described by the regular triangular tiling. By identifying hexagons (which reverses the dual), this figure can be understood as a fifth of a regular pentagon and its neighboring hexagons (hereafter termed a pentagon's sector).
A plane is exactly what we want, though.
As mentioned above, each sector must transform like a triangle under rotation.
It therefore makes sense to work on a triangle grid and identify hexagons on it.
:::: {layout-ncol="2"}
::: {width="40%"}
![](./triangle_grid.png)
```{python}
#| echo: false
#| layout-ncol: 2
#| fig-cap:
#| - "Triangular grid before..."
#| - "...and after identifying hexagons."
Triangular grid before...
:::
goldberg_triangles.draw_triangular_grid(50, -10, False)
goldberg_triangles.recenter_axes(4, 0)
plt.show()
::: {width="40%"}
![](./triangle_grid_hexes.png)
goldberg_triangles.draw_triangular_grid(50, -10, True)
goldberg_triangles.recenter_axes(4, 0)
plt.show()
```
...and after identifying hexagons.
:::
::::
Note also that the triangular grid is dual to the hexagonal one.
In the left figure, the lower-leftmost triangle is one-fifth of a pentagonal pyramid, dual to a pentagon.
In the right figure, it corresponds to a section of a regular pentagon.
In this grid, the lower-left triangle is not part of a hexagon, and instead comes
from one of the pentagons in the figure.
For every pentagon in the figure, there are five copies of the grid,
with the lower-left triangle in each overlapping slightly.
This means that the partial hexagons at one of the edges of the grid
will always be complemented by the other edge, always giving full hexagons.
Each point in this grid is of the form $a + bu$, where *u* is the primitive sixth root of unity that lives in the upper half of the complex plane. Since 1 and *u* are not perpendicular, the norm is not simply $a^2 + b^2$. Rather than trying to describe a point in rectangular coordinates with square roots, we can find its norm by multiplying by its conjugate, which is $a + b u^{6-1} = a + b u^5$. As a primitive sixth root, u has the property that $u^2 - u + 1 = 0$, so:
Each point in the grid is of the form $a + bu$, where *u* is the complex root of $x^2 - x + 1$,
which satisfies $u^6 = 1$ (a primitive sixth root of unity).
Since 1 and *u* are not perpendicular like 1 and *i*, the norm is not simply $a^2 + b^2$.
We can find its norm by multiplying by its conjugate, which is $a + b u^5$.
$$
\begin{gather*}
\| a + bu \| = (a + bu)(a + bu^5) = a^2 + ab(u + u^5) + b^2 \\ \\
u + u^5 = u + u \textcolor{red}{u^2 u^2} = u + u\textcolor{red}{(u - 1)(u - 1)} \\
= u + \textcolor{blue}{(u^2 - u)}(u - 1)
= u + \textcolor{blue}{(-1)}(u - 1) = 1
\\ \\
\| a + bu \| = a^2 + ab + b^2
\| a + bu \| = (a + bu)(a + bu^5) = a^2 + (u + u^5)ab + b^2 \\ \\
u^5 = u \textcolor{red}{u^2 u^2}
= u\textcolor{red}{(u - 1)(u - 1)} \\
= \textcolor{blue}{(u^2 - u)}(u - 1)
= \textcolor{blue}{(-1)}(u - 1)
= -u + 1
\\ \\
\| a + bu \| = a^2 + ab + b^2
\end{gather*}
$$
Hooray, a simple (and symmetric) polynomial in *a* and *b*! This symmetry is apparent in the grid, since the grid is symmetric about the angle bisector of the lower-leftmost angle. Thus, *a* and *b* are interchangeable.
Hooray, we get a simple (and symmetric) polynomial in *a* and *b*!
This symmetry is apparent in the grid, since the grid is laterally symmetric about a line cutting it in half.
Flipping along this line exchanges the axes for *a* and *b*, so *a* and *b* must be interchangeable.
### Counting Triangles
Each point $a + bu = (a, b)$ has an secondary interpretation: it parametrizes a path between the center of two pentagonal faces. Starting from any pentagon facing an edge, walk across *a* edges onto the center of hexagons. Then, turn 60 degrees, and walk across *b* edges onto another pentagon, completing the walk. The turn may be made either clockwise or counterclockwise and produces two chiral opposites when $a \neq b$. For simplicity's sake, let $a \ge b$ mean a clockwise turn so that these opposites can be differentiated by reversing the tuple.
Each point $a + bu = (a, b)$ has an secondary interpretation: we can use it to parametrize
a path between two pentagonal faces.
On the target figure, if we start from any pentagon facing an edge, we walk across *a* edges
onto the center of hexagons.
Then, we turn to face an adjacent edge, then walk across *b* edges onto another pentagon, completing the walk.
::: {}
![](./hex_path_4_2.png)
::: { #fig-goldberg-path }
```{python}
#| echo: false
#| layout-ncol: 2
Path between pentagons corresponding to (4, 2). The gray outline will become clearer in the following figures.
goldberg_triangles.draw_sector((4, 2), path=True)
plt.show()
goldberg_triangles.draw_sector((2, 4), path=True)
plt.show()
```
Paths between pentagons corresponding to (4, 2) and (2, 4).
The gray outline shows the sector.
Note in the diagram for (2, 4) that we can identify a (4, 2) path where we instead turn counterclockwise.
:::
The "center" of the red pentagon is at (0, 0) and is the lower-left vertex of the red triangle. The center of the first adjacent hexagon along the red line is (1, 1); after traversing *a* hexagons we end up at (*a*, *a*). The hexagon to the lower right of this one is at $(a, a) + (2, -1)$; after *b* steps, the center of the blue pentagon lies at $(a, a) + (2b, -b) = (a + 2b, a - b)$.
### Construction Classes
What's the point of being able to specify neighboring pentagons in triangular coordinates? It turns out that the (triangular) norm of the path directly corresponds to the number of triangles unique to each pentagon's sector. Geometrically, there are three classes.
It turns out that the (triangular) norm of the path directly corresponds to the number
of triangles unique to each sector.
Geometrically, there are three classes.
#### Class I
Points of the form (*a*, 0) (or symmetrically, (0, *a*)) have norm $a^2$. This is also the number of triangles within a larger triangle bounded by the line connecting (*a*, 0) and (0, *a*). In the diagram below, two pentagonal sectors with the same number of triangles are connected end-to-end.
These are points of the form $(a, 0)$ (or symmetrically, $(0, a)$).
:::{}
![](./triangle_count_4_0.png)
```{python}
#| echo: false
#| fig-cap: |
#| Areas corresponding to tuple (4, 0).
#| This is the only class where we only need to consider pairs.
Areas corresponding to tuple (4, 0). This is the only class where we need to consider pairs.
:::
goldberg_triangles.draw_sector((4, 0), fill_all=True)
```
Two sectors are shown in the above diagram, with each sector composed of a large triangle.
The large triangles are bounded by $a$ triangles, and contain $a^2$ triangles.
Coincidentally, $\|(a, 0)\| = a^2$.
#### Class II
Points of the form (*a*, *a*) have norm $3a^2$. This is also the number of triangles contained within a trapezoid through the points (0, 0), (0, *a*), (*a*, *a*), and (*a*, 2*a*). In the diagram below, three pentagonal sectors are connected, since the path across hexagons is the same for a 60 degree turn in either direction.
These are points of the form $(a, a)$.
:::{}
![](./triangle_count_4_4.png)
```{python}
#| echo: false
#| fig-cap: |
#| Areas corresponding to tuple (4, 4).
Areas corresponding to tuple (4, 4). The region shared by the three pentagonal sectors is outlined in dark gray.
:::
goldberg_triangles.draw_sector((4, 4), fill_all=True)
```
In the above diagram, we split a sector into three trapezoids, one for each pentagon.
This makes it obvious that the largest triangle is bounded by $3a$ triangles and therefore has
$9a^2$ triangles in it.
Each pentagon therefore gets $3a^2$ triangles, and $\|(a, a)\| = 3a^2$.
#### Class III
All other tuples (*a*, *b*) do not cleanly slice the triangular plane. However, it is still possible to count the number of triangles in a triple of sectors. The lines which connect the nearest vertices of any two pentagons are the diagonals of a parallelogram. These parallelograms contain 2*wh* triangles (which can be seen by completing the square), or *wh* triangles when cleft in half by the diagonal. The center of the figure contains a large triangle with 3*b* triangles on an edge. This leaves three parallelograms with width 1 and height *h*, or 6*h* triangles unaccounted for.
These are all remaining points of the form $(a, b)$.
It should go without saying that this is the most complicated case.
:::: {layout-ncol=3}
::: {width="25%"}
![](./triangle_count_4_1.png)
::: { #fig-chiral-triangle }
```{python}
#| echo: false
#| layout-ncol: 3
goldberg_triangles.draw_sector((4, 1), fill_all=True)
plt.show()
goldberg_triangles.draw_sector((4, 2), fill_all=True)
plt.show()
goldberg_triangles.draw_sector((4, 3), fill_all=True)
plt.show()
```
Areas corresponding to tuples $(4, b)$, with *b* = 1, 2, 3.
:::
::: {width="25%"}
![](./triangle_count_4_2.png)
:::
In each case we do not cleanly slice the plane.
The largest triangle which can fit in the sector is colored in light gray.
This shape is surrounded by three parallelograms.
::: {width="25%"}
![](./triangle_count_4_3.png)
:::
::::
By inspection, it seems like the central triangle is bounded by 3, 6, and 9 triangles, or generally $3b$.
Similarly, the parallelograms are have heights 3, 2, and 1 (generally, $a - b$)
and widths 5, 7, and 9 (generally, $a + 2b - 1$).
Areas corresponding to tuples (4, *b*). Triangles which belong to a pentagon are colored red, green, and blue. Parallelograms (width *w*, height *h*) are colored in light red, green and blue. Completions of parallelograms (width 1, height *h*) are in dark gray. Central triangle colored in light gray.
<details>
<summary>
A more careful calculation
</summary>
We can verify this by calculating the coordinates of the blue triangle.
Starting from the red triangle, designate the lower-left vertex to be (0, 0).
After taking *a* steps, we are at $(a, a)$, which is the center of a hexagon.
The hexagon we face after turning clockwise is centered $(a, a) + (2, -1)$.
After *b* steps, the vertex of the blue triangle which is *not* touching a hexagon
lies at $(a, a) + (2b, -b) = (a + 2b, a - b)$.
Now, from that vertex, move one vertex to the left and draw a diagonal to the (0, 0)
This line is a diagonal of a parallelogram with width $a + 2b - 1$ and height $a - b$.
In order to find suitable values for *w* and *h*, recall the coordinates of the center of the blue pentagon where the red pentagon lies at the origin: $(a + 2b, a - b)$. The edge length of the central triangle is 3*b*, which can be seen from the subtraction $a + 2b - (a - b)$. The diagonal of the red parallelogram reaches from (1, 0) to $(a + 2b - 1, a - b)$. This means $w = a + 2b - 2$ and $l = a - b$. There are therefore:
Finally, notice that the central triangle does not have the same width as the parallelogram,
since the height of another parallelogram (minus the one colored triangle) is in the way.
This means that it is bounded by $a + 2b - 1 - (a - b - 1) = 3b$ triangles.
</details>
Now, a parallelogram of height $w$ and width $h$ is what remains after building
a large triangle of width $w + h$ and removing two a large triangles:
one of width $w$ from the top and one of width $h$ from the side.
Thus, a parallelogram contains $(w + h)^2 - w^2 - h^2 = 2wh$ triangles,
We can finally count the number of triangles:
$$
\begin{align*}
T &= 3wh + (3b)^2 + 6h
= 3(a + 2b - 2)(a - b) + 9b^2 + 6(a - b) \\[4pt]
&= 3(a^2 + 2ab - 2a - ab - 2b^2 + 2b) + 9b^2 + 6a - 6b \\[4pt]
&= 3a^2 + 3ab + (9 - 6)b^2 + (6 - 6)a - (6 - 6)b \\[4pt]
&= 3a^2 + 3ab + 3b^2 = 3\|a + bu\| \text{ triangles per triple of sectors}
T &= 3wh + (3b)^2
= 3(a + 2b - 1)(a - b) + 9b^2 \\[4pt]
&= 3(a^2 + 2ab - a - ab - 2b^2 + b) + 9b^2 \\[4pt]
&= 3a^2 + 3ab + (9 - 6)b^2 + (6 - 6)a - (6 - 6)b \\[4pt]
&= 3a^2 + 3ab + 3b^2 = 3\|a + bu\|
\end{align*}
$$
Giving an equal share of triangles to each pentagon as before, each has $\|(a, b)\|$ triangles.
### Triangles to Hexagons
We counted triangles rather than hexagons because the former is easier to count in the triangular plane. Plus, we know that hexagons can be decomposed (and recomposed) into 6 triangles. Now we can easily count the number of hexagons. The lower-leftmost triangle is part of a pentagon, so it is not counted. Of the remaining triangles, 6 make up a hexagon, meaning the point (*a*, *b*) counts $\|a +bu\| - 1 \over 6$ hexagons. These hexagons are only within the sector of a single pentagonal edge, so there are:
From this, we can very easily compute the number of hexagons.
One of the triangles belongs to the pentagon and should not be counted,
but the rest belong to hexagons.
Hexagons are composed of 6 triangles, so point $(a, b)$ counts $\|a +bu\| - 1 \over 6$ hexagons.
There are this many hexagons for each edge of a pentagon, so there are:
$$
\begin{gather*}
{\|a +bu\| - 1 \over 6}
\scriptsize {\text{hexagons} \over \text{sector}} \normalsize \cdot 5
\scriptsize {\text{sectors} \over \text{pentagon}} \normalsize \cdot 12
\scriptsize \text{ pentagons} \normalsize \\[4pt]
= 10(\|a +bu\| - 1) \text{ hexagons}
{\|a + bu\| - 1 \over 6}
\scriptsize {\text{hexagons} \over \text{edge}} \normalsize
\cdot 5
\scriptsize {\text{edges} \over \text{pentagon}} \normalsize
\cdot 12
\scriptsize \text{ pentagons} \normalsize \\[4pt]
= 10(\|a + bu\| - 1) \text{ hexagons}
\end{gather*}
$$
In other words, the number of hexagons is a multiple of 10 dictated by triangular norms of integer tuples minus 1. It may seem strange that the result is an integer, since every pentagonal sector contains at least some partial hexagons. However, all of these partial hexagons are completed by their adjacent sectors, whether on the same pentagon or those formed by any three pentagons. Visualize this by placing the regions formed by these triples (enclosed above in dark gray) on the faces on an icosahedron, the dual of the dodecahedron.
In other words, the number of hexagons is 10 times a number of the form $a^2 + ab + b^2 - 1$,
for integers *a* and *b*.
It may seem strange that the result is an integer, since every pentagonal sector contains
at least some partial hexagons.
However, all of these partial hexagons are completed on the adjacent sectors.
You can try visualizing this by placing each sector on
the face of an icosahedron (the dual of the dodecahedron).
Soccer Balls and Beyond
-----------------------
Beyond Soccer Balls
-------------------
The three cases of paths as described above are also used to delineate classes of Goldberg polyhedra. All possess rotational icosahedral symmetry ($I$) by virtue of their construction. Only class I and II polyhedra are mirror-symmetric ($I_h$) with class III polyhedra coming in chiral pairs, as mentioned previously.
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.
### Basic Conway Operators
Before listing certain Goldberg polyhedra, I will comment on their relationship to [Conway polyhedron notation](https://en.wikipedia.org/wiki/Conway_polyhedron_notation). Given a "seed" polyhedron and a string of operators (applied right-to-left), many polyhedra can be constructed. The simplest seed polyhedra are the Platonic solids (their symbols enclosed in parentheses): the (T)etrahedron, (C)ube, (O)ctahedron, (D)odecahedron, and (I)cosahedron.
Before listing certain Goldberg polyhedra, I will comment on their relationship to
[Conway polyhedron notation](https://en.wikipedia.org/wiki/Conway_polyhedron_notation).
Given a "seed" polyhedron and a string of operators (applied right-to-left), many polyhedra can be constructed.
The simplest seed polyhedra are the Platonic solids (their symbols enclosed in parentheses):
the (T)etrahedron, (C)ube, (O)ctahedron, (D)odecahedron, and (I)cosahedron.
::: {}
![](./polyhedronisme-D.png)
*D*, the regular dodecahedron
::: {.row .centered}
![
*D*, the regular dodecahedron
](./polyhedronisme-D.png)
:::
@ -247,90 +481,210 @@ Roughly, 6 operators generate most Goldberg polyhedra:
- Dual (*d*)
- Swaps faces for vertices and vice versa. Involutory.
- Kis ($k_n$)
- Replaces each face with a pyramid. If *n* is specified, only applies to *n*-gonal faces.
- Replaces each face with a pyramid.
- If *n* is specified, only applies to *n*-gonal faces.
- Truncate ($t_n = dk_nd$)
- Expands a vertex into a face, with the number of sides equalling the degree of the vertex. If *n* is specified, only applies to vertices of degree *n*.
- Expands a vertex into a face, with the number of sides equalling the degree of the vertex.
- If *n* is specified, only applies to vertices of degree *n*.
::: {layout-ncol=3}
![
[I = dD](https://levskaya.github.io/polyhedronisme/?recipe=I)
](./polyhedronisme-I.png)
![
[kD](https://levskaya.github.io/polyhedronisme/?recipe=kD)
](./polyhedronisme-kD.png)
![
[tD](https://levskaya.github.io/polyhedronisme/?recipe=tD)
](./polyhedronisme-tD.png)
:::
- Subdivide ($u_n$)
- For polyhedra with triangular faces, divides each into $n^2$ triangles by cutting each edge into *n* parts. For unspecified *n*, *n* = 2.
- For polyhedra with triangular faces, divides each into $n^2$ triangles by cutting each edge into *n* parts.
- For unspecified *n*, *n* = 2.
- Chamfer (*c* = *dud*)
- Adds hexagonal faces along edges, preserving existing vertices and faces.
- Whirl (*w*)
- Rotates faces outward and interpolates with hexagonal faces along each edge. Higher order whirls are possible, but outside the scope of this post.
- Rotates faces outward and interpolates with hexagonal faces along each edge.
- Higher order whirls are possible, but outside the scope of this post.
::: {}
![](./polyhedronisme-I.png)
::: {layout-ncol=3}
![
[uI](https://levskaya.github.io/polyhedronisme/?recipe=uI)
](./polyhedronisme-uI.png)
[I = dD](https://levskaya.github.io/polyhedronisme/?recipe=I)
![
[cD](https://levskaya.github.io/polyhedronisme/?recipe=K300cD)
](./polyhedronisme-K300cD.png)
![
[wD](https://levskaya.github.io/polyhedronisme/?recipe=K300wD)
](./polyhedronisme-K300wD.png)
:::
::: {}
![](./polyhedronisme-kD.png)
The last three operations are obtained from the Goldberg-Coxeter construction,
and as such, are termed Goldberg-Coxeter operators.
Both chamfer and whirl add hexagons, meaning they transform Goldberg polyhedra into other Goldberg polyhedra.
Also, since every vertex in a Goldberg polyhedron has degree 3,
it is always possible to use odd *u* operators by taking the dual.
[kD](https://levskaya.github.io/polyhedronisme/?recipe=kD)
:::
::: {}
![]()
[tD](https://levskaya.github.io/polyhedronisme/?recipe=tD)
:::
::: {}
![](./polyhedronisme-uI.png)
[uI](https://levskaya.github.io/polyhedronisme/?recipe=uI)
:::
::: {}
![](./polyhedronisme-K300cD.png)
[cD](https://levskaya.github.io/polyhedronisme/?recipe=K300cD)
:::
:::{}
![](./polyhedronisme-K300wD.png)
[wD](https://levskaya.github.io/polyhedronisme/?recipe=K300wD)
:::
The last three operations can be obtained from the Goldberg-Coxeter construction, and as such are termed Goldberg-Coxeter operators. In particular, since every vertex in a Goldberg polyhedron has degree 3, it is always possible to use odd *u* operators by taking the dual. Both chamfer and whirl add hexagons, meaning they transform Goldberg polyhedra into other Goldberg polyhedra. Two compound operators in particular which do the same are:
Two compound operators which also produce Goldberg polyhedra from existing ones are:
- $dk = d(dtd) = td$
- Raises pentagons and expands hexagons (as in central hexagonal numbers). Changes class I polyhedra into class II and vice versa.
- Raises pentagons and expands hexagons (as in
[gnomons of centered hexagonal numbers](https://en.wikipedia.org/wiki/Centered_hexagonal_number)).
- Changes class I polyhedra into class II and vice versa.
- $(dk)^2 = dkdk = tk$
- See above. Preserves class.
- Preserves class.
List of Hexagon Counts
----------------------
Here is a list containing the number of hexagons in each Goldberg polyhedron, answering the initial question. Though this list can be found [elsewhere](https://en.wikipedia.org/wiki/List_of_geodesic_polyhedra_and_Goldberg_polyhedra#Icosahedral), I will duplicate the first few entries here.
Here is a list containing the number of hexagons in each Goldberg polyhedron, answering the initial question.
Though this list can be found
[elsewhere](https://en.wikipedia.org/wiki/List_of_geodesic_polyhedra_and_Goldberg_polyhedra#Icosahedral),
I'll duplicate the first few entries here.
| Class | Tuple | $F_6$ | V | E | Conway |
|-------|--------|-------|-----|-----|--------|
| I | [(1, 0)](https://en.wikipedia.org/wiki/Regular_dodecahedron) | 0 | 20 | 30 | [D](https://levskaya.github.io/polyhedronisme/?recipe=D) |
| | [(2, 0)](https://en.wikipedia.org/wiki/Chamfered_dodecahedron) | 30 | 80 | 120 | [cD](https://levskaya.github.io/polyhedronisme/?recipe=K300cD) |
| | (3, 0) | 80 | 180 | 270 | [tkD = du3I](https://levskaya.github.io/polyhedronisme/?recipe=tkD) |
| | (4, 0) | 150 | 320 | 480 | [ccD = duuI](https://levskaya.github.io/polyhedronisme/?recipe=duudD) |
| | (5, 0) | 240 | 400 | 600 | [du5I](https://levskaya.github.io/polyhedronisme/?recipe=du5I) |
| II | [(1, 1)](https://en.wikipedia.org/wiki/Truncated_icosahedron) | 20 | 60 | 90 | tI |
| | (2, 2) | 110 | 240 | 360 | [tdcD](https://levskaya.github.io/polyhedronisme/?recipe=K300tdcD) |
| | (3, 3) | 260 | 540 | 810 | [tktI](https://levskaya.github.io/polyhedronisme/?recipe=tktI) |
| III | (2, 1) | 60 | 140 | 210 | [wD](https://levskaya.github.io/polyhedronisme/?recipe=K300wD) |
| | (3, 1) | 120 | 260 | 390 | \* |
| | (3, 2) | 180 | 380 | 570 | \* |
| | (4, 1) | 200 | 420 | 630 | [tdwD](https://levskaya.github.io/polyhedronisme/?recipe=K300tdwD) |
```{python}
#| echo: false
#| label: tbl-goldberg
#| tbl-cap: "\\\\* higher-order whirl needed"
#| tbl-colwidths: [20, 25, 10, 10, 10, 25]
#| classes: plain
\* higher-order whirl needed
goldberg_classes = {
"I": [
GoldbergData(
parameter=(1, 0),
parameter_link="https://en.wikipedia.org/wiki/Regular_dodecahedron",
conway="D",
conway_recipe="D",
),
GoldbergData(
parameter=(2, 0),
parameter_link="https://en.wikipedia.org/wiki/Chamfered_dodecahedron",
conway="cD",
conway_recipe="K300cD",
),
GoldbergData(
parameter=(3, 0),
conway="tkD = du3I",
conway_recipe="tkD",
),
GoldbergData(
parameter=(4, 0),
conway="ccD = du4I",
conway_recipe="du4I",
),
GoldbergData(
parameter=(5, 0),
conway="du5I",
conway_recipe="du5I",
),
],
"II": [
GoldbergData(
parameter=(1, 1),
parameter_link="https://en.wikipedia.org/wiki/Truncated_icosahedron",
conway="tI",
conway_recipe="tI",
),
GoldbergData(
parameter=(2, 2),
parameter_link="https://en.wikipedia.org/wiki/Truncated_icosahedron",
conway="tdcD",
conway_recipe="K300tdcD",
),
GoldbergData(
parameter=(3, 3),
conway="tktI",
conway_recipe="tktI",
),
],
"III": [
GoldbergData(
parameter=(2, 1),
conway="wD",
conway_recipe="K300wD",
),
GoldbergData(
parameter=(3, 1),
conway="*",
),
GoldbergData(
parameter=(3, 2),
conway="*",
),
GoldbergData(
parameter=(4, 1),
conway="tdwD",
conway_recipe="K300tdwD",
),
],
}
The polyhedron which corresponds to the shape of a soccer ball has parameter (1, 1), and is known (as implied by its Conway notation) as the truncated icosahedron. Additionally, similarly to how the entry (1, 0) is special because the dodecahedron is a Platonic solid, (1, 1) is special in that it is an [*Archimedean solid*](https://en.wikipedia.org/wiki/Archimedean_solid): every vertex has the same configuration of 2 hexagons and 1 pentagon ($V = V_1$).
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,
)
def goldberg_table_row(data: GoldbergData) -> list[str]:
poly_data = poly_from_dodecahedral_goldberg_parameter(data.parameter)
return [
f"[{data.parameter}]({data.parameter_link})"
if data.parameter_link is not None
else str(data.parameter),
str(poly_data.hexagon_count),
str(poly_data.vertex_count),
str(poly_data.edge_count),
f"[{data.conway}]({polyhedronisme(data.conway_recipe)})"
if data.conway_recipe is not None
else str(data.conway)
]
Markdown(tabulate(
[
([class_] if i == 0 else [""]) + goldberg_table_row(item)
for class_, items in goldberg_classes.items()
for i, item in enumerate(items)
],
headers=["Class", "Parameter", "$F_6$", "V", "E", "Conway"],
numalign="left",
))
```
The polyhedron which corresponds to the shape of a soccer ball has parameter (1, 1).
It is known (as implied by its Conway notation) as the truncated icosahedron.
Similarly to how the entry (1, 0) is special because the dodecahedron is a Platonic solid,
(1, 1) is special in that it is an [*Archimedean solid*](https://en.wikipedia.org/wiki/Archimedean_solid).
This means that every vertex has the same configuration: 2 hexagons and 1 pentagon ($V = V^1$).
Closing
-------
Goldberg polyhedra on their own are fascinating because they can be found in nature. [Buckyballs](https://en.wikipedia.org/wiki/Buckminsterfullerene) can be formed according to their structure, with number of carbons equalling the number of vertices. Viral [capsids](https://en.wikipedia.org/wiki/Capsid) are frequently observed to be arranged in these shapes. Goldberg's original paper can be found [here](https://www.jstage.jst.go.jp/article/tmj1911/43/0/43_0_104/_article), which contains additional observations such as the non-uniqueness of hexagon counts to a particular tuple.
Goldberg polyhedra on their own are fascinating because they can be found in nature.
[Buckyballs](https://en.wikipedia.org/wiki/Buckminsterfullerene) can be formed according to their structure,
with number of carbons equalling the number of vertices.
Viral [capsids](https://en.wikipedia.org/wiki/Capsid) are frequently observed to be arranged in these shapes.
Goldberg's original paper can be found
[here](https://www.jstage.jst.go.jp/article/tmj1911/43/0/43_0_104/_article),
which contains additional observations such as the non-uniqueness of hexagon counts to a particular tuple.
Despite the elegance in the symmetry and simple classification of these shapes, this does not produce *every* possible polyhedron as described by the problem statement. In the [next]() [few]() posts, I will do my best to catalogue additional, slightly more obscure solution polyhedra.
Despite the elegance in the symmetry and simple classification of these shapes, this does not produce *every*
possible polyhedron as described by the problem statement.
In the [next](../2) [few](../3) posts, I will do my best to catalogue additional, more obscure solutions.
Polyhedron images were generated using [polyHédronisme](https://levskaya.github.io/polyhedronisme/), triangular grid images were created using Matplotlib, and vertex enumeration image was created with GeoGebra.
Polyhedron images were generated using [polyHédronisme](https://levskaya.github.io/polyhedronisme/)
and vertex enumeration image was created with GeoGebra.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 63 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 72 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 79 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 103 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 107 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 110 KiB