finish pythonifying data, minor revisions to permutations.2
This commit is contained in:
parent
2c1775e8f2
commit
f5d6614462
Binary file not shown.
|
Before Width: | Height: | Size: 86 KiB After Width: | Height: | Size: 66 KiB |
BIN
posts/permutations/2/exp_order_4.png
Normal file
BIN
posts/permutations/2/exp_order_4.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 352 KiB |
@ -54,9 +54,9 @@ class SymmetricSpectrum:
|
||||
shown_roots = len(polynomial_roots) > 0 or len(integer_roots) > 0
|
||||
not_shown_string = (
|
||||
(
|
||||
f"Not shown: {self.not_shown_count} other roots"
|
||||
f"*Not shown: {self.not_shown_count} other roots*"
|
||||
if shown_roots
|
||||
else f"Not shown: all {self.not_shown_count} roots"
|
||||
else f"*Not shown: all {self.not_shown_count} roots*"
|
||||
)
|
||||
if self.not_shown_count > 0
|
||||
else ""
|
||||
@ -97,7 +97,8 @@ class SymmetricSpectrum:
|
||||
)
|
||||
)
|
||||
|
||||
return ((
|
||||
return (
|
||||
(
|
||||
"$$\\begin{gather*}"
|
||||
+ integral_roots_lines
|
||||
+ " \\\\ "
|
||||
@ -127,9 +128,10 @@ def count_roots_spectrum(spectrum: SymmetricSpectrum) -> int:
|
||||
+ spectrum.not_shown_count
|
||||
)
|
||||
|
||||
|
||||
@dataclass
|
||||
class GraphData:
|
||||
vertex_count: int
|
||||
edge_count: int
|
||||
distance_classes: list[int]
|
||||
spectrum: SymmetricSpectrum
|
||||
vertex_count: int | None = None
|
||||
edge_count: int | None = None
|
||||
distance_classes: list[int] | None = None
|
||||
|
||||
@ -1,10 +1,24 @@
|
||||
from .base import SymmetricSpectrum
|
||||
from .base import GraphData, SymmetricSpectrum
|
||||
|
||||
# TODO: other non-spectral data
|
||||
complete_spectra = {
|
||||
3: SymmetricSpectrum([(0, 4), (3, 1)]),
|
||||
4: SymmetricSpectrum([(0, 4), (2, 9), (6, 1)]),
|
||||
5: SymmetricSpectrum(
|
||||
data = {
|
||||
3: GraphData(
|
||||
vertex_count=6,
|
||||
edge_count=9,
|
||||
distance_classes=[1, 3, 2],
|
||||
spectrum=SymmetricSpectrum([(0, 4), (3, 1)]),
|
||||
),
|
||||
4: GraphData(
|
||||
vertex_count=24,
|
||||
edge_count=72,
|
||||
distance_classes=[1, 6, 11, 6],
|
||||
spectrum=SymmetricSpectrum([(0, 4), (2, 9), (6, 1)]),
|
||||
),
|
||||
5: GraphData(
|
||||
vertex_count=120,
|
||||
edge_count=600,
|
||||
distance_classes=[1, 10, 35, 50, 24],
|
||||
spectrum=SymmetricSpectrum(
|
||||
[
|
||||
(0, 36),
|
||||
(2, 25),
|
||||
@ -12,7 +26,12 @@ complete_spectra = {
|
||||
(10, 1),
|
||||
]
|
||||
),
|
||||
6: SymmetricSpectrum(
|
||||
),
|
||||
6: GraphData(
|
||||
vertex_count=720,
|
||||
edge_count=5400,
|
||||
distance_classes=[1, 15, 85, 225, 274, 120],
|
||||
spectrum=SymmetricSpectrum(
|
||||
[
|
||||
(0, 256),
|
||||
(3, 125),
|
||||
@ -21,7 +40,12 @@ complete_spectra = {
|
||||
(15, 1),
|
||||
]
|
||||
),
|
||||
7: SymmetricSpectrum(
|
||||
),
|
||||
7: GraphData(
|
||||
vertex_count=5040,
|
||||
edge_count=52920,
|
||||
distance_classes=[1, 21, 175, 735, 1624, 1764, 720],
|
||||
spectrum=SymmetricSpectrum(
|
||||
[
|
||||
(0, 400),
|
||||
(1, 441),
|
||||
@ -33,8 +57,11 @@ complete_spectra = {
|
||||
(21, 1),
|
||||
]
|
||||
),
|
||||
),
|
||||
# TODO: missing a root (and its negative) of multiplicity 400
|
||||
8: SymmetricSpectrum(
|
||||
8: GraphData(
|
||||
vertex_count=40320,
|
||||
spectrum=SymmetricSpectrum(
|
||||
[
|
||||
(0, 9864),
|
||||
(2, 3136),
|
||||
@ -46,5 +73,8 @@ complete_spectra = {
|
||||
(20, 49),
|
||||
(28, 1),
|
||||
]
|
||||
)
|
||||
),
|
||||
}
|
||||
|
||||
# TODO (maybe): verify these quantities with outputs from Haskell
|
||||
|
||||
@ -1,10 +1,17 @@
|
||||
from .base import SymmetricSpectrum, x
|
||||
from .base import SymmetricSpectrum, GraphData, x
|
||||
|
||||
path_spectra = {
|
||||
3: SymmetricSpectrum(
|
||||
[(1, 2), (2, 1)]
|
||||
data = {
|
||||
3: GraphData(
|
||||
vertex_count=6,
|
||||
edge_count=6,
|
||||
distance_classes=[1, 2, 2, 1],
|
||||
spectrum=SymmetricSpectrum([(1, 2), (2, 1)]),
|
||||
),
|
||||
4: SymmetricSpectrum(
|
||||
4: GraphData(
|
||||
vertex_count=24,
|
||||
edge_count=36,
|
||||
distance_classes=[1, 3, 5, 6, 5, 3, 1],
|
||||
spectrum=SymmetricSpectrum(
|
||||
[
|
||||
(1, 3),
|
||||
(3, 1),
|
||||
@ -13,7 +20,12 @@ path_spectra = {
|
||||
(x**2 + 2 * x - 1, 3),
|
||||
]
|
||||
),
|
||||
5: SymmetricSpectrum(
|
||||
),
|
||||
5: GraphData(
|
||||
vertex_count=120,
|
||||
edge_count=240,
|
||||
distance_classes=[1, 4, 9, 15, 20, 22, 20, 15, 9, 4, 1],
|
||||
spectrum=SymmetricSpectrum(
|
||||
[
|
||||
(0, 12),
|
||||
(1, 6),
|
||||
@ -25,7 +37,12 @@ path_spectra = {
|
||||
(x**3 + 2 * x**2 - 5 * x - 4, 5),
|
||||
]
|
||||
),
|
||||
6: SymmetricSpectrum(
|
||||
),
|
||||
6: GraphData(
|
||||
vertex_count=720,
|
||||
edge_count=1800,
|
||||
distance_classes=[1, 5, 14, 29, 49, 71, 90, 101, 101, 90, 71, 49, 29, 14, 5, 1],
|
||||
spectrum=SymmetricSpectrum(
|
||||
[
|
||||
(0, 20),
|
||||
(1, 25),
|
||||
@ -37,7 +54,35 @@ path_spectra = {
|
||||
],
|
||||
not_shown_count=558,
|
||||
),
|
||||
7: SymmetricSpectrum(
|
||||
),
|
||||
7: GraphData(
|
||||
vertex_count=5040,
|
||||
edge_count=15120,
|
||||
distance_classes=[
|
||||
1,
|
||||
6,
|
||||
20,
|
||||
49,
|
||||
98,
|
||||
169,
|
||||
259,
|
||||
359,
|
||||
455,
|
||||
531,
|
||||
573,
|
||||
573,
|
||||
531,
|
||||
455,
|
||||
359,
|
||||
259,
|
||||
169,
|
||||
98,
|
||||
49,
|
||||
20,
|
||||
6,
|
||||
1,
|
||||
],
|
||||
spectrum=SymmetricSpectrum(
|
||||
[
|
||||
(0, 35),
|
||||
(1, 20),
|
||||
@ -46,5 +91,11 @@ path_spectra = {
|
||||
],
|
||||
not_shown_count=4873,
|
||||
),
|
||||
8: SymmetricSpectrum([], not_shown_count=40320),
|
||||
),
|
||||
8: GraphData(
|
||||
vertex_count=40320,
|
||||
spectrum=SymmetricSpectrum([], not_shown_count=40320)
|
||||
),
|
||||
}
|
||||
|
||||
# TODO (maybe): verify these quantities with outputs from Haskell
|
||||
|
||||
@ -1,8 +1,17 @@
|
||||
from .base import SymmetricSpectrum
|
||||
from .base import SymmetricSpectrum, GraphData
|
||||
|
||||
star_spectra = {
|
||||
3: SymmetricSpectrum([(1, 2), (2, 1)]),
|
||||
4: SymmetricSpectrum(
|
||||
data = {
|
||||
3: GraphData(
|
||||
vertex_count=6,
|
||||
edge_count=6,
|
||||
distance_classes=[1, 2, 2, 1],
|
||||
spectrum=SymmetricSpectrum([(1, 2), (2, 1)]),
|
||||
),
|
||||
4: GraphData(
|
||||
vertex_count=24,
|
||||
edge_count=36,
|
||||
distance_classes=[1, 3, 6, 9, 5],
|
||||
spectrum=SymmetricSpectrum(
|
||||
[
|
||||
(0, 4),
|
||||
(1, 3),
|
||||
@ -10,7 +19,12 @@ star_spectra = {
|
||||
(3, 1),
|
||||
]
|
||||
),
|
||||
5: SymmetricSpectrum(
|
||||
),
|
||||
5: GraphData(
|
||||
vertex_count=120,
|
||||
edge_count=240,
|
||||
distance_classes=[1, 4, 12, 30, 44, 26, 3],
|
||||
spectrum=SymmetricSpectrum(
|
||||
[
|
||||
(0, 30),
|
||||
(1, 4),
|
||||
@ -19,7 +33,12 @@ star_spectra = {
|
||||
(4, 1),
|
||||
]
|
||||
),
|
||||
6: SymmetricSpectrum(
|
||||
),
|
||||
6: GraphData(
|
||||
vertex_count=720,
|
||||
edge_count=1800,
|
||||
distance_classes=[1, 5, 20, 70, 170, 250, 169, 35],
|
||||
spectrum=SymmetricSpectrum(
|
||||
[
|
||||
(0, 168),
|
||||
(1, 30),
|
||||
@ -29,7 +48,12 @@ star_spectra = {
|
||||
(5, 1),
|
||||
]
|
||||
),
|
||||
7: SymmetricSpectrum(
|
||||
),
|
||||
7: GraphData(
|
||||
vertex_count=5040,
|
||||
edge_count=15120,
|
||||
distance_classes=[1, 6, 30, 135, 460, 1110, 1689, 1254, 340, 15],
|
||||
spectrum=SymmetricSpectrum(
|
||||
[
|
||||
(0, 840),
|
||||
(1, 468),
|
||||
@ -40,7 +64,10 @@ star_spectra = {
|
||||
(6, 1),
|
||||
]
|
||||
),
|
||||
8: SymmetricSpectrum(
|
||||
),
|
||||
8: GraphData(
|
||||
vertex_count=40320,
|
||||
spectrum=SymmetricSpectrum(
|
||||
[
|
||||
(0, 3960),
|
||||
(1, 5691),
|
||||
@ -51,5 +78,8 @@ star_spectra = {
|
||||
(6, 42),
|
||||
(7, 1),
|
||||
]
|
||||
)
|
||||
),
|
||||
}
|
||||
|
||||
# TODO (maybe): verify these quantities with outputs from Haskell
|
||||
|
||||
|
Before Width: | Height: | Size: 1.0 KiB After Width: | Height: | Size: 1.0 KiB |
@ -1,17 +1,16 @@
|
||||
---
|
||||
title: "A Game of Permutations, Part 2"
|
||||
description: |
|
||||
Permutohedra and some very large graphs
|
||||
Notes on permutohedra and some very large graphs.
|
||||
format:
|
||||
html:
|
||||
html-math-method: katex
|
||||
jupyter: python3
|
||||
date: "2022-01-18"
|
||||
date-modified: "2025-07-04"
|
||||
date-modified: "2025-07-06"
|
||||
categories:
|
||||
- graph theory
|
||||
- group theory
|
||||
- sorting algorithms
|
||||
---
|
||||
|
||||
```{python}
|
||||
@ -36,27 +35,29 @@ Cayley Graphs
|
||||
-------------
|
||||
|
||||
For a given generating set, we can assign every element in the group it generates to a vertex in a graph.
|
||||
Starting with each of the generators, we draw arrows from one vertex to the other when
|
||||
Starting with each of the generators, we draw edges from one vertex to another when
|
||||
the product of the initial vertex and a generator (in that order) is the product vertex.
|
||||
If we continue until there are no more arrows to draw, the resulting figure is known as a
|
||||
[Cayley graph](https://mathworld.wolfram.com/CayleyGraph.html).
|
||||
This process continues until there are no more arrows to draw.
|
||||
The resulting figure is known as a [Cayley graph](https://mathworld.wolfram.com/CayleyGraph.html)[^1].
|
||||
|
||||
Owing to the way in which they are generated, Cayley graphs have a few useful properties as graphs.
|
||||
[^1]: The construction implies a labelling of edges by its generating set and a labelling
|
||||
of vertices by the generated elements.
|
||||
It is also common to describe an unlabelled graph as "Cayley" if it could
|
||||
be generated by this procedure.
|
||||
|
||||
Owing to the way in which they are defined, Cayley graphs have a few useful properties as graphs.
|
||||
At every vertex, we have as many outward edges as we do generators in the generating set,
|
||||
so the outward (and in fact, inward) degree of each vertex is the same.
|
||||
In other words, it is a regular graph.
|
||||
More than that, it is vertex-transitive, since labelling a single vertex's outward edges
|
||||
will label that of the entire graph.
|
||||
More than that, it is [vertex-transitive](https://mathworld.wolfram.com/Vertex-TransitiveGraph.html),
|
||||
since labelling a single vertex's outward edges will label that of the entire graph.
|
||||
|
||||
Cayley graphs can take a wide variety of shapes, which depend on the generating set used.
|
||||
Their construction implies a labelling of vertices by permutations and an edge labelling
|
||||
indicative of its generating set, but they can just as easily be abstract graphs separate
|
||||
from the procedure that was used to generate them.
|
||||
Cayley graphs depend on the generating set used, so they can take a wide variety of shapes.
|
||||
Here are a few examples of Cayley graphs made from elements of $S_4$:
|
||||
|
||||

|
||||
@ -70,10 +71,17 @@ However, if for every member of the generating set, we also include its inverse,
|
||||
Graphs to Graphs
|
||||
----------------
|
||||
|
||||
Since all 2-cycles are their own inverse, the generating sets which include only them produce undirected Cayley graphs.
|
||||
Furthermore, since the generating set can itself be thought of as a graph,
|
||||
All 2-cycles are their own inverse, so generating sets which include only them
|
||||
produce undirected Cayley graphs.
|
||||
Since this kind of generating set can itself be thought of as a graph,
|
||||
we may consider an operation from graphs to graphs that maps a swap diagram to its Cayley graph.
|
||||
|
||||

|
||||
|
||||
I've taken to calling this operation the "graph exponential"[^1] because of its apparent relationship
|
||||
with the disjoint union.
|
||||
Namely, it seems to be the case that $\exp( A \oplus B ) = \exp( A ) \times \exp( B )$,
|
||||
@ -82,17 +90,10 @@ Namely, it seems to be the case that $\exp( A \oplus B ) = \exp( A ) \times \exp
|
||||
|
||||
[^1]: Originally, I called this operation the "graph factorial", since it involves permutations
|
||||
and the number of vertices in the resulting graph grows factorially.
|
||||
While I believe this is a better name, some images in this article retain the earlier A! notation.
|
||||
|
||||
[^2]: Graphs have many product structures, such as the tensor product and strong product.
|
||||
The Cartesian product is (categorically) more natural when paired with disjoint unions.
|
||||
|
||||

|
||||
|
||||
This operation is my own invention, so I am unsure whether or not
|
||||
it constitutes anything useful.
|
||||
In fact, the possible graphs grow so rapidly that computing anything about the exponential
|
||||
@ -108,7 +109,8 @@ They are among the simplest graphs one can consider, and as we will see shortly,
|
||||
Some Small Exponential Graphs
|
||||
-----------------------------
|
||||
|
||||
Because of the difficulty in determining graph isomorphism, it is challenging for a computer to find a graph in an encyclopedia.
|
||||
Because of [the difficulty in determining graph isomorphism](https://en.wikipedia.org/wiki/Graph_isomorphism_problem),
|
||||
it is challenging for a computer to find a graph in an encyclopedia.
|
||||
Computers think of graphs as a list of vertices and their outward edges,
|
||||
but this implementation faces inherent labelling issues.
|
||||
These persist even if the graph is described as a list of (un)ordered pairs,
|
||||
@ -119,12 +121,14 @@ I was able to locate a project named the
|
||||
but it is only able to build a database simple connected graphs which
|
||||
can be queried by invariants (and is outdated since it uses Python 2).
|
||||
|
||||
However, as visual objects, humans can compare graphs fairly easily -- the name means "drawing" after all.
|
||||
Exponentials of 3- and 4- graphs are neither so small as to be uninteresting nor so big as to be unparsable by humans.
|
||||
However, as visual objects, humans can compare graphs fairly easily
|
||||
-- the name means "drawing" after all.
|
||||
Exponentials of 3- and 4-graphs are neither so small as to be uninteresting
|
||||
nor so big as to be unparsable by humans.
|
||||
|
||||
|
||||
### Order 3
|
||||
|
||||
<!-- TODO: Diagram contains old ! format -->
|
||||

|
||||
|
||||
At this stage, we only really have two graphs to consider, since $P_3 = \bigstar_3$.
|
||||
@ -135,7 +139,7 @@ It is also apparent that $\exp( K_3 )$ is the utility graph, $K_{3,3}$.
|
||||

|
||||
|
||||
We can again demonstrate the sum rule of the graph exponential with $\exp( P_3 \oplus P_2 )$.
|
||||
Simplifying, since we know $\exp( P_3 ) = C_6$, the expression is $C_6 \times P_2 = \text{Prism}_6$,
|
||||
Simplifying, since we know $\exp( P_3 ) = C_6$, the result is $C_6 \times P_2 = \text{Prism}_6$,
|
||||
the hexagonal prism graph.
|
||||
|
||||
|
||||
@ -147,8 +151,7 @@ Simplifying, since we know $\exp( P_3 ) = C_6$, the expression is $C_6 \times P_
|
||||

|
||||
:::
|
||||
|
||||
<!-- TODO: blank? -->
|
||||
![]()
|
||||

|
||||
|
||||
With some effort, $\exp( P_4 )$ can be imagined as a projection of a 3D object,
|
||||
the [truncated octahedron](https://en.wikipedia.org/wiki/Truncated_octahedron).
|
||||
@ -160,16 +163,19 @@ In fact, they are able to completely tessellate the $n-1$ dimensional subspace o
|
||||
$\mathbb{R}^n$ where the coordinates sum to the $n-1$th triangular number.
|
||||
Note that the previous graph in the sequence of $\exp(P_n)$, the hexagonal graph,
|
||||
is visible in the truncated octahedron.
|
||||
This can be seen in the orthographic projection obtained by the map $(x,y,z,w) \mapsto (x,y,z)$.
|
||||
This corresponds to the projection $(x,y,z,w) \mapsto (x,y,z)$ over
|
||||
the coordinates of the permutohedra.
|
||||
|
||||
Technically, there is a distinction between the Cayley graphs and permutohedra since their labellings differ.
|
||||
Both have edges generated by swaps, but in the latter case, there is a uniform
|
||||
Euclidean metric between two vertices.
|
||||
Technically, there is a distinction between the Cayley graphs and permutohedra
|
||||
since their labellings differ.
|
||||
Both have edges generated by swaps, but in the latter case, the connected vertices are expected to be
|
||||
separated by a certain Euclidean distance.
|
||||
More information about the distinction can be found at this article on
|
||||
[Wikimedia](https://commons.wikimedia.org/wiki/Category:Permutohedron_of_order_4_%28raytraced%29#Permutohedron_vs._Cayley_graph)[^3].
|
||||
|
||||
[^3]: Actually, if one considers a *right* Cayley graph, where each generator is right-multiplied
|
||||
to the permutation at a node rather than left-multiplied, then a true correspondence is obtained.
|
||||
to the permutation at a node rather than left-multiplied, then a true correspondence is obtained,
|
||||
at least for order 4.
|
||||
|
||||
Meanwhile, $\exp( \bigstar_4 )$ is more difficult to identify, at least without rearranging its vertices.
|
||||
It turns out to be isomorphic to the [Nauru graph](https://mathworld.wolfram.com/NauruGraph.html),
|
||||
@ -179,7 +185,8 @@ Notably, whereas the graph isomorphic to the permutohedron is obviously a spheri
|
||||
The Nauru graph also belongs to the family of
|
||||
[permutation star graphs](https://mathworld.wolfram.com/PermutationStarGraph.html)
|
||||
$PS_n$ (*n* = 4), which also includes the hexagonal graph (*n* = 3).
|
||||
The MathWorld article confirms a correspondence, stating graphs of this form are generated by pairwise swaps.
|
||||
The MathWorld article confirms some kind of correspondence, stating graphs of this form
|
||||
are generated by pairwise swaps.
|
||||
|
||||
My attempts at finding a graph isomorphic to $\exp( K_4 )$ have thus far ended in failure.
|
||||
It is certainly *not* isomorphic to $K_{4,4}$, since this graph has 8 vertices,
|
||||
@ -201,16 +208,42 @@ I also have great confidence in the sequences I found for $\exp( K_n )$.
|
||||
|
||||
#### Edge Counts
|
||||
|
||||
Despite knowing how many vertices there are ($n!$, the order of the symmetric group), we don't necessarily know how many edges there are.
|
||||
Despite knowing how many vertices there are ($n!$, the order of the symmetric group),
|
||||
we don't necessarily know how many edges there are.
|
||||
|
||||
| *n* | $\#E(\exp( P_n ))$ | $\#E(\exp( \bigstar_n ))$ | $\#E(\exp( K_n ))$ |
|
||||
|------|--------------------|---------------------------|--------------------|
|
||||
| 3 | 6 | 6 | 9 |
|
||||
| 4 | 36 | 36 | 72 |
|
||||
| 5 | 240 | 240 | 600 |
|
||||
| 6 | 1800 | 1800 | 5400 |
|
||||
| 7 | 15120 | 15120 | 52920 |
|
||||
| Rule | Second column of Lah numbers $L(n,2) = n!{(n-1)(n-2) \over 4}$ [OEIS A001286](http://oeis.org/A001286) | Same as previous | $n!{n(n-1) \over 4}$ [OEIS 001809](http://oeis.org/A001809) |
|
||||
```{python}
|
||||
#| echo: false
|
||||
#| classes: plain
|
||||
|
||||
Markdown(tabulate(
|
||||
[
|
||||
[i, pathG.edge_count, starG.edge_count, completeG.edge_count]
|
||||
for i in range(3, 8)
|
||||
for pathG, starG, completeG in (
|
||||
[path.data[i], star.data[i], complete.data[i]],
|
||||
)
|
||||
] + [
|
||||
[
|
||||
"Sequence",
|
||||
"Second column of Lah numbers <br> [OEIS A001286](http://oeis.org/A001286)",
|
||||
"Same as previous",
|
||||
"[OEIS 001809](http://oeis.org/A001809)",
|
||||
],
|
||||
[
|
||||
"Rule",
|
||||
r"$L(n,2) = n!{(n-1)(n-2) \over 4}$",
|
||||
"",
|
||||
r"$n!{n(n-1) \over 4}$"
|
||||
]
|
||||
],
|
||||
headers=[
|
||||
"*n*",
|
||||
r"$\#E(\exp( P_n ))$",
|
||||
r"$\#E(\exp( \bigstar_n ))$",
|
||||
r"$\#E(\exp( K_n ))$"
|
||||
]
|
||||
))
|
||||
```
|
||||
|
||||
|
||||
#### Radius and Distance Classes
|
||||
@ -218,56 +251,68 @@ Despite knowing how many vertices there are ($n!$, the order of the symmetric gr
|
||||
The radius of a graph is the smallest possible distance which separates two maximally-separated vertices.
|
||||
Due to vertex transitivity, the greatest distance between two vertices is the same for every vertex.
|
||||
|
||||
| *n* | $r(\exp( P_n ))$ | $r(\exp( \bigstar_n ))$ | $r(\exp( K_n ))$ |
|
||||
|------|------------------|-------------------------|------------------|
|
||||
| 3 | 3 | 3 | 2 |
|
||||
| 4 | 6 | 4 | 3 |
|
||||
| 5 | 10 | 6 | 4 |
|
||||
| 6 | 15 | 7 | 5 |
|
||||
| 7 | 21 | 9 | 6 |
|
||||
| Rule | Triangular numbers $\Delta_{n-1} = {n(n-1) \over 2}$ [OEIS A00021](http://oeis.org/A000217) | Integers not congruent to 2 (mod 3) $\lfloor {n-1 \over 2} \rfloor + n -\ 1$ [OEIS A032766](http://oeis.org/A032766) | *n* - 1 |
|
||||
```{python}
|
||||
#| echo: false
|
||||
#| classes: plain
|
||||
|
||||
More information can be gathered about distances on the graph than these reductive quantities.
|
||||
If a vertex is distinguished and the remaining vertices are partitioned into classes by their distances from it,
|
||||
then the size of each class will be the same for every vertex.
|
||||
Markdown(tabulate(
|
||||
[
|
||||
[i, len(pathG), len(starG), len(completeG)]
|
||||
for i in range(3, 8)
|
||||
for pathG, starG, completeG in (
|
||||
[path.data[i].distance_classes, star.data[i].distance_classes, complete.data[i].distance_classes],
|
||||
)
|
||||
] + [
|
||||
[
|
||||
"Sequence",
|
||||
"Triangular numbers <br> [OEIS A000217](http://oeis.org/A000217)",
|
||||
"Integers not congruent to 2 (mod 3) <br> [OEIS A032766](http://oeis.org/A032766)",
|
||||
"*n* - 1"
|
||||
],
|
||||
[
|
||||
"Rule",
|
||||
r"$\Delta_{n-1} = {n(n-1) \over 2}$",
|
||||
r"$\lfloor {n-1 \over 2} \rfloor + n -\ 1$"
|
||||
]
|
||||
],
|
||||
headers=[
|
||||
"*n*",
|
||||
r"$r(\exp( P_n ))$",
|
||||
r"$r(\exp( \bigstar_n ))$",
|
||||
r"$r(\exp( K_n ))$"
|
||||
]
|
||||
))
|
||||
```
|
||||
|
||||
These quantities are somewhat reductive.
|
||||
If a vertex is distinguished, the remaining vertices may be partitioned into classes by their
|
||||
distance from it.
|
||||
Including the vertex itself (which is distance 0 away), there will be $r + 1$ such classes,
|
||||
where r is the radius.
|
||||
where *r* is the radius.
|
||||
These classes are the same for every vertex due to transitivity.
|
||||
|
||||
In the case of these graphs, they are a partition of the factorial numbers.
|
||||
|
||||
```{python}
|
||||
#| echo: false
|
||||
#| classes: plain
|
||||
|
||||
mahonian = [
|
||||
[1, 2, 2, 1],
|
||||
[1, 3, 5, 6, 5, 3, 1],
|
||||
[1, 4, 9, 15, 20, 22, 20, 15, 9, 4, 1],
|
||||
[1, 5, 14, 29, 49, 71, 90, 101, 101, 90, 71, 49, 29, 14, 5, 1],
|
||||
[1, 6, 20, 49, 98, 169, 259, 359, 455, 531, 573, 573, 531, 455, 359, 259, 169, 98, 49, 20, 6, 1],
|
||||
]
|
||||
|
||||
whitney_second_kind = [
|
||||
[1, 2, 2, 1],
|
||||
[1, 3, 6, 9, 5],
|
||||
[1, 4, 12, 30, 44, 26, 3],
|
||||
[1, 5, 20, 70, 170, 250, 169, 35],
|
||||
[1, 6, 30, 135, 460, 1110, 1689, 1254, 340, 15],
|
||||
]
|
||||
|
||||
stirling_second_kind = [
|
||||
[1, 3, 2],
|
||||
[1, 6, 11, 6],
|
||||
[1, 10, 35, 50, 24],
|
||||
[1, 15, 85, 225, 274, 120],
|
||||
[1, 21, 175, 735, 1624, 1764, 720],
|
||||
]
|
||||
|
||||
half_break = lambda x: str(x[:len(x) // 2])[:-1] + "<br>" + str(x[len(x) // 2:])[1:]
|
||||
|
||||
Markdown(tabulate(
|
||||
[
|
||||
[i, j if i <= 5 else half_break(j), k, l]
|
||||
for i, j, k, l in zip(range(3,8), mahonian, whitney_second_kind, stirling_second_kind)
|
||||
[i, pathG if i <= 5 else half_break(pathG), starG, completeG]
|
||||
for i in range(3, 8)
|
||||
for pathG, starG, completeG in (
|
||||
[path.data[i].distance_classes, star.data[i].distance_classes, complete.data[i].distance_classes],
|
||||
)
|
||||
] + [
|
||||
[
|
||||
"Sequence",
|
||||
"Mahonian numbers <br> [OEIS A008302](http://oeis.org/A008302)",
|
||||
"Whitney numbers of the second kind (star poset) <br> [OEIS A007799](http://oeis.org/A007799)",
|
||||
"Stirling numbers of the first kind <br> [OEIS A132393](http://oeis.org/A132393)"
|
||||
]
|
||||
],
|
||||
headers=[
|
||||
"*n*",
|
||||
@ -278,9 +323,13 @@ Markdown(tabulate(
|
||||
))
|
||||
```
|
||||
|
||||
I am certain that the appearance of the Stirling numbers here is legitimate, since these numbers count the number of permutations of *n* objects with *k* disjoint cycles.
|
||||
Obviously, the identity element is distance 1 from all 2-cycles since they are all in the generating set; likewise, all 3-cycles are distance 2 from the identity (but distance 1 from the 2-cycles), and so on until the entire graph has been mapped.
|
||||
The shapes induced by these classes were used to create the diagrams of $\exp( K_3 )$ and $\exp( K_4 )$ above.
|
||||
I am certain that the appearance of the Stirling numbers here is legitimate,
|
||||
since these numbers count the number of permutations of *n* objects with *k* disjoint cycles.
|
||||
Obviously, the identity element is distance 1 from all 2-cycles since they are all in the generating set;
|
||||
likewise, all 3-cycles are distance 2 from the identity (but distance 1 from the 2-cycles),
|
||||
and so on until the entire graph has been mapped.
|
||||
The shapes induced by these classes were used to create the diagrams
|
||||
of $\exp( K_3 )$ and $\exp( K_4 )$ above.
|
||||
|
||||
|
||||
#### Spectrum
|
||||
@ -299,7 +348,7 @@ Markdown(tabulate(
|
||||
[i, pathG.to_markdown(), starG.to_markdown(), completeG.to_markdown()]
|
||||
for i in range(3, 9)
|
||||
for pathG, starG, completeG in (
|
||||
[path.path_spectra[i], star.star_spectra[i], complete.complete_spectra[i]],
|
||||
[path.data[i].spectrum, star.data[i].spectrum, complete.data[i].spectrum],
|
||||
)
|
||||
],
|
||||
headers=[
|
||||
@ -315,8 +364,9 @@ From what I have been able to identify, the spectrum of an exponential graph is
|
||||
by which I mean that the characteristic polynomial is even.
|
||||
This has been the case for all graphs I have tried testing, even outside these graph families.
|
||||
|
||||
Since all eigenvalues of $\exp( \bigstar_n )$ calculated are integers, it appears they are integral graphs,
|
||||
a fact of which I am reasonably sure because of the correspondence to permutation star graphs.
|
||||
Since all eigenvalues of $\exp( \bigstar_n )$ calculated are integers,
|
||||
it appears they are integral graphs, a fact of which I am reasonably sure
|
||||
because of the aforementioned correspondence to permutation star graphs.
|
||||
Additionally, the eigenvalues are very conveniently the integers up to $n-1$ and down to $-n+1$.
|
||||
Unfortunately, despite the ease of reading the eigenvalues themselves,
|
||||
there isn't an OEIS entry for the multiplicities.
|
||||
@ -326,7 +376,7 @@ If this is truly the sequence being generated, it means there is a 1:1 correspon
|
||||
these orderings and a basis of the nullspace of the adjacency matrix.
|
||||
|
||||
It seems to be the case that $\exp( K_n )$ are also integral graphs.
|
||||
Perplexingly, the multiplicities for each of the eigenvalues appear to be perfect powers.
|
||||
Perplexingly, the multiplicities for each of the eigenvalues appear to mostly be perfect powers.
|
||||
This is the case until n = 8, which ruins the pattern because neither of
|
||||
$9864 = 2^3 \cdot 3^2 \cdot 137$ or $6125 = 5^3 \cdot 7^2$ are perfect powers.
|
||||
I find both this and the fact that such a large prime appears among the factorization
|
||||
@ -380,8 +430,9 @@ While this is a fascinating topic unto itself, this post is already long enough,
|
||||
:::
|
||||
|
||||
|
||||
### [Heap's Algorithm](https://en.wikipedia.org/wiki/Heap%27s_algorithm)[^1]
|
||||
### [Heap's Algorithm](https://en.wikipedia.org/wiki/Heap%27s_algorithm)
|
||||
|
||||
:::: {}
|
||||
::: {layout-ncol="3"}
|
||||

|
||||
|
||||
@ -396,7 +447,8 @@ While this is a fascinating topic unto itself, this post is already long enough,
|
||||

|
||||
:::
|
||||
|
||||
[^5]: GHC's `Data.List.permutations` is slightly different from Heap's algorithm as displayed on Wikipedia
|
||||
Note: GHC's `Data.List.permutations` is slightly different from Heap's algorithm as displayed on Wikipedia
|
||||
::::
|
||||
|
||||
|
||||
Closing
|
||||
@ -423,8 +475,8 @@ Remember, as raw bitmaps, these files are on the order of *gigabytes* big.
|
||||
On a much weaker computer than I used to render the images, merely opening my file explorer
|
||||
to the folder containing *the folder containing* the images
|
||||
caused its all-too-eager thumbnailer to run.
|
||||
It started to consume all of my system resources, crashing all of my browser's tabs,
|
||||
distorting audio, and locking up the computer.
|
||||
This started consuming all of my system resources, crashed all of my browser's tabs,
|
||||
distorted audio, and finally locked up the computer.
|
||||
Despite this, PNG is a wonderful format that is able to compress them down to just 4MB,
|
||||
which demonstrates just how sparse these matrices are.
|
||||
|
||||
@ -439,8 +491,12 @@ Graph diagrams made with GeoGebra and NetworkX (GraphViz).
|
||||
|
||||
### Additional Links
|
||||
|
||||
- [Whitney Numbers of the Second Kind for the Star Poset (Paper from ScienceDirect)](https://www.sciencedirect.com/science/article/pii/S0195669813801278)
|
||||
- [Whitney Numbers of the Second Kind for the Star Poset (
|
||||
Paper from ScienceDirect
|
||||
)](https://www.sciencedirect.com/science/article/pii/S0195669813801278)
|
||||
- This article includes a section about representing a list of generators as a graph,
|
||||
making me wonder if someone has tried defining this operation before
|
||||
- [Whitney Numbers (Josh Cooper's Mathpages)](https://people.math.sc.edu/cooper/graph.html)
|
||||
- [The Many Faces of the Nauru Graph (Blogpost by David Eppstein)](https://11011110.github.io/blog/2007/12/12/many-faces-of.html)
|
||||
- [
|
||||
The Many Faces of the Nauru Graph (Blogpost by David Eppstein)
|
||||
](https://11011110.github.io/blog/2007/12/12/many-faces-of.html)
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user