`$\newcommand{\N}{\mathbb{N}} \newcommand{\Z}{\mathbb{Z}} \newcommand{\Q}{\mathbb{Q}} \newcommand{\R}{\mathbb{R}} \newcommand{\LP}{\left(} \newcommand{\RP}{\right)} \newcommand{\LS}{\left\lbrace} \newcommand{\RS}{\right\rbrace} \newcommand{\LA}{\left\langle} \newcommand{\RA}{\right\rangle} \newcommand{\LB}{\left[} \newcommand{\RB}{\right]} \newcommand{\MM}{\ \middle|\ } \newcommand{\exp}{\text{exp}} \newcommand{\abs}[1]{\left\vert#1\right\vert} \newcommand{\msr}[1]{m\left(#1\right)} \newcommand{\inv}[1]{#1^{-1}} \newcommand{\bkt}[1]{\LA \img{#1}\RA} \require{color}$`s
Zachary Bryhtan, Nicholas Connolly, Isabel Darcy, Ethan Rooke, Joseph Starr*
Mathematics Department at The University of Iowa
C. Livingston and A. H. Moore, KnotInfo: Table of Knot Invariants, https://knotinfo.math.indiana.edu/, today’s date (eg. August 24, 2023)
“We define a tangle as a portion of a knot diagram from which there emerge just 4 arcs pointing in the compass directions NW, NE, SW, SE.” - Conway, J.H.
Conway, J.H. “An Enumeration of Knots and Links, and Some of Their Algebraic Properties.” In Computational Problems in Abstract Algebra, 329-58. Elsevier, 1970. https://doi.org/10.1016/B978-0-08-012975-4.50034-5
For any $N$ an obvious twist vector is the twist vector of all $1$s $$[1\ 1\ 1\ \cdots\ 1]$$ Noting that when we write this sequence, we have $N-1$ spaces.
If we choose to place a $+$ instead of the left most space we get $$[1+1\ 1\ \cdots\ 1]=[2\ 1\ \cdots\ 1]$$ we’re free to make this choice for each space
this gives $N-1$ choices between ‘$+$’ and space $$[1\square 1\square 1\square\cdots\square1]$$ letting us generate twist vectors by simply counting from $0\to 2^{N-1}$.
i | tmplt | cnt | j | tv |
---|---|---|---|---|
0 | 0000 | 5 | 0 | [1,1,1,1,1] |
0 | 0000 | 4 | 1 | [1,1,1,1,1] |
0 | 0000 | 3 | 2 | [1,1,1,1,1] |
0 | 0000 | 2 | 3 | [1,1,1,1,1] |
0 | 0000 | 1 | 4 | [1,1,1,1,1] |
0 | 0000 | 0 | 4 | [1,1,1,1,1] |
i | tmplt | cnt | j | tv |
---|---|---|---|---|
6 | 0110 | 5 | 4 | [1,1,1,1,1] |
6 | 0011 | 4 | 1 | [1,1,1,1,1] |
6 | 0001 | 3 | 1 | [1,2,1,1,1] |
6 | 0000 | 2 | 1 | [1,3,1,1,1] |
6 | 0000 | 1 | 2 | [1,3,1,1,1] |
6 | 0000 | 0 | 2 | [1,3,1,1,1] |
i | tmplt | cnt | j | tv |
---|---|---|---|---|
7 | 0111 | 5 | 0 | [1,1,1,1,1] |
7 | 0011 | 4 | 0 | [2,1,1,1,1] |
7 | 0001 | 3 | 0 | [3,1,1,1,1] |
7 | 0000 | 2 | 0 | [4,1,1,1,1] |
7 | 0000 | 1 | 1 | [4,1,1,1,1] |
7 | 0000 | 0 | 1 | [4,1,1,1,1] |
We can write a canonical twist vector by taking the odd length vectors (appending $0$ where needed).
The rational number for a twist vector is computed by taking the twist vector as a finite continued fraction, that is: $$\LB a\ b\ c\RB=c+\frac{1}{b+\frac{1}{a}}$$
To play with twist vectors and continued fractions, visit:
https://joe-starr.com/resources/cont_frac_convert/
If we take the rational number $\frac{p}{q}$ associated with the rational tangle we get the following correspondence for parity
Louis H. Kauffman and Sofia Lambropoulou. Classifying and applying rational knots and rational tangles. In DeTurck, editor, Contemporary Mathematics, volume 304, pages 223-259, 2001
Schubert, Horst. “Knoten mit zwei Brücken..” Mathematische Zeitschrift 65 (1956): 133-170. http://eudml.org/doc/169591.
F. Bonahon and L. Siebenmann, New geometric splittings of classical knots, and the classification and symmetries of arborescent knots, http://www-bcf.usc.edu/~fbonahon/Research/Publications.html
For Montesinos tangles of crossing number $N$ we start by again generating twist vectors, however we require that each entry $e$ of the twist vector satisfies $2\leq e < N.$
We call these restricted set of twist vectors stencils.
Now for each entry $e_i$ of the stencil, we generate a list of rational tangles of crossing number equal to $e_i$, with the restriction $0<\frac{p_i}{q_i}<1$. We then take all combinations of elements of these lists.
The construction for the canonical Montesinos tangles includes a trailing $\frac{k}{1}$ tangle. Our generation strategy seems to miss these.
What we’re actually generating with this algorithm is Montesinos tangles up to moveable boundary components of the tangle. To recover fixed boundary tangles we can append an integral $k$ summand to each lower crossing Montesinos tangle with a circle product (more to come).
To play with a live version, visit:
https://tanglenomicon.com
Moon, Hyeyoung, and Isabel K. Darcy. “Tangle Equations Involving Montesinos Links.” Journal of Knot Theory and Its Ramifications 30, no. 08 (July 2021): 2150060. https://doi.org/10.1142/S0218216521500607.
We just need to take our lists of Montesinos and rational tangles and glue them together with $\circ$.
All possible tangles made from $+$ and $\vee$ on basic tangles
As we saw, we can linearize any algebraic tangle as:
$$\LP\LB3\ 2\ 3\RB+\LB3\ 2\ 3\RB\RP\vee\LP\LB3\ 2\ 3\RB+\LB3\ 2\ 3\RB\RP$$
How do we programmatically generate tangles from this?
$$\LP\LB3\ 2\ 3\RB+\LB3\ 2\ 3\RB\RP\vee\LP\LB3\ 2\ 3\RB+\LB3\ 2\ 3\RB\RP$$
We can generate all possible algebraic expressions involving the basic tangles and twist vector of rational tangles.
Equivalently, all full binary trees with $N$ leaves. Where the tree’s internal nodes are labeled with combinations of $\vee$ and $+$ and leaves are labeled with all combinations of basic tangles or the twist vector of rational tangles.
We call these binary trees Algebraic Tangle Trees.
Bonahon and Siebenmann describe a classification for what they call Arborescent Tangles. Their Arborescent Tangles can be translated into our algebraic tangles.
These Arborescent Tangles are constructed by taking a collection of twisted bands described by a weighted tree and connecting them with successive Murasugi sums.
F. Bonahon and L. Siebenmann, New geometric splittings of classical knots, and the classification and symmetries of arborescent knots, http://www-bcf.usc.edu/~fbonahon/Research/Publications.html
There exist tables of 4 valent graphs. We can use those with insertions from our list of algebraic tangles to generate all polygonal tangles.
The design for The Tanglenomicon project prioritizes flexibility and extensibility. We want a feature, maybe “calculate Jones polynomial,” to be runnable in a jupyter notebook or on a university cluster. We’re aiming for a “write once deploy anywhere” design.
To that end we’ve decoupled functionality wherever feasible, taking a layered approach for system design.
A runner is a human/machine interface layer. This abstracts the routines in lower layers for a user to interact with. This could be a CLI, Python binding, a Mathematica wrapper, or a web API.
Generators
Generators create new data. A generator might look like a module to create rational tangles. They may use one or more Computations, Notations, or Translators.
Computation
Computations compute a value for a given data. A computation might look like a module for computing a Jones polynomial of a link, or computing the writhe of a tangle.
Translators
Translators define a conversion between two Notations. A translator might look like a module for converting from PD notation to Conway notation and back again.
Notations
Notations define a notational convention for a link/tangle. They describe a method for converting to and from a string representation of a link/tangle and data structure describing that link/tangle.
Storage
A storage module defines a storage interface for the application. The main inter-module type is string and the calling module is responsible for en/decoding the string with a notation module.
-------------------------------------------------------------------------------
Language files blank comment code
-------------------------------------------------------------------------------
C 13 516 834 3563
C/C++ Header 18 408 967 1939
C++ 7 107 222 912
Markdown 21 418 0 794
SVG 5 5 5 322
CMake 41 74 21 236
TeX 1 1 0 92
Cython 1 21 2 83
JSON 2 1 0 78
Python 3 37 79 68
YAML 3 17 9 64
Nix 1 17 56 38
Text 1 0 0 7
-------------------------------------------------------------------------------
SUM: 117 1622 2195 8196
-------------------------------------------------------------------------------
┏━━━━━━━━━━━━━━━┳━━━━━━━┳━━━━━━━┳━━━━━━┳━━━━━━┳━━━━━━━━━┳━━━━━━┓
┃ Language ┃ Files ┃ % ┃ Code ┃ % ┃ Comment ┃ % ┃
┡━━━━━━━━━━━━━━━╇━━━━━━━╇━━━━━━━╇━━━━━━╇━━━━━━╇━━━━━━━━━╇━━━━━━┩
│ Python │ 27 │ 30.7 │ 1818 │ 53.9 │ 766 │ 22.7 │
│ Markdown │ 56 │ 63.6 │ 1473 │ 34.1 │ 0 │ 0.0 │
│ YAML │ 4 │ 4.5 │ 89 │ 93.7 │ 6 │ 6.3 │
│ __duplicate__ │ 1 │ 1.1 │ 0 │ 0.0 │ 0 │ 0.0 │
├───────────────┼───────┼───────┼──────┼──────┼─────────┼──────┤
│ Sum │ 88 │ 100.0 │ 3380 │ 43.4 │ 772 │ 9.9 │
└───────────────┴───────┴───────┴──────┴──────┴─────────┴──────┘
| language | files | code | comment | blank | total |
|----------------------|-------|-------|---------|-------|-------|
| JSON | 2 | 3,119 | 0 | 2 | 3,121 |
| SVG | 1 | 1,489 | 1 | 2 | 1,492 |
| JavaScript JSX | 6 | 398 | 9 | 43 | 450 |
| source.markdown.math | 2 | 161 | 0 | 62 | 223 |
| TypeScript JSX | 2 | 143 | 1 | 13 | 157 |
| JavaScript | 7 | 141 | 2 | 14 | 157 |
| XML | 5 | 56 | 0 | 0 | 56 |
| JSON with Comments | 1 | 37 | 0 | 1 | 38 |
| TypeScript | 1 | 20 | 0 | 4 | 24 |
| CSS | 3 | 18 | 0 | 4 | 22 |
| Nix | 1 | 16 | 0 | 3 | 19 |
| HTML | 1 | 13 | 0 | 1 | 14 |
| Docker | 1 | 12 | 1 | 11 | 24 |
| Properties | 1 | 9 | 1 | 2 | 12 |
/* A left shift multiplies the value of an integer by 2. */
size_t count_lim = 0x01u << (crossingNumber - 1);
for (size_t i = 0u; i < count_lim; i++)
{
gen_rational_proc_template(i);
}
void proc_tmp(size_t template)
{
uint8_t counter = crossingNumber;
size_t tv_length = 0;
uint8_t twist_vector[UTIL_TANG_DEFS_MAX_CROSSINGNUM]={1};
while (counter > 0u)
{
counter--;
if ((template & 0x01u) == 0)
{
tv_length++;
}
else
{
twist_vector[tv_length]++;
}
template = template >> 0x01u;
}
if (tv_length % 2 == 0)
{
evenperm_shift_write();
}
else
{
write();
}
}