Stephen Wolfram Blog https://writings.stephenwolfram.com Stephen Wolfram's Personal Blog Tue, 07 Jul 2020 13:52:05 +0000 en-US hourly 1 http://wordpress.org/?v=3.4.2 <![CDATA[Exploring Rulial Space: The Case of Turing Machines]]> https://writings.stephenwolfram.com/2020/06/exploring-rulial-space-the-case-of-turing-machines/ https://writings.stephenwolfram.com/2020/06/exploring-rulial-space-the-case-of-turing-machines/#comments Tue, 09 Jun 2020 18:34:49 +0000 Stephen Wolfram https://writings.internal.stephenwolfram.com/?p=24713 Wolfram Physics Bulletin Informal updates and commentary on progress in the Wolfram Physics Project Related livestreams Related notebooks Video work logs Related tweets Related livestreams May 26, 2020 (with Jonathan Gorard, Ed Pegg and Max Piskunov) June 4, 2020 Related notebooks Rulial-01-NDTM (by Stephen Wolfram) Rulial-02-SS (by Stephen Wolfram) Rulial-03-NDTM (by Stephen Wolfram) Rulial-04-continuum (by [...]]]>

Wolfram Physics Bulletin

Informal updates and commentary on progress in the Wolfram Physics Project

Generalized Physics and the Theory of Computation

Let’s say we find a rule that reproduces physics. A big question would then be: “Why this rule, and not another?” I think there’s a very elegant potential answer to this question, that uses what we’re calling rule space relativity—and that essentially says that there isn’t just one rule: actually all possible rules are being used, but we’re basically picking a reference frame that makes us attribute what we see to some particular rule. In other words, our description of the universe is a sense of our making, and there can be many other—potentially utterly incoherent—descriptions, etc.

But so how does this work at a more formal level? This bulletin is going to explore one very simple case. And in doing so we’ll discover that what we’re exploring is potentially relevant not only for questions of “generalized physics”, but also for fundamental questions in the theory of computation. In essence, what we’ll be doing is to study the structure of spaces created by applying all possible rules, potentially, for example, allowing us to “geometrize” spaces of possible algorithms and their applications.

In our models of physics, we begin by considering spatial hypergraphs that describe relations between “atoms of space”. Then, looking at all possible ways a given rule can update these hypergraphs, we form what we call a multiway graph. The transversals of this graph define what we call branchial space, in which we can see the pattern of entanglements between quantum states.

But there’s also a third level we can consider. Instead of just forming a multiway graph in which we do all possible updates with a given rule, we form a rulial multiway (or “ultramultiway”) graph in which we follow not only all possible updates, but also all possible rules. The transversals to this rulial multiway graph define what we call rulial space. Causal invariance in the rulial multiway graph then implies “rule space relativity” which is what allows us to use different possible reference frames to describe the universe.

In the end, the Principle of Computational Equivalence implies a certain invariance to the limiting structure of the rulial multiway graph, independent of the particular parametrization of the set of possible rules. But for the sake of understanding rulial space and the rulial multiway graph—and getting intuition about these—this bulletin is going to look at a specific set of possible rules, defined by simple Turing machines.

The rules we’ll use aren’t a good fit for describing our universe. But the comparative simplicity of their structure will help us in trying to elucidate some of the complexities of rulial space. In addition, using Turing machines will make it easier for us to make contact with the theory of computation, where Turing machines are standard models.

Turing Machines

Here’s a representation of the rule for a particular 2-state (s = 2), 2-color (k = 2) Turing machine:

RulePlot
&#10005

RulePlot[TuringMachine[2506]]

The pointer represents the “head” of the Turing machine and its orientation represents the state of the head. Here’s what this particular Turing machine does over the course of a few steps starting from a “blank tape” (i.e. all squares white):

RulePlot
&#10005

RulePlot[TuringMachine[2506], {{1, 10}, Table[0, 21]}, 20, 
 Mesh -> All, Frame -> None]

There are (2 s k)sk possible s-state k-color Turing machines, or 4096 s = 2, k = 2 machines. Here are all the distinct behaviors that occur (up to left-right reflection) in these 4096 machines, starting from a blank tape:

allrules = With
&#10005

allrules = 
  With[{s = 2, k = 2}, 
   Table[Flatten[
     MapIndexed[{1, -1} #2 + {0, 
          k} -> {1, 1, 2} Mod[
           Quotient[#1, {2 k, 2, 1}], {s, k, 2}] + {1, 0, -1} &, 
      Partition[IntegerDigits[n, 2 s k, s k], k], {2}]], {n, 0, 
     4095}]];
o0[{s1_, k1_} -> {s2_, k2_, o_}] := {s1, k1} -> {s2, k2, -o};
minrule[r_] := First[Sort[Sort /@ {r, o0 /@ r}]];
Keys[ReverseSort[
  Counts[RulePlot[TuringMachine[#], {1, {{}, 0}}, 9, 
      ImageSize -> {Automatic, 45}, FrameStyle -> LightGray] & /@ 
    Union[minrule /@ allrules]]]]

But note that all these are deterministic Turing machines, in the sense that, for a given machine, it is always the same rule that is applied at every step. But what about non-deterministic Turing machines? The idea here is to allow several different rules at any given step.

As a simple example, consider the pair of rules:

RulePlot
&#10005

RulePlot[TuringMachine[#]] & /@ {2506, 3506}

To show the possible evolution histories, we can construct a multiway system:

With
&#10005

With[{t = 3}, 
 Show[ResourceFunction["MultiwayTuringMachine"][{2506, 
     3506}, {{1, t + 1, 0}, Table[0, 2 t + 1]}, t, "StatesGraph", 
    "IncludeEventInstances" -> True, 
    VertexSize -> 1.1 {1, 1/(2 t + 1)}]] /. 
  Arrowheads[Medium] -> Arrowheads[0.025]]

Each arrow represents an application of one of the two possible rules. A non-deterministic Turing machine is usually considered to follow a particular path, corresponding to a particular evolution history. Then a typical question is whether there exists some path that leads to a particular final state (which might be viewed as the solution to some particular problem). (In a quantum Turing machine, one considers collections of multiple states, viewed as being in a quantum superposition.)

In what we’re going to be doing here, we want to study the “extreme case” of non-determinism—where at every step, every possible Turing machine rule (at least with a given s, k) is applied. Then we’ll be interested in the full rulial multiway graph that’s created.

The Rulial Multiway Graph

Start with a blank tape. Then apply all possible 2,2 Turing machine rules. This is the rulial multiway graph that’s formed after 1 step:

With[{t = 1}
&#10005

CloudGet[CloudObject[
   "https://www.wolframcloud.com/obj/wolframphysics/Bulletin/DeltaTM.\
wl"]];
With[{t = 1}, 
 ResourceFunction["MultiwayTuringMachine"][
  AllDeltaTMRules[{2, 2}], {{1, t + 1, 0}, ConstantArray[0, 2 t + 1]},
   t, "StatesGraph", "IncludeEventInstances" -> False, 
  VertexSize -> .25 {1, 1/(2 t + 1)}]]

Each individual arrow here represents many possible rules from all the 4096 discussed above. Here’s what happens after 2 steps:

Graph
&#10005

CloudGet[CloudObject[
  "https://www.wolframcloud.com/obj/wolframphysics/Bulletin/DeltaTM.\
wl"]]; Graph[
 With[{t = 2}, 
  ResourceFunction["MultiwayTuringMachine"][
   AllDeltaTMRules[{2, 2}], {{1, t + 1, 0}, Table[0, 2 t + 1]}, t, 
   "StatesGraph", "IncludeEventInstances" -> False, 
   PerformanceGoal -> "Quality", VertexSize -> .4 {1.1, .3}]], 
 EdgeStyle -> 
  Directive[Arrowheads[0.015], 
   ResourceFunction["WolframPhysicsProjectStyleData"]["StatesGraph"][
    "EdgeStyle"], Dashing[None], AbsoluteThickness[1]]]

In layered form, this becomes:

LayeredGraphPlot
&#10005

CloudGet[CloudObject[
  "https://www.wolframcloud.com/obj/wolframphysics/Bulletin/DeltaTM.\
wl"]]; LayeredGraphPlot[
 With[{t = 2}, 
  ResourceFunction["MultiwayTuringMachine"][
   AllDeltaTMRules[{2, 2}], {{1, t + 1, 0}, Table[0, 2 t + 1]}, t, 
   "StatesGraph", "IncludeEventInstances" -> False, 
   PerformanceGoal -> "Quality", VertexSize -> {1, .3}]], 
 EdgeStyle -> 
  Directive[Arrowheads[0.01], Hue[0.75, 0, 0.35], Dashing[None], 
   AbsoluteThickness[1]], AspectRatio -> 1/4]

In creating these rulial multiway graphs, there’s an important simplification we’re able to make. We don’t need to separately apply all 4096 2,2 Turing machine rules to each state at each step—because all that ever matters is the one case of the rule that’s relevant to the particular state one has. There are 4 possible individual cases—and for each of these there are 8 possible outcomes, leading to 32 “micro-rules”:

GraphicsGrid
&#10005

Cell[CellGroupData[{
Cell[BoxData[{
 RowBox[{
  RowBox[{"CloudGet", "[", 
   RowBox[{
   "CloudObject", "[", 
    "\"\<https://www.wolframcloud.com/obj/wolframphysics/Bulletin/\
DeltaTM.wl\>\"", "]"}], "]"}], ";"}], "\[IndentingNewLine]", 
 RowBox[{
  RowBox[{
   RowBox[{"tmg0", "[", 
    RowBox[{
     RowBox[{
      RowBox[{"{", 
       RowBox[{"s_", ",", "a_"}], "}"}], "\[Rule]", 
      RowBox[{"{", 
       RowBox[{"sp_", ",", "ap_", ",", "dir_"}], "}"}]}], ",", 
     "stot_", ",", "k_"}], "]"}], ":=", 
   RowBox[{"With", "[", 
    RowBox[{
     RowBox[{"{", 
      RowBox[{"cf", "=", 
       RowBox[{"Apply", "[", 
        RowBox[{"Function", ",", 
         RowBox[{"{", 
          RowBox[{"Piecewise", "[", 
           RowBox[{
            RowBox[{"Table", "[", 
             RowBox[{
              RowBox[{"{", 
               RowBox[{
                RowBox[{"Blend", "[", 
                 RowBox[{
                  RowBox[{"{", 
                   RowBox[{
                    RowBox[{"RGBColor", "[", 
                    RowBox[{"0.977", ",", "0.952", ",", "0."}], "]"}],
                     ",", 
                    RowBox[{"RGBColor", "[", 
                    RowBox[{"0.965", ",", "0.401", ",", "0.18"}], 
                    "]"}]}], "}"}], ",", 
                  RowBox[{"If", "[", 
                   RowBox[{
                    RowBox[{"k", "\[LessEqual]", "2"}], ",", 
                    RowBox[{"1", "/", "2"}], ",", 
                    RowBox[{"i", "/", 
                    RowBox[{"(", 
                    RowBox[{"k", "-", "2"}], ")"}]}]}], "]"}]}], 
                 "]"}], ",", 
                RowBox[{"#", ">", "i"}]}], "}"}], ",", 
              RowBox[{"{", 
               RowBox[{"i", ",", 
                RowBox[{"k", "-", "2"}], ",", "0", ",", 
                RowBox[{"-", "1"}]}], "}"}]}], "]"}], ",", "White"}], 
           "]"}], "}"}]}], "]"}]}], "}"}], ",", 
     RowBox[{"Graphics", "[", 
      RowBox[{
       RowBox[{"{", 
        RowBox[{
         RowBox[{"{", 
          RowBox[{"White", ",", 
           RowBox[{"Rectangle", "[", 
            RowBox[{
             RowBox[{"Scaled", "[", 
              RowBox[{"{", 
               RowBox[{"0", ",", "0"}], "}"}], "]"}], ",", 
             RowBox[{"Scaled", "[", 
              RowBox[{"{", 
               RowBox[{"1", ",", "1"}], "}"}], "]"}]}], "]"}]}], 
          "}"}], ",", 
         RowBox[{"{", 
          RowBox[{
           RowBox[{"Directive", "[", 
            RowBox[{
             RowBox[{"EdgeForm", "[", 
              RowBox[{"Directive", "[", 
               RowBox[{
                RowBox[{"GrayLevel", "[", ".6", "]"}], ",", 
                RowBox[{"AbsoluteThickness", "[", "0.7", "]"}]}], 
               "]"}], "]"}], ",", 
             RowBox[{"cf", "[", "a", "]"}]}], "]"}], ",", 
           RowBox[{"Rectangle", "[", 
            RowBox[{
             RowBox[{"{", 
              RowBox[{"1", ",", "0"}], "}"}], ",", 
             RowBox[{"{", 
              RowBox[{"2", ",", "1"}], "}"}]}], "]"}]}], "}"}], ",", 
         RowBox[{"{", 
          RowBox[{
           RowBox[{"Directive", "[", 
            RowBox[{
             RowBox[{"EdgeForm", "[", 
              RowBox[{"Directive", "[", 
               RowBox[{
                RowBox[{"GrayLevel", "[", ".6", "]"}], ",", 
                RowBox[{"AbsoluteThickness", "[", "0.7", "]"}]}], 
               "]"}], "]"}], ",", 
             RowBox[{"cf", "[", "ap", "]"}]}], "]"}], ",", 
           RowBox[{"Rectangle", "[", 
            RowBox[{
             RowBox[{"{", 
              RowBox[{"1", ",", 
               RowBox[{
                RowBox[{"-", "5"}], "/", "4"}]}], "}"}], ",", 
             RowBox[{"{", 
              RowBox[{"2", ",", 
               RowBox[{
                RowBox[{"-", "1"}], "/", "4"}]}], "}"}]}], "]"}]}], 
          "}"}], ",", 
         RowBox[{"{", 
          RowBox[{
           RowBox[{
           "NKSSpecialFunctions`RulePlot`Dump`TuringMarker", "[", 
            RowBox[{
             RowBox[{"{", 
              RowBox[{"1.5", ",", "0.5"}], "}"}], ",", 
             RowBox[{"{", 
              RowBox[{"s", ",", "stot"}], "}"}]}], "]"}], ",", 
           RowBox[{
           "NKSSpecialFunctions`RulePlot`Dump`TuringMarker", "[", 
            RowBox[{
             RowBox[{"{", 
              RowBox[{
               RowBox[{"1.5", "+", "dir"}], ",", 
               RowBox[{
                RowBox[{"-", "3"}], "/", "4"}]}], "}"}], ",", 
             RowBox[{"{", 
              RowBox[{"sp", ",", "stot"}], "}"}]}], "]"}]}], "}"}]}], 
        "}"}], ",", 
       RowBox[{"PlotRange", "\[Rule]", 
        RowBox[{"{", 
         RowBox[{
          RowBox[{"{", 
           RowBox[{
            RowBox[{
             RowBox[{"-", "1"}], "/", "2"}], ",", 
            RowBox[{"3", "+", 
             RowBox[{"1", "/", "2"}]}]}], "}"}], ",", 
          RowBox[{"{", 
           RowBox[{
            RowBox[{
             RowBox[{"-", "7"}], "/", "4"}], ",", 
            RowBox[{"3", "/", "2"}]}], "}"}]}], "}"}]}]}], "]"}]}], 
    "]"}]}], ";"}], "\[IndentingNewLine]", 
 RowBox[{
  RowBox[{
   RowBox[{"ElementaryTuringGraphic", "[", 
    RowBox[{"rules_List", ",", 
     RowBox[{"s_Integer", ":", "2"}], ",", 
     RowBox[{"k_Integer", ":", "2"}], ",", "opts___"}], "]"}], ":=", 
   RowBox[{"Table", "[", 
    RowBox[{
     RowBox[{
     "NKSSpecialFunctions`RulePlot`Dump`AtlasGraphicsGrid", "[", 
      RowBox[{
       RowBox[{"{", 
        RowBox[{"{", 
         RowBox[{"tmg0", "[", 
          RowBox[{"r", ",", "s", ",", "k"}], "]"}], "}"}], "}"}], ",",
        "opts", ",", 
       RowBox[{"Frame", "\[Rule]", "True"}]}], "]"}], ",", 
     RowBox[{"{", 
      RowBox[{"r", ",", "rules"}], "}"}]}], "]"}]}], ";"}]}], "Input"],

Cell[BoxData[
 RowBox[{"GraphicsGrid", "[", 
  RowBox[{"With", "[", 
   RowBox[{
    RowBox[{"{", 
     RowBox[{
      RowBox[{"s", " ", "=", " ", "2"}], ",", " ", 
      RowBox[{"k", " ", "=", " ", "2"}]}], "}"}], ",", " ", 
    RowBox[{"Partition", "[", 
     RowBox[{
      RowBox[{"ElementaryTuringGraphic", "[", 
       RowBox[{
        RowBox[{"Flatten", "[", 
         RowBox[{"Table", "[", 
          RowBox[{
           RowBox[{"DeltaTMRule", "[", 
            RowBox[{
             RowBox[{"{", 
              RowBox[{"si", ",", " ", "ki"}], "}"}], ",", " ", 
             RowBox[{"{", 
              RowBox[{"s", ",", " ", "k"}], "}"}]}], "]"}], ",", " ", 
           
           RowBox[{"{", 
            RowBox[{"si", ",", " ", "s"}], "}"}], ",", " ", 
           RowBox[{"{", 
            RowBox[{"ki", ",", " ", "0", ",", " ", 
             RowBox[{"k", " ", "-", " ", "1"}]}], "}"}]}], "]"}], 
         "]"}], ",", 
        RowBox[{"ImageSize", " ", "\[Rule]", " ", "50"}]}], "]"}], 
      ",", "8"}], "]"}]}], "]"}], "]"}]], "Input"]
}, Open  ]]

After 3 steps, the rulial multiway graph has the form:

With[{t = 3}
&#10005

CloudGet[CloudObject[
  "https://www.wolframcloud.com/obj/wolframphysics/Bulletin/DeltaTM.\
wl"]]; With[{t = 3}, 
 ResourceFunction["MultiwayTuringMachine"][
  AllDeltaTMRules[{2, 2}], {{1, t + 1, 0}, Table[0, 2 t + 1]}, t, 
  "StatesGraphStructure", VertexSize -> 1]]

In 3D this becomes:

Graph3D
&#10005

CloudGet[CloudObject[
   "https://www.wolframcloud.com/obj/wolframphysics/Bulletin/DeltaTM.\
wl"]];
Graph3D[With[{t = 3}, 
  ResourceFunction["MultiwayTuringMachine"][
   AllDeltaTMRules[{2, 2}], {{1, t + 1, 0}, Table[0, 2 t + 1]}, t, 
   "StatesGraphStructure", VertexSize -> 1, 
   EdgeStyle -> Directive[Hue[0.62, 0.05, 0.55], Opacity[.6]]]]]

In layered form it is:

LayeredGraphPlot
&#10005

CloudGet[CloudObject[
   "https://www.wolframcloud.com/obj/wolframphysics/Bulletin/DeltaTM.\
wl"]];
LayeredGraphPlot[
 With[{t = 3}, 
  ResourceFunction["MultiwayTuringMachine"][
   AllDeltaTMRules[{2, 2}], {{1, t + 1, 0}, Table[0, 2 t + 1]}, t, 
   "StatesGraphStructure"]], AspectRatio -> 1/4]

After 5 steps, the rulial multiway graph is:

With
&#10005

CloudGet[CloudObject[
  "https://www.wolframcloud.com/obj/wolframphysics/Bulletin/DeltaTM.\
wl"]]; With[{t = 5}, 
 ResourceFunction["MultiwayTuringMachine"][
  AllDeltaTMRules[{2, 2}], {{1, t + 1, 0}, Table[0, 2 t + 1]}, t, 
  "StatesGraphStructure", VertexSize -> 1]]

What about other numbers of states and colors? Here are the rulial multiway graphs after 3 steps for Turing machines with various numbers of states and colors :

ParallelMap
&#10005

CloudGet[CloudObject[
  "https://www.wolframcloud.com/obj/wolframphysics/Bulletin/DeltaTM.\
wl"]]; ParallelMap[
 Labeled[With[{t = 3}, 
    ResourceFunction["MultiwayTuringMachine"][
     AllDeltaTMRules[#], {{1, t + 1, 0}, Table[0, 2 t + 1]}, t, 
     "StatesGraphStructure"]], Text[#]] &, {{1, 2}, {1, 3}, {1, 
   4}, {2, 2}, {2, 3}, {2, 4}, {3, 2}, {3, 3}, {3, 4}, {4, 2}, {4, 
   3}, {4, 4}}]

Notice the presence of s = 1 examples. Even with a single possible state, it is already possible to form a nontrivial rulial multiway system. Here are the results for k = 2 after 1 step:

With
&#10005

CloudGet[CloudObject[
  "https://www.wolframcloud.com/obj/wolframphysics/Bulletin/DeltaTM.\
wl"]]; With[{t = 1}, 
 ResourceFunction["MultiwayTuringMachine"][
  AllDeltaTMRules[{1, 2}], {{1, t + 1, 0}, ConstantArray[0, 2 t + 1]},
   t, "StatesGraph", "IncludeEventInstances" -> False, 
  VertexSize -> .4 {1, 1/(2 t + 1)}]]

2 steps:

Graph
&#10005

CloudGet[CloudObject[
  "https://www.wolframcloud.com/obj/wolframphysics/Bulletin/DeltaTM.\
wl"]]; Graph[
 With[{t = 2}, 
  ResourceFunction["MultiwayTuringMachine"][
   AllDeltaTMRules[{1, 2}], {{1, t + 1, 0}, 
    ConstantArray[0, 2 t + 1]}, t, "StatesGraph", 
   "IncludeEventInstances" -> False, PerformanceGoal -> "Quality", 
   VertexSize -> .5 {1.1, .3}]], 
 EdgeStyle -> 
  Directive[Arrowheads[0.02], 
   ResourceFunction["WolframPhysicsProjectStyleData"]["StatesGraph"][
    "EdgeStyle"], Dashing[None], AbsoluteThickness[1]]]

6 steps:

With
&#10005

CloudGet[CloudObject[
   "https://www.wolframcloud.com/obj/wolframphysics/Bulletin/DeltaTM.\
wl"]];
With[{t = 6}, 
 ResourceFunction["MultiwayTuringMachine"][
  AllDeltaTMRules[{1, 2}], {{1, t + 1, 0}, ConstantArray[0, 2 t + 1]},
   t, "StatesGraphStructure"]]

In principle one can also consider the even simpler case of s = k = 1. After 1 step one gets:

With
&#10005

CloudGet[CloudObject[
  "https://www.wolframcloud.com/obj/wolframphysics/Bulletin/DeltaTM.\
wl"]]; With[{t = 1}, 
 ResourceFunction["MultiwayTuringMachine"][
  AllDeltaTMRules[{1, 1}], {{1, t + 1, 0}, ConstantArray[0, 2 t + 1]},
   t, "StatesGraph", "IncludeEventInstances" -> False, 
  PerformanceGoal -> "Quality", VertexSize -> .7 {1, 1/(2 t + 1)}]]

After 2 steps this becomes:

Graph
&#10005

CloudGet[CloudObject[
  "https://www.wolframcloud.com/obj/wolframphysics/Bulletin/DeltaTM.\
wl"]]; Graph[
 With[{t = 2}, 
  ResourceFunction["MultiwayTuringMachine"][
   AllDeltaTMRules[{1, 1}], {{1, t + 1, 0}, 
    ConstantArray[0, 2 t + 1]}, t, "StatesGraph", 
   "IncludeEventInstances" -> False, PerformanceGoal -> "Quality", 
   VertexSize -> .5 {1.1, .3}]], 
 EdgeStyle -> 
  Directive[Arrowheads[0.02], 
   ResourceFunction["WolframPhysicsProjectStyleData"]["StatesGraph"][
    "EdgeStyle"], Dashing[None], AbsoluteThickness[1]]]

And after 3 steps:

Graph
&#10005

CloudGet[CloudObject[
  "https://www.wolframcloud.com/obj/wolframphysics/Bulletin/DeltaTM.\
wl"]]; Graph[
 With[{t = 3}, 
  ResourceFunction["MultiwayTuringMachine"][
   AllDeltaTMRules[{1, 1}], {{1, t + 1, 0}, 
    ConstantArray[0, 2 t + 1]}, t, "StatesGraph", 
   "IncludeEventInstances" -> False, PerformanceGoal -> "Quality", 
   VertexSize -> .5 {1, .3}]], 
 EdgeStyle -> 
  Directive[Arrowheads[0.015], 
   ResourceFunction["WolframPhysicsProjectStyleData"]["StatesGraph"][
    "EdgeStyle"], Dashing[None], AbsoluteThickness[1]]]

As a layered graph rendering, this becomes:

LayeredGraphPlot
&#10005

CloudGet[CloudObject[
  "https://www.wolframcloud.com/obj/wolframphysics/Bulletin/DeltaTM.\
wl"]]; LayeredGraphPlot[
 With[{t = 4}, 
  ResourceFunction["MultiwayTuringMachine"][
   AllDeltaTMRules[{1, 1}], {{1, t + 1, 0}, Table[0, 2 t + 1]}, t, 
   "StatesGraphStructure"]], AspectRatio -> 1/2]

With s = 2, k = 1 one gets after 1 step:

With
&#10005

CloudGet[CloudObject[
  "https://www.wolframcloud.com/obj/wolframphysics/Bulletin/DeltaTM.\
wl"]]; With[{t = 1}, 
 ResourceFunction["MultiwayTuringMachine"][
  AllDeltaTMRules[{2, 1}], {{1, t + 1, 0}, ConstantArray[0, 2 t + 1]},
   t, "StatesGraph", "IncludeEventInstances" -> False, 
  PerformanceGoal -> "Quality", VertexSize -> .6 {1, 1/(2 t + 1)}]]

After 2 steps this becomes:

Graph
&#10005

CloudGet[CloudObject[
  "https://www.wolframcloud.com/obj/wolframphysics/Bulletin/DeltaTM.\
wl"]]; Graph[
 With[{t = 2}, 
  ResourceFunction["MultiwayTuringMachine"][
   AllDeltaTMRules[{2, 1}], {{1, t + 1, 0}, 
    ConstantArray[0, 2 t + 1]}, t, "StatesGraph", 
   "IncludeEventInstances" -> False, PerformanceGoal -> "Quality", 
   VertexSize -> .5 {1, .27}]], 
 EdgeStyle -> 
  Directive[Arrowheads[0.02], 
   ResourceFunction["WolframPhysicsProjectStyleData"]["StatesGraph"][
    "EdgeStyle"], Dashing[None], AbsoluteThickness[1]]]

And after 3 steps:

Graph
&#10005

CloudGet[CloudObject[
  "https://www.wolframcloud.com/obj/wolframphysics/Bulletin/DeltaTM.\
wl"]]; Graph[
 With[{t = 3}, 
  ResourceFunction["MultiwayTuringMachine"][
   AllDeltaTMRules[{2, 1}], {{1, t + 1, 0}, 
    ConstantArray[0, 2 t + 1]}, t, "StatesGraph", 
   "IncludeEventInstances" -> False, PerformanceGoal -> "Quality", 
   VertexSize -> .5 {1.15, .3}]], 
 EdgeStyle -> 
  Directive[Arrowheads[0.015], 
   ResourceFunction["WolframPhysicsProjectStyleData"]["StatesGraph"][
    "EdgeStyle"], Dashing[None], AbsoluteThickness[1]]]

After 6 steps this becomes:

Graph
&#10005

CloudGet[CloudObject[
  "https://www.wolframcloud.com/obj/wolframphysics/Bulletin/DeltaTM.\
wl"]]; Graph[
 With[{t = 6}, 
  ResourceFunction["MultiwayTuringMachine"][
   AllDeltaTMRules[{2, 1}], {{1, t + 1, 0}, 
    ConstantArray[0, 2 t + 1]}, t, "StatesGraphStructure", 
   "IncludeEventInstances" -> False, PerformanceGoal -> "Quality"]], 
 EdgeStyle -> 
  Directive[Arrowheads[0.013], 
   ResourceFunction["WolframPhysicsProjectStyleData"]["StatesGraph"][
    "EdgeStyle"], Dashing[None], AbsoluteThickness[1]]]

At least in the central part of this graph, there are edges going in both directions. Combining these, and treating the graph as undirected, one gets:

SimpleGraph
&#10005

CloudGet[CloudObject[
  "https://www.wolframcloud.com/obj/wolframphysics/Bulletin/DeltaTM.\
wl"]]; SimpleGraph[
 UndirectedGraph[
  With[{t = 6}, 
   ResourceFunction["MultiwayTuringMachine"][
    AllDeltaTMRules[{2, 1}], {{1, t + 1, 0}, 
     ConstantArray[0, 2 t + 1]}, t, "StatesGraphStructure", 
    "IncludeEventInstances" -> False, PerformanceGoal -> "Quality"]]]]

With 3 states (s = 3) there are 3 tracks:

SimpleGraph
&#10005

CloudGet[CloudObject[
  "https://www.wolframcloud.com/obj/wolframphysics/Bulletin/DeltaTM.\
wl"]]; SimpleGraph[
 UndirectedGraph[
  With[{t = 6}, 
   ResourceFunction["MultiwayTuringMachine"][
    AllDeltaTMRules[{3, 1}], {{1, t + 1, 0}, 
     ConstantArray[0, 2 t + 1]}, t, "StatesGraphStructure", 
    "IncludeEventInstances" -> False, PerformanceGoal -> "Quality"]]]]

One can also consider Turing machines in which the head can not only move left or right, but can also stay still. In this case, with s = 2, k = 1 one gets after 1 step:

With
&#10005

CloudGet[CloudObject[
  "https://www.wolframcloud.com/obj/wolframphysics/Bulletin/DeltaTM.\
wl"]]; With[{t = 1}, 
 ResourceFunction["MultiwayTuringMachine"][
  AllDeltaTMRules[{2, 1}, {-1, 0, 1}], {{1, t + 1, 0}, 
   ConstantArray[0, 2 t + 1]}, t, "StatesGraph", 
  "IncludeEventInstances" -> False, PerformanceGoal -> "Quality", 
  VertexSize -> .6 {1, 1/(2 t + 1)}]]

After 2 steps this becomes:

Graph
&#10005

CloudGet[CloudObject[
  "https://www.wolframcloud.com/obj/wolframphysics/Bulletin/DeltaTM.\
wl"]]; Graph[
 With[{t = 2}, 
  ResourceFunction["MultiwayTuringMachine"][
   AllDeltaTMRules[{2, 1}, {-1, 0, 1}], {{1, t + 1, 0}, 
    ConstantArray[0, 2 t + 1]}, t, "StatesGraph", 
   "IncludeEventInstances" -> False, PerformanceGoal -> "Quality", 
   VertexSize -> .5 {1.15, .3}]], 
 EdgeStyle -> 
  Directive[Arrowheads[0.015], 
   ResourceFunction["WolframPhysicsProjectStyleData"]["StatesGraph"][
    "EdgeStyle"], Dashing[None], AbsoluteThickness[1]]]

After 4 steps, removing repeated edges, etc. this gives:

SimpleGraph
&#10005

CloudGet[CloudObject[
  "https://www.wolframcloud.com/obj/wolframphysics/Bulletin/DeltaTM.\
wl"]]; SimpleGraph[
 UndirectedGraph[
  With[{t = 4}, 
   ResourceFunction["MultiwayTuringMachine"][
    AllDeltaTMRules[{2, 1}, {-1, 0, 1}], {{1, t + 1, 0}, 
     ConstantArray[0, 2 t + 1]}, t, "StatesGraphStructure", 
    "IncludeEventInstances" -> False, PerformanceGoal -> "Quality"]]]]

As another generalization, one can consider Turing machines that can move not just one, but also two squares:

Graph
&#10005

CloudGet[CloudObject[
  "https://www.wolframcloud.com/obj/wolframphysics/Bulletin/DeltaTM.\
wl"]]; Graph[
 With[{t = 1}, 
  ResourceFunction["MultiwayTuringMachine"][
   AllDeltaTMRules[{2, 1}, {-2, -1, 0, 1, 2}], {{1, 2 t + 1, 0}, 
    ConstantArray[0, 4 t + 1]}, t, "StatesGraph", 
   "IncludeEventInstances" -> False, PerformanceGoal -> "Quality", 
   VertexSize -> .3 {1.15, .3}]], 
 EdgeStyle -> 
  Directive[Arrowheads[0.015], 
   ResourceFunction["WolframPhysicsProjectStyleData"]["StatesGraph"][
    "EdgeStyle"], Dashing[None], AbsoluteThickness[1]]]

After 2 steps one gets:

With
&#10005

CloudGet[CloudObject[
  "https://www.wolframcloud.com/obj/wolframphysics/Bulletin/DeltaTM.\
wl"]]; With[{t = 2}, 
 ResourceFunction["MultiwayTuringMachine"][
  AllDeltaTMRules[{2, 1}, {-2, -1, 0, 1, 2}], {{1, 2 t + 1, 0}, 
   ConstantArray[0, 4 t + 1]}, t, "StatesGraph", 
  "IncludeEventInstances" -> False, PerformanceGoal -> "Quality", 
  VertexSize -> .6 {1, 1/(2 t + 1)}]]

After 3 steps, removing repeated edges, etc. this gives:

SimpleGraph
&#10005

CloudGet[CloudObject[
  "https://www.wolframcloud.com/obj/wolframphysics/Bulletin/DeltaTM.\
wl"]]; SimpleGraph[
 UndirectedGraph[
  With[{t = 3}, 
   ResourceFunction["MultiwayTuringMachine"][
    AllDeltaTMRules[{2, 1}, {-2, -1, 0, 1, 2}], {{1, 2 t + 1, 0}, 
     ConstantArray[0, 4 t + 1]}, t, "StatesGraphStructure", 
    "IncludeEventInstances" -> False, PerformanceGoal -> "Quality"]]]]

The Limit of the Rulial Multiway Graph

What is the limiting structure of the rulial multiway graph after an infinite number of steps? The first crucial observation is that it’s in a sense homogeneous: the structure of the graph around any given node is always the same (i.e. it’s a vertex-transitive graph). To see why this is true, recall that each node in the graph corresponds to a particular distinct configuration of the Turing machine. This node will lead to all nodes that can be obtained from it by one step of Turing machine evolution. But (assuming the head always moves ±1 square) there are always exactly 2 s k of these. And because we are following all possible “micro-rules”, we can think of ourselves as just “blindly overwriting” whatever configuration we had, so that the structure of the graph is the same independent of what configuration we’re at.

As a simple example, here’s what happens in the s = 2, k = 1 case, after 3 steps:

With
&#10005

CloudGet[CloudObject[
  "https://www.wolframcloud.com/obj/wolframphysics/Bulletin/DeltaTM.\
wl"]]; With[{t = 3}, 
 ResourceFunction["MultiwayTuringMachine"][
  AllDeltaTMRules[{2, 1}], {{1, t + 1, 0}, ConstantArray[0, 2 t + 1]},
   t, "StatesGraph", "IncludeEventInstances" -> False, 
  PerformanceGoal -> "Quality", VertexSize -> .9 {1, 1/(2 t + 1)}]]

There’s some trickiness at the ends, but in the central region we see as expected that each node has exactly 4 successors. If we pick out the subgraph around the blank-tape starting node it has the form:

With
&#10005

CloudGet[CloudObject[
  "https://www.wolframcloud.com/obj/wolframphysics/Bulletin/DeltaTM.\
wl"]]; With[{g = 
   With[{t = 3}, 
    ResourceFunction["MultiwayTuringMachine"][
     AllDeltaTMRules[{2, 1}], {{1, t + 1, 0}, 
      ConstantArray[0, 2 t + 1]}, t, "StatesGraph", 
     "IncludeEventInstances" -> False, PerformanceGoal -> "Quality", 
     VertexSize -> .8 {1, 1/(2 t + 1)}]]}, 
 NeighborhoodGraph[g, First[VertexList[g]], 1, 
  VertexCoordinates -> None]]

In general, the limiting neighborhood of every node is just:

Graph
&#10005

CloudGet[CloudObject[
  "https://www.wolframcloud.com/obj/wolframphysics/Bulletin/DeltaTM.\
wl"]]; Graph[
 CanonicalGraph[
  With[{g = 
     With[{t = 3}, 
      ResourceFunction["MultiwayTuringMachine"][
       AllDeltaTMRules[{2, 1}], {{1, t + 1, 0}, 
        ConstantArray[0, 2 t + 1]}, t, "StatesGraph", 
       "IncludeEventInstances" -> False, PerformanceGoal -> "Quality",
        VertexSize -> .8 {1, 1/(2 t + 1)}]]}, 
   NeighborhoodGraph[g, First[VertexList[g]], 1]]], 
 EdgeStyle -> 
  ResourceFunction["WolframPhysicsProjectStyleData"]["StatesGraph"][
   "EdgeStyle"], 
 VertexStyle -> 
  ResourceFunction["WolframPhysicsProjectStyleData"]["StatesGraph"][
   "VertexStyle"]]

In the full graph, these neighborhoods are knitted together, giving pieces like:

Graph
&#10005

CloudGet[CloudObject[
  "https://www.wolframcloud.com/obj/wolframphysics/Bulletin/DeltaTM.\
wl"]]; Graph[
 CanonicalGraph[
  With[{g = 
     With[{t = 8}, 
      ResourceFunction["MultiwayTuringMachine"][
       AllDeltaTMRules[{2, 1}], {{1, t + 1, 0}, 
        ConstantArray[0, 2 t + 1]}, t, "StatesGraphStructure", 
       PerformanceGoal -> "Quality"]]}, 
   NeighborhoodGraph[g, First[VertexList[g]], 3]]], 
 EdgeStyle -> 
  ResourceFunction["WolframPhysicsProjectStyleData"]["StatesGraph"][
   "EdgeStyle"], 
 VertexStyle -> 
  ResourceFunction["WolframPhysicsProjectStyleData"]["StatesGraph"][
   "VertexStyle"]]

Let’s now consider the case s = 1, k = 2. After 4 steps the full graph is:

With[{t = 4}
&#10005

CloudGet[CloudObject[
  "https://www.wolframcloud.com/obj/wolframphysics/Bulletin/DeltaTM.\
wl"]]; With[{t = 4}, 
 ResourceFunction["MultiwayTuringMachine"][
  AllDeltaTMRules[{1, 2}], {{1, t + 1, 0}, ConstantArray[0, 2 t + 1]},
   t, "StatesGraph", "IncludeEventInstances" -> False, 
  PerformanceGoal -> "Quality", VertexSize -> .45 {1.15, .3}]]

Here the neighborhood of the start node is:

With
&#10005

CloudGet[CloudObject[
  "https://www.wolframcloud.com/obj/wolframphysics/Bulletin/DeltaTM.\
wl"]]; With[{g = 
   With[{t = 4}, 
    ResourceFunction["MultiwayTuringMachine"][
     AllDeltaTMRules[{1, 2}], {{1, t + 1, 0}, 
      ConstantArray[0, 2 t + 1]}, t, "StatesGraph", 
     "IncludeEventInstances" -> False, PerformanceGoal -> "Quality", 
     VertexSize -> 1 {1, 1/(2 t + 1)}]]}, 
 NeighborhoodGraph[g, First[VertexList[g]], 1, 
  VertexCoordinates -> None]]

And in the limiting graph, every node will have a local neighborhood with this same structure. If we look at successively larger neighborhoods, the limiting form of these for every node will be:

With
&#10005

CloudGet[CloudObject[
  "https://www.wolframcloud.com/obj/wolframphysics/Bulletin/DeltaTM.\
wl"]]; With[{g = 
   With[{t = 8}, 
    ResourceFunction["MultiwayTuringMachine"][
     AllDeltaTMRules[{1, 2}], {{1, t + 1, 0}, 
      ConstantArray[0, 2 t + 1]}, t, "StatesGraphStructure"]]}, 
 Table[NeighborhoodGraph[g, First[VertexList[g]], i, 
   VertexCoordinates -> None], {i, 4}]]

Here’s a table of the number of distinct nodes in these successively larger neighborhoods for Turing machines with various values of s and k:

Grid
&#10005

data = {{1, 
   1, {1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29, 
    31}}, {1, 
   2, {1, 5, 18, 50, 124, 288, 640, 1384, 2928, 6112, 12608, 25824, 
    52544, 106496, 215040, 433280}}, {1, 
   3, {1, 7, 39, 153, 543, 1809, 5787, 18117, 55755, 170181, 515727, 
    1557873}}, {2, 
   1, {1, 5, 10, 14, 18, 22, 26, 30, 34, 38, 42, 46, 50, 54, 58, 
    62}}, {2, 
   2, {1, 9, 36, 100, 248, 576, 1280, 2768, 5856, 12224, 25216, 51648,
     105088, 212992, 430080}}, {2, 
   3, {1, 13, 78, 306, 1086, 3618, 11574, 36234, 111510, 340362}}, {3,
    1, {1, 7, 15, 21, 27, 33, 39, 45, 51, 57, 63, 69, 75, 81, 87, 
    93}}, {3, 
   2, {1, 13, 54, 150, 372, 864, 1920, 4152, 8784, 18336, 37824, 
    77472, 157632, 319488}}, {3, 
   3, {1, 19, 117, 459, 1629, 5427, 17361, 54351, 167265}}, {4, 
   1, {1, 9, 20, 28, 36, 44, 52, 60, 68, 76, 84, 92, 100, 108, 116, 
    124}}, {4, 
   2, {1, 17, 72, 200, 496, 1152, 2560, 5536, 11712, 24448, 50432, 
    103296}}}; Grid[
 Prepend[Map[
   Style[#] &, {#1, #2, 
      Row[Append[#3, "\[Ellipsis]"], ", "]} & @@@ 
    SortBy[data, #[[2]] &], {2}], {ToString[HoldForm[s], 
    TraditionalForm], ToString[HoldForm[k], TraditionalForm], ""}], 
 Background -> {None, {1 -> GrayLevel[0.94]}}, 
 Dividers -> {Thread[{1, 4} -> Directive[Thick, GrayLevel[0.7]]], 
   Thread[{1, 2, 6, 10, 13} -> Directive[Thick, GrayLevel[0.7]]]}, 
 Frame -> All, FrameStyle -> GrayLevel[0.7], Alignment -> Left]

In the limit t   the number of nodes reached in all cases goes like:

For k = 1, one finds (for ):

For t = 1 one has:

If one ignores directedness in the graph, and just counts the total number of neighbors out to distance t, the results for k = 1 are the same as before, but in other cases they are different:

Grid
&#10005

datau = {{1, 
    1, {1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29, 
     31}}, {1, 
    2, {1, 7, 26, 74, 180, 412, 900, 1924, 4028, 8348, 17116, 34908, 
     70780, 118654, 215040, 433280}}, {1, 
    3, {1, 11, 63, 273, 975, 3273, 10443, 32685, 100443, 203825, 
     515727, 1557873}}, {2, 
    1, {1, 5, 10, 14, 18, 22, 26, 30, 34, 38, 42, 46, 50, 54, 58, 
     62}}, {2, 
    2, {1, 13, 52, 148, 360, 824, 1800, 3848, 8056, 16696, 34232, 
     69816, 117244, 212992, 430080}}, {2, 
    3, {1, 21, 126, 546, 1950, 6546, 20886, 43282, 111510, 
     340362}}, {3, 
    1, {1, 7, 15, 21, 27, 33, 39, 45, 51, 57, 63, 69, 75, 81, 87, 
     93}}, {3, 
    2, {1, 19, 78, 222, 540, 1236, 2700, 5772, 12084, 25044, 51348, 
     86490, 157632, 319488}}, {3, 
    3, {1, 31, 189, 819, 2925, 9819, 20757, 54351, 167265}}, {4, 
    1, {1, 9, 20, 28, 36, 44, 52, 60, 68, 76, 84, 92, 100, 108, 116, 
     124}}, {4, 
    2, {1, 25, 104, 296, 720, 1648, 3600, 7696, 16112, 27384, 50432, 
     103296}}};
Grid[Prepend[
  Map[Style[#] &, {#1, #2, 
      Row[Append[Drop[#3, -3], "\[Ellipsis]"], ", "]} & @@@ 
    SortBy[Select[datau, #[[2]] != 1 &], #[[2]] &], {2}], {ToString[
    HoldForm[s], TraditionalForm], 
   ToString[HoldForm[k], TraditionalForm], ""}], 
 Background -> {None, {1 -> GrayLevel[0.94]}}, 
 Dividers -> {Thread[{1, 4} -> Directive[Thick, GrayLevel[0.7]]], 
   Thread[{1, 2, 6, 9} -> Directive[Thick, GrayLevel[0.7]]]}, 
 Frame -> All, FrameStyle -> GrayLevel[0.7], Alignment -> Left]

(These results asymptotically seem larger by a factor .)

So for k = 1, the limiting rulial multiway graph behaves like a 1-dimensional space, but for all k  2, it behaves like an infinite-dimensional space, in which the volumes of geodesic balls grow exponentially with volume.

Finite Tapes

So far we’ve always assumed that our Turing machine tape is unbounded. But in some ways it’s easier to see what’s going on if we instead limit the tape, so we have a finite total number of states (n s kn). One thing we can do is to consider a cyclic tape.

For s = k = 1 with successively longer tapes we then get:

NeighboringConfigurations
&#10005

Cell[CellGroupData[{
	Cell[BoxData[
 RowBox[{
  RowBox[{"NeighboringConfigurations", "[", 
   RowBox[{
    RowBox[{"{", 
     RowBox[{
      RowBox[{"{", 
       RowBox[{"s0_Integer", ",", "pos0_Integer"}], "}"}], ",", 
      "tape0_List"}], "}"}], ",", 
    RowBox[{"{", 
     RowBox[{"s_Integer", ",", "k_Integer"}], "}"}], ",", 
    RowBox[{"offs_", ":", 
     RowBox[{"{", 
      RowBox[{
       RowBox[{"-", "1"}], ",", "1"}], "}"}]}]}], "]"}], ":=", 
  RowBox[{"Flatten", "[", 
   RowBox[{
    RowBox[{"Table", "[", 
     RowBox[{
      RowBox[{"{", 
       RowBox[{
        RowBox[{"{", 
         RowBox[{"s1", ",", 
          RowBox[{"Mod", "[", 
           RowBox[{
            RowBox[{"pos0", "+", "pos1"}], ",", 
            RowBox[{"Length", "[", "tape0", "]"}], ",", "1"}], 
           "]"}]}], "}"}], ",", "tape1"}], "}"}], ",", 
      RowBox[{"{", 
       RowBox[{"s1", ",", "s"}], "}"}], ",", 
      RowBox[{"{", 
       RowBox[{"pos1", ",", "offs"}], "}"}], ",", 
      RowBox[{"{", 
       RowBox[{"tape1", ",", 
        RowBox[{"Table", "[", 
         RowBox[{
          RowBox[{"ReplacePart", "[", 
           RowBox[{"tape0", ",", 
            RowBox[{"pos0", "\[Rule]", "i"}]}], "]"}], ",", 
          RowBox[{"{", 
           RowBox[{"i", ",", "0", ",", 
            RowBox[{"k", "-", "1"}]}], "}"}]}], "]"}]}], "}"}]}], 
     "]"}], ",", "2"}], "]"}]}]], "Input"],

Cell[BoxData[
 RowBox[{
  RowBox[{"TMNCGraphX", "[", 
   RowBox[{"tlen_Integer", ",", 
    RowBox[{"{", 
     RowBox[{"s_Integer", ",", "k_Integer"}], "}"}], ",", 
    RowBox[{"offs_", ":", 
     RowBox[{"{", 
      RowBox[{
       RowBox[{"-", "1"}], ",", "1"}], "}"}]}]}], "]"}], ":=", 
  RowBox[{"Graph", "[", 
   RowBox[{
    RowBox[{"Flatten", "[", 
     RowBox[{"Table", "[", 
      RowBox[{
       RowBox[{
        RowBox[{
         RowBox[{
          RowBox[{"{", 
           RowBox[{
            RowBox[{"{", 
             RowBox[{"s0", ",", "pos0"}], "}"}], ",", "tape0"}], 
           "}"}], "\[DirectedEdge]", "#"}], "&"}], "/@", 
        RowBox[{"NeighboringConfigurations", "[", 
         RowBox[{
          RowBox[{"{", 
           RowBox[{
            RowBox[{"{", 
             RowBox[{"s0", ",", "pos0"}], "}"}], ",", "tape0"}], 
           "}"}], ",", 
          RowBox[{"{", 
           RowBox[{"s", ",", "k"}], "}"}], ",", "offs"}], "]"}]}], 
       ",", 
       RowBox[{"{", 
        RowBox[{"s0", ",", "s"}], "}"}], ",", 
       RowBox[{"{", 
        RowBox[{"pos0", ",", "tlen"}], "}"}], ",", 
       RowBox[{"{", 
        RowBox[{"tape0", ",", 
         RowBox[{"Tuples", "[", 
          RowBox[{
           RowBox[{"Range", "[", 
            RowBox[{"0", ",", 
             RowBox[{"k", "-", "1"}]}], "]"}], ",", "tlen"}], "]"}]}],
         "}"}]}], "]"}], "]"}], ",", 
    RowBox[{"VertexShapeFunction", "\[Rule]", 
     RowBox[{"(", 
      RowBox[{
       RowBox[{"Inset", "[", 
        RowBox[{
         RowBox[{"Framed", "[", 
          RowBox[{
           RowBox[{"RulePlot", "[", 
            RowBox[{
             RowBox[{"TuringMachine", "[", 
              RowBox[{"{", 
               RowBox[{"0", ",", 
                RowBox[{"Max", "[", 
                 RowBox[{"s", ",", "2"}], "]"}], ",", 
                RowBox[{"Max", "[", 
                 RowBox[{"k", ",", "2"}], "]"}]}], "}"}], "]"}], ",", 
             
             RowBox[{"{", 
              RowBox[{
               RowBox[{"{", 
                RowBox[{"1", ",", 
                 RowBox[{"#2", "[", 
                  RowBox[{"[", 
                   RowBox[{"1", ",", "2"}], "]"}], "]"}]}], "}"}], 
               ",", 
               RowBox[{"#2", "[", 
                RowBox[{"[", "2", "]"}], "]"}]}], "}"}], ",", "0", 
             ",", 
             RowBox[{"Mesh", "\[Rule]", "All"}], ",", 
             RowBox[{"Frame", "\[Rule]", "False"}], ",", 
             RowBox[{"ImageSize", "\[Rule]", "40"}]}], "]"}], ",", 
           RowBox[{"Background", "\[Rule]", 
            RowBox[{"Directive", "[", 
             RowBox[{
              RowBox[{"Opacity", "[", "0.2", "]"}], ",", 
              RowBox[{"Hue", "[", 
               RowBox[{"0.62", ",", "0.45", ",", "0.87"}], "]"}]}], 
             "]"}]}], ",", 
           RowBox[{"FrameMargins", "\[Rule]", 
            RowBox[{"{", 
             RowBox[{
              RowBox[{"{", 
               RowBox[{"2", ",", "2"}], "}"}], ",", 
              RowBox[{"{", 
               RowBox[{"0", ",", "0"}], "}"}]}], "}"}]}], ",", 
           RowBox[{"RoundingRadius", "\[Rule]", "0"}], ",", 
           RowBox[{"FrameStyle", "\[Rule]", 
            RowBox[{"Directive", "[", 
             RowBox[{
              RowBox[{"Opacity", "[", "0.5", "]"}], ",", 
              RowBox[{"Hue", "[", 
               RowBox[{"0.62", ",", "0.52", ",", "0.82"}], "]"}]}], 
             "]"}]}]}], "]"}], ",", "#1"}], "]"}], "&"}], ")"}]}], 
    ",", 
    RowBox[{"EdgeStyle", "\[Rule]", 
     RowBox[{
      RowBox[{
       RowBox[{
       "ResourceFunction", "[", 
        "\"\<WolframPhysicsProjectStyleData\>\"", "]"}], "[", 
       "\"\<StatesGraph\>\"", "]"}], "[", "\"\<EdgeStyle\>\"", 
      "]"}]}]}], "]"}]}]], "Input"],

Cell[BoxData[
 RowBox[{"Table", "[", 
  RowBox[{
   RowBox[{"Show", "[", 
    RowBox[{
     RowBox[{"TMNCGraphX", "[", 
      RowBox[{"len", ",", 
       RowBox[{"{", 
        RowBox[{"1", ",", "1"}], "}"}]}], "]"}], ",", 
     RowBox[{"ImageSize", "\[Rule]", "200"}]}], "]"}], ",", 
   RowBox[{"{", 
    RowBox[{"len", ",", "3", ",", "5"}], "}"}]}], "]"}]], "Input"]
}, Open  ]]

For s = 2, k = 1 we get:

NeighboringConfigurations
&#10005

Cell[CellGroupData[{
Cell[BoxData[
 RowBox[{
  RowBox[{"NeighboringConfigurations", "[", 
   RowBox[{
    RowBox[{"{", 
     RowBox[{
      RowBox[{"{", 
       RowBox[{"s0_Integer", ",", "pos0_Integer"}], "}"}], ",", 
      "tape0_List"}], "}"}], ",", 
    RowBox[{"{", 
     RowBox[{"s_Integer", ",", "k_Integer"}], "}"}], ",", 
    RowBox[{"offs_", ":", 
     RowBox[{"{", 
      RowBox[{
       RowBox[{"-", "1"}], ",", "1"}], "}"}]}]}], "]"}], ":=", 
  RowBox[{"Flatten", "[", 
   RowBox[{
    RowBox[{"Table", "[", 
     RowBox[{
      RowBox[{"{", 
       RowBox[{
        RowBox[{"{", 
         RowBox[{"s1", ",", 
          RowBox[{"Mod", "[", 
           RowBox[{
            RowBox[{"pos0", "+", "pos1"}], ",", 
            RowBox[{"Length", "[", "tape0", "]"}], ",", "1"}], 
           "]"}]}], "}"}], ",", "tape1"}], "}"}], ",", 
      RowBox[{"{", 
       RowBox[{"s1", ",", "s"}], "}"}], ",", 
      RowBox[{"{", 
       RowBox[{"pos1", ",", "offs"}], "}"}], ",", 
      RowBox[{"{", 
       RowBox[{"tape1", ",", 
        RowBox[{"Table", "[", 
         RowBox[{
          RowBox[{"ReplacePart", "[", 
           RowBox[{"tape0", ",", 
            RowBox[{"pos0", "\[Rule]", "i"}]}], "]"}], ",", 
          RowBox[{"{", 
           RowBox[{"i", ",", "0", ",", 
            RowBox[{"k", "-", "1"}]}], "}"}]}], "]"}]}], "}"}]}], 
     "]"}], ",", "2"}], "]"}]}]], "Input"],

 Cell[BoxData[
 RowBox[{
  RowBox[{"TMNCGraphX", "[", 
   RowBox[{"tlen_Integer", ",", 
    RowBox[{"{", 
     RowBox[{"s_Integer", ",", "k_Integer"}], "}"}], ",", 
    RowBox[{"offs_", ":", 
     RowBox[{"{", 
      RowBox[{
       RowBox[{"-", "1"}], ",", "1"}], "}"}]}]}], "]"}], ":=", 
  RowBox[{"Graph", "[", 
   RowBox[{
    RowBox[{"Flatten", "[", 
     RowBox[{"Table", "[", 
      RowBox[{
       RowBox[{
        RowBox[{
         RowBox[{
          RowBox[{"{", 
           RowBox[{
            RowBox[{"{", 
             RowBox[{"s0", ",", "pos0"}], "}"}], ",", "tape0"}], 
           "}"}], "\[DirectedEdge]", "#"}], "&"}], "/@", 
        RowBox[{"NeighboringConfigurations", "[", 
         RowBox[{
          RowBox[{"{", 
           RowBox[{
            RowBox[{"{", 
             RowBox[{"s0", ",", "pos0"}], "}"}], ",", "tape0"}], 
           "}"}], ",", 
          RowBox[{"{", 
           RowBox[{"s", ",", "k"}], "}"}], ",", "offs"}], "]"}]}], 
       ",", 
       RowBox[{"{", 
        RowBox[{"s0", ",", "s"}], "}"}], ",", 
       RowBox[{"{", 
        RowBox[{"pos0", ",", "tlen"}], "}"}], ",", 
       RowBox[{"{", 
        RowBox[{"tape0", ",", 
         RowBox[{"Tuples", "[", 
          RowBox[{
           RowBox[{"Range", "[", 
            RowBox[{"0", ",", 
             RowBox[{"k", "-", "1"}]}], "]"}], ",", "tlen"}], "]"}]}],
         "}"}]}], "]"}], "]"}], ",", 
    RowBox[{"VertexShapeFunction", "\[Rule]", 
     RowBox[{"(", 
      RowBox[{
       RowBox[{"Inset", "[", 
        RowBox[{
         RowBox[{"Framed", "[", 
          RowBox[{
           RowBox[{"RulePlot", "[", 
            RowBox[{
             RowBox[{"TuringMachine", "[", 
              RowBox[{"{", 
               RowBox[{"0", ",", 
                RowBox[{"Max", "[", 
                 RowBox[{"s", ",", "2"}], "]"}], ",", 
                RowBox[{"Max", "[", 
                 RowBox[{"k", ",", "2"}], "]"}]}], "}"}], "]"}], ",", 
             
             RowBox[{"{", 
              RowBox[{
               RowBox[{"{", 
                RowBox[{"1", ",", 
                 RowBox[{"#2", "[", 
                  RowBox[{"[", 
                   RowBox[{"1", ",", "2"}], "]"}], "]"}]}], "}"}], 
               ",", 
               RowBox[{"#2", "[", 
                RowBox[{"[", "2", "]"}], "]"}]}], "}"}], ",", "0", 
             ",", 
             RowBox[{"Mesh", "\[Rule]", "All"}], ",", 
             RowBox[{"Frame", "\[Rule]", "False"}], ",", 
             RowBox[{"ImageSize", "\[Rule]", "40"}]}], "]"}], ",", 
           RowBox[{"Background", "\[Rule]", 
            RowBox[{"Directive", "[", 
             RowBox[{
              RowBox[{"Opacity", "[", "0.2", "]"}], ",", 
              RowBox[{"Hue", "[", 
               RowBox[{"0.62", ",", "0.45", ",", "0.87"}], "]"}]}], 
             "]"}]}], ",", 
           RowBox[{"FrameMargins", "->", 
            RowBox[{"{", 
             RowBox[{
              RowBox[{"{", 
               RowBox[{"2", ",", "2"}], "}"}], ",", 
              RowBox[{"{", 
               RowBox[{"0", ",", "0"}], "}"}]}], "}"}]}], ",", 
           RowBox[{"RoundingRadius", "\[Rule]", "0"}], ",", 
           RowBox[{"FrameStyle", "\[Rule]", 
            RowBox[{"Directive", "[", 
             RowBox[{
              RowBox[{"Opacity", "[", "0.5", "]"}], ",", 
              RowBox[{"Hue", "[", 
               RowBox[{"0.62", ",", "0.52", ",", "0.82"}], "]"}]}], 
             "]"}]}]}], "]"}], ",", "#1"}], "]"}], "&"}], ")"}]}], 
    ",", 
    RowBox[{"EdgeStyle", "\[Rule]", 
     RowBox[{"Directive", "[", 
      RowBox[{
       RowBox[{"Arrowheads", "[", "0.06", "]"}], ",", 
       RowBox[{"Hue", "[", 
        RowBox[{"0.75", ",", "0", ",", "0.35"}], "]"}], ",", 
       RowBox[{"Dashing", "[", "None", "]"}], ",", 
       RowBox[{"AbsoluteThickness", "[", "1", "]"}]}], "]"}]}]}], 
   "]"}]}]], "Input"],

Cell[BoxData[
 RowBox[{"Table", "[", 
  RowBox[{
   RowBox[{"Show", "[", 
    RowBox[{
     RowBox[{"TMNCGraphX", "[", 
      RowBox[{"len", ",", 
       RowBox[{"{", 
        RowBox[{"2", ",", "1"}], "}"}]}], "]"}], ",", 
     RowBox[{"ImageSize", "\[Rule]", "200"}]}], "]"}], ",", 
   RowBox[{"{", 
    RowBox[{"len", ",", "3", ",", "5"}], "}"}]}], "]"}]], "Input"]
 }, Open  ]]

For tape size 10, the results for successive values of s are:

NeighboringConfigurations
&#10005

Cell[CellGroupData[{
Cell[BoxData[
 RowBox[{
  RowBox[{"NeighboringConfigurations", "[", 
   RowBox[{
    RowBox[{"{", 
     RowBox[{
      RowBox[{"{", 
       RowBox[{"s0_Integer", ",", "pos0_Integer"}], "}"}], ",", 
      "tape0_List"}], "}"}], ",", 
    RowBox[{"{", 
     RowBox[{"s_Integer", ",", "k_Integer"}], "}"}], ",", 
    RowBox[{"offs_", ":", 
     RowBox[{"{", 
      RowBox[{
       RowBox[{"-", "1"}], ",", "1"}], "}"}]}]}], "]"}], ":=", 
  RowBox[{"Flatten", "[", 
   RowBox[{
    RowBox[{"Table", "[", 
     RowBox[{
      RowBox[{"{", 
       RowBox[{
        RowBox[{"{", 
         RowBox[{"s1", ",", 
          RowBox[{"Mod", "[", 
           RowBox[{
            RowBox[{"pos0", "+", "pos1"}], ",", 
            RowBox[{"Length", "[", "tape0", "]"}], ",", "1"}], 
           "]"}]}], "}"}], ",", "tape1"}], "}"}], ",", 
      RowBox[{"{", 
       RowBox[{"s1", ",", "s"}], "}"}], ",", 
      RowBox[{"{", 
       RowBox[{"pos1", ",", "offs"}], "}"}], ",", 
      RowBox[{"{", 
       RowBox[{"tape1", ",", 
        RowBox[{"Table", "[", 
         RowBox[{
          RowBox[{"ReplacePart", "[", 
           RowBox[{"tape0", ",", 
            RowBox[{"pos0", "\[Rule]", "i"}]}], "]"}], ",", 
          RowBox[{"{", 
           RowBox[{"i", ",", "0", ",", 
            RowBox[{"k", "-", "1"}]}], "}"}]}], "]"}]}], "}"}]}], 
     "]"}], ",", "2"}], "]"}]}]], "Input"],

Cell[BoxData[
 RowBox[{
  RowBox[{"TMNCGraph", "[", 
   RowBox[{"tlen_Integer", ",", 
    RowBox[{"{", 
     RowBox[{"s_Integer", ",", "k_Integer"}], "}"}], ",", 
    RowBox[{"offs_", ":", 
     RowBox[{"{", 
      RowBox[{
       RowBox[{"-", "1"}], ",", "1"}], "}"}]}]}], "]"}], ":=", 
  RowBox[{"Graph", "[", 
   RowBox[{
    RowBox[{"Flatten", "[", 
     RowBox[{"Table", "[", 
      RowBox[{
       RowBox[{
        RowBox[{
         RowBox[{
          RowBox[{"{", 
           RowBox[{
            RowBox[{"{", 
             RowBox[{"s0", ",", "pos0"}], "}"}], ",", "tape0"}], 
           "}"}], "\[DirectedEdge]", "#"}], "&"}], "/@", 
        RowBox[{"NeighboringConfigurations", "[", 
         RowBox[{
          RowBox[{"{", 
           RowBox[{
            RowBox[{"{", 
             RowBox[{"s0", ",", "pos0"}], "}"}], ",", "tape0"}], 
           "}"}], ",", 
          RowBox[{"{", 
           RowBox[{"s", ",", "k"}], "}"}], ",", "offs"}], "]"}]}], 
       ",", 
       RowBox[{"{", 
        RowBox[{"s0", ",", "s"}], "}"}], ",", 
       RowBox[{"{", 
        RowBox[{"pos0", ",", "tlen"}], "}"}], ",", 
       RowBox[{"{", 
        RowBox[{"tape0", ",", 
         RowBox[{"Tuples", "[", 
          RowBox[{
           RowBox[{"Range", "[", 
            RowBox[{"0", ",", 
             RowBox[{"k", "-", "1"}]}], "]"}], ",", "tlen"}], "]"}]}],
         "}"}]}], "]"}], "]"}], ",", 
    RowBox[{"EdgeStyle", "\[Rule]", 
     RowBox[{"Directive", "[", 
      RowBox[{
       RowBox[{"Arrowheads", "[", "0.04", "]"}], ",", 
       RowBox[{"Hue", "[", 
        RowBox[{"0.75", ",", "0", ",", "0.35"}], "]"}], ",", 
       RowBox[{"Dashing", "[", "None", "]"}], ",", 
       RowBox[{"AbsoluteThickness", "[", "1", "]"}]}], "]"}]}], ",", 
    RowBox[{"VertexStyle", "\[Rule]", 
     RowBox[{
      RowBox[{
       RowBox[{
       "ResourceFunction", "[", 
        "\"\<WolframPhysicsProjectStyleData\>\"", "]"}], "[", 
       "\"\<StatesGraph\>\"", "]"}], "[", "\"\<VertexStyle\>\"", 
      "]"}]}]}], "]"}]}]], "Input"],

Cell[BoxData[
 RowBox[{"Table", "[", 
  RowBox[{
   RowBox[{"Labeled", "[", 
    RowBox[{
     RowBox[{"Show", "[", 
      RowBox[{
       RowBox[{"TMNCGraph", "[", 
        RowBox[{"10", ",", 
         RowBox[{"{", 
          RowBox[{"s", ",", "1"}], "}"}]}], "]"}], ",", 
       RowBox[{"ImageSize", "\[Rule]", "200"}]}], "]"}], ",", 
     RowBox[{"Text", "[", "s", "]"}]}], "]"}], ",", 
   RowBox[{"{", 
    RowBox[{"s", ",", "3"}], "}"}]}], "]"}]], "Input"]
}, Open  ]]

If instead of having a cyclic tape, we just have a finite tape, and insist that the head never goes off either end, then for s = k = 1 we get:

NeighboringConfigurationsC
&#10005

Cell[CellGroupData[{
Cell[BoxData[
 RowBox[{
  RowBox[{"NeighboringConfigurationsC", "[", 
   RowBox[{
    RowBox[{"{", 
     RowBox[{
      RowBox[{"{", 
       RowBox[{"s0_Integer", ",", "pos0_Integer"}], "}"}], ",", 
      "tape0_List"}], "}"}], ",", 
    RowBox[{"{", 
     RowBox[{"s_Integer", ",", "k_Integer"}], "}"}], ",", 
    RowBox[{"offs_", ":", 
     RowBox[{"{", 
      RowBox[{
       RowBox[{"-", "1"}], ",", "1"}], "}"}]}]}], "]"}], ":=", 
  RowBox[{"Flatten", "[", 
   RowBox[{
    RowBox[{"Table", "[", 
     RowBox[{
      RowBox[{"If", "[", 
       RowBox[{
        RowBox[{"1", "\[LessEqual]", 
         RowBox[{"pos0", "+", "pos1"}], "\[LessEqual]", 
         RowBox[{"Length", "[", "tape0", "]"}]}], ",", 
        RowBox[{"{", 
         RowBox[{
          RowBox[{"{", 
           RowBox[{"s1", ",", 
            RowBox[{"pos0", "+", "pos1"}]}], "}"}], ",", "tape1"}], 
         "}"}], ",", "Nothing"}], "]"}], ",", 
      RowBox[{"{", 
       RowBox[{"s1", ",", "s"}], "}"}], ",", 
      RowBox[{"{", 
       RowBox[{"pos1", ",", "offs"}], "}"}], ",", 
      RowBox[{"{", 
       RowBox[{"tape1", ",", 
        RowBox[{"Table", "[", 
         RowBox[{
          RowBox[{"ReplacePart", "[", 
           RowBox[{"tape0", ",", 
            RowBox[{"pos0", "\[Rule]", "i"}]}], "]"}], ",", 
          RowBox[{"{", 
           RowBox[{"i", ",", "0", ",", 
            RowBox[{"k", "-", "1"}]}], "}"}]}], "]"}]}], "}"}]}], 
     "]"}], ",", "2"}], "]"}]}]], "Input"],

Cell[BoxData[
 RowBox[{
  RowBox[{"TMNCGraphCX", "[", 
   RowBox[{"tlen_Integer", ",", 
    RowBox[{"{", 
     RowBox[{"s_Integer", ",", "k_Integer"}], "}"}], ",", 
    RowBox[{"offs_", ":", 
     RowBox[{"{", 
      RowBox[{
       RowBox[{"-", "1"}], ",", "1"}], "}"}]}]}], "]"}], ":=", 
  RowBox[{"Graph", "[", 
   RowBox[{
    RowBox[{"Flatten", "[", 
     RowBox[{"Table", "[", 
      RowBox[{
       RowBox[{
        RowBox[{
         RowBox[{
          RowBox[{"{", 
           RowBox[{
            RowBox[{"{", 
             RowBox[{"s0", ",", "pos0"}], "}"}], ",", "tape0"}], 
           "}"}], "\[DirectedEdge]", "#"}], "&"}], "/@", 
        RowBox[{"NeighboringConfigurationsC", "[", 
         RowBox[{
          RowBox[{"{", 
           RowBox[{
            RowBox[{"{", 
             RowBox[{"s0", ",", "pos0"}], "}"}], ",", "tape0"}], 
           "}"}], ",", 
          RowBox[{"{", 
           RowBox[{"s", ",", "k"}], "}"}], ",", "offs"}], "]"}]}], 
       ",", 
       RowBox[{"{", 
        RowBox[{"s0", ",", "s"}], "}"}], ",", 
       RowBox[{"{", 
        RowBox[{"pos0", ",", "tlen"}], "}"}], ",", 
       RowBox[{"{", 
        RowBox[{"tape0", ",", 
         RowBox[{"Tuples", "[", 
          RowBox[{
           RowBox[{"Range", "[", 
            RowBox[{"0", ",", 
             RowBox[{"k", "-", "1"}]}], "]"}], ",", "tlen"}], "]"}]}],
         "}"}]}], "]"}], "]"}], ",", 
    RowBox[{"VertexShapeFunction", "\[Rule]", 
     RowBox[{"(", 
      RowBox[{
       RowBox[{"Inset", "[", 
        RowBox[{
         RowBox[{"Framed", "[", 
          RowBox[{
           RowBox[{"RulePlot", "[", 
            RowBox[{
             RowBox[{"TuringMachine", "[", 
              RowBox[{"{", 
               RowBox[{"0", ",", 
                RowBox[{"Max", "[", 
                 RowBox[{"s", ",", "2"}], "]"}], ",", 
                RowBox[{"Max", "[", 
                 RowBox[{"k", ",", "2"}], "]"}]}], "}"}], "]"}], ",", 
             
             RowBox[{"{", 
              RowBox[{
               RowBox[{"{", 
                RowBox[{"1", ",", 
                 RowBox[{"#2", "[", 
                  RowBox[{"[", 
                   RowBox[{"1", ",", "2"}], "]"}], "]"}]}], "}"}], 
               ",", 
               RowBox[{"#2", "[", 
                RowBox[{"[", "2", "]"}], "]"}]}], "}"}], ",", "0", 
             ",", 
             RowBox[{"Mesh", "\[Rule]", "All"}], ",", 
             RowBox[{"Frame", "\[Rule]", "False"}], ",", 
             RowBox[{"ImageSize", "\[Rule]", "40"}]}], "]"}], ",", 
           RowBox[{"Background", "\[Rule]", 
            RowBox[{"Directive", "[", 
             RowBox[{
              RowBox[{"Opacity", "[", "0.2", "]"}], ",", 
              RowBox[{"Hue", "[", 
               RowBox[{"0.62", ",", "0.45", ",", "0.87"}], "]"}]}], 
             "]"}]}], ",", 
           RowBox[{"FrameMargins", "\[Rule]", 
            RowBox[{"{", 
             RowBox[{
              RowBox[{"{", 
               RowBox[{"2", ",", "2"}], "}"}], ",", 
              RowBox[{"{", 
               RowBox[{"0", ",", "0"}], "}"}]}], "}"}]}], ",", 
           RowBox[{"RoundingRadius", "\[Rule]", "0"}], ",", 
           RowBox[{"FrameStyle", "\[Rule]", 
            RowBox[{"Directive", "[", 
             RowBox[{
              RowBox[{"Opacity", "[", "0.5", "]"}], ",", 
              RowBox[{"Hue", "[", 
               RowBox[{"0.62", ",", "0.52", ",", "0.82"}], "]"}]}], 
             "]"}]}]}], "]"}], ",", "#1"}], "]"}], "&"}], ")"}]}], 
    ",", 
    RowBox[{"EdgeStyle", "\[Rule]", 
     RowBox[{
      RowBox[{
       RowBox[{
       "ResourceFunction", "[", 
        "\"\<WolframPhysicsProjectStyleData\>\"", "]"}], "[", 
       "\"\<StatesGraph\>\"", "]"}], "[", "\"\<EdgeStyle\>\"", 
      "]"}]}]}], "]"}]}]], "Input"],

Cell[BoxData[
 RowBox[{"Table", "[", 
  RowBox[{
   RowBox[{"Show", "[", 
    RowBox[{
     RowBox[{"TMNCGraphCX", "[", 
      RowBox[{"len", ",", 
       RowBox[{"{", 
        RowBox[{"1", ",", "1"}], "}"}]}], "]"}], ",", 
     RowBox[{"ImageSize", "\[Rule]", "200"}]}], "]"}], ",", 
   RowBox[{"{", 
    RowBox[{"len", ",", "3", ",", "5"}], "}"}]}], "]"}]], "Input"]
}, Open  ]]

For s = 2, k = 1 we get

NeighboringConfigurationsC
&#10005

Cell[CellGroupData[{
Cell[BoxData[
 RowBox[{
  RowBox[{"NeighboringConfigurationsC", "[", 
   RowBox[{
    RowBox[{"{", 
     RowBox[{
      RowBox[{"{", 
       RowBox[{"s0_Integer", ",", "pos0_Integer"}], "}"}], ",", 
      "tape0_List"}], "}"}], ",", 
    RowBox[{"{", 
     RowBox[{"s_Integer", ",", "k_Integer"}], "}"}], ",", 
    RowBox[{"offs_", ":", 
     RowBox[{"{", 
      RowBox[{
       RowBox[{"-", "1"}], ",", "1"}], "}"}]}]}], "]"}], ":=", 
  RowBox[{"Flatten", "[", 
   RowBox[{
    RowBox[{"Table", "[", 
     RowBox[{
      RowBox[{"If", "[", 
       RowBox[{
        RowBox[{"1", "\[LessEqual]", 
         RowBox[{"pos0", "+", "pos1"}], "\[LessEqual]", 
         RowBox[{"Length", "[", "tape0", "]"}]}], ",", 
        RowBox[{"{", 
         RowBox[{
          RowBox[{"{", 
           RowBox[{"s1", ",", 
            RowBox[{"pos0", "+", "pos1"}]}], "}"}], ",", "tape1"}], 
         "}"}], ",", "Nothing"}], "]"}], ",", 
      RowBox[{"{", 
       RowBox[{"s1", ",", "s"}], "}"}], ",", 
      RowBox[{"{", 
       RowBox[{"pos1", ",", "offs"}], "}"}], ",", 
      RowBox[{"{", 
       RowBox[{"tape1", ",", 
        RowBox[{"Table", "[", 
         RowBox[{
          RowBox[{"ReplacePart", "[", 
           RowBox[{"tape0", ",", 
            RowBox[{"pos0", "\[Rule]", "i"}]}], "]"}], ",", 
          RowBox[{"{", 
           RowBox[{"i", ",", "0", ",", 
            RowBox[{"k", "-", "1"}]}], "}"}]}], "]"}]}], "}"}]}], 
     "]"}], ",", "2"}], "]"}]}]], "Input"],

Cell[BoxData[
 RowBox[{
  RowBox[{"TMNCGraphCX", "[", 
   RowBox[{"tlen_Integer", ",", 
    RowBox[{"{", 
     RowBox[{"s_Integer", ",", "k_Integer"}], "}"}], ",", 
    RowBox[{"offs_", ":", 
     RowBox[{"{", 
      RowBox[{
       RowBox[{"-", "1"}], ",", "1"}], "}"}]}]}], "]"}], ":=", 
  RowBox[{"Graph", "[", 
   RowBox[{
    RowBox[{"Flatten", "[", 
     RowBox[{"Table", "[", 
      RowBox[{
       RowBox[{
        RowBox[{
         RowBox[{
          RowBox[{"{", 
           RowBox[{
            RowBox[{"{", 
             RowBox[{"s0", ",", "pos0"}], "}"}], ",", "tape0"}], 
           "}"}], "\[DirectedEdge]", "#"}], "&"}], "/@", 
        RowBox[{"NeighboringConfigurationsC", "[", 
         RowBox[{
          RowBox[{"{", 
           RowBox[{
            RowBox[{"{", 
             RowBox[{"s0", ",", "pos0"}], "}"}], ",", "tape0"}], 
           "}"}], ",", 
          RowBox[{"{", 
           RowBox[{"s", ",", "k"}], "}"}], ",", "offs"}], "]"}]}], 
       ",", 
       RowBox[{"{", 
        RowBox[{"s0", ",", "s"}], "}"}], ",", 
       RowBox[{"{", 
        RowBox[{"pos0", ",", "tlen"}], "}"}], ",", 
       RowBox[{"{", 
        RowBox[{"tape0", ",", 
         RowBox[{"Tuples", "[", 
          RowBox[{
           RowBox[{"Range", "[", 
            RowBox[{"0", ",", 
             RowBox[{"k", "-", "1"}]}], "]"}], ",", "tlen"}], "]"}]}],
         "}"}]}], "]"}], "]"}], ",", 
    RowBox[{"VertexShapeFunction", "\[Rule]", 
     RowBox[{"(", 
      RowBox[{
       RowBox[{"Inset", "[", 
        RowBox[{
         RowBox[{"Framed", "[", 
          RowBox[{
           RowBox[{"RulePlot", "[", 
            RowBox[{
             RowBox[{"TuringMachine", "[", 
              RowBox[{"{", 
               RowBox[{"0", ",", 
                RowBox[{"Max", "[", 
                 RowBox[{"s", ",", "2"}], "]"}], ",", 
                RowBox[{"Max", "[", 
                 RowBox[{"k", ",", "2"}], "]"}]}], "}"}], "]"}], ",", 
             
             RowBox[{"{", 
              RowBox[{
               RowBox[{"{", 
                RowBox[{"1", ",", 
                 RowBox[{"#2", "[", 
                  RowBox[{"[", 
                   RowBox[{"1", ",", "2"}], "]"}], "]"}]}], "}"}], 
               ",", 
               RowBox[{"#2", "[", 
                RowBox[{"[", "2", "]"}], "]"}]}], "}"}], ",", "0", 
             ",", 
             RowBox[{"Mesh", "\[Rule]", "All"}], ",", 
             RowBox[{"Frame", "\[Rule]", "False"}], ",", 
             RowBox[{"ImageSize", "\[Rule]", "40"}]}], "]"}], ",", 
           RowBox[{"Background", "\[Rule]", 
            RowBox[{"Directive", "[", 
             RowBox[{
              RowBox[{"Opacity", "[", "0.2", "]"}], ",", 
              RowBox[{"Hue", "[", 
               RowBox[{"0.62", ",", "0.45", ",", "0.87"}], "]"}]}], 
             "]"}]}], ",", 
           RowBox[{"FrameMargins", "\[Rule]", 
            RowBox[{"{", 
             RowBox[{
              RowBox[{"{", 
               RowBox[{"2", ",", "2"}], "}"}], ",", 
              RowBox[{"{", 
               RowBox[{"0", ",", "0"}], "}"}]}], "}"}]}], ",", 
           RowBox[{"RoundingRadius", "\[Rule]", "0"}], ",", 
           RowBox[{"FrameStyle", "\[Rule]", 
            RowBox[{"Directive", "[", 
             RowBox[{
              RowBox[{"Opacity", "[", "0.5", "]"}], ",", 
              RowBox[{"Hue", "[", 
               RowBox[{"0.62", ",", "0.52", ",", "0.82"}], "]"}]}], 
             "]"}]}]}], "]"}], ",", "#1"}], "]"}], "&"}], ")"}]}], 
    ",", 
    RowBox[{"EdgeStyle", "\[Rule]", 
     RowBox[{"Directive", "[", 
      RowBox[{
       RowBox[{"Arrowheads", "[", "0.06", "]"}], ",", 
       RowBox[{"Hue", "[", 
        RowBox[{"0.75", ",", "0", ",", "0.35"}], "]"}], ",", 
       RowBox[{"Dashing", "[", "None", "]"}], ",", 
       RowBox[{"AbsoluteThickness", "[", "1", "]"}]}], "]"}]}]}], 
   "]"}]}]], "Input"],

Cell[BoxData[
 RowBox[{"Table", "[", 
  RowBox[{
   RowBox[{"Show", "[", 
    RowBox[{
     RowBox[{"TMNCGraphCX", "[", 
      RowBox[{"len", ",", 
       RowBox[{"{", 
        RowBox[{"2", ",", "1"}], "}"}]}], "]"}], ",", 
     RowBox[{"ImageSize", "\[Rule]", "200"}]}], "]"}], ",", 
   RowBox[{"{", 
    RowBox[{"len", ",", "3", ",", "5"}], "}"}]}], "]"}]], "Input"]
}, Open  ]]

and the overall behavior for successive s is exactly as we saw above for unbounded tapes:

NeighboringConfigurationsC
&#10005

Cell[CellGroupData[{
Cell[BoxData[
 RowBox[{
  RowBox[{"NeighboringConfigurationsC", "[", 
   RowBox[{
    RowBox[{"{", 
     RowBox[{
      RowBox[{"{", 
       RowBox[{"s0_Integer", ",", "pos0_Integer"}], "}"}], ",", 
      "tape0_List"}], "}"}], ",", 
    RowBox[{"{", 
     RowBox[{"s_Integer", ",", "k_Integer"}], "}"}], ",", 
    RowBox[{"offs_", ":", 
     RowBox[{"{", 
      RowBox[{
       RowBox[{"-", "1"}], ",", "1"}], "}"}]}]}], "]"}], ":=", 
  RowBox[{"Flatten", "[", 
   RowBox[{
    RowBox[{"Table", "[", 
     RowBox[{
      RowBox[{"If", "[", 
       RowBox[{
        RowBox[{"1", "\[LessEqual]", 
         RowBox[{"pos0", "+", "pos1"}], "\[LessEqual]", 
         RowBox[{"Length", "[", "tape0", "]"}]}], ",", 
        RowBox[{"{", 
         RowBox[{
          RowBox[{"{", 
           RowBox[{"s1", ",", 
            RowBox[{"pos0", "+", "pos1"}]}], "}"}], ",", "tape1"}], 
         "}"}], ",", "Nothing"}], "]"}], ",", 
      RowBox[{"{", 
       RowBox[{"s1", ",", "s"}], "}"}], ",", 
      RowBox[{"{", 
       RowBox[{"pos1", ",", "offs"}], "}"}], ",", 
      RowBox[{"{", 
       RowBox[{"tape1", ",", 
        RowBox[{"Table", "[", 
         RowBox[{
          RowBox[{"ReplacePart", "[", 
           RowBox[{"tape0", ",", 
            RowBox[{"pos0", "\[Rule]", "i"}]}], "]"}], ",", 
          RowBox[{"{", 
           RowBox[{"i", ",", "0", ",", 
            RowBox[{"k", "-", "1"}]}], "}"}]}], "]"}]}], "}"}]}], 
     "]"}], ",", "2"}], "]"}]}]], "Input"],

Cell[BoxData[
 RowBox[{
  RowBox[{"TMNCGraphC", "[", 
   RowBox[{"tlen_Integer", ",", 
    RowBox[{"{", 
     RowBox[{"s_Integer", ",", "k_Integer"}], "}"}], ",", 
    RowBox[{"offs_", ":", 
     RowBox[{"{", 
      RowBox[{
       RowBox[{"-", "1"}], ",", "1"}], "}"}]}]}], "]"}], ":=", 
  RowBox[{"Graph", "[", 
   RowBox[{
    RowBox[{"Flatten", "[", 
     RowBox[{"Table", "[", 
      RowBox[{
       RowBox[{
        RowBox[{
         RowBox[{
          RowBox[{"{", 
           RowBox[{
            RowBox[{"{", 
             RowBox[{"s0", ",", "pos0"}], "}"}], ",", "tape0"}], 
           "}"}], "\[DirectedEdge]", "#"}], "&"}], "/@", 
        RowBox[{"NeighboringConfigurationsC", "[", 
         RowBox[{
          RowBox[{"{", 
           RowBox[{
            RowBox[{"{", 
             RowBox[{"s0", ",", "pos0"}], "}"}], ",", "tape0"}], 
           "}"}], ",", 
          RowBox[{"{", 
           RowBox[{"s", ",", "k"}], "}"}], ",", "offs"}], "]"}]}], 
       ",", 
       RowBox[{"{", 
        RowBox[{"s0", ",", "s"}], "}"}], ",", 
       RowBox[{"{", 
        RowBox[{"pos0", ",", "tlen"}], "}"}], ",", 
       RowBox[{"{", 
        RowBox[{"tape0", ",", 
         RowBox[{"Tuples", "[", 
          RowBox[{
           RowBox[{"Range", "[", 
            RowBox[{"0", ",", 
             RowBox[{"k", "-", "1"}]}], "]"}], ",", "tlen"}], "]"}]}],
         "}"}]}], "]"}], "]"}], ",", 
    RowBox[{"EdgeStyle", "\[Rule]", 
     RowBox[{"Directive", "[", 
      RowBox[{
       RowBox[{"Arrowheads", "[", "0.03", "]"}], ",", 
       RowBox[{"Hue", "[", 
        RowBox[{"0.75", ",", "0", ",", "0.35"}], "]"}], ",", 
       RowBox[{"Dashing", "[", "None", "]"}], ",", 
       RowBox[{"AbsoluteThickness", "[", "1", "]"}]}], "]"}]}], ",", 
    RowBox[{"VertexStyle", "\[Rule]", 
     RowBox[{
      RowBox[{
       RowBox[{
       "ResourceFunction", "[", 
        "\"\<WolframPhysicsProjectStyleData\>\"", "]"}], "[", 
       "\"\<StatesGraph\>\"", "]"}], "[", "\"\<VertexStyle\>\"", 
      "]"}]}]}], "]"}]}]], "Input"],

Cell[BoxData[
 RowBox[{"Table", "[", 
  RowBox[{
   RowBox[{"Labeled", "[", 
    RowBox[{
     RowBox[{"Show", "[", 
      RowBox[{
       RowBox[{"TMNCGraphC", "[", 
        RowBox[{"10", ",", 
         RowBox[{"{", 
          RowBox[{"s", ",", "1"}], "}"}]}], "]"}], ",", 
       RowBox[{"ImageSize", "\[Rule]", "200"}]}], "]"}], ",", 
     RowBox[{"Style", "[", 
      RowBox[{
       RowBox[{"Text", "[", "s", "]"}], ",", "10"}], "]"}]}], "]"}], 
   ",", 
   RowBox[{"{", 
    RowBox[{"s", ",", "3"}], "}"}]}], "]"}]], "Input"]
}, Open  ]]

For s = 1, k = 2, this is what happens in the cyclic case for length 3:

NeighboringConfigurations
&#10005

Cell[CellGroupData[{
Cell[BoxData[
 RowBox[{
  RowBox[{"NeighboringConfigurations", "[", 
   RowBox[{
    RowBox[{"{", 
     RowBox[{
      RowBox[{"{", 
       RowBox[{"s0_Integer", ",", "pos0_Integer"}], "}"}], ",", 
      "tape0_List"}], "}"}], ",", 
    RowBox[{"{", 
     RowBox[{"s_Integer", ",", "k_Integer"}], "}"}], ",", 
    RowBox[{"offs_", ":", 
     RowBox[{"{", 
      RowBox[{
       RowBox[{"-", "1"}], ",", "1"}], "}"}]}]}], "]"}], ":=", 
  RowBox[{"Flatten", "[", 
   RowBox[{
    RowBox[{"Table", "[", 
     RowBox[{
      RowBox[{"{", 
       RowBox[{
        RowBox[{"{", 
         RowBox[{"s1", ",", 
          RowBox[{"Mod", "[", 
           RowBox[{
            RowBox[{"pos0", "+", "pos1"}], ",", 
            RowBox[{"Length", "[", "tape0", "]"}], ",", "1"}], 
           "]"}]}], "}"}], ",", "tape1"}], "}"}], ",", 
      RowBox[{"{", 
       RowBox[{"s1", ",", "s"}], "}"}], ",", 
      RowBox[{"{", 
       RowBox[{"pos1", ",", "offs"}], "}"}], ",", 
      RowBox[{"{", 
       RowBox[{"tape1", ",", 
        RowBox[{"Table", "[", 
         RowBox[{
          RowBox[{"ReplacePart", "[", 
           RowBox[{"tape0", ",", 
            RowBox[{"pos0", "\[Rule]", "i"}]}], "]"}], ",", 
          RowBox[{"{", 
           RowBox[{"i", ",", "0", ",", 
            RowBox[{"k", "-", "1"}]}], "}"}]}], "]"}]}], "}"}]}], 
     "]"}], ",", "2"}], "]"}]}]], "Input"],

Cell[BoxData[
 RowBox[{
  RowBox[{"TMNCGraphX", "[", 
   RowBox[{"tlen_Integer", ",", 
    RowBox[{"{", 
     RowBox[{"s_Integer", ",", "k_Integer"}], "}"}], ",", 
    RowBox[{"offs_", ":", 
     RowBox[{"{", 
      RowBox[{
       RowBox[{"-", "1"}], ",", "1"}], "}"}]}]}], "]"}], ":=", 
  RowBox[{"Graph", "[", 
   RowBox[{
    RowBox[{"Flatten", "[", 
     RowBox[{"Table", "[", 
      RowBox[{
       RowBox[{
        RowBox[{
         RowBox[{
          RowBox[{"{", 
           RowBox[{
            RowBox[{"{", 
             RowBox[{"s0", ",", "pos0"}], "}"}], ",", "tape0"}], 
           "}"}], "\[DirectedEdge]", "#"}], "&"}], "/@", 
        RowBox[{"NeighboringConfigurations", "[", 
         RowBox[{
          RowBox[{"{", 
           RowBox[{
            RowBox[{"{", 
             RowBox[{"s0", ",", "pos0"}], "}"}], ",", "tape0"}], 
           "}"}], ",", 
          RowBox[{"{", 
           RowBox[{"s", ",", "k"}], "}"}], ",", "offs"}], "]"}]}], 
       ",", 
       RowBox[{"{", 
        RowBox[{"s0", ",", "s"}], "}"}], ",", 
       RowBox[{"{", 
        RowBox[{"pos0", ",", "tlen"}], "}"}], ",", 
       RowBox[{"{", 
        RowBox[{"tape0", ",", 
         RowBox[{"Tuples", "[", 
          RowBox[{
           RowBox[{"Range", "[", 
            RowBox[{"0", ",", 
             RowBox[{"k", "-", "1"}]}], "]"}], ",", "tlen"}], "]"}]}],
         "}"}]}], "]"}], "]"}], ",", 
    RowBox[{"VertexShapeFunction", "\[Rule]", 
     RowBox[{"(", 
      RowBox[{
       RowBox[{"Inset", "[", 
        RowBox[{
         RowBox[{"Framed", "[", 
          RowBox[{
           RowBox[{"RulePlot", "[", 
            RowBox[{
             RowBox[{"TuringMachine", "[", 
              RowBox[{"{", 
               RowBox[{"0", ",", 
                RowBox[{"Max", "[", 
                 RowBox[{"s", ",", "2"}], "]"}], ",", 
                RowBox[{"Max", "[", 
                 RowBox[{"k", ",", "2"}], "]"}]}], "}"}], "]"}], ",", 
             
             RowBox[{"{", 
              RowBox[{
               RowBox[{"{", 
                RowBox[{"1", ",", 
                 RowBox[{"#2", "[", 
                  RowBox[{"[", 
                   RowBox[{"1", ",", "2"}], "]"}], "]"}]}], "}"}], 
               ",", 
               RowBox[{"#2", "[", 
                RowBox[{"[", "2", "]"}], "]"}]}], "}"}], ",", "0", 
             ",", 
             RowBox[{"Mesh", "\[Rule]", "All"}], ",", 
             RowBox[{"Frame", "\[Rule]", "False"}], ",", 
             RowBox[{"ImageSize", "\[Rule]", "40"}]}], "]"}], ",", 
           RowBox[{"Background", "\[Rule]", 
            RowBox[{"Directive", "[", 
             RowBox[{
              RowBox[{"Opacity", "[", "0.2", "]"}], ",", 
              RowBox[{"Hue", "[", 
               RowBox[{"0.62", ",", "0.45", ",", "0.87"}], "]"}]}], 
             "]"}]}], ",", 
           RowBox[{"FrameMargins", "->", 
            RowBox[{"{", 
             RowBox[{
              RowBox[{"{", 
               RowBox[{"2", ",", "2"}], "}"}], ",", 
              RowBox[{"{", 
               RowBox[{"0", ",", "0"}], "}"}]}], "}"}]}], ",", 
           RowBox[{"RoundingRadius", "\[Rule]", "0"}], ",", 
           RowBox[{"FrameStyle", "\[Rule]", 
            RowBox[{"Directive", "[", 
             RowBox[{
              RowBox[{"Opacity", "[", "0.5", "]"}], ",", 
              RowBox[{"Hue", "[", 
               RowBox[{"0.62", ",", "0.52", ",", "0.82"}], "]"}]}], 
             "]"}]}]}], "]"}], ",", "#1"}], "]"}], "&"}], ")"}]}], 
    ",", 
    RowBox[{"EdgeStyle", "\[Rule]", 
     RowBox[{
      RowBox[{
       RowBox[{
       "ResourceFunction", "[", 
        "\"\<WolframPhysicsProjectStyleData\>\"", "]"}], "[", 
       "\"\<StatesGraph\>\"", "]"}], "[", "\"\<EdgeStyle\>\"", 
      "]"}]}]}], "]"}]}]], "Input"],

Cell[BoxData[
 RowBox[{"TMNCGraphX", "[", 
  RowBox[{"3", ",", 
   RowBox[{"{", 
    RowBox[{"1", ",", "2"}], "}"}]}], "]"}]], "Input"]

}, Open  ]]

The results for lengths 1 through 6 are:

NeighboringConfigurations
&#10005

Cell[CellGroupData[{
Cell[BoxData[
 RowBox[{
  RowBox[{"NeighboringConfigurations", "[", 
   RowBox[{
    RowBox[{"{", 
     RowBox[{
      RowBox[{"{", 
       RowBox[{"s0_Integer", ",", "pos0_Integer"}], "}"}], ",", 
      "tape0_List"}], "}"}], ",", 
    RowBox[{"{", 
     RowBox[{"s_Integer", ",", "k_Integer"}], "}"}], ",", 
    RowBox[{"offs_", ":", 
     RowBox[{"{", 
      RowBox[{
       RowBox[{"-", "1"}], ",", "1"}], "}"}]}]}], "]"}], ":=", 
  RowBox[{"Flatten", "[", 
   RowBox[{
    RowBox[{"Table", "[", 
     RowBox[{
      RowBox[{"{", 
       RowBox[{
        RowBox[{"{", 
         RowBox[{"s1", ",", 
          RowBox[{"Mod", "[", 
           RowBox[{
            RowBox[{"pos0", "+", "pos1"}], ",", 
            RowBox[{"Length", "[", "tape0", "]"}], ",", "1"}], 
           "]"}]}], "}"}], ",", "tape1"}], "}"}], ",", 
      RowBox[{"{", 
       RowBox[{"s1", ",", "s"}], "}"}], ",", 
      RowBox[{"{", 
       RowBox[{"pos1", ",", "offs"}], "}"}], ",", 
      RowBox[{"{", 
       RowBox[{"tape1", ",", 
        RowBox[{"Table", "[", 
         RowBox[{
          RowBox[{"ReplacePart", "[", 
           RowBox[{"tape0", ",", 
            RowBox[{"pos0", "\[Rule]", "i"}]}], "]"}], ",", 
          RowBox[{"{", 
           RowBox[{"i", ",", "0", ",", 
            RowBox[{"k", "-", "1"}]}], "}"}]}], "]"}]}], "}"}]}], 
     "]"}], ",", "2"}], "]"}]}]], "Input"],

Cell[BoxData[
 RowBox[{
  RowBox[{"TMNCGraph", "[", 
   RowBox[{"tlen_Integer", ",", 
    RowBox[{"{", 
     RowBox[{"s_Integer", ",", "k_Integer"}], "}"}], ",", 
    RowBox[{"offs_", ":", 
     RowBox[{"{", 
      RowBox[{
       RowBox[{"-", "1"}], ",", "1"}], "}"}]}]}], "]"}], ":=", 
  RowBox[{"Graph", "[", 
   RowBox[{
    RowBox[{"Flatten", "[", 
     RowBox[{"Table", "[", 
      RowBox[{
       RowBox[{
        RowBox[{
         RowBox[{
          RowBox[{"{", 
           RowBox[{
            RowBox[{"{", 
             RowBox[{"s0", ",", "pos0"}], "}"}], ",", "tape0"}], 
           "}"}], "\[DirectedEdge]", "#"}], "&"}], "/@", 
        RowBox[{"NeighboringConfigurations", "[", 
         RowBox[{
          RowBox[{"{", 
           RowBox[{
            RowBox[{"{", 
             RowBox[{"s0", ",", "pos0"}], "}"}], ",", "tape0"}], 
           "}"}], ",", 
          RowBox[{"{", 
           RowBox[{"s", ",", "k"}], "}"}], ",", "offs"}], "]"}]}], 
       ",", 
       RowBox[{"{", 
        RowBox[{"s0", ",", "s"}], "}"}], ",", 
       RowBox[{"{", 
        RowBox[{"pos0", ",", "tlen"}], "}"}], ",", 
       RowBox[{"{", 
        RowBox[{"tape0", ",", 
         RowBox[{"Tuples", "[", 
          RowBox[{
           RowBox[{"Range", "[", 
            RowBox[{"0", ",", 
             RowBox[{"k", "-", "1"}]}], "]"}], ",", "tlen"}], "]"}]}],
         "}"}]}], "]"}], "]"}], ",", 
    RowBox[{"EdgeStyle", "\[Rule]", 
     RowBox[{
      RowBox[{
       RowBox[{
       "ResourceFunction", "[", 
        "\"\<WolframPhysicsProjectStyleData\>\"", "]"}], "[", 
       "\"\<StatesGraph\>\"", "]"}], "[", "\"\<EdgeStyle\>\"", 
      "]"}]}], ",", 
    RowBox[{"VertexStyle", "\[Rule]", 
     RowBox[{
      RowBox[{
       RowBox[{
       "ResourceFunction", "[", 
        "\"\<WolframPhysicsProjectStyleData\>\"", "]"}], "[", 
       "\"\<StatesGraph\>\"", "]"}], "[", "\"\<VertexStyle\>\"", 
      "]"}]}]}], "]"}]}]], "Input"],

Cell[BoxData[
 RowBox[{"Table", "[", 
  RowBox[{
   RowBox[{"Graph", "[", 
    RowBox[{
     RowBox[{"TMNCGraph", "[", 
      RowBox[{"n", ",", 
       RowBox[{"{", 
        RowBox[{"1", ",", "2"}], "}"}]}], "]"}], ",", 
     RowBox[{"ImageSize", "\[Rule]", "200"}]}], "]"}], ",", 
   RowBox[{"{", 
    RowBox[{"n", ",", "6"}], "}"}]}], "]"}]], "Input"]
}, Open  ]]

Rendering these in 3D makes the connection with progressively high-dimensional hypercubes slightly clearer:

NeighboringConfigurations
&#10005

Cell[CellGroupData[{
Cell[BoxData[
 RowBox[{
  RowBox[{"NeighboringConfigurations", "[", 
   RowBox[{
    RowBox[{"{", 
     RowBox[{
      RowBox[{"{", 
       RowBox[{"s0_Integer", ",", "pos0_Integer"}], "}"}], ",", 
      "tape0_List"}], "}"}], ",", 
    RowBox[{"{", 
     RowBox[{"s_Integer", ",", "k_Integer"}], "}"}], ",", 
    RowBox[{"offs_", ":", 
     RowBox[{"{", 
      RowBox[{
       RowBox[{"-", "1"}], ",", "1"}], "}"}]}]}], "]"}], ":=", 
  RowBox[{"Flatten", "[", 
   RowBox[{
    RowBox[{"Table", "[", 
     RowBox[{
      RowBox[{"{", 
       RowBox[{
        RowBox[{"{", 
         RowBox[{"s1", ",", 
          RowBox[{"Mod", "[", 
           RowBox[{
            RowBox[{"pos0", "+", "pos1"}], ",", 
            RowBox[{"Length", "[", "tape0", "]"}], ",", "1"}], 
           "]"}]}], "}"}], ",", "tape1"}], "}"}], ",", 
      RowBox[{"{", 
       RowBox[{"s1", ",", "s"}], "}"}], ",", 
      RowBox[{"{", 
       RowBox[{"pos1", ",", "offs"}], "}"}], ",", 
      RowBox[{"{", 
       RowBox[{"tape1", ",", 
        RowBox[{"Table", "[", 
         RowBox[{
          RowBox[{"ReplacePart", "[", 
           RowBox[{"tape0", ",", 
            RowBox[{"pos0", "\[Rule]", "i"}]}], "]"}], ",", 
          RowBox[{"{", 
           RowBox[{"i", ",", "0", ",", 
            RowBox[{"k", "-", "1"}]}], "}"}]}], "]"}]}], "}"}]}], 
     "]"}], ",", "2"}], "]"}]}]], "Input"],

Cell[BoxData[
 RowBox[{
  RowBox[{"TMNCGraph", "[", 
   RowBox[{"tlen_Integer", ",", 
    RowBox[{"{", 
     RowBox[{"s_Integer", ",", "k_Integer"}], "}"}], ",", 
    RowBox[{"offs_", ":", 
     RowBox[{"{", 
      RowBox[{
       RowBox[{"-", "1"}], ",", "1"}], "}"}]}]}], "]"}], ":=", 
  RowBox[{"Graph", "[", 
   RowBox[{
    RowBox[{"Flatten", "[", 
     RowBox[{"Table", "[", 
      RowBox[{
       RowBox[{
        RowBox[{
         RowBox[{
          RowBox[{"{", 
           RowBox[{
            RowBox[{"{", 
             RowBox[{"s0", ",", "pos0"}], "}"}], ",", "tape0"}], 
           "}"}], "\[DirectedEdge]", "#"}], "&"}], "/@", 
        RowBox[{"NeighboringConfigurations", "[", 
         RowBox[{
          RowBox[{"{", 
           RowBox[{
            RowBox[{"{", 
             RowBox[{"s0", ",", "pos0"}], "}"}], ",", "tape0"}], 
           "}"}], ",", 
          RowBox[{"{", 
           RowBox[{"s", ",", "k"}], "}"}], ",", "offs"}], "]"}]}], 
       ",", 
       RowBox[{"{", 
        RowBox[{"s0", ",", "s"}], "}"}], ",", 
       RowBox[{"{", 
        RowBox[{"pos0", ",", "tlen"}], "}"}], ",", 
       RowBox[{"{", 
        RowBox[{"tape0", ",", 
         RowBox[{"Tuples", "[", 
          RowBox[{
           RowBox[{"Range", "[", 
            RowBox[{"0", ",", 
             RowBox[{"k", "-", "1"}]}], "]"}], ",", "tlen"}], "]"}]}],
         "}"}]}], "]"}], "]"}], ",", 
    RowBox[{"EdgeStyle", "\[Rule]", 
     RowBox[{
      RowBox[{
       RowBox[{
       "ResourceFunction", "[", 
        "\"\<WolframPhysicsProjectStyleData\>\"", "]"}], "[", 
       "\"\^lt;StatesGraph\>\"", "]"}], "[", "\"\<EdgeStyle\>\"", 
      "]"}]}], ",", 
    RowBox[{"VertexStyle", "\[Rule]", 
     RowBox[{
      RowBox[{
       RowBox[{
       "ResourceFunction", "[", 
        "\"\<WolframPhysicsProjectStyleData\>\"", "]"}], "[", 
       "\"\<StatesGraph\>\"", "]"}], "[", "\"\<VertexStyle\>\"", 
      "]"}]}]}], "]"}]}]], "Input"],

Cell[BoxData[
 RowBox[{"Table", "[", 
  RowBox[{
   RowBox[{"Graph3D", "[", 
    RowBox[{
     RowBox[{"TMNCGraph", "[", 
      RowBox[{"n", ",", 
       RowBox[{"{", 
        RowBox[{"1", ",", "2"}], "}"}]}], "]"}], ",", 
     RowBox[{"ImageSize", "\[Rule]", "200"}], ",", 
     RowBox[{"EdgeStyle", "\[Rule]", 
      RowBox[{"Directive", "[", 
       RowBox[{
        RowBox[{"Hue", "[", 
         RowBox[{"0.62", ",", "0.05", ",", "0.55"}], "]"}], ",", 
        RowBox[{"Opacity", "[", ".6", "]"}]}], "]"}]}]}], "]"}], ",", 
   
   RowBox[{"{", 
    RowBox[{"n", ",", "6"}], "}"}]}], "]"}]], "Input"]
}, Open  ]]

The non-cyclic case for lengths 2 through 6 (length 1 is trivial):

NeighboringConfigurationsC
&#10005

Cell[CellGroupData[{
Cell[BoxData[
 RowBox[{
  RowBox[{"NeighboringConfigurationsC", "[", 
   RowBox[{
    RowBox[{"{", 
     RowBox[{
      RowBox[{"{", 
       RowBox[{"s0_Integer", ",", "pos0_Integer"}], "}"}], ",", 
      "tape0_List"}], "}"}], ",", 
    RowBox[{"{", 
     RowBox[{"s_Integer", ",", "k_Integer"}], "}"}], ",", 
    RowBox[{"offs_", ":", 
     RowBox[{"{", 
      RowBox[{
       RowBox[{"-", "1"}], ",", "1"}], "}"}]}]}], "]"}], ":=", 
  RowBox[{"Flatten", "[", 
   RowBox[{
    RowBox[{"Table", "[", 
     RowBox[{
      RowBox[{"If", "[", 
       RowBox[{
        RowBox[{"1", "\[LessEqual]", 
         RowBox[{"pos0", "+", "pos1"}], "\[LessEqual]", 
         RowBox[{"Length", "[", "tape0", "]"}]}], ",", 
        RowBox[{"{", 
         RowBox[{
          RowBox[{"{", 
           RowBox[{"s1", ",", 
            RowBox[{"pos0", "+", "pos1"}]}], "}"}], ",", "tape1"}], 
         "}"}], ",", "Nothing"}], "]"}], ",", 
      RowBox[{"{", 
       RowBox[{"s1", ",", "s"}], "}"}], ",", 
      RowBox[{"{", 
       RowBox[{"pos1", ",", "offs"}], "}"}], ",", 
      RowBox[{"{", 
       RowBox[{"tape1", ",", 
        RowBox[{"Table", "[", 
         RowBox[{
          RowBox[{"ReplacePart", "[", 
           RowBox[{"tape0", ",", 
            RowBox[{"pos0", "\[Rule]", "i"}]}], "]"}], ",", 
          RowBox[{"{", 
           RowBox[{"i", ",", "0", ",", 
            RowBox[{"k", "-", "1"}]}], "}"}]}], "]"}]}], "}"}]}], 
     "]"}], ",", "2"}], "]"}]}]], "Input"],

Cell[BoxData[
 RowBox[{
  RowBox[{"TMNCGraphC", "[", 
   RowBox[{"tlen_Integer", ",", 
    RowBox[{"{", 
     RowBox[{"s_Integer", ",", "k_Integer"}], "}"}], ",", 
    RowBox[{"offs_", ":", 
     RowBox[{"{", 
      RowBox[{
       RowBox[{"-", "1"}], ",", "1"}], "}"}]}]}], "]"}], ":=", 
  RowBox[{"Graph", "[", 
   RowBox[{
    RowBox[{"Flatten", "[", 
     RowBox[{"Table", "[", 
      RowBox[{
       RowBox[{
        RowBox[{
         RowBox[{
          RowBox[{"{", 
           RowBox[{
            RowBox[{"{", 
             RowBox[{"s0", ",", "pos0"}], "}"}], ",", "tape0"}], 
           "}"}], "\[DirectedEdge]", "#"}], "&"}], "/@", 
        RowBox[{"NeighboringConfigurationsC", "[", 
         RowBox[{
          RowBox[{"{", 
           RowBox[{
            RowBox[{"{", 
             RowBox[{"s0", ",", "pos0"}], "}"}], ",", "tape0"}], 
           "}"}], ",", 
          RowBox[{"{", 
           RowBox[{"s", ",", "k"}], "}"}], ",", "offs"}], "]"}]}], 
       ",", 
       RowBox[{"{", 
        RowBox[{"s0", ",", "s"}], "}"}], ",", 
       RowBox[{"{", 
        RowBox[{"pos0", ",", "tlen"}], "}"}], ",", 
       RowBox[{"{", 
        RowBox[{"tape0", ",", 
         RowBox[{"Tuples", "[", 
          RowBox[{
           RowBox[{"Range", "[", 
            RowBox[{"0", ",", 
             RowBox[{"k", "-", "1"}]}], "]"}], ",", "tlen"}], "]"}]}],
         "}"}]}], "]"}], "]"}], ",", 
    RowBox[{"EdgeStyle", "\[Rule]", 
     RowBox[{
      RowBox[{
       RowBox[{
       "ResourceFunction", "[", 
        "\"\<WolframPhysicsProjectStyleData\>\"", "]"}], "[", 
       "\"\<StatesGraph\>\"", "]"}], "[", "\"\<EdgeStyle\>\"", 
      "]"}]}], ",", 
    RowBox[{"VertexStyle", "\[Rule]", 
     RowBox[{
      RowBox[{
       RowBox[{
       "ResourceFunction", "[", 
        "\"\<WolframPhysicsProjectStyleData\>\"", "]"}], "[", 
       "\"\<StatesGraph\>\"", "]"}], "[", "\"\<VertexStyle\>\"", 
      "]"}]}]}], "]"}]}]], "Input"],

Cell[BoxData[
 RowBox[{"Table", "[", 
  RowBox[{
   RowBox[{"Graph", "[", 
    RowBox[{
     RowBox[{"TMNCGraphC", "[", 
      RowBox[{"n", ",", 
       RowBox[{"{", 
        RowBox[{"1", ",", "2"}], "}"}]}], "]"}], ",", 
     RowBox[{"ImageSize", "\[Rule]", "200"}]}], "]"}], ",", 
   RowBox[{"{", 
    RowBox[{"n", ",", "2", ",", "6"}], "}"}]}], "]"}]], "Input"]
}, Open  ]]

Rendered in 3D these become:

NeighboringConfigurationsC
&#10005

Cell[CellGroupData[{
Cell[BoxData[
 RowBox[{
  RowBox[{"NeighboringConfigurationsC", "[", 
   RowBox[{
    RowBox[{"{", 
     RowBox[{
      RowBox[{"{", 
       RowBox[{"s0_Integer", ",", "pos0_Integer"}], "}"}], ",", 
      "tape0_List"}], "}"}], ",", 
    RowBox[{"{", 
     RowBox[{"s_Integer", ",", "k_Integer"}], "}"}], ",", 
    RowBox[{"offs_", ":", 
     RowBox[{"{", 
      RowBox[{
       RowBox[{"-", "1"}], ",", "1"}], "}"}]}]}], "]"}], ":=", 
  RowBox[{"Flatten", "[", 
   RowBox[{
    RowBox[{"Table", "[", 
     RowBox[{
      RowBox[{"If", "[", 
       RowBox[{
        RowBox[{"1", "\[LessEqual]", 
         RowBox[{"pos0", "+", "pos1"}], "\[LessEqual]", 
         RowBox[{"Length", "[", "tape0", "]"}]}], ",", 
        RowBox[{"{", 
         RowBox[{
          RowBox[{"{", 
           RowBox[{"s1", ",", 
            RowBox[{"pos0", "+", "pos1"}]}], "}"}], ",", "tape1"}], 
         "}"}], ",", "Nothing"}], "]"}], ",", 
      RowBox[{"{", 
       RowBox[{"s1", ",", "s"}], "}"}], ",", 
      RowBox[{"{", 
       RowBox[{"pos1", ",", "offs"}], "}"}], ",", 
      RowBox[{"{", 
       RowBox[{"tape1", ",", 
        RowBox[{"Table", "[", 
         RowBox[{
          RowBox[{"ReplacePart", "[", 
           RowBox[{"tape0", ",", 
            RowBox[{"pos0", "\[Rule]", "i"}]}], "]"}], ",", 
          RowBox[{"{", 
           RowBox[{"i", ",", "0", ",", 
            RowBox[{"k", "-", "1"}]}], "}"}]}], "]"}]}], "}"}]}], 
     "]"}], ",", "2"}], "]"}]}]], "Input"],

Cell[BoxData[
 RowBox[{
  RowBox[{"TMNCGraphC", "[", 
   RowBox[{"tlen_Integer", ",", 
    RowBox[{"{", 
     RowBox[{"s_Integer", ",", "k_Integer"}], "}"}], ",", 
    RowBox[{"offs_", ":", 
     RowBox[{"{", 
      RowBox[{
       RowBox[{"-", "1"}], ",", "1"}], "}"}]}]}], "]"}], ":=", 
  RowBox[{"Graph", "[", 
   RowBox[{
    RowBox[{"Flatten", "[", 
     RowBox[{"Table", "[", 
      RowBox[{
       RowBox[{
        RowBox[{
         RowBox[{
          RowBox[{"{", 
           RowBox[{
            RowBox[{"{", 
             RowBox[{"s0", ",", "pos0"}], "}"}], ",", "tape0"}], 
           "}"}], "\[DirectedEdge]", "#"}], "&"}], "/@", 
        RowBox[{"NeighboringConfigurationsC", "[", 
         RowBox[{
          RowBox[{"{", 
           RowBox[{
            RowBox[{"{", 
             RowBox[{"s0", ",", "pos0"}], "}"}], ",", "tape0"}], 
           "}"}], ",", 
          RowBox[{"{", 
           RowBox[{"s", ",", "k"}], "}"}], ",", "offs"}], "]"}]}], 
       ",", 
       RowBox[{"{", 
        RowBox[{"s0", ",", "s"}], "}"}], ",", 
       RowBox[{"{", 
        RowBox[{"pos0", ",", "tlen"}], "}"}], ",", 
       RowBox[{"{", 
        RowBox[{"tape0", ",", 
         RowBox[{"Tuples", "[", 
          RowBox[{
           RowBox[{"Range", "[", 
            RowBox[{"0", ",", 
             RowBox[{"k", "-", "1"}]}], "]"}], ",", "tlen"}], "]"}]}],
         "}"}]}], "]"}], "]"}], ",", 
    RowBox[{"EdgeStyle", "\[Rule]", 
     RowBox[{
      RowBox[{
       RowBox[{
       "ResourceFunction", "[", 
        "\"\<WolframPhysicsProjectStyleData\>\"", "]"}], "[", 
       "\"\<StatesGraph\>\"", "]"}], "[", "\"\<EdgeStyle\>\"", 
      "]"}]}], ",", 
    RowBox[{"VertexStyle", "\[Rule]", 
     RowBox[{
      RowBox[{
       RowBox[{
       "ResourceFunction", "[", 
        "\"\<WolframPhysicsProjectStyleData\>\"", "]"}], "[", 
       "\"\<StatesGraph\>\"", "]"}], "[", "\"\<VertexStyle\>\"", 
      "]"}]}]}], "]"}]}]], "Input"],

Cell[BoxData[
 RowBox[{"Table", "[", 
  RowBox[{
   RowBox[{"Graph3D", "[", 
    RowBox[{
     RowBox[{"TMNCGraphC", "[", 
      RowBox[{"n", ",", 
       RowBox[{"{", 
        RowBox[{"1", ",", "2"}], "}"}]}], "]"}], ",", 
     RowBox[{"ImageSize", "\[Rule]", "200"}], ",", 
     RowBox[{"VertexStyle", "\[Rule]", " ", 
      RowBox[{
       RowBox[{
       "ResourceFunction", "[", 
        "\"\<WolframPhysicsProjectStyleData\>\"", "]"}], "[", 
       RowBox[{"\"\<StatesGraph3D\>\"", ",", "\"\<VertexStyle\>\""}], 
       "]"}]}], ",", 
     RowBox[{"EdgeStyle", "\[Rule]", " ", 
      RowBox[{
       RowBox[{
       "ResourceFunction", "[", 
        "\"\<WolframPhysicsProjectStyleData\>\"", "]"}], "[", 
       RowBox[{"\"\<StatesGraph3D\>\"", ",", "\"\<EdgeStyle\>\""}], 
       "]"}]}]}], "]"}], ",", 
   RowBox[{"{", 
    RowBox[{"n", ",", "2", ",", "6"}], "}"}]}], "]"}]], "Input"]
}, Open  ]]

In the case s = 2, k = 2 for a length-3 cyclic tape we get:

NeighboringConfigurations
&#10005

Cell[CellGroupData[{
Cell[BoxData[
 RowBox[{
  RowBox[{"NeighboringConfigurations", "[", 
   RowBox[{
    RowBox[{"{", 
     RowBox[{
      RowBox[{"{", 
       RowBox[{"s0_Integer", ",", "pos0_Integer"}], "}"}], ",", 
      "tape0_List"}], "}"}], ",", 
    RowBox[{"{", 
     RowBox[{"s_Integer", ",", "k_Integer"}], "}"}], ",", 
    RowBox[{"offs_", ":", 
     RowBox[{"{", 
      RowBox[{
       RowBox[{"-", "1"}], ",", "1"}], "}"}]}]}], "]"}], ":=", 
  RowBox[{"Flatten", "[", 
   RowBox[{
    RowBox[{"Table", "[", 
     RowBox[{
      RowBox[{"{", 
       RowBox[{
        RowBox[{"{", 
         RowBox[{"s1", ",", 
          RowBox[{"Mod", "[", 
           RowBox[{
            RowBox[{"pos0", "+", "pos1"}], ",", 
            RowBox[{"Length", "[", "tape0", "]"}], ",", "1"}], 
           "]"}]}], "}"}], ",", "tape1"}], "}"}], ",", 
      RowBox[{"{", 
       RowBox[{"s1", ",", "s"}], "}"}], ",", 
      RowBox[{"{", 
       RowBox[{"pos1", ",", "offs"}], "}"}], ",", 
      RowBox[{"{", 
       RowBox[{"tape1", ",", 
        RowBox[{"Table", "[", 
         RowBox[{
          RowBox[{"ReplacePart", "[", 
           RowBox[{"tape0", ",", 
            RowBox[{"pos0", "\[Rule]", "i"}]}], "]"}], ",", 
          RowBox[{"{", 
           RowBox[{"i", ",", "0", ",", 
            RowBox[{"k", "-", "1"}]}], "}"}]}], "]"}]}], "}"}]}], 
     "]"}], ",", "2"}], "]"}]}]], "Input"],

Cell[BoxData[
 RowBox[{
  RowBox[{"TMNCGraphX", "[", 
   RowBox[{"tlen_Integer", ",", 
    RowBox[{"{", 
     RowBox[{"s_Integer", ",", "k_Integer"}], "}"}], ",", 
    RowBox[{"offs_", ":", 
     RowBox[{"{", 
      RowBox[{
       RowBox[{"-", "1"}], ",", "1"}], "}"}]}]}], "]"}], ":=", 
  RowBox[{"Graph", "[", 
   RowBox[{
    RowBox[{"Flatten", "[", 
     RowBox[{"Table", "[", 
      RowBox[{
       RowBox[{
        RowBox[{
         RowBox[{
          RowBox[{"{", 
           RowBox[{
            RowBox[{"{", 
             RowBox[{"s0", ",", "pos0"}], "}"}], ",", "tape0"}], 
           "}"}], "\[DirectedEdge]", "#"}], "&"}], "/@", 
        RowBox[{"NeighboringConfigurations", "[", 
         RowBox[{
          RowBox[{"{", 
           RowBox[{
            RowBox[{"{", 
             RowBox[{"s0", ",", "pos0"}], "}"}], ",", "tape0"}], 
           "}"}], ",", 
          RowBox[{"{", 
           RowBox[{"s", ",", "k"}], "}"}], ",", "offs"}], "]"}]}], 
       ",", 
       RowBox[{"{", 
        RowBox[{"s0", ",", "s"}], "}"}], ",", 
       RowBox[{"{", 
        RowBox[{"pos0", ",", "tlen"}], "}"}], ",", 
       RowBox[{"{", 
        RowBox[{"tape0", ",", 
         RowBox[{"Tuples", "[", 
          RowBox[{
           RowBox[{"Range", "[", 
            RowBox[{"0", ",", 
             RowBox[{"k", "-", "1"}]}], "]"}], ",", "tlen"}], "]"}]}],
         "}"}]}], "]"}], "]"}], ",", 
    RowBox[{"VertexShapeFunction", "\[Rule]", 
     RowBox[{"(", 
      RowBox[{
       RowBox[{"Inset", "[", 
        RowBox[{
         RowBox[{"Framed", "[", 
          RowBox[{
           RowBox[{"RulePlot", "[", 
            RowBox[{
             RowBox[{"TuringMachine", "[", 
              RowBox[{"{", 
               RowBox[{"0", ",", 
                RowBox[{"Max", "[", 
                 RowBox[{"s", ",", "2"}], "]"}], ",", 
                RowBox[{"Max", "[", 
                 RowBox[{"k", ",", "2"}], "]"}]}], "}"}], "]"}], ",", 
             
             RowBox[{"{", 
              RowBox[{
               RowBox[{"{", 
                RowBox[{"1", ",", 
                 RowBox[{"#2", "[", 
                  RowBox[{"[", 
                   RowBox[{"1", ",", "2"}], "]"}], "]"}]}], "}"}], 
               ",", 
               RowBox[{"#2", "[", 
                RowBox[{"[", "2", "]"}], "]"}]}], "}"}], ",", "0", 
             ",", 
             RowBox[{"Mesh", "\[Rule]", "All"}], ",", 
             RowBox[{"Frame", "\[Rule]", "False"}], ",", 
             RowBox[{"ImageSize", "\[Rule]", "40"}]}], "]"}], ",", 
           RowBox[{"Background", "\[Rule]", 
            RowBox[{"Directive", "[", 
             RowBox[{
              RowBox[{"Opacity", "[", "0.2", "]"}], ",", 
              RowBox[{"Hue", "[", 
               RowBox[{"0.62", ",", "0.45", ",", "0.87"}], "]"}]}], 
             "]"}]}], ",", 
           RowBox[{"FrameMargins", "->", 
            RowBox[{"{", 
             RowBox[{
              RowBox[{"{", 
               RowBox[{"2", ",", "2"}], "}"}], ",", 
              RowBox[{"{", 
               RowBox[{"0", ",", "0"}], "}"}]}], "}"}]}], ",", 
           RowBox[{"RoundingRadius", "\[Rule]", "0"}], ",", 
           RowBox[{"FrameStyle", "\[Rule]", 
            RowBox[{"Directive", "[", 
             RowBox[{
              RowBox[{"Opacity", "[", "0.5", "]"}], ",", 
              RowBox[{"Hue", "[", 
               RowBox[{"0.62", ",", "0.52", ",", "0.82"}], "]"}]}], 
             "]"}]}]}], "]"}], ",", "#1"}], "]"}], "&"}], ")"}]}], 
    ",", 
    RowBox[{"EdgeStyle", "\[Rule]", 
     RowBox[{"Directive", "[", 
      RowBox[{
       RowBox[{"Arrowheads", "[", "0.02", "]"}], ",", 
       RowBox[{"Hue", "[", 
        RowBox[{"0.75", ",", "0", ",", "0.35"}], "]"}], ",", 
       RowBox[{"Dashing", "[", "None", "]"}], ",", 
       RowBox[{"AbsoluteThickness", "[", "1", "]"}]}], "]"}]}]}], 
   "]"}]}]], "Input"],

Cell[BoxData[
 RowBox[{"TMNCGraphX", "[", 
  RowBox[{"3", ",", 
   RowBox[{"{", 
    RowBox[{"2", ",", "2"}], "}"}]}], "]"}]], "Input"]
}, Open  ]]

Rendering the results for lengths 1 through 6 in 3D gives:

NeighboringConfigurations
&#10005

Cell[CellGroupData[{
Cell[BoxData[
 RowBox[{
  RowBox[{"NeighboringConfigurations", "[", 
   RowBox[{
    RowBox[{"{", 
     RowBox[{
      RowBox[{"{", 
       RowBox[{"s0_Integer", ",", "pos0_Integer"}], "}"}], ",", 
      "tape0_List"}], "}"}], ",", 
    RowBox[{"{", 
     RowBox[{"s_Integer", ",", "k_Integer"}], "}"}], ",", 
    RowBox[{"offs_", ":", 
     RowBox[{"{", 
      RowBox[{
       RowBox[{"-", "1"}], ",", "1"}], "}"}]}]}], "]"}], ":=", 
  RowBox[{"Flatten", "[", 
   RowBox[{
    RowBox[{"Table", "[", 
     RowBox[{
      RowBox[{"{", 
       RowBox[{
        RowBox[{"{", 
         RowBox[{"s1", ",", 
          RowBox[{"Mod", "[", 
           RowBox[{
            RowBox[{"pos0", "+", "pos1"}], ",", 
            RowBox[{"Length", "[", "tape0", "]"}], ",", "1"}], 
           "]"}]}], "}"}], ",", "tape1"}], "}"}], ",", 
      RowBox[{"{", 
       RowBox[{"s1", ",", "s"}], "}"}], ",", 
      RowBox[{"{", 
       RowBox[{"pos1", ",", "offs"}], "}"}], ",", 
      RowBox[{"{", 
       RowBox[{"tape1", ",", 
        RowBox[{"Table", "[", 
         RowBox[{
          RowBox[{"ReplacePart", "[", 
           RowBox[{"tape0", ",", 
            RowBox[{"pos0", "\[Rule]", "i"}]}], "]"}], ",", 
          RowBox[{"{", 
           RowBox[{"i", ",", "0", ",", 
            RowBox[{"k", "-", "1"}]}], "}"}]}], "]"}]}], "}"}]}], 
     "]"}], ",", "2"}], "]"}]}]], "Input"],

Cell[BoxData[
 RowBox[{
  RowBox[{"TMNCGraph", "[", 
   RowBox[{"tlen_Integer", ",", 
    RowBox[{"{", 
     RowBox[{"s_Integer", ",", "k_Integer"}], "}"}], ",", 
    RowBox[{"offs_", ":", 
     RowBox[{"{", 
      RowBox[{
       RowBox[{"-", "1"}], ",", "1"}], "}"}]}]}], "]"}], ":=", 
  RowBox[{"Graph", "[", 
   RowBox[{
    RowBox[{"Flatten", "[", 
     RowBox[{"Table", "[", 
      RowBox[{
       RowBox[{
        RowBox[{
         RowBox[{
          RowBox[{"{", 
           RowBox[{
            RowBox[{"{", 
             RowBox[{"s0", ",", "pos0"}], "}"}], ",", "tape0"}], 
           "}"}], "\[DirectedEdge]", "#"}], "&"}], "/@", 
        RowBox[{"NeighboringConfigurations", "[", 
         RowBox[{
          RowBox[{"{", 
           RowBox[{
            RowBox[{"{", 
             RowBox[{"s0", ",", "pos0"}], "}"}], ",", "tape0"}], 
           "}"}], ",", 
          RowBox[{"{", 
           RowBox[{"s", ",", "k"}], "}"}], ",", "offs"}], "]"}]}], 
       ",", 
       RowBox[{"{", 
        RowBox[{"s0", ",", "s"}], "}"}], ",", 
       RowBox[{"{", 
        RowBox[{"pos0", ",", "tlen"}], "}"}], ",", 
       RowBox[{"{", 
        RowBox[{"tape0", ",", 
         RowBox[{"Tuples", "[", 
          RowBox[{
           RowBox[{"Range", "[", 
            RowBox[{"0", ",", 
             RowBox[{"k", "-", "1"}]}], "]"}], ",", "tlen"}], "]"}]}],
         "}"}]}], "]"}], "]"}], ",", 
    RowBox[{"EdgeStyle", "\[Rule]", 
     RowBox[{
      RowBox[{
       RowBox[{
       "ResourceFunction", "[", 
        "\"\<WolframPhysicsProjectStyleData\>\"", "]"}], "[", 
       "\"\<StatesGraph\>\"", "]"}], "[", "\"\<EdgeStyle\>\"", 
      "]"}]}], ",", 
    RowBox[{"VertexStyle", "\[Rule]", 
     RowBox[{
      RowBox[{
       RowBox[{
       "ResourceFunction", "[", 
        "\"\<WolframPhysicsProjectStyleData\>\"", "]"}], "[", 
       "\"\<StatesGraph\>\"", "]"}], "[", "\"\<VertexStyle\>\"", 
      "]"}]}]}], "]"}]}]], "Input"],

Cell[BoxData[
 RowBox[{"Table", "[", 
  RowBox[{
   RowBox[{"Graph3D", "[", 
    RowBox[{
     RowBox[{"TMNCGraph", "[", 
      RowBox[{"n", ",", 
       RowBox[{"{", 
        RowBox[{"2", ",", "2"}], "}"}]}], "]"}], ",", 
     RowBox[{"ImageSize", "\[Rule]", "260"}], ",", 
     RowBox[{"VertexStyle", "\[Rule]", " ", 
      RowBox[{
       RowBox[{
       "ResourceFunction", "[", 
        "\"\<WolframPhysicsProjectStyleData\>\"", "]"}], "[", 
       RowBox[{"\"\<StatesGraph3D\>\"", ",", "\"\<VertexStyle\>\""}], 
       "]"}]}], ",", 
     RowBox[{"EdgeStyle", "\[Rule]", " ", 
      RowBox[{
       RowBox[{
       "ResourceFunction", "[", 
        "\"\<WolframPhysicsProjectStyleData\>\"", "]"}], "[", 
       RowBox[{"\"\<StatesGraph3D\>\"", ",", "\"\<EdgeStyle\>\""}], 
       "]"}]}]}], "]"}], ",", 
   RowBox[{"{", 
    RowBox[{"n", ",", "6"}], "}"}]}], "]"}]], "Input"]
}, Open  ]]

In the non-cyclic case the results for lengths 2 through 6 in 3D are (the length-1 case is trivial):

NeighboringConfigurationsC
&#10005

Cell[CellGroupData[{

Cell[BoxData[
 RowBox[{
  RowBox[{"NeighboringConfigurationsC", "[", 
   RowBox[{
    RowBox[{"{", 
     RowBox[{
      RowBox[{"{", 
       RowBox[{"s0_Integer", ",", "pos0_Integer"}], "}"}], ",", 
      "tape0_List"}], "}"}], ",", 
    RowBox[{"{", 
     RowBox[{"s_Integer", ",", "k_Integer"}], "}"}], ",", 
    RowBox[{"offs_", ":", 
     RowBox[{"{", 
      RowBox[{
       RowBox[{"-", "1"}], ",", "1"}], "}"}]}]}], "]"}], ":=", 
  RowBox[{"Flatten", "[", 
   RowBox[{
    RowBox[{"Table", "[", 
     RowBox[{
      RowBox[{"If", "[", 
       RowBox[{
        RowBox[{"1", "\[LessEqual]", 
         RowBox[{"pos0", "+", "pos1"}], "\[LessEqual]", 
         RowBox[{"Length", "[", "tape0", "]"}]}], ",", 
        RowBox[{"{", 
         RowBox[{
          RowBox[{"{", 
           RowBox[{"s1", ",", 
            RowBox[{"pos0", "+", "pos1"}]}], "}"}], ",", "tape1"}], 
         "}"}], ",", "Nothing"}], "]"}], ",", 
      RowBox[{"{", 
       RowBox[{"s1", ",", "s"}], "}"}], ",", 
      RowBox[{"{", 
       RowBox[{"pos1", ",", "offs"}], "}"}], ",", 
      RowBox[{"{", 
       RowBox[{"tape1", ",", 
        RowBox[{"Table", "[", 
         RowBox[{
          RowBox[{"ReplacePart", "[", 
           RowBox[{"tape0", ",", 
            RowBox[{"pos0", "\[Rule]", "i"}]}], "]"}], ",", 
          RowBox[{"{", 
           RowBox[{"i", ",", "0", ",", 
            RowBox[{"k", "-", "1"}]}], "}"}]}], "]"}]}], "}"}]}], 
     "]"}], ",", "2"}], "]"}]}]], "Input"],

Cell[BoxData[
 RowBox[{
  RowBox[{"TMNCGraphC", "[", 
   RowBox[{"tlen_Integer", ",", 
    RowBox[{"{", 
     RowBox[{"s_Integer", ",", "k_Integer"}], "}"}], ",", 
    RowBox[{"offs_", ":", 
     RowBox[{"{", 
      RowBox[{
       RowBox[{"-", "1"}], ",", "1"}], "}"}]}]}], "]"}], ":=", 
  RowBox[{"Graph", "[", 
   RowBox[{
    RowBox[{"Flatten", "[", 
     RowBox[{"Table", "[", 
      RowBox[{
       RowBox[{
        RowBox[{
         RowBox[{
          RowBox[{"{", 
           RowBox[{
            RowBox[{"{", 
             RowBox[{"s0", ",", "pos0"}], "}"}], ",", "tape0"}], 
           "}"}], "\[DirectedEdge]", "#"}], "&"}], "/@", 
        RowBox[{"NeighboringConfigurationsC", "[", 
         RowBox[{
          RowBox[{"{", 
           RowBox[{
            RowBox[{"{", 
             RowBox[{"s0", ",", "pos0"}], "}"}], ",", "tape0"}], 
           "}"}], ",", 
          RowBox[{"{", 
           RowBox[{"s", ",", "k"}], "}"}], ",", "offs"}], "]"}]}], 
       ",", 
       RowBox[{"{", 
        RowBox[{"s0", ",", "s"}], "}"}], ",", 
       RowBox[{"{", 
        RowBox[{"pos0", ",", "tlen"}], "}"}], ",", 
       RowBox[{"{", 
        RowBox[{"tape0", ",", 
         RowBox[{"Tuples", "[", 
          RowBox[{
           RowBox[{"Range", "[", 
            RowBox[{"0", ",", 
             RowBox[{"k", "-", "1"}]}], "]"}], ",", "tlen"}], "]"}]}],
         "}"}]}], "]"}], "]"}], ",", 
    RowBox[{"EdgeStyle", "\[Rule]", 
     RowBox[{
      RowBox[{
       RowBox[{
       "ResourceFunction", "[", 
        "\"\<WolframPhysicsProjectStyleData\>\"", "]"}], "[", 
       "\"\<StatesGraph\>\"", "]"}], "[", "\"\<EdgeStyle\>\"", 
      "]"}]}], ",", 
    RowBox[{"VertexStyle", "\[Rule]", 
     RowBox[{
      RowBox[{
       RowBox[{
       "ResourceFunction", "[", 
        "\"\<WolframPhysicsProjectStyleData\>\"", "]"}], "[", 
       "\"\<StatesGraph\>\"", "]"}], "[", "\"\<VertexStyle\>\"", 
      "]"}]}]}], "]"}]}]], "Input"],

Cell[BoxData[
 RowBox[{"Table", "[", 
  RowBox[{
   RowBox[{"Graph3D", "[", 
    RowBox[{
     RowBox[{"TMNCGraphC", "[", 
      RowBox[{"n", ",", 
       RowBox[{"{", 
        RowBox[{"2", ",", "2"}], "}"}]}], "]"}], ",", 
     RowBox[{"ImageSize", "\[Rule]", "260"}], ",", 
     RowBox[{"VertexStyle", "\[Rule]", " ", 
      RowBox[{
       RowBox[{
       "ResourceFunction", "[", 
        "\"\<WolframPhysicsProjectStyleData\>\"", "]"}], "[", 
       RowBox[{"\"\<StatesGraph3D\>\"", ",", "\"\<VertexStyle\>\""}], 
       "]"}]}], ",", 
     RowBox[{"EdgeStyle", "\[Rule]", " ", 
      RowBox[{
       RowBox[{
       "ResourceFunction", "[", 
        "\"\<WolframPhysicsProjectStyleData\>\"", "]"}], "[", 
       RowBox[{"\"\<StatesGraph3D\>\"", ",", "\"\<EdgeStyle\>\""}], 
       "]"}]}]}], "]"}], ",", 
   RowBox[{"{", 
    RowBox[{"n", ",", "2", ",", "6"}], "}"}]}], "]"}]], "Input"]
}, Open  ]]

The Turing Machine Group

It turns out that there’s a nice mathematical characterization of rulial multiway graphs for Turing machines: they’re just Cayley graphs of groups that we can call “Turing machine groups”. Why is this? Basically it’s because the possible configurations of a Turing machine have a direct correspondence with transformations that can act on these configurations. And in particular, one can pick out certain transformations that correspond to individual transitions in a non-deterministic Turing machine, and use these as generators in a presentation of the group.

Let’s start by considering the case of Turing machines with finite cyclic tapes. If the tape has length n, the total number of possible configurations of the machine is n s kn. (Note that if the tape is finite but not cyclic then one doesn’t get a group.)

Assume for now s = 1, k = 2. Then for n = 3, there are 24 possible configurations, and the rulial multiway graph is:

TMNCGraphX
&#10005

Cell[CellGroupData[{
Cell[BoxData[
 RowBox[{
  RowBox[{"NeighboringConfigurations", "[", 
   RowBox[{
    RowBox[{"{", 
     RowBox[{
      RowBox[{"{", 
       RowBox[{"s0_Integer", ",", "pos0_Integer"}], "}"}], ",", 
      "tape0_List"}], "}"}], ",", 
    RowBox[{"{", 
     RowBox[{"s_Integer", ",", "k_Integer"}], "}"}], ",", 
    RowBox[{"offs_", ":", 
     RowBox[{"{", 
      RowBox[{
       RowBox[{"-", "1"}], ",", "1"}], "}"}]}]}], "]"}], ":=", 
  RowBox[{"Flatten", "[", 
   RowBox[{
    RowBox[{"Table", "[", 
     RowBox[{
      RowBox[{"{", 
       RowBox[{
        RowBox[{"{", 
         RowBox[{"s1", ",", 
          RowBox[{"Mod", "[", 
           RowBox[{
            RowBox[{"pos0", "+", "pos1"}], ",", 
            RowBox[{"Length", "[", "tape0", "]"}], ",", "1"}], 
           "]"}]}], "}"}], ",", "tape1"}], "}"}], ",", 
      RowBox[{"{", 
       RowBox[{"s1", ",", "s"}], "}"}], ",", 
      RowBox[{"{", 
       RowBox[{"pos1", ",", "offs"}], "}"}], ",", 
      RowBox[{"{", 
       RowBox[{"tape1", ",", 
        RowBox[{"Table", "[", 
         RowBox[{
          RowBox[{"ReplacePart", "[", 
           RowBox[{"tape0", ",", 
            RowBox[{"pos0", "\[Rule]", "i"}]}], "]"}], ",", 
          RowBox[{"{", 
           RowBox[{"i", ",", "0", ",", 
            RowBox[{"k", "-", "1"}]}], "}"}]}], "]"}]}], "}"}]}], 
     "]"}], ",", "2"}], "]"}]}]], "Input"],

Cell[BoxData[
 RowBox[{
  RowBox[{"TMNCGraphX", "[", 
   RowBox[{"tlen_Integer", ",", 
    RowBox[{"{", 
     RowBox[{"s_Integer", ",", "k_Integer"}], "}"}], ",", 
    RowBox[{"offs_", ":", 
     RowBox[{"{", 
      RowBox[{
       RowBox[{"-", "1"}], ",", "1"}], "}"}]}]}], "]"}], ":=", 
  RowBox[{"Graph", "[", 
   RowBox[{
    RowBox[{"Flatten", "[", 
     RowBox[{"Table", "[", 
      RowBox[{
       RowBox[{
        RowBox[{
         RowBox[{
          RowBox[{"{", 
           RowBox[{
            RowBox[{"{", 
             RowBox[{"s0", ",", "pos0"}], "}"}], ",", "tape0"}], 
           "}"}], "\[DirectedEdge]", "#"}], "&"}], "/@", 
        RowBox[{"NeighboringConfigurations", "[", 
         RowBox[{
          RowBox[{"{", 
           RowBox[{
            RowBox[{"{", 
             RowBox[{"s0", ",", "pos0"}], "}"}], ",", "tape0"}], 
           "}"}], ",", 
          RowBox[{"{", 
           RowBox[{"s", ",", "k"}], "}"}], ",", "offs"}], "]"}]}], 
       ",", 
       RowBox[{"{", 
        RowBox[{"s0", ",", "s"}], "}"}], ",", 
       RowBox[{"{", 
        RowBox[{"pos0", ",", "tlen"}], "}"}], ",", 
       RowBox[{"{", 
        RowBox[{"tape0", ",", 
         RowBox[{"Tuples", "[", 
          RowBox[{
           RowBox[{"Range", "[", 
            RowBox[{"0", ",", 
             RowBox[{"k", "-", "1"}]}], "]"}], ",", "tlen"}], "]"}]}],
         "}"}]}], "]"}], "]"}], ",", 
    RowBox[{"VertexShapeFunction", "\[Rule]", 
     RowBox[{"(", 
      RowBox[{
       RowBox[{"Inset", "[", 
        RowBox[{
         RowBox[{"Framed", "[", 
          RowBox[{
           RowBox[{"RulePlot", "[", 
            RowBox[{
             RowBox[{"TuringMachine", "[", 
              RowBox[{"{", 
               RowBox[{"0", ",", 
                RowBox[{"Max", "[", 
                 RowBox[{"s", ",", "2"}], "]"}], ",", 
                RowBox[{"Max", "[", 
                 RowBox[{"k", ",", "2"}], "]"}]}], "}"}], "]"}], ",", 
             
             RowBox[{"{", 
              RowBox[{
               RowBox[{"{", 
                RowBox[{"1", ",", 
                 RowBox[{"#2", "[", 
                  RowBox[{"[", 
                   RowBox[{"1", ",", "2"}], "]"}], "]"}]}], "}"}], 
               ",", 
               RowBox[{"#2", "[", 
                RowBox[{"[", "2", "]"}], "]"}]}], "}"}], ",", "0", 
             ",", 
             RowBox[{"Mesh", "\[Rule]", "All"}], ",", 
             RowBox[{"Frame", "\[Rule]", "False"}], ",", 
             RowBox[{"ImageSize", "\[Rule]", "40"}]}], "]"}], ",", 
           RowBox[{"Background", "\[Rule]", 
            RowBox[{"Directive", "[", 
             RowBox[{
              RowBox[{"Opacity", "[", "0.2", "]"}], ",", 
              RowBox[{"Hue", "[", 
               RowBox[{"0.62", ",", "0.45", ",", "0.87"}], "]"}]}], 
             "]"}]}], ",", 
           RowBox[{"FrameMargins", "\[Rule]", 
            RowBox[{"{", 
             RowBox[{
              RowBox[{"{", 
               RowBox[{"2", ",", "2"}], "}"}], ",", 
              RowBox[{"{", 
               RowBox[{"0", ",", "0"}], "}"}]}], "}"}]}], ",", 
           RowBox[{"RoundingRadius", "\[Rule]", "0"}], ",", 
           RowBox[{"FrameStyle", "\[Rule]", 
            RowBox[{"Directive", "[", 
             RowBox[{
              RowBox[{"Opacity", "[", "0.5", "]"}], ",", 
              RowBox[{"Hue", "[", 
               RowBox[{"0.62", ",", "0.52", ",", "0.82"}], "]"}]}], 
             "]"}]}]}], "]"}], ",", "#1"}], "]"}], "&"}], ")"}]}], 
    ",", 
    RowBox[{"EdgeStyle", "\[Rule]", 
     RowBox[{
      RowBox[{
       RowBox[{
       "ResourceFunction", "[", 
        "\"\<WolframPhysicsProjectStyleData\>\"", "]"}], "[", 
       "\"\<StatesGraph\>\"", "]"}], "[", "\"\<EdgeStyle\>\"", 
      "]"}]}]}], "]"}]}]], "Input"],

Cell[BoxData[
 RowBox[{"TMNCGraphX", "[", 
  RowBox[{"3", ",", 
   RowBox[{"{", 
    RowBox[{"1", ",", "2"}], "}"}]}], "]"}]], "Input"]
}, Open  ]]

But this graph turns out to be a Cayley graph for the finite group A4 × 2:

{Graph
&#10005

{Graph[#, ImageSize -> 300], Graph3D[#, ImageSize -> 300]} &@
 CayleyGraph[
  PermutationGroup[
   PermutationCycles /@ 
    FiniteGroupData[{"DirectProduct", {{"AlternatingGroup", 
         4}, {"CyclicGroup", 2}}}, "MultiplicationTable"][[{3, 5, 10, 
      22}]]]]

To construct this Cayley graph let’s represent the configurations of the Turing machine by pairs of integers , where 0  i  n – 1 gives the position of the head, and the bits of u (with 0  u  2n – 1) give the values on the tape. (Since s = 1, we don’t have to worry about the state of the head.) With this representation of the configurations, consider the “multiplication” operation:

f
&#10005

f[{i_, u_}, {j_, v_}] := {Mod[i + j, n], 
  BitXor[BitShiftRight[u, j], v]} 

When this operation acts on the configurations it defines a group. Here’s the multiplication table for n = 3:

GraphicsGrid
&#10005

Cell[CellGroupData[{
Cell[BoxData[
 RowBox[{
  RowBox[{"op", "[", 
   RowBox[{
    RowBox[{"{", 
     RowBox[{"i_", ",", "u_"}], "}"}], ",", 
    RowBox[{"{", 
     RowBox[{"j_", ",", "v_"}], "}"}]}], "]"}], ":=", 
  RowBox[{"{", 
   RowBox[{
    RowBox[{"Mod", "[", 
     RowBox[{
      RowBox[{"i", "+", "j"}], ",", "n"}], "]"}], ",", 
    RowBox[{"BitXor", "[", 
     RowBox[{
      RowBox[{"BitShiftRight", "[", 
       RowBox[{"u", ",", "j"}], "]"}], ",", "v"}], "]"}]}], "}"}], 
  " "}]], "Input"],

Cell[BoxData[
 RowBox[{
  RowBox[{"tmdec", "[", 
   RowBox[{
    RowBox[{"{", 
     RowBox[{"i_", ",", "u_"}], "}"}], ",", "n_", ",", 
    RowBox[{"sz_", ":", "Automatic"}]}], "]"}], ":=", 
  RowBox[{"RulePlot", "[", 
   RowBox[{
    RowBox[{"TuringMachine", "[", "2506", "]"}], ",", 
    RowBox[{"{", 
     RowBox[{
      RowBox[{"{", 
       RowBox[{"1", ",", 
        RowBox[{"i", "+", "1"}]}], "}"}], ",", 
      RowBox[{"IntegerDigits", "[", 
       RowBox[{"u", ",", "2", ",", "n"}], "]"}]}], "}"}], ",", "0", 
    ",", 
    RowBox[{"Mesh", "\[Rule]", "All"}], ",", 
    RowBox[{"Frame", "\[Rule]", "None"}], ",", 
    RowBox[{"ImageSize", "\[Rule]", "sz"}]}], "]"}]}]], "Input"],

Cell[BoxData[
 RowBox[{
  RowBox[{"Block", "[", 
   RowBox[{
    RowBox[{"{", 
     RowBox[{"n", "=", "3"}], "}"}], ",", 
    RowBox[{"With", "[", 
     RowBox[{
      RowBox[{"{", 
       RowBox[{"elems", "=", 
        RowBox[{"Catenate", "[", 
         RowBox[{"Table", "[", 
          RowBox[{
           RowBox[{"{", 
            RowBox[{"i", ",", "u"}], "}"}], ",", 
           RowBox[{"{", 
            RowBox[{"u", ",", "0", ",", 
             RowBox[{
              RowBox[{"2", "^", "n"}], "-", "1"}]}], "}"}], ",", 
           RowBox[{"{", 
            RowBox[{"i", ",", "0", ",", 
             RowBox[{"n", "-", "1"}]}], "}"}]}], "]"}], "]"}]}], 
       "}"}], ",", 
      RowBox[{"Outer", "[", 
       RowBox[{"op", ",", "elems", ",", "elems", ",", "1"}], "]"}]}], 
     "]"}]}], "]"}], ";"}]], "Input"],

Cell[BoxData[
 RowBox[{"GraphicsGrid", "[", 
  RowBox[{
   RowBox[{"Map", "[", 
    RowBox[{
     RowBox[{
      RowBox[{"tmdec", "[", 
       RowBox[{"#", ",", "3", ",", "20"}], "]"}], "&"}], ",", "%", 
     ",", 
     RowBox[{"{", "2", "}"}]}], "]"}], ",", 
   RowBox[{"Frame", "\[Rule]", "All"}]}], "]"}]], "Input"]
}, Open  ]]

Or equivalently:

With
&#10005

Cell[CellGroupData[{
Cell[BoxData[
 RowBox[{
  RowBox[{"op", "[", 
   RowBox[{
    RowBox[{"{", 
     RowBox[{"i_", ",", "u_"}], "}"}], ",", 
    RowBox[{"{", 
     RowBox[{"j_", ",", "v_"}], "}"}]}], "]"}], ":=", 
  RowBox[{"{", 
   RowBox[{
    RowBox[{"Mod", "[", 
     RowBox[{
      RowBox[{"i", "+", "j"}], ",", "n"}], "]"}], ",", 
    RowBox[{"BitXor", "[", 
     RowBox[{
      RowBox[{"BitShiftRight", "[", 
       RowBox[{"u", ",", "j"}], "]"}], ",", "v"}], "]"}]}], "}"}], 
  " "}]], "Input"],

Cell[BoxData[
 RowBox[{
  RowBox[{"cf", "=", 
   RowBox[{
    RowBox[{"Blend", "[", 
     RowBox[{"System`PlotThemeDump`$ThemeDefaultMatrix", ",", "#1"}], 
     "]"}], "&"}]}], ";"}]], "Input"],

Cell[BoxData[
 RowBox[{"With", "[", 
  RowBox[{
   RowBox[{"{", 
    RowBox[{"data", "=", 
     RowBox[{"Map", "[", 
      RowBox[{
       RowBox[{
        RowBox[{
         RowBox[{"#", "[", 
          RowBox[{"[", "1", "]"}], "]"}], "+", 
         RowBox[{"2", 
          RowBox[{"#", "[", 
           RowBox[{"[", "2", "]"}], "]"}]}]}], "&"}], ",", 
       RowBox[{"Block", "[", 
        RowBox[{
         RowBox[{"{", 
          RowBox[{"n", "=", "3"}], "}"}], ",", 
         RowBox[{"With", "[", 
          RowBox[{
           RowBox[{"{", 
            RowBox[{"elems", "=", 
             RowBox[{"Catenate", "[", 
              RowBox[{"Table", "[", 
               RowBox[{
                RowBox[{"{", 
                 RowBox[{"i", ",", "u"}], "}"}], ",", 
                RowBox[{"{", 
                 RowBox[{"u", ",", "0", ",", 
                  RowBox[{
                   RowBox[{"2", "^", "n"}], "-", "1"}]}], "}"}], ",", 
                
                RowBox[{"{", 
                 RowBox[{"i", ",", "0", ",", 
                  RowBox[{"n", "-", "1"}]}], "}"}]}], "]"}], "]"}]}], 
            "}"}], ",", 
           RowBox[{"Outer", "[", 
            RowBox[{"op", ",", "elems", ",", "elems", ",", "1"}], 
            "]"}]}], "]"}]}], "]"}], ",", 
       RowBox[{"{", "2", "}"}]}], "]"}]}], "}"}], ",", 
   RowBox[{"{", 
    RowBox[{
     RowBox[{"ArrayPlot", "[", 
      RowBox[{"data", ",", 
       RowBox[{"Axes", "\[Rule]", "None"}], ",", 
       RowBox[{"ColorFunction", "\[Rule]", "cf"}], ",", 
       RowBox[{"Mesh", "\[Rule]", "All"}], ",", 
       RowBox[{"Frame", "\[Rule]", "None"}]}], "]"}], ",", 
     RowBox[{"Show", "[", 
      RowBox[{
       RowBox[{
        RowBox[{"ListPointPlot3D", "[", 
         RowBox[{
          RowBox[{"Reverse", "[", "data", "]"}], ",", 
          RowBox[{"Axes", "\[Rule]", "None"}], ",", 
          RowBox[{"ColorFunction", "\[Rule]", 
           RowBox[{"(", 
            RowBox[{
             RowBox[{"cf", "[", "#3", "]"}], "&"}], ")"}]}], ",", 
          RowBox[{"DataRange", "\[Rule]", "All"}], ",", 
          RowBox[{"BoxRatios", "\[Rule]", "1"}], ",", 
          RowBox[{"Lighting", "\[Rule]", "\"\<Neutral\>\""}], ",", 
          RowBox[{"PlotStyle", "\[Rule]", 
           RowBox[{"EdgeForm", "[", "]"}]}]}], "]"}], "/.", 
        RowBox[{"Point", "\[Rule]", "Cuboid"}]}], ",", 
       RowBox[{"PlotRange", "\[Rule]", "All"}]}], "]"}]}], "}"}]}], 
  "]"}]], "Input"]
}, Open  ]]

But now consider the four elements , (position –1 wraps around on the cyclic tape):

tmdec
&#10005

Cell[CellGroupData[{
    Cell[BoxData[
 RowBox[{
  RowBox[{"tmdec", "[", 
   RowBox[{
    RowBox[{"{", 
     RowBox[{"i_", ",", "u_"}], "}"}], ",", "n_", ",", 
    RowBox[{"sz_", ":", "Automatic"}]}], "]"}], ":=", 
  RowBox[{"RulePlot", "[", 
   RowBox[{
    RowBox[{"TuringMachine", "[", "2506", "]"}], ",", 
    RowBox[{"{", 
     RowBox[{
      RowBox[{"{", 
       RowBox[{"1", ",", 
        RowBox[{"i", "+", "1"}]}], "}"}], ",", 
      RowBox[{"IntegerDigits", "[", 
       RowBox[{"u", ",", "2", ",", "n"}], "]"}]}], "}"}], ",", "0", 
    ",", 
    RowBox[{"Mesh", "\[Rule]", "All"}], ",", 
    RowBox[{"Frame", "\[Rule]", "None"}], ",", 
    RowBox[{"ImageSize", "\[Rule]", "sz"}]}], "]"}]}]], "Input"],

Cell[BoxData[
 RowBox[{
  RowBox[{
   RowBox[{"tmdec", "[", 
    RowBox[{"#", ",", "3", ",", "50"}], "]"}], "&"}], "/@", 
  RowBox[{"{", 
   RowBox[{
    RowBox[{"{", 
     RowBox[{"1", ",", "0"}], "}"}], ",", 
    RowBox[{"{", 
     RowBox[{"2", ",", "0"}], "}"}], ",", 
    RowBox[{"{", 
     RowBox[{"1", ",", "1"}], "}"}], ",", 
    RowBox[{"{", 
     RowBox[{"2", ",", "1"}], "}"}]}], "}"}]}]], "Input"]
}, Open  ]]

We can consider these as the result of applying the 4 possible Turing machine transitions

ElementaryTuringGraphic
&#10005

Cell[CellGroupData[{
Cell[BoxData[{
 RowBox[{
  RowBox[{"CloudGet", "[", 
   RowBox[{
   "CloudObject", "[", 
    "\"\<https://www.wolframcloud.com/obj/wolframphysics/Bulletin/\
DeltaTM.wl\>\"", "]"}], "]"}], ";"}], "\[IndentingNewLine]", 
 RowBox[{
  RowBox[{
   RowBox[{"tmg0", "[", 
    RowBox[{
     RowBox[{
      RowBox[{"{", 
       RowBox[{"s_", ",", "a_"}], "}"}], "\[Rule]", 
      RowBox[{"{", 
       RowBox[{"sp_", ",", "ap_", ",", "dir_"}], "}"}]}], ",", 
     "stot_", ",", "k_"}], "]"}], ":=", 
   RowBox[{"With", "[", 
    RowBox[{
     RowBox[{"{", 
      RowBox[{"cf", "=", 
       RowBox[{"Apply", "[", 
        RowBox[{"Function", ",", 
         RowBox[{"{", 
          RowBox[{"Piecewise", "[", 
           RowBox[{
            RowBox[{"Table", "[", 
             RowBox[{
              RowBox[{"{", 
               RowBox[{
                RowBox[{"Blend", "[", 
                 RowBox[{
                  RowBox[{"{", 
                   RowBox[{
                    RowBox[{"RGBColor", "[", 
                    RowBox[{"0.977", ",", "0.952", ",", "0."}], "]"}],
                     ",", 
                    RowBox[{"RGBColor", "[", 
                    RowBox[{"0.965", ",", "0.401", ",", "0.18"}], 
                    "]"}]}], "}"}], ",", 
                  RowBox[{"If", "[", 
                   RowBox[{
                    RowBox[{"k", "\[LessEqual]", "2"}], ",", 
                    RowBox[{"1", "/", "2"}], ",", 
                    RowBox[{"i", "/", 
                    RowBox[{"(", 
                    RowBox[{"k", "-", "2"}], ")"}]}]}], "]"}]}], 
                 "]"}], ",", 
                RowBox[{"#", ">", "i"}]}], "}"}], ",", 
              RowBox[{"{", 
               RowBox[{"i", ",", 
                RowBox[{"k", "-", "2"}], ",", "0", ",", 
                RowBox[{"-", "1"}]}], "}"}]}], "]"}], ",", "White"}], 
           "]"}], "}"}]}], "]"}]}], "}"}], ",", 
     RowBox[{"Graphics", "[", 
      RowBox[{
       RowBox[{"{", 
        RowBox[{
         RowBox[{"{", 
          RowBox[{"White", ",", 
           RowBox[{"Rectangle", "[", 
            RowBox[{
             RowBox[{"Scaled", "[", 
              RowBox[{"{", 
               RowBox[{"0", ",", "0"}], "}"}], "]"}], ",", 
             RowBox[{"Scaled", "[", 
              RowBox[{"{", 
               RowBox[{"1", ",", "1"}], "}"}], "]"}]}], "]"}]}], 
          "}"}], ",", 
         RowBox[{"{", 
          RowBox[{
           RowBox[{"Directive", "[", 
            RowBox[{
             RowBox[{"EdgeForm", "[", 
              RowBox[{"Directive", "[", 
               RowBox[{
                RowBox[{"GrayLevel", "[", ".6", "]"}], ",", 
                RowBox[{"AbsoluteThickness", "[", "0.7", "]"}]}], 
               "]"}], "]"}], ",", 
             RowBox[{"cf", "[", "a", "]"}]}], "]"}], ",", 
           RowBox[{"Rectangle", "[", 
            RowBox[{
             RowBox[{"{", 
              RowBox[{"1", ",", "0"}], "}"}], ",", 
             RowBox[{"{", 
              RowBox[{"2", ",", "1"}], "}"}]}], "]"}]}], "}"}], ",", 
         RowBox[{"{", 
          RowBox[{
           RowBox[{"Directive", "[", 
            RowBox[{
             RowBox[{"EdgeForm", "[", 
              RowBox[{"Directive", "[", 
               RowBox[{
                RowBox[{"GrayLevel", "[", ".6", "]"}], ",", 
                RowBox[{"AbsoluteThickness", "[", "0.7", "]"}]}], 
               "]"}], "]"}], ",", 
             RowBox[{"cf", "[", "ap", "]"}]}], "]"}], ",", 
           RowBox[{"Rectangle", "[", 
            RowBox[{
             RowBox[{"{", 
              RowBox[{"1", ",", 
               RowBox[{
                RowBox[{"-", "5"}], "/", "4"}]}], "}"}], ",", 
             RowBox[{"{", 
              RowBox[{"2", ",", 
               RowBox[{
                RowBox[{"-", "1"}], "/", "4"}]}], "}"}]}], "]"}]}], 
          "}"}], ",", 
         RowBox[{"{", 
          RowBox[{
           RowBox[{
           "NKSSpecialFunctions`RulePlot`Dump`TuringMarker", "[", 
            RowBox[{
             RowBox[{"{", 
              RowBox[{"1.5", ",", "0.5"}], "}"}], ",", 
             RowBox[{"{", 
              RowBox[{"s", ",", "stot"}], "}"}]}], "]"}], ",", 
           RowBox[{
           "NKSSpecialFunctions`RulePlot`Dump`TuringMarker", "[", 
            RowBox[{
             RowBox[{"{", 
              RowBox[{
               RowBox[{"1.5", "+", "dir"}], ",", 
               RowBox[{
                RowBox[{"-", "3"}], "/", "4"}]}], "}"}], ",", 
             RowBox[{"{", 
              RowBox[{"sp", ",", "stot"}], "}"}]}], "]"}]}], "}"}]}], 
        "}"}], ",", 
       RowBox[{"PlotRange", "\[Rule]", 
        RowBox[{"{", 
         RowBox[{
          RowBox[{"{", 
           RowBox[{
            RowBox[{
             RowBox[{"-", "1"}], "/", "2"}], ",", 
            RowBox[{"3", "+", 
             RowBox[{"1", "/", "2"}]}]}], "}"}], ",", 
          RowBox[{"{", 
           RowBox[{
            RowBox[{
             RowBox[{"-", "7"}], "/", "4"}], ",", 
            RowBox[{"3", "/", "2"}]}], "}"}]}], "}"}]}]}], "]"}]}], 
    "]"}]}], ";"}], "\[IndentingNewLine]", 
 RowBox[{
  RowBox[{
   RowBox[{"ElementaryTuringGraphic", "[", 
    RowBox[{"rules_List", ",", 
     RowBox[{"s_Integer", ":", "2"}], ",", 
     RowBox[{"k_Integer", ":", "2"}], ",", "opts___"}], "]"}], ":=", 
   RowBox[{"Table", "[", 
    RowBox[{
     RowBox[{
     "NKSSpecialFunctions`RulePlot`Dump`AtlasGraphicsGrid", "[", 
      RowBox[{
       RowBox[{"{", 
        RowBox[{"{", 
         RowBox[{"tmg0", "[", 
          RowBox[{"r", ",", "s", ",", "k"}], "]"}], "}"}], "}"}], ",",
        "opts", ",", 
       RowBox[{"Frame", "\[Rule]", "True"}]}], "]"}], ",", 
     RowBox[{"{", 
      RowBox[{"r", ",", "rules"}], "}"}]}], "]"}]}], ";"}]}], "Input"],

Cell[BoxData[
 RowBox[{"With", "[", 
  RowBox[{
   RowBox[{"{", 
    RowBox[{
     RowBox[{"s", " ", "=", " ", "1"}], ",", " ", 
     RowBox[{"k", " ", "=", " ", "2"}]}], "}"}], ",", " ", 
   RowBox[{"ElementaryTuringGraphic", "[", 
    RowBox[{
     RowBox[{"Flatten", "[", 
      RowBox[{"Table", "[", 
       RowBox[{
        RowBox[{"DeltaTMRule", "[", 
         RowBox[{
          RowBox[{"{", 
           RowBox[{"si", ",", " ", "ki"}], "}"}], ",", " ", 
          RowBox[{"{", 
           RowBox[{"s", ",", " ", "k"}], "}"}]}], "]"}], ",", " ", 
        RowBox[{"{", 
         RowBox[{"si", ",", " ", "s"}], "}"}], ",", " ", 
        RowBox[{"{", 
         RowBox[{"ki", ",", " ", "0", ",", "0"}], "}"}]}], "]"}], 
      "]"}], ",", 
     RowBox[{"ImageSize", " ", "\[Rule]", " ", "50"}]}], "]"}]}], 
  "]"}]], "Input"]
}, Open  ]]

to the configuration (corresponding to ):

tmdec
&#10005

Cell[CellGroupData[{
Cell[BoxData[
 RowBox[{
  RowBox[{"tmdec", "[", 
   RowBox[{
    RowBox[{"{", 
     RowBox[{"i_", ",", "u_"}], "}"}], ",", "n_", ",", 
    RowBox[{"sz_", ":", "Automatic"}]}], "]"}], ":=", 
  RowBox[{"RulePlot", "[", 
   RowBox[{
    RowBox[{"TuringMachine", "[", "2506", "]"}], ",", 
    RowBox[{"{", 
     RowBox[{
      RowBox[{"{", 
       RowBox[{"1", ",", 
        RowBox[{"i", "+", "1"}]}], "}"}], ",", 
      RowBox[{"IntegerDigits", "[", 
       RowBox[{"u", ",", "2", ",", "n"}], "]"}]}], "}"}], ",", "0", 
    ",", 
    RowBox[{"Mesh", "\[Rule]", "All"}], ",", 
    RowBox[{"Frame", "\[Rule]", "None"}], ",", 
    RowBox[{"ImageSize", "\[Rule]", "sz"}]}], "]"}]}]], "Input"],

    Cell[BoxData[
 RowBox[{"tmdec", "[", 
  RowBox[{
   RowBox[{"{", 
    RowBox[{"0", ",", "0"}], "}"}], ",", "3", ",", "50"}], 
  "]"}]], "Input"]
}, Open  ]]

And now by treating these elements as generators (and effectively applying them not just to the initial configuration, but to any configuration), we get as the Cayley graph of the group exactly the rulial multiway graph above.

It’s worth noting that the 4 elements we’ve used don’t correspond to the minimal set of generators for the group. Two elements suffice. And for example, we can use and , which can be thought of respectively as moving the head right, and flipping the color of one cell (again relative to the “identity” configuration ):

tmdec
&#10005

Cell[CellGroupData[{
Cell[BoxData[
 RowBox[{
  RowBox[{"tmdec", "[", 
   RowBox[{
    RowBox[{"{", 
     RowBox[{"i_", ",", "u_"}], "}"}], ",", "n_", ",", 
    RowBox[{"sz_", ":", "Automatic"}]}], "]"}], ":=", 
  RowBox[{"RulePlot", "[", 
   RowBox[{
    RowBox[{"TuringMachine", "[", "2506", "]"}], ",", 
    RowBox[{"{", 
     RowBox[{
      RowBox[{"{", 
       RowBox[{"1", ",", 
        RowBox[{"i", "+", "1"}]}], "}"}], ",", 
      RowBox[{"IntegerDigits", "[", 
       RowBox[{"u", ",", "2", ",", "n"}], "]"}]}], "}"}], ",", "0", 
    ",", 
    RowBox[{"Mesh", "\[Rule]", "All"}], ",", 
    RowBox[{"Frame", "\[Rule]", "None"}], ",", 
    RowBox[{"ImageSize", "\[Rule]", "sz"}]}], "]"}]}]], "Input"],

Cell[BoxData[
 RowBox[{
  RowBox[{
   RowBox[{"tmdec", "[", 
    RowBox[{"#", ",", "3", ",", "50"}], "]"}], "&"}], "/@", 
  RowBox[{"{", 
   RowBox[{
    RowBox[{"{", 
     RowBox[{"1", ",", "0"}], "}"}], ",", 
    RowBox[{"{", 
     RowBox[{"0", ",", "1"}], "}"}]}], "}"}]}]], "Input"]
}, Open  ]]

With these generators, we get the Cayley graph:

With
&#10005

With[{n = 3}, 
 With[{g = 
    CayleyGraph[
     PermutationGroup[{Cycles[{{1, 2}}], 
       Cycles[{Range[1, 2 n - 1, 2], Range[2, 2 n, 2]}]}]]}, 
  Show[#, ImageSize -> 200] & /@ {g, Graph3D[g]}]]

How else can we characterize the group? For any tape size n we can write it in terms of explicit permutations:

PermutationGroup
&#10005

PermutationGroup[{Cycles[{{1, 2}}], 
  Cycles[{Range[1, 2 n - 1, 2], Range[2, 2 n, 2]}]}]

(For , the group can be generated by the permutations .)

We can also represent it symbolically in terms of generators and relations. Calling our “move-right” generator R, and “bit-flip” generator F, the group then satisfies at least the relations:

OK, so does the group have a name? For n = 2, it’s the 8-element dihedral group D4 and for n = 3, it’s the 24-element group A4 × 2. For larger n, there doesn’t seem to be a standard name. But given our derivation we can just call it . And we can express it as a semidirect product (or wreath product):

The normal subgroup (2)n here represents states of the tape, and corresponds to a Boolean n-cube. The cyclic group n represents the position of the head, and acts on the Boolean n-cube by rotating its coordinates.

For any n, we can use just two generators, producing the sequence of Cayley graphs:

Table
&#10005

Table[CayleyGraph[
  PermutationGroup[{Cycles[{{1, 2}}], 
    Cycles[{Range[1, 2 n - 1, 2], Range[2, 2 n, 2]}]}]], {n, 2, 5}]

Undirected versions of these are exactly the cube-connected cycle graphs that have arisen in studying communications networks:

Prepend
&#10005

Prepend[Table[GraphData[{"CubeConnectedCycle", n}], {n, 3, 5}], 
 CloudGet["https://wolfr.am/N9FGlZe8"]]

So now what about the limit n  ? Now, the group is no longer finite, but we’ve still got the relations

and in the end, we can see that the group can be described as a semidirect product:

In a sense, the group—and its Cayley graph—is dominated by the infinite-dimensional Boolean hypercube. But there’s more going on. And perhaps there’s a useful characterization of the limit that can be derived by the methods of modern geometric theory.

For arbitrary s and k, we can potentially generalize to get:

(Thanks to Tali Beynon, Todd Rowland, Ed Pegg, Jose Martin-Garcia and Christopher Wolfram for trying to help me unscramble the fairly elementary group theory used here.)

Causal Graphs for Deterministic Turing Machines

In a deterministic Turing machine, every step involves one updating event—and the causal graph can be drawn by just joining successive locations of the head, and successive points where the head returns to a square where it has been before:

TMCausalPlot
&#10005

CloudGet[CloudObject[
   "https://www.wolframcloud.com/obj/wolframphysics/Bulletin/TMCausal.\
wl"]];
TMCausalPlot[2506, {{1, 10}, ConstantArray[0, 21]}, 20]

Continuing for a few more steps, the causal graph for this particular Turing machine becomes:

With[{t = 40}
&#10005

CloudGet[CloudObject[
   "https://www.wolframcloud.com/obj/wolframphysics/Bulletin/TMCausal.\
wl"]];
With[{t = 40}, 
 Graph[Rule @@@ 
   TMCausalData[
    TuringMachine[2506, {{1, t}, ConstantArray[0, 2 t + 1]}, t]], 
  EdgeStyle -> 
   ResourceFunction["WolframPhysicsProjectStyleData"]["CausalGraph", 
    "EdgeStyle"], 
  VertexStyle -> 
   ResourceFunction["WolframPhysicsProjectStyleData"]["CausalGraph", 
    "VertexStyle"]]]

Continuing for more steps, and redrawing the graph, we see that we get a simple grid:

With[{t = 400}
&#10005

CloudGet[CloudObject[
  "https://www.wolframcloud.com/obj/wolframphysics/Bulletin/TMCausal.\
wl"]]; With[{t = 400}, 
 Graph[Rule @@@ 
   TMCausalData[
    TuringMachine[2506, {{1, t}, ConstantArray[0, 2 t + 1]}, t]], 
  EdgeStyle -> 
   ResourceFunction["WolframPhysicsProjectStyleData"]["CausalGraph", 
    "EdgeStyle"], 
  VertexStyle -> 
   ResourceFunction["WolframPhysicsProjectStyleData"]["CausalGraph", 
    "VertexStyle"]]]

Of s = 2, k = 2 Turing machines, the one with the most exotic causal graph is the “binary counter” machine 1953:

TMCausalPlot
&#10005

CloudGet[CloudObject[
   "https://www.wolframcloud.com/obj/wolframphysics/Bulletin/TMCausal.\
wl"]];
TMCausalPlot[1953, {{1, 10}, ConstantArray[0, 21]}, 20]

With[{t = 1000}
&#10005

CloudGet[CloudObject[
  "https://www.wolframcloud.com/obj/wolframphysics/Bulletin/TMCausal.\
wl"]]; With[{t = 1000}, 
 Graph[Rule @@@ 
   TMCausalData[
    TuringMachine[1953, {{1, t}, ConstantArray[0, 2 t + 1]}, t]], 
  EdgeStyle -> 
   ResourceFunction["WolframPhysicsProjectStyleData"]["CausalGraph", 
    "EdgeStyle"], 
  VertexStyle -> 
   ResourceFunction["WolframPhysicsProjectStyleData"]["CausalGraph", 
    "VertexStyle"]]]

The causal graph gives a good “overall map” of the behavior of a Turing machine. Here are a few Turing machines (with s = 3, k = 2 and s = 4, k = 2) from A New Kind of Science (compare also the s = 2, k = 3 universal Turing machine):

RulePlot
&#10005

RulePlot[TuringMachine[#], {1, {{}, 0}}, 100, 
   ImageSize -> {Automatic, 400}] & /@ {{{1, 0} -> {3, 1, -1}, {1, 
     1} -> {2, 0, 1}, {2, 0} -> {1, 1, 1}, {2, 1} -> {3, 1, 1}, {3, 
     0} -> {2, 1, 1}, {3, 1} -> {1, 0, -1}}, {{1, 0} -> {3, 
     1, -1}, {1, 1} -> {2, 1, -1}, {2, 0} -> {1, 1, -1}, {2, 1} -> {4,
      1, 1}, {3, 0} -> {2, 1, 1}, {3, 1} -> {1, 0, -1}, {4, 0} -> {2, 
     1, -1}, {4, 1} -> {4, 0, 1}}, {{1, 0} -> {4, 0, 1}, {1, 1} -> {3,
      1, -1}, {2, 0} -> {1, 1, -1}, {2, 1} -> {1, 1, 1}, {3, 0} -> {1,
      1, 1}, {3, 1} -> {3, 0, -1}, {4, 0} -> {2, 1, 1}, {4, 1} -> {2, 
     1, 1}}, {{1, 0} -> {2, 1, -1}, {1, 1} -> {1, 0, 1}, {2, 0} -> {4,
      0, -1}, {2, 1} -> {3, 1, 1}, {3, 0} -> {4, 1, -1}, {3, 1} -> {1,
      1, 1}, {4, 0} -> {1, 1, 1}, {4, 1} -> {2, 0, -1}}}

And here are their respective causal graphs:

With[{t = 1000}
&#10005

CloudGet[CloudObject[
  "https://www.wolframcloud.com/obj/wolframphysics/Bulletin/TMCausal.\
wl"]]; With[{t = 1000}, 
   Graph[Rule @@@ 
     TMCausalData[
      TuringMachine[#, {{1, t}, ConstantArray[0, 2 t + 1]}, t]], 
    EdgeStyle -> 
     ResourceFunction["WolframPhysicsProjectStyleData"]["CausalGraph",
       "EdgeStyle"], 
    VertexStyle -> 
     ResourceFunction["WolframPhysicsProjectStyleData"]["CausalGraph",
       "VertexStyle"]]] & /@ {{{1, 0} -> {3, 1, -1}, {1, 1} -> {2, 0, 
     1}, {2, 0} -> {1, 1, 1}, {2, 1} -> {3, 1, 1}, {3, 0} -> {2, 1, 
     1}, {3, 1} -> {1, 0, -1}}, {{1, 0} -> {3, 1, -1}, {1, 1} -> {2, 
     1, -1}, {2, 0} -> {1, 1, -1}, {2, 1} -> {4, 1, 1}, {3, 0} -> {2, 
     1, 1}, {3, 1} -> {1, 0, -1}, {4, 0} -> {2, 1, -1}, {4, 1} -> {4, 
     0, 1}}, {{1, 0} -> {4, 0, 1}, {1, 1} -> {3, 1, -1}, {2, 0} -> {1,
      1, -1}, {2, 1} -> {1, 1, 1}, {3, 0} -> {1, 1, 1}, {3, 1} -> {3, 
     0, -1}, {4, 0} -> {2, 1, 1}, {4, 1} -> {2, 1, 1}}, {{1, 0} -> {2,
      1, -1}, {1, 1} -> {1, 0, 1}, {2, 0} -> {4, 0, -1}, {2, 1} -> {3,
      1, 1}, {3, 0} -> {4, 1, -1}, {3, 1} -> {1, 1, 1}, {4, 0} -> {1, 
     1, 1}, {4, 1} -> {2, 0, -1}}}

Rulial Multiway Causal Graphs

What can we say about the causal graph associated with a rulial multiway system? The first important observation is that rulial multiway graphs always exhibit causal invariance, since by including transitions associated with all possible rules one is inevitably including both rules and their inverses, with the result that every branching of edges in the rulial multiway graph is always associated with a corresponding merging.

It’s fairly easy to see this for two steps of s = 2, k = 2 Turing machines. The rulial multiway states graph here is:

LayeredGraphPlot
&#10005

CloudGet[CloudObject[
  "https://www.wolframcloud.com/obj/wolframphysics/Bulletin/DeltaTM.\
wl"]]; LayeredGraphPlot[
 With[{t = 2}, 
  ResourceFunction["MultiwayTuringMachine"][
   AllDeltaTMRules[{2, 2}], {{1, t + 1, 0}, 
    ConstantArray[0, 2 t + 1]}, t, "StatesGraphStructure"]], 
 AspectRatio -> 1/2]

This can also be rendered:

With[{t = 2}
&#10005

CloudGet[CloudObject[
   "https://www.wolframcloud.com/obj/wolframphysics/Bulletin/DeltaTM.\
wl"]];
With[{t = 2}, 
 ResourceFunction["MultiwayTuringMachine"][
  AllDeltaTMRules[{2, 2}], {{1, t + 1, 0}, ConstantArray[0, 2 t + 1]},
   t, "StatesGraphStructure"]]

Explicitly showing events we get:

With[{t = 2}
&#10005

CloudGet[CloudObject[
  "https://www.wolframcloud.com/obj/wolframphysics/Bulletin/DeltaTM.\
wl"]]; With[{t = 2}, 
 ResourceFunction["MultiwayTuringMachine"][
  AllDeltaTMRules[{2, 2}], {{1, t + 1, 0}, ConstantArray[0, 2 t + 1]},
   t, "EvolutionEventsGraphStructure"]]

Including causal connections we get

With[{t = 2}
&#10005

CloudGet[CloudObject[
  "https://www.wolframcloud.com/obj/wolframphysics/Bulletin/DeltaTM.\
wl"]]; With[{t = 2}, 
 ResourceFunction["MultiwayTuringMachine"][
  AllDeltaTMRules[{2, 2}], {{1, t + 1, 0}, ConstantArray[0, 2 t + 1]},
   t, "EvolutionCausalGraphStructure"]]

or after 3 steps:

With[{t = 3}
&#10005

CloudGet[CloudObject[
  "https://www.wolframcloud.com/obj/wolframphysics/Bulletin/DeltaTM.\
wl"]]; With[{t = 3}, 
 ResourceFunction["MultiwayTuringMachine"][
  AllDeltaTMRules[{2, 2}], {{1, t + 1, 0}, ConstantArray[0, 2 t + 1]},
   t, "EvolutionCausalGraphStructure"]]

The pure rulial multiway causal graph in this case is then:

With[{t = 3}
&#10005

CloudGet[CloudObject[
   "https://www.wolframcloud.com/obj/wolframphysics/Bulletin/DeltaTM.\
wl"]];
With[{t = 3}, 
 ResourceFunction["MultiwayTuringMachine"][
  AllDeltaTMRules[{2, 2}], {{1, t + 1, 0}, ConstantArray[0, 2 t + 1]},
   t, "CausalGraphStructure"]]

In layered form this becomes:

With[{t = 3}
&#10005

CloudGet[CloudObject[
   "https://www.wolframcloud.com/obj/wolframphysics/Bulletin/DeltaTM.\
wl"]];
With[{t = 3}, 
 LayeredGraphPlot[
  ResourceFunction["MultiwayTuringMachine"][
   AllDeltaTMRules[{2, 2}], {{1, t + 1, 0}, 
    ConstantArray[0, 2 t + 1]}, t, "CausalGraphStructure"], 
  AspectRatio -> 1/2]]

After 5 steps the growth in the number of nodes reached going from the root grows like:

ListLogPlot
&#10005

Cell[CellGroupData[{
Cell[BoxData[
 RowBox[{
  RowBox[{"data", "=", 
   RowBox[{"\[LeftAssociation]", 
    RowBox[{
     RowBox[{
      RowBox[{"{", "1", "}"}], "\[Rule]", "1184"}], ",", 
     RowBox[{
      RowBox[{"{", 
       RowBox[{"1", ",", "9"}], "}"}], "\[Rule]", "400"}], ",", 
     RowBox[{
      RowBox[{"{", 
       RowBox[{
       "1", ",", "9", ",", "104", ",", "344", ",", "656", ",", "1208",
         ",", "1728", ",", "1984"}], "}"}], "\[Rule]", "8"}], ",", 
     RowBox[{
      RowBox[{"{", 
       RowBox[{
       "1", ",", "9", ",", "104", ",", "344", ",", "592", ",", "1112",
         ",", "1688", ",", "1984"}], "}"}], "\[Rule]", "8"}], ",", 
     RowBox[{
      RowBox[{"{", 
       RowBox[{
       "1", ",", "9", ",", "104", ",", "288", ",", "576", ",", "1208",
         ",", "1728", ",", "1984"}], "}"}], "\[Rule]", "8"}], ",", 
     RowBox[{
      RowBox[{"{", 
       RowBox[{
       "1", ",", "9", ",", "104", ",", "288", ",", "512", ",", "1112",
         ",", "1688", ",", "1984"}], "}"}], "\[Rule]", "8"}], ",", 
     RowBox[{
      RowBox[{"{", 
       RowBox[{
       "1", ",", "9", ",", "72", ",", "160", ",", "344", ",", "656", 
        ",", "1208", ",", "1728", ",", "1984"}], "}"}], "\[Rule]", 
      "4"}], ",", 
     RowBox[{
      RowBox[{"{", 
       RowBox[{
       "1", ",", "9", ",", "72", ",", "160", ",", "344", ",", "592", 
        ",", "1112", ",", "1688", ",", "1984"}], "}"}], "\[Rule]", 
      "4"}], ",", 
     RowBox[{
      RowBox[{"{", 
       RowBox[{
       "1", ",", "9", ",", "72", ",", "160", ",", "288", ",", "576", 
        ",", "1208", ",", "1728", ",", "1984"}], "}"}], "\[Rule]", 
      "4"}], ",", 
     RowBox[{
      RowBox[{"{", 
       RowBox[{
       "1", ",", "9", ",", "72", ",", "160", ",", "288", ",", "512", 
        ",", "1112", ",", "1688", ",", "1984"}], "}"}], "\[Rule]", 
      "4"}], ",", 
     RowBox[{
      RowBox[{"{", 
       RowBox[{
       "1", ",", "9", ",", "136", ",", "560", ",", "1208", ",", 
        "1728", ",", "1984"}], "}"}], "\[Rule]", "8"}], ",", 
     RowBox[{
      RowBox[{"{", 
       RowBox[{
       "1", ",", "9", ",", "136", ",", "496", ",", "1112", ",", 
        "1688", ",", "1984"}], "}"}], "\[Rule]", "8"}], ",", 
     RowBox[{
      RowBox[{"{", 
       RowBox[{
       "1", ",", "9", ",", "72", ",", "464", ",", "1208", ",", "1728",
         ",", "1984"}], "}"}], "\[Rule]", "8"}], ",", 
     RowBox[{
      RowBox[{"{", 
       RowBox[{
       "1", ",", "9", ",", "72", ",", "400", ",", "1112", ",", "1688",
         ",", "1984"}], "}"}], "\[Rule]", "8"}], ",", 
     RowBox[{
      RowBox[{"{", 
       RowBox[{"1", ",", "33", ",", "73"}], "}"}], "\[Rule]", "32"}], 
     ",", 
     RowBox[{
      RowBox[{"{", 
       RowBox[{"1", ",", "25", ",", "73"}], "}"}], "\[Rule]", "32"}], 
     ",", 
     RowBox[{
      RowBox[{"{", 
       RowBox[{
       "1", ",", "9", ",", "184", ",", "800", ",", "1552", ",", 
        "1984"}], "}"}], "\[Rule]", "4"}], ",", 
     RowBox[{
      RowBox[{"{", 
       RowBox[{
       "1", ",", "9", ",", "104", ",", "352", ",", "816", ",", "1528",
         ",", "1848", ",", "1984"}], "}"}], "\[Rule]", "16"}], ",", 
     RowBox[{
      RowBox[{"{", 
       RowBox[{
       "1", ",", "9", ",", "104", ",", "712", ",", "1568", ",", 
        "1984"}], "}"}], "\[Rule]", "8"}], ",", 
     RowBox[{
      RowBox[{"{", 
       RowBox[{
       "1", ",", "9", ",", "104", ",", "392", ",", "960", ",", "1680",
         ",", "1968", ",", "1984"}], "}"}], "\[Rule]", "8"}], ",", 
     RowBox[{
      RowBox[{"{", 
       RowBox[{
       "1", ",", "9", ",", "104", ",", "456", ",", "1032", ",", 
        "1672", ",", "1928", ",", "1984"}], "}"}], "\[Rule]", "8"}], 
     ",", 
     RowBox[{
      RowBox[{"{", 
       RowBox[{
       "1", ",", "9", ",", "104", ",", "656", ",", "1496", ",", 
        "1984"}], "}"}], "\[Rule]", "4"}], ",", 
     RowBox[{
      RowBox[{"{", 
       RowBox[{
       "1", ",", "69", ",", "285", ",", "720", ",", "1336", ",", 
        "1816", ",", "1984"}], "}"}], "\[Rule]", "4"}], ",", 
     RowBox[{
      RowBox[{"{", 
       RowBox[{
       "1", ",", "69", ",", "285", ",", "696", ",", "1296", ",", 
        "1816", ",", "1984"}], "}"}], "\[Rule]", "4"}], ",", 
     RowBox[{
      RowBox[{"{", 
       RowBox[{
       "1", ",", "45", ",", "253", ",", "696", ",", "1304", ",", 
        "1816", ",", "1984"}], "}"}], "\[Rule]", "4"}], ",", 
     RowBox[{
      RowBox[{"{", 
       RowBox[{
       "1", ",", "45", ",", "253", ",", "672", ",", "1264", ",", 
        "1816", ",", "1984"}], "}"}], "\[Rule]", "4"}], ",", 
     RowBox[{
      RowBox[{"{", 
       RowBox[{
       "1", ",", "9", ",", "105", ",", "344", ",", "656", ",", "1208",
         ",", "1728", ",", "1984"}], "}"}], "\[Rule]", "4"}], ",", 
     RowBox[{
      RowBox[{"{", 
       RowBox[{
       "1", ",", "9", ",", "105", ",", "344", ",", "592", ",", "1112",
         ",", "1688", ",", "1984"}], "}"}], "\[Rule]", "4"}], ",", 
     RowBox[{
      RowBox[{"{", 
       RowBox[{
       "1", ",", "9", ",", "185", ",", "800", ",", "1552", ",", 
        "1984"}], "}"}], "\[Rule]", "4"}], ",", 
     RowBox[{
      RowBox[{"{", 
       RowBox[{
       "1", ",", "9", ",", "105", ",", "712", ",", "1568", ",", 
        "1984"}], "}"}], "\[Rule]", "8"}], ",", 
     RowBox[{
      RowBox[{"{", 
       RowBox[{
       "1", ",", "9", ",", "105", ",", "656", ",", "1496", ",", 
        "1984"}], "}"}], "\[Rule]", "4"}], ",", 
     RowBox[{
      RowBox[{"{", 
       RowBox[{
       "1", ",", "9", ",", "72", ",", "160", ",", "352", ",", "816", 
        ",", "1528", ",", "1848", ",", "1984"}], "}"}], "\[Rule]", 
      "8"}], ",", 
     RowBox[{
      RowBox[{"{", 
       RowBox[{
       "1", ",", "9", ",", "136", ",", "640", ",", "1352", ",", 
        "1784", ",", "1984"}], "}"}], "\[Rule]", "8"}], ",", 
     RowBox[{
      RowBox[{"{", 
       RowBox[{
       "1", ",", "9", ",", "72", ",", "480", ",", "1272", ",", "1776",
         ",", "1984"}], "}"}], "\[Rule]", "8"}], ",", 
     RowBox[{
      RowBox[{"{", 
       RowBox[{
       "1", ",", "9", ",", "136", ",", "560", ",", "1264", ",", 
        "1800", ",", "1984"}], "}"}], "\[Rule]", "8"}], ",", 
     RowBox[{
      RowBox[{"{", 
       RowBox[{
       "1", ",", "9", ",", "72", ",", "400", ",", "1176", ",", "1752",
         ",", "1984"}], "}"}], "\[Rule]", "8"}], ",", 
     RowBox[{
      RowBox[{"{", 
       RowBox[{
       "1", ",", "9", ",", "72", ",", "160", ",", "392", ",", "960", 
        ",", "1680", ",", "1968", ",", "1984"}], "}"}], "\[Rule]", 
      "4"}], ",", 
     RowBox[{
      RowBox[{"{", 
       RowBox[{
       "1", ",", "9", ",", "72", ",", "160", ",", "456", ",", "1032", 
        ",", "1672", ",", "1928", ",", "1984"}], "}"}], "\[Rule]", 
      "4"}], ",", 
     RowBox[{
      RowBox[{"{", 
       RowBox[{
       "1", ",", "117", ",", "588", ",", "1376", ",", "1864", ",", 
        "1984"}], "}"}], "\[Rule]", "2"}], ",", 
     RowBox[{
      RowBox[{"{", 
       RowBox[{
       "1", ",", "33", ",", "136", ",", "312", ",", "728", ",", 
        "1360", ",", "1792", ",", "1984"}], "}"}], "\[Rule]", "4"}], 
     ",", 
     RowBox[{
      RowBox[{"{", 
       RowBox[{
       "1", ",", "69", ",", "540", ",", "1384", ",", "1864", ",", 
        "1984"}], "}"}], "\[Rule]", "2"}], ",", 
     RowBox[{
      RowBox[{"{", 
       RowBox[{
       "1", ",", "25", ",", "200", ",", "616", ",", "1272", ",", 
        "1808", ",", "1984"}], "}"}], "\[Rule]", "4"}], ",", 
     RowBox[{
      RowBox[{"{", 
       RowBox[{
       "1", ",", "33", ",", "376", ",", "1048", ",", "1656", ",", 
        "1928", ",", "1984"}], "}"}], "\[Rule]", "4"}], ",", 
     RowBox[{
      RowBox[{"{", 
       RowBox[{
       "1", ",", "33", ",", "136", ",", "312", ",", "648", ",", 
        "1272", ",", "1808", ",", "1984"}], "}"}], "\[Rule]", "4"}], 
     ",", 
     RowBox[{
      RowBox[{"{", 
       RowBox[{
       "1", ",", "25", ",", "344", ",", "1080", ",", "1712", ",", 
        "1928", ",", "1984"}], "}"}], "\[Rule]", "4"}], ",", 
     RowBox[{
      RowBox[{"{", 
       RowBox[{
       "1", ",", "25", ",", "200", ",", "696", ",", "1360", ",", 
        "1792", ",", "1984"}], "}"}], "\[Rule]", "4"}], ",", 
     RowBox[{
      RowBox[{"{", 
       RowBox[{
       "1", ",", "33", ",", "248", ",", "896", ",", "1624", ",", 
        "1968", ",", "1984"}], "}"}], "\[Rule]", "4"}], ",", 
     RowBox[{
      RowBox[{"{", 
       RowBox[{
       "1", ",", "25", ",", "136", ",", "432", ",", "1016", ",", 
        "1656", ",", "1928", ",", "1984"}], "}"}], "\[Rule]", "4"}], 
     ",", 
     RowBox[{
      RowBox[{"{", 
       RowBox[{
       "1", ",", "33", ",", "312", ",", "976", ",", "1656", ",", 
        "1928", ",", "1984"}], "}"}], "\[Rule]", "4"}], ",", 
     RowBox[{
      RowBox[{"{", 
       RowBox[{
       "1", ",", "25", ",", "136", ",", "368", ",", "936", ",", 
        "1624", ",", "1968", ",", "1984"}], "}"}], "\[Rule]", "4"}], 
     ",", 
     RowBox[{
      RowBox[{"{", 
       RowBox[{
       "1", ",", "9", ",", "104", ",", "352", ",", "760", ",", "1352",
         ",", "1784", ",", "1984"}], "}"}], "\[Rule]", "8"}], ",", 
     RowBox[{
      RowBox[{"{", 
       RowBox[{
       "1", ",", "9", ",", "104", ",", "288", ",", "600", ",", "1272",
         ",", "1776", ",", "1984"}], "}"}], "\[Rule]", "8"}], ",", 
     RowBox[{
      RowBox[{"{", 
       RowBox[{
       "1", ",", "9", ",", "104", ",", "352", ",", "680", ",", "1264",
         ",", "1800", ",", "1984"}], "}"}], "\[Rule]", "8"}], ",", 
     RowBox[{
      RowBox[{"{", 
       RowBox[{
       "1", ",", "9", ",", "104", ",", "288", ",", "520", ",", "1176",
         ",", "1752", ",", "1984"}], "}"}], "\[Rule]", "8"}], ",", 
     RowBox[{
      RowBox[{"{", 
       RowBox[{
       "1", ",", "69", ",", "349", ",", "856", ",", "1448", ",", 
        "1848", ",", "1984"}], "}"}], "\[Rule]", "8"}], ",", 
     RowBox[{
      RowBox[{"{", 
       RowBox[{
       "1", ",", "45", ",", "253", ",", "744", ",", "1360", ",", 
        "1792", ",", "1984"}], "}"}], "\[Rule]", "4"}], ",", 
     RowBox[{
      RowBox[{"{", 
       RowBox[{
       "1", ",", "9", ",", "105", ",", "352", ",", "760", ",", "1352",
         ",", "1784", ",", "1984"}], "}"}], "\[Rule]", "4"}], ",", 
     RowBox[{
      RowBox[{"{", 
       RowBox[{
       "1", ",", "45", ",", "253", ",", "664", ",", "1272", ",", 
        "1808", ",", "1984"}], "}"}], "\[Rule]", "4"}], ",", 
     RowBox[{
      RowBox[{"{", 
       RowBox[{
       "1", ",", "9", ",", "105", ",", "352", ",", "680", ",", "1264",
         ",", "1800", ",", "1984"}], "}"}], "\[Rule]", "4"}], ",", 
     RowBox[{
      RowBox[{"{", 
       RowBox[{
       "1", ",", "9", ",", "72", ",", "160", ",", "352", ",", "760", 
        ",", "1352", ",", "1784", ",", "1984"}], "}"}], "\[Rule]", 
      "4"}], ",", 
     RowBox[{
      RowBox[{"{", 
       RowBox[{
       "1", ",", "9", ",", "72", ",", "160", ",", "288", ",", "600", 
        ",", "1272", ",", "1776", ",", "1984"}], "}"}], "\[Rule]", 
      "4"}], ",", 
     RowBox[{
      RowBox[{"{", 
       RowBox[{
       "1", ",", "9", ",", "72", ",", "160", ",", "352", ",", "680", 
        ",", "1264", ",", "1800", ",", "1984"}], "}"}], "\[Rule]", 
      "4"}], ",", 
     RowBox[{
      RowBox[{"{", 
       RowBox[{
       "1", ",", "9", ",", "72", ",", "160", ",", "288", ",", "520", 
        ",", "1176", ",", "1752", ",", "1984"}], "}"}], "\[Rule]", 
      "4"}], ",", 
     RowBox[{
      RowBox[{"{", 
       RowBox[{
       "1", ",", "33", ",", "312", ",", "968", ",", "1624", ",", 
        "1968", ",", "1984"}], "}"}], "\[Rule]", "2"}], ",", 
     RowBox[{
      RowBox[{"{", 
       RowBox[{
       "1", ",", "25", ",", "264", ",", "992", ",", "1696", ",", 
        "1968", ",", "1984"}], "}"}], "\[Rule]", "2"}]}], 
    "\[RightAssociation]"}]}], ";"}]], "Input"],

Cell[BoxData[
 RowBox[{"ListLogPlot", "[", 
  RowBox[{
   RowBox[{"Select", "[", 
    RowBox[{
     RowBox[{"Keys", "[", "data", "]"}], ",", 
     RowBox[{
      RowBox[{
       RowBox[{"Length", "[", "#", "]"}], "\[Equal]", "9"}], "&"}]}], 
    "]"}], ",", 
   RowBox[{"Joined", "\[Rule]", "True"}], ",", 
   RowBox[{"Frame", "\[Rule]", "True"}], ",", 
   RowBox[{"PlotStyle", "\[Rule]", 
    RowBox[{
     RowBox[{
     "ResourceFunction", "[", 
      "\"\<WolframPhysicsProjectStyleData\>\"", "]"}], "[", 
     RowBox[{"\"\<GenericLinePlot\>\"", ",", "\"\<PlotStyles\>\""}], 
     "]"}]}]}], "]"}]], "Input"]
}, Open  ]]

Causal invariance implies that this multiway causal graph is ultimately composed of a large number of interwoven copies of a single causal graph. After any given number of steps of evolution, the various copies of this causal graph will have “reached different stages”. Here are the results after 3 steps:

Counts
&#10005

CloudGet[CloudObject[
  "https://www.wolframcloud.com/obj/wolframphysics/Bulletin/DeltaTM.\
wl"]]; Counts[
 IndexGraph[#, ImageSize -> Tiny] & /@ 
  With[{t = 3}, 
   ResourceFunction["MultiwayTuringMachine"][
    AllDeltaTMRules[{2, 2}], {{1, t + 1, 0}, Table[0, 2 t + 1]}, t, 
    "CausalGraphStructureInstances"]]]

And after 4 steps:

Counts
&#10005

CloudGet[CloudObject[
  "https://www.wolframcloud.com/obj/wolframphysics/Bulletin/DeltaTM.\
wl"]]; Counts[
 IndexGraph[#, ImageSize -> Tiny] & /@ 
  With[{t = 4}, 
   ResourceFunction["MultiwayTuringMachine"][
    AllDeltaTMRules[{2, 2}], {{1, t + 1, 0}, Table[0, 2 t + 1]}, t, 
    "CausalGraphStructureInstances"]]]

One can also look at rulial multiway causal graphs for other sets of Turing machines. For s = 1, k = 1 one has (here after 5 steps)

LayeredGraphPlot
&#10005

CloudGet[CloudObject[
  "https://www.wolframcloud.com/obj/wolframphysics/Bulletin/DeltaTM.\
wl"]]; LayeredGraphPlot[
 SimpleGraph[
  With[{t = 5}, 
   ResourceFunction["MultiwayTuringMachine"][
    AllDeltaTMRules[{1, 1}], {{1, t + 1, 0}, 
     ConstantArray[0, 2 t + 1]}, t, "CausalGraphStructure"]]]]

which is equivalent to:

With[{t = 5}
&#10005

CloudGet[CloudObject[
  "https://www.wolframcloud.com/obj/wolframphysics/Bulletin/DeltaTM.\
wl"]]; With[{t = 5}, 
 SimpleGraph[
  ResourceFunction["MultiwayTuringMachine"][
   AllDeltaTMRules[{1, 1}], {{1, t + 1, 0}, Table[0, 2 t + 1]}, t, 
   "CausalGraphStructure"]]]

The individual causal graphs in this case are immediately all the same, and are just:

Counts
&#10005

CloudGet[CloudObject[
  "https://www.wolframcloud.com/obj/wolframphysics/Bulletin/DeltaTM.\
wl"]]; Counts[
 IndexGraph[#, ImageSize -> Tiny] & /@ 
  With[{t = 5}, 
   ResourceFunction["MultiwayTuringMachine"][
    AllDeltaTMRules[{1, 1}], {{1, t + 1, 0}, Table[0, 2 t + 1]}, t, 
    "CausalGraphStructureInstances"]]]

For s = 2, k = 1 one already has after 3 steps

With[{t = 3}
&#10005

CloudGet[CloudObject[
   "https://www.wolframcloud.com/obj/wolframphysics/Bulletin/DeltaTM.\
wl"]];
With[{t = 3}, 
 ResourceFunction["MultiwayTuringMachine"][
  AllDeltaTMRules[{2, 1}], {{1, t + 1, 0}, ConstantArray[0, 2 t + 1]},
   t, "CausalGraphStructure"]]

or in layered form:

LayeredGraphPlot
&#10005

CloudGet[CloudObject[
  "https://www.wolframcloud.com/obj/wolframphysics/Bulletin/DeltaTM.\
wl"]]; LayeredGraphPlot[
 With[{t = 3}, 
  ResourceFunction["MultiwayTuringMachine"][
   AllDeltaTMRules[{2, 1}], {{1, t + 1, 0}, 
    ConstantArray[0, 2 t + 1]}, t, "CausalGraphStructure"]], 
 AspectRatio -> 1/3]

After 5 steps this becomes

With[{t = 5}
&#10005

CloudGet[CloudObject[
   "https://www.wolframcloud.com/obj/wolframphysics/Bulletin/DeltaTM.\
wl"]];
With[{t = 5}, 
 ResourceFunction["MultiwayTuringMachine"][
  AllDeltaTMRules[{2, 1}], {{1, t + 1, 0}, ConstantArray[0, 2 t + 1]},
   t, "CausalGraphStructure"]]

or in layered form:

LayeredGraphPlot
&#10005

CloudGet[CloudObject[
  "https://www.wolframcloud.com/obj/wolframphysics/Bulletin/DeltaTM.\
wl"]]; LayeredGraphPlot[
 With[{t = 5}, 
  ResourceFunction["MultiwayTuringMachine"][
   AllDeltaTMRules[{2, 1}], {{1, t + 1, 0}, 
    ConstantArray[0, 2 t + 1]}, t, "CausalGraphStructure"]], 
 AspectRatio -> 1/3]

In this case, the individual causal graphs after 5 steps are:

Counts
&#10005

CloudGet[CloudObject[
  "https://www.wolframcloud.com/obj/wolframphysics/Bulletin/DeltaTM.\
wl"]]; Counts[
 IndexGraph[#, ImageSize -> Tiny] & /@ 
  With[{t = 5}, 
   ResourceFunction["MultiwayTuringMachine"][
    AllDeltaTMRules[{2, 1}], {{1, t + 1, 0}, Table[0, 2 t + 1]}, t, 
    "CausalGraphStructureInstances"]]]

For s = 1, k = 2 one has very similar results to the case s = 2, k = 2. After 3 steps the causal graph is:

With[{t = 3}
&#10005

CloudGet[CloudObject[
  "https://www.wolframcloud.com/obj/wolframphysics/Bulletin/DeltaTM.\
wl"]]; With[{t = 3}, 
 ResourceFunction["MultiwayTuringMachine"][
  AllDeltaTMRules[{1, 2}], {{1, t + 1, 0}, ConstantArray[0, 2 t + 1]},
   t, "CausalGraphStructure"]]

Or after 5 steps:

With[{t = 4}
&#10005

CloudGet[CloudObject[
  "https://www.wolframcloud.com/obj/wolframphysics/Bulletin/DeltaTM.\
wl"]]; With[{t = 4}, 
 ResourceFunction["MultiwayTuringMachine"][
  AllDeltaTMRules[{1, 2}], {{1, t + 1, 0}, ConstantArray[0, 2 t + 1]},
   t, "CausalGraphStructure"]]

Removing multiple edges this is:

SimpleGraph
&#10005

CloudGet[CloudObject[
  "https://www.wolframcloud.com/obj/wolframphysics/Bulletin/DeltaTM.\
wl"]]; SimpleGraph[
 With[{t = 4}, 
  ResourceFunction["MultiwayTuringMachine"][
   AllDeltaTMRules[{1, 2}], {{1, t + 1, 0}, 
    ConstantArray[0, 2 t + 1]}, t, "CausalGraphStructure"]]]

The individual causal graphs in this case are:

Counts
&#10005

CloudGet[CloudObject[
  "https://www.wolframcloud.com/obj/wolframphysics/Bulletin/DeltaTM.\
wl"]]; Counts[
 IndexGraph[#, ImageSize -> Tiny] & /@ 
  With[{t = 5}, 
   ResourceFunction["MultiwayTuringMachine"][
    AllDeltaTMRules[{1, 2}], {{1, t + 1, 0}, Table[0, 2 t + 1]}, t, 
    "CausalGraphStructureInstances"]]]

Rulial Graphs

Just as for ordinary multiway graphs one can study branchial graphs which represent their transversals, so similarly for rulial multiway graphs one can study rulial graphs which represent their transversals. The layered way we have drawn multiway graphs corresponds to a particular choice of foliation—and with this choice, we can immediately generate rulial graphs.

For s = 2, k = 1 one has after 2 steps

With[{t = 2}
&#10005

CloudGet[CloudObject[
  "https://www.wolframcloud.com/obj/wolframphysics/Bulletin/DeltaTM.\
wl"]]; With[{t = 2}, 
 Graph[ResourceFunction["MultiwayTuringMachine"][
   AllDeltaTMRules[{2, 1}], {{1, t + 1, 0}, 
    ConstantArray[0, 2 t + 1]}, t, "BranchialGraph", 
   PerformanceGoal -> "Quality", VertexSize -> .45 {1.15, .3}], 
  EdgeStyle -> 
   ResourceFunction["WolframPhysicsProjectStyleData"]["RulialGraph", 
    "EdgeStyle"]]]

while after 3 steps one gets:

With[{t = 3}
&#10005

CloudGet[CloudObject[
  "https://www.wolframcloud.com/obj/wolframphysics/Bulletin/DeltaTM.\
wl"]]; Framed[
 With[{t = 3}, 
  Graph[ResourceFunction["MultiwayTuringMachine"][
    AllDeltaTMRules[{2, 1}], {{1, t + 1, 0}, Table[0, 2 t + 1]}, t, 
    "BranchialGraph"], PerformanceGoal -> "Quality", 
   VertexSize -> .8 {1, 1/(2 t + 1)}, 
   EdgeStyle -> 
    ResourceFunction["WolframPhysicsProjectStyleData"]["RulialGraph", 
     "EdgeStyle"]]], FrameStyle -> LightGray]

For s = 1, k = 2 one gets after 2 steps:

With[{t = 2}
&#10005

CloudGet[CloudObject[
  "https://www.wolframcloud.com/obj/wolframphysics/Bulletin/DeltaTM.\
wl"]]; Framed[
 With[{t = 2}, 
  Graph[ResourceFunction["MultiwayTuringMachine"][
    AllDeltaTMRules[{1, 2}], {{1, t + 1, 0}, Table[0, 2 t + 1]}, t, 
    "BranchialGraph"], PerformanceGoal -> "Quality", 
   VertexSize -> .45 {1.15, .3}, 
   EdgeStyle -> 
    ResourceFunction["WolframPhysicsProjectStyleData"]["RulialGraph", 
     "EdgeStyle"]]], FrameStyle -> LightGray]

while after 3 steps one has:

With[{t = 3}
&#10005

CloudGet[CloudObject[
  "https://www.wolframcloud.com/obj/wolframphysics/Bulletin/DeltaTM.\
wl"]]; Framed[
 With[{t = 3}, 
  Graph[ResourceFunction["MultiwayTuringMachine"][
    AllDeltaTMRules[{1, 2}], {{1, t + 1, 0}, Table[0, 2 t + 1]}, t, 
    "BranchialGraph"], PerformanceGoal -> "Quality", 
   VertexSize -> .5 {1.15, .3}, 
   EdgeStyle -> 
    ResourceFunction["WolframPhysicsProjectStyleData"]["RulialGraph", 
     "EdgeStyle"]]], FrameStyle -> LightGray]

The sequence of results for steps 1 through 4 is:

Table
&#10005

Table[Framed[
  Graph[ResourceFunction["MultiwayTuringMachine"][
    AllDeltaTMRules[{1, 2}], {{1, t + 1, 0}, Table[0, 2 t + 1]}, t, 
    "BranchialGraphStructure"], 
   EdgeStyle -> 
    ResourceFunction["WolframPhysicsProjectStyleData"]["RulialGraph", 
     "EdgeStyle"]], FrameStyle -> LightGray], {t, 1, 4}]

For s = 2, k = 2 the corresponding results are:

Table
&#10005

Table[Framed[
  Graph[ResourceFunction["MultiwayTuringMachine"][
    AllDeltaTMRules[{2, 2}], {{1, t + 1, 0}, Table[0, 2 t + 1]}, t, 
    "BranchialGraphStructure"], 
   EdgeStyle -> 
    ResourceFunction["WolframPhysicsProjectStyleData"]["RulialGraph", 
     "EdgeStyle"]], FrameStyle -> LightGray], {t, 1, 4}]

What do these pictures mean? Just as branchial graphs in ordinary multiway systems can be thought of as “entanglement maps” for states (interpreted in our models as quantum states) in ordinary “multiway space”, so here these rulial graphs can be thought of as “entanglement maps” for states in rulial space. In other words, they are a kind of map of which Turing machine configurations are “evolutionarily close” to which other ones, in the sense that they can be reached with only a few different choices of rules.

Deterministic Turing Machine Paths in Rulial Space

The rulial multiway graph defines all paths that can be followed by all non-deterministic Turing machines. At each node in this graph there is therefore an outgoing edge corresponding to any possible Turing machine transition from the configuration corresponding to that node. But what if one considers just a single deterministic Turing machine? Its evolution is then a single path within the rulial multiway graph.

Consider for example the s = 2, k = 2 Turing machine:

RulePlot
&#10005

RulePlot[TuringMachine[2506]]

This machine evolves from a blank tape according to:

RulePlot
&#10005

RulePlot[TuringMachine[2506], {1, {{}, 0}}, 10, Mesh -> True, 
 Frame -> None]

This corresponds to a path in the rulial multiway graph:

With[{t = 4}
&#10005

CloudGet[CloudObject[
  "https://www.wolframcloud.com/obj/wolframphysics/Bulletin/DeltaTM.\
wl"]]; With[{t = 4}, 
 HighlightGraph[
  ResourceFunction["MultiwayTuringMachine"][
   AllDeltaTMRules[{2, 2}], {{1, t + 1, 0}, 
    ConstantArray[0, 2 t + 1]}, t, "StatesGraphStructure", 
   VertexSize -> 1], 
  Style[PathGraph[
    Rule @@@ 
     Partition[
      ToString /@ 
       TuringMachine[
        2506, {{2, t + 1, 0}, 
         ReplacePart[ConstantArray[0, 2 t + 1], t + 1 -> 1]}, t], 2, 
      1]], Thickness[0.01], Red]]]

With a different initial condition

RulePlot
&#10005

RulePlot[TuringMachine[2506], {1, {{1}, 0}}, 10, Mesh -> True, 
 Frame -> None]

the path can be very different:

With[{t = 4}
&#10005

CloudGet[CloudObject[
  "https://www.wolframcloud.com/obj/wolframphysics/Bulletin/DeltaTM.\
wl"]]; With[{t = 4}, 
 HighlightGraph[
  ResourceFunction["MultiwayTuringMachine"][
   AllDeltaTMRules[{2, 2}], {{1, t + 1, 0}, 
    ConstantArray[0, 2 t + 1]}, t, "StatesGraphStructure", 
   VertexSize -> 1], 
  Style[PathGraph[
    Rule @@@ 
     Partition[
      ToString /@ 
       TuringMachine[
        2506, {{1, t + 1, 0}, 
         ReplacePart[ConstantArray[0, 2 t + 1], t + 1 -> 1]}, t], 2, 
      1]], Thickness[0.01], Red]]]

This pictures might make it seem that the paths corresponding to the evolution of deterministic Turing machines are geodesics in the rulial multiway graph. But in general they are definitely not. For example, starting from a blank tape, the rule

RulePlot
&#10005

RulePlot[TuringMachine[{{1, 0} -> {2, 0, -1}, {1, 1} -> {1, 
     0, -1}, {2, 0} -> {1, 1, 1}, {2, 1} -> {1, 0, -1}}]]

follows this path on the rulial multiway graph:

With[{t = 4}
&#10005

CloudGet[CloudObject[
  "https://www.wolframcloud.com/obj/wolframphysics/Bulletin/DeltaTM.\
wl"]]; With[{t = 4}, 
 HighlightGraph[
  ResourceFunction["MultiwayTuringMachine"][
   AllDeltaTMRules[{2, 2}], {{1, t + 1, 0}, 
    ConstantArray[0, 2 t + 1]}, t, "StatesGraphStructure", 
   VertexSize -> 1], 
  Style[PathGraph[
    Rule @@@ 
     Partition[
      ToString /@ 
       TuringMachine[{{1, 0} -> {2, 0, -1}, {1, 1} -> {1, 0, -1}, {2, 
           0} -> {1, 1, 1}, {2, 1} -> {1, 0, -1}}, {{1, t + 1, 0}, 
         ConstantArray[0, 2 t + 1]}, t], 2, 1]], Thickness[0.01], 
   Red]]]

If one allows any possible Turing machine transition at every step, then one can follow a geodesic path from a node corresponding to an initial condition to a node corresponding to any other configuration. But if one restricts oneself to the transitions in a particular (deterministic) Turing machine, then there will in general be many configurations one will never reach, and even those that one can reach, one may reach by a circuitous route in the rulial multiway graph.

Given a particular configuration (corresponding to a node in the rulial multiway graph), there may be many deterministic Turing machines that can reach it from a given initial state. One can consider each of these Turing machines to be implementing a certain algorithm. So then the “optimal algorithm” will be the one which is shortest among deterministic Turing machine paths. As I just mentioned, this won’t typically be the shortest possible path: that will usually be achieved by a non-deterministic Turing machine with a particular sequence of transitions. But there is still an optimal case (i.e. an “optimal algorithm”) among deterministic Turing machines.

But now we can ask across all possible deterministic Turing machines where they can reach in the rulial multiway graph. Here is the result for 4 steps for the s = 2, k = 2 Turing machines we have been considering:

With[{t = 4}
&#10005

CloudGet[CloudObject[
  "https://www.wolframcloud.com/obj/wolframphysics/Bulletin/DeltaTM.\
wl"]]; With[{t = 4}, 
 With[{g = 
    ResourceFunction["MultiwayTuringMachine"][
     AllDeltaTMRules[{2, 2}], {{1, t + 1, 0}, 
      ConstantArray[0, 2 t + 1]}, t, "StatesGraphStructure", 
     VertexSize -> 1]}, 
  HighlightGraph[g, 
   Style[PathGraph[
       Rule @@@ 
        Partition[
         ToString /@ 
          TuringMachine[#, {{1, t + 1, 0}, ConstantArray[0, 2 t + 1]},
            t], 2, 1]], Thick, Red] & /@ Range[0, 4095]]]]

These are the results for 1, 2 and 3 steps:

ParallelTable
&#10005

CloudGet[CloudObject[
  "https://www.wolframcloud.com/obj/wolframphysics/Bulletin/DeltaTM.\
wl"]]; ParallelTable[
 With[{t = 4}, 
  With[{g = 
     ResourceFunction["MultiwayTuringMachine"][
      AllDeltaTMRules[{2, 2}], {{1, t + 1, 0}, 
       ConstantArray[0, 2 t + 1]}, t, "StatesGraphStructure", 
      EdgeStyle -> 
       Directive[
        ResourceFunction["WolframPhysicsProjectStyleData"][
          "StatesGraph"]["EdgeStyle"], Opacity[0.4]], 
      VertexSize -> 1]}, 
   HighlightGraph[g, 
    Style[PathGraph[
        Rule @@@ 
         Partition[
          ToString /@ 
           TuringMachine[#, {{1, t + 1, 0}, 
             ConstantArray[0, 2 t + 1]}, tt], 2, 1]], Thick, 
       Append[Red, 1]] & /@ Range[0, 4095]]]], {tt, 3}]

What is the significance of this? Essentially what we’re seeing is a comparison of what can be achieved with deterministic computation versus non-deterministic. Taking the 4-step case as an example, the “background” gray rulial multiway graph shows what can be achieved with arbitrary non-deterministic computation in 4 steps. The red region is what deterministic computation can achieve in the same number of steps.

In a sense this is a very simple empirical analog of the P vs. NP problem. Unlike the real P vs. NP case, we’re not allowing arbitrary polynomial-time algorithms here; we’re just looking at possible s = 2, k = 2 Turing machine algorithms running specifically for 4 steps. But if we were to generalize this appropriately, P = NP would imply that the “red region” must in some limit in effect “reach anywhere in the graph”.

A little more precisely, the official definition of P and NP is for decision problems: you start from some initial condition which defines an instance of a problem (“Is this Boolean formula satisfiable?” or whatever), and the system must eventually evolve to a state representing either “yes” or “no”. We can imagine setting things up so that the outcomes correspond to particular configurations of the Turing machine. The inputs are then also encoded as initial configurations of the Turing machine, and we want to know what happens as we consider inputs of progressively larger sizes. We can imagine drawing the rulial multiway graph so that progressively larger inputs are shown “progressively further from the center”. If we consider non-deterministic Turing machines (associated with the class of NP computations), then the shortest computation will be a geodesic path in the rulial multiway graph from the input configuration to the outcome configuration. But for deterministic Turing machines (associated with the class P) it will in general be some much more circuitous path.

The standard P vs. NP problem asks about limiting behavior as one increases the size of the input computation—and one might imagine that the question could be “geometrized” in terms of some continuum limit of the rulial multiway graph. Of course, there is no guarantee that any reasonable limit exists. And it could perfectly well be that the question of whether P  NP is actually undecidable, or in other words, that no finite proof of it can be given within a standard axiom system (such as Peano arithmetic or ZFC set theory).

One could imagine empirically testing more and more Turing machines, and seeing how they perform on an NP-complete problem. One might think of plotting their running times as a function of n for increasingly large n. For a while a particular Turing machine might be the winner. But then another one might take over. And there might be no end to how many “surprises” would occur as one increases n. (Somehow this is reminiscent of the story of the Skewes number and whether LogIntegral[n] > Prime[n].)

In computational complexity theory one usually thinks about explicitly constructing optimal algorithms by standard “engineering-like” methods. But I think there’s a lot to be learned from a more empirical approach—in which one doesn’t try to construct optimal algorithms, but just finds them “in the wild” by searching all possible programs. In the past, it might not have seemed that “just searching for programs” would ever produce anything terribly interesting. But one of the big consequences of what I discussed in A New Kind of Science is that even among tiny programs—small enough that one can, for example, enumerate all of them—there’s often very complex and potentially “useful” behavior. And that makes it seem much more reasonable to try to do “empirical computational complexity theory”—enumerating possible programs to find optimal ones, and so on.

Small programs can be thought of as ones with low algorithmic complexity. So searching for “fast programs” among these can be thought of as searching for programs with low time complexity, and low algorithmic complexity. We don’t know exactly how strong the constraint of low algorithmic complexity is, but from what I’ve seen in the computational universe (and what’s embodied in things like the Principle of Computational Equivalence), it seems as if it’s not such a big constraint.

I studied “empirical computational complexity theory” a bit in A New Kind of Science, notably for Turing machines. And one of the interesting observations was that the optimal algorithm for things was often not something that could readily be constructed in a step-by-step engineering way. Instead, it was something that one basically could only find pretty much by doing a search of possible programs—and where there usually didn’t seem to be a “general form” that would “apply for all n”, and let one readily deduce the properties of the n   limit. In other words, it didn’t seem like what we’d now think of as the sequence of paths in rulial space would show any sign of converging to a “continuum limit”.

A decent example of all this occurs in sorting networks. Imagine that you are given a collection of n numbers to sort. You can straightforwardly do this by making about n2 pairwise comparisons, and it’s pretty easy to optimize this a bit.

But explicit searches have revealed that the actual optimal networks for successive n are:

Table
&#10005

Cell[CellGroupData[{
Cell[BoxData[{
 RowBox[{
  RowBox[{"CloudGet", "[", 
   RowBox[{
   "CloudObject", "[", 
    "\"\<https://www.wolframcloud.com/obj/wolframphysics/Bulletin/\
SortingNetworks.wl\>\"", "]"}], "]"}], ";"}], "\[IndentingNewLine]", 
 RowBox[{
  RowBox[{"NetworkGraphics", "[", 
   RowBox[{"net_", ",", "seq_", ",", "opts___"}], "]"}], ":=", 
  RowBox[{"Module", "[", 
   RowBox[{
    RowBox[{"{", 
     RowBox[{
      RowBox[{"n", "=", 
       RowBox[{"Max", "[", "net", "]"}]}], ",", 
      RowBox[{"net1", "=", 
       RowBox[{"Flatten", "[", 
        RowBox[{"net", ",", "1"}], "]"}]}], ",", "len"}], "}"}], ",", 
    "\[IndentingNewLine]", 
    RowBox[{
     RowBox[{"len", "=", 
      RowBox[{"Length", "[", "net1", "]"}]}], ";", 
     "\[IndentingNewLine]", 
     RowBox[{"Graphics", "[", 
      RowBox[{
       RowBox[{"{", 
        RowBox[{
         RowBox[{"GrayLevel", "[", "0.8", "]"}], ",", 
         RowBox[{"Map", "[", 
          RowBox[{"Reverse", ",", 
           RowBox[{"If", "[", 
            RowBox[{
             RowBox[{"seq", "===", "None"}], ",", 
             RowBox[{"Table", "[", 
              RowBox[{
               RowBox[{"Line", "[", 
                RowBox[{"{", 
                 RowBox[{
                  RowBox[{"{", 
                   RowBox[{"0", ",", "y"}], "}"}], ",", 
                  RowBox[{"{", 
                   RowBox[{
                    RowBox[{"len", "+", "1"}], ",", "y"}], "}"}]}], 
                 "}"}], "]"}], ",", 
               RowBox[{"{", 
                RowBox[{"y", ",", "n"}], "}"}]}], "]"}], ",", 
             RowBox[{"MapIndexed", "[", 
              RowBox[{
               RowBox[{
                RowBox[{"{", 
                 RowBox[{
                  RowBox[{"Thickness", "[", 
                   RowBox[{"0.1", "/", 
                    RowBox[{"Length", "[", 
                    RowBox[{"First", "[", "seq", "]"}], "]"}]}], 
                   "]"}], ",", 
                  RowBox[{
                   RowBox[{"ColorData", "[", "\"\<Rainbow\>\"", "]"}],
                    "[", 
                   RowBox[{
                    RowBox[{"#", "[", 
                    RowBox[{"[", "1", "]"}], "]"}], "/", "n"}], "]"}],
                   ",", 
                  RowBox[{"Line", "[", 
                   RowBox[{"{", 
                    RowBox[{
                    RowBox[{"{", 
                    RowBox[{
                    RowBox[{"#", "[", 
                    RowBox[{"[", 
                    RowBox[{"2", ",", "1"}], "]"}], "]"}], ",", 
                    RowBox[{"#2", "[", 
                    RowBox[{"[", "1", "]"}], "]"}]}], "}"}], ",", 
                    RowBox[{"{", 
                    RowBox[{
                    RowBox[{"#", "[", 
                    RowBox[{"[", 
                    RowBox[{"2", ",", "2"}], "]"}], "]"}], ",", 
                    RowBox[{"#2", "[", 
                    RowBox[{"[", "1", "]"}], "]"}]}], "}"}]}], "}"}], 
                   "]"}]}], "}"}], "&"}], ",", 
               RowBox[{"Map", "[", 
                RowBox[{
                 RowBox[{"Function", "[", 
                  RowBox[{"x", ",", 
                   RowBox[{"With", "[", 
                    RowBox[{
                    RowBox[{"{", 
                    RowBox[{"lengths", "=", 
                    RowBox[{"Length", "/@", 
                    RowBox[{"Split", "[", "x", "]"}]}]}], "}"}], ",", 
                    
                    RowBox[{
                    RowBox[{
                    RowBox[{"{", 
                    RowBox[{
                    RowBox[{"#", "[", 
                    RowBox[{"[", "1", "]"}], "]"}], ",", 
                    RowBox[{"{", 
                    RowBox[{
                    RowBox[{
                    RowBox[{"#", "[", 
                    RowBox[{"[", "3", "]"}], "]"}], "-", 
                    RowBox[{"#", "[", 
                    RowBox[{"[", "2", "]"}], "]"}]}], ",", 
                    RowBox[{"#", "[", 
                    RowBox[{"[", "3", "]"}], "]"}]}], "}"}]}], "}"}], 
                    "&"}], "/@", 
                    RowBox[{"Thread", "[", 
                    RowBox[{"{", 
                    RowBox[{
                    RowBox[{"Map", "[", 
                    RowBox[{"First", ",", 
                    RowBox[{"Split", "[", "x", "]"}]}], "]"}], ",", 
                    "lengths", ",", 
                    RowBox[{"Accumulate", "[", "lengths", "]"}]}], 
                    "}"}], "]"}]}]}], "]"}]}], "]"}], ",", 
                 RowBox[{"Transpose", "[", "seq", "]"}]}], "]"}], ",", 
               RowBox[{"{", 
                RowBox[{"-", "3"}], "}"}]}], "]"}]}], "]"}]}], "]"}], 
         ",", 
         RowBox[{"{", 
          RowBox[{"Black", ",", 
           RowBox[{"If", "[", 
            RowBox[{
             RowBox[{"seq", "=!=", "None"}], ",", 
             RowBox[{"Thickness", "[", 
              RowBox[{"0.1", "/", 
               RowBox[{"Length", "[", 
                RowBox[{"First", "[", "seq", "]"}], "]"}]}], "]"}], 
             ",", 
             RowBox[{"{", "}"}]}], "]"}], ",", 
           RowBox[{"MapIndexed", "[", 
            RowBox[{
             RowBox[{
              RowBox[{"Line", "[", 
               RowBox[{"{", 
                RowBox[{
                 RowBox[{"{", 
                  RowBox[{
                   RowBox[{"#2", "[", 
                    RowBox[{"[", "1", "]"}], "]"}], ",", 
                   RowBox[{"#1", "[", 
                    RowBox[{"[", "1", "]"}], "]"}]}], "}"}], ",", 
                 RowBox[{"{", 
                  RowBox[{
                   RowBox[{"#2", "[", 
                    RowBox[{"[", "1", "]"}], "]"}], ",", 
                   RowBox[{"#1", "[", 
                    RowBox[{"[", "2", "]"}], "]"}]}], "}"}]}], "}"}], 
               "]"}], "&"}], ",", "net1", ",", 
             RowBox[{"{", 
              RowBox[{"-", "2"}], "}"}]}], "]"}]}], "}"}]}], "}"}], 
       ",", "opts", ",", 
       RowBox[{"PlotRange", "\[Rule]", "All"}], ",", 
       RowBox[{"ImageSize", "\[Rule]", "450"}], ",", 
       RowBox[{"AspectRatio", "\[Rule]", 
        RowBox[{"1", "/", "2"}]}]}], "]"}]}]}], "]"}]}]}], "Input"],

Cell[BoxData[
 RowBox[{"Table", "[", 
  RowBox[{
   RowBox[{"Show", "[", 
    RowBox[{
     RowBox[{"NetworkGraphics", "[", 
      RowBox[{
       RowBox[{"OptimalSort", "[", "n", "]"}], ",", "None"}], "]"}], 
     ",", 
     RowBox[{"ImageSize", "\[Rule]", 
      RowBox[{"{", 
       RowBox[{"Automatic", ",", "70"}], "}"}]}]}], "]"}], ",", 
   RowBox[{"{", 
    RowBox[{"n", ",", "4", ",", "16"}], "}"}]}], "]"}]], "Input"]
}, Open  ]]

What’s notable is how complicated and “random” they look; there doesn’t seem to be any obvious pattern to them (and my guess is that there fundamentally isn’t). Here’s a plot of the sizes of these networks (divided by n2):

ListLinePlot
&#10005

ListLinePlot[{1, 3, 5, 9, 12, 16, 19, 25, 29, 35, 39, 45, 51, 56, 60}/
  Range[2, 16]^2, AspectRatio -> 1/3, DataRange -> {2, 16}, 
 Filling -> Axis, Frame -> True, Mesh -> All, MeshStyle -> Tiny, 
 PlotRange -> {{1.5, 16.5}, Automatic}, 
 PlotStyle -> 
  ResourceFunction["WolframPhysicsProjectStyleData"][
   "GenericLinePlot", "PlotStyles"]]

It’s worth noting that these are deterministic networks. One could also imagine non-deterministic networks (and indeed one could construct a rulial multiway graph by considering all possible successive placements of pairwise comparisons)—and in a non-deterministic network it’s always possible to sort n numbers in at most n – 1 steps.

The Space of Deterministic Turing Machine Computations

We’ve just seen how the results of deterministic Turing machine computations lay out in the rulial multiway space of all possible non-deterministic Turing machine computations. But what happens if we just look at the graph of deterministic Turing machine computations on their own?

Here are the full rulial multiway graphs for 2 and 3 steps with the graphs of deterministic Turing machine computations superimposed, as before:

Table
&#10005

CloudGet[CloudObject[
  "https://www.wolframcloud.com/obj/wolframphysics/Bulletin/DeltaTM.\
wl"]]; Table[
 With[{g = 
    ResourceFunction["MultiwayTuringMachine"][
     AllDeltaTMRules[{2, 2}], {{1, t + 1, 0}, 
      ConstantArray[0, 2 t + 1]}, t, "StatesGraphStructure"]}, 
  HighlightGraph[g, 
   Style[PathGraph[
       Rule @@@ 
        Partition[
         ToString /@ 
          TuringMachine[#, {{1, t + 1, 0}, Table[0, 2 t + 1]}, t], 2, 
         1]], Thick, Red] & /@ Range[0, 4095]]], {t, 2, 3}]

But now let’s “pull out just the red subgraphs”—in other words, include as nodes only those configurations that at least one of the 4096 s = 2, k = 2 Turing machines can reach after 2 or 3 steps:

Table
&#10005

Table[SimpleGraph[
  Flatten@Table[
    DirectedEdge @@@ 
     Partition[
      TuringMachine[tm, {{1, t + 1, 0}, ConstantArray[0, 2 t + 1]}, 
       t], 2, 1], {tm, 0, 4095}], ImageSize -> 300, 
  EdgeStyle -> RGBColor[0.92, 0.17, 0.24]], {t, 2, 3}]

Notice that after 2 steps, deterministic Turing machines can still reach all 36 configurations that non-deterministic ones can reach (though not through quite as many paths). But after 3 steps, among all the deterministic Turing machines, they can only reach 68 possible configurations, while non-deterministic ones can reach 100 configurations.

For all possible non-deterministic Turing machines with s = 2, k = 2 the total number of configurations that can be reached eventually roughly doubles on successive steps:

VertexCount
&#10005

CloudGet[CloudObject[
  "https://www.wolframcloud.com/obj/wolframphysics/Bulletin/DeltaTM.\
wl"]]; ParallelTable[
 VertexCount[
  ResourceFunction["MultiwayTuringMachine"][
   AllDeltaTMRules[{2, 2}], {{1, t + 1, 0}, 
    ConstantArray[0, 2 t + 1]}, t, "StatesGraphStructure"]], {t, 0, 
  10}]

For deterministic Turing machines, however, the number of possible configurations that can be reached soon increases much more slowly:

ParallelTable
&#10005

ParallelTable[
 If[t == 0, 1, 
  VertexCount[
   Graph[Flatten@
     Table[DirectedEdge @@@ 
       Partition[
        TuringMachine[tm, {{1, t + 1, 0}, Table[0, 2 t + 1]}, t], 2, 
        1], {tm, 0, 4095}]]]], {t, 0, 15}]

And in fact there’s an obvious bound here: at any given step, the most that can happen is that each of the 4096 s = 2, k = 2 Turing machines leads to a new configuration—or, in other words, the maximum number of configurations reached increases by 4096.

Looking at the differences on successive steps, we find:

data = Block
&#10005

Cell[CellGroupData[{
Cell[BoxData[
 RowBox[{
  RowBox[{"data", "=", 
   RowBox[{"Block", "[", 
    RowBox[{
     RowBox[{"{", 
      RowBox[{
       RowBox[{"t", "=", "200"}], ",", "rr"}], "}"}], ",", 
     "\[IndentingNewLine]", 
     RowBox[{
      RowBox[{"rr", "=", 
       RowBox[{"Table", "[", 
        RowBox[{
         RowBox[{"Rule", "@@@", 
          RowBox[{"Partition", "[", 
           RowBox[{
            RowBox[{"TuringMachine", "[", 
             RowBox[{"tm", ",", 
              RowBox[{"{", 
               RowBox[{
                RowBox[{"{", 
                 RowBox[{"1", ",", 
                  RowBox[{"t", "+", "1"}], ",", "0"}], "}"}], ",", 
                RowBox[{"ConstantArray", "[", 
                 RowBox[{"0", ",", 
                  RowBox[{
                   RowBox[{"2", "t"}], "+", "1"}]}], "]"}]}], "}"}], 
              ",", "t"}], "]"}], ",", "2", ",", "1"}], "]"}]}], ",", 
         RowBox[{"{", 
          RowBox[{"tm", ",", "0", ",", "4095"}], "}"}]}], "]"}]}], 
      ";", "\[IndentingNewLine]", 
      RowBox[{"Table", "[", 
       RowBox[{
        RowBox[{"VertexCount", "[", 
         RowBox[{"Flatten", "[", 
          RowBox[{"Take", "[", 
           RowBox[{"rr", ",", "All", ",", "u"}], "]"}], "]"}], "]"}], 
        ",", 
        RowBox[{"{", 
         RowBox[{"u", ",", "t"}], "}"}]}], "]"}]}]}], "]"}]}], 
  ";"}]], "Input"],

Cell[BoxData[{
 RowBox[{
  RowBox[{"data", "=", 
   RowBox[{"{", 
    RowBox[{
    "9", ",", "36", ",", "68", ",", "94", ",", "144", ",", "248", ",",
      "322", ",", "382", ",", "458", ",", "559", ",", "659", ",", 
     "737", ",", "823", ",", "921", ",", "1007", ",", "1091", ",", 
     "1189", ",", "1303", ",", "1399", ",", "1483", ",", "1575", ",", 
     "1689", ",", "1793", ",", "1870", ",", "1950", ",", "2050", ",", 
     "2146", ",", "2234", ",", "2340", ",", "2456", ",", "2550", ",", 
     "2638", ",", "2730", ",", "2840", ",", "2948", ",", "3036", ",", 
     "3128", ",", "3238", ",", "3332", ",", "3417", ",", "3515", ",", 
     "3629", ",", "3727", ",", "3807", ",", "3901", ",", "4017", ",", 
     "4123", ",", "4205", ",", "4289", ",", "4395", ",", "4493", ",", 
     "4583", ",", "4689", ",", "4799", ",", "4889", ",", "4969", ",", 
     "5055", ",", "5165", ",", "5275", ",", "5368", ",", "5460", ",", 
     "5568", ",", "5658", ",", "5738", ",", "5838", ",", "5954", ",", 
     "6052", ",", "6134", ",", "6228", ",", "6346", ",", "6454", ",", 
     "6546", ",", "6638", ",", "6746", ",", "6846", ",", "6934", ",", 
     "7040", ",", "7156", ",", "7250", ",", "7330", ",", "7416", ",", 
     "7526", ",", "7638", ",", "7725", ",", "7817", ",", "7927", ",", 
     "8017", ",", "8103", ",", "8205", ",", "8321", ",", "8419", ",", 
     "8507", ",", "8605", ",", "8717", ",", "8823", ",", "8913", ",", 
     "9001", ",", "9105", ",", "9199", ",", "9285", ",", "9387", ",", 
     "9509", ",", "9605", ",", "9683", ",", "9773", ",", "9889", ",", 
     "10003", ",", "10093", ",", "10187", ",", "10297", ",", "10389", 
     ",", "10476", ",", "10576", ",", "10682", ",", "10774", ",", 
     "10856", ",", "10946", ",", "11052", ",", "11152", ",", "11236", 
     ",", "11322", ",", "11430", ",", "11530", ",", "11618", ",", 
     "11726", ",", "11842", ",", "11936", ",", "12018", ",", "12108", 
     ",", "12224", ",", "12336", ",", "12428", ",", "12524", ",", 
     "12634", ",", "12730", ",", "12818", ",", "12920", ",", "13034", 
     ",", "13132", ",", "13216", ",", "13308", ",", "13426", ",", 
     "13532", ",", "13615", ",", "13701", ",", "13807", ",", "13903", 
     ",", "13991", ",", "14097", ",", "14213", ",", "14305", ",", 
     "14391", ",", "14483", ",", "14593", ",", "14703", ",", "14793", 
     ",", "14887", ",", "14999", ",", "15095", ",", "15185", ",", 
     "15289", ",", "15407", ",", "15509", ",", "15591", ",", "15685", 
     ",", "15799", ",", "15903", ",", "15987", ",", "16073", ",", 
     "16177", ",", "16275", ",", "16369", ",", "16479", ",", "16593", 
     ",", "16687", ",", "16771", ",", "16863", ",", "16977", ",", 
     "17089", ",", "17180", ",", "17272", ",", "17382", ",", "17474", 
     ",", "17554", ",", "17654", ",", "17770", ",", "17868", ",", 
     "17948", ",", "18042", ",", "18160", ",", "18268", ",", "18360", 
     ",", "18450", ",", "18552", ",", "18646", ",", "18734", ",", 
     "18838", ",", "18954", ",", "19048", ",", "19134"}], "}"}]}], 
  ";"}], "\[IndentingNewLine]", 
 RowBox[{"ListLinePlot", "[", 
  RowBox[{
   RowBox[{"Differences", "[", "data", "]"}], ",", 
   RowBox[{"Frame", "\[Rule]", "True"}], ",", 
   RowBox[{"AspectRatio", "\[Rule]", 
    RowBox[{"1", "/", "3"}]}], ",", 
   RowBox[{"Filling", "\[Rule]", "Axis"}], ",", 
   RowBox[{"PlotStyle", "\[Rule]", 
    RowBox[{
     RowBox[{
     "ResourceFunction", "[", 
      "\"\<WolframPhysicsProjectStyleData\>\"", "]"}], "[", 
     RowBox[{"\"\<GenericLinePlot\>\"", ",", "\"\<PlotStyles\>\""}], 
     "]"}]}]}], "]"}]}], "Input"]
}, Open  ]]

In other words, among all 4096 Turing machines, about 100 “novel configurations” are reached at each successive step. (The actual sequence here looks surprisingly random; it’s not clear whether there’s any particular regularity.)

Now let’s look at the actual graphs formed. With 4 through 7 steps we get:

Table
&#10005

Table[SimpleGraph[
  Flatten@Table[
    DirectedEdge @@@ 
     Partition[
      TuringMachine[tm, {{1, t + 1, 0}, ConstantArray[0, 2 t + 1]}, 
       t], 2, 1], {tm, 0, 4095}], 
  EdgeStyle -> RGBColor[0.92, 0.17, 0.24]], {t, 4, 7}]

After 10 and 20 steps the results are:

ParallelTable
&#10005

ParallelTable[
 SimpleGraph[
  Flatten@Table[
    DirectedEdge @@@ 
     Partition[
      TuringMachine[tm, {{1, t + 1, 0}, ConstantArray[0, 2 t + 1]}, 
       t], 2, 1], {tm, 0, 4095}], 
  EdgeStyle -> RGBColor[0.92, 0.17, 0.24], 
  VertexStyle -> Darker[RGBColor[0.92, 0.17, 0.24], 0.4], 
  ImageSize -> 250], {t, {10, 20}}]

Here is the result after 50 steps:

big = SimpleGraph
&#10005

big = SimpleGraph[
  With[{t = 50}, 
   Flatten@Table[
     DirectedEdge @@@ 
      Partition[
       TuringMachine[tm, {{1, t + 1, 0}, ConstantArray[0, 2 t + 1]}, 
        t], 2, 1], {tm, 0, 4095}]], 
  EdgeStyle -> RGBColor[0.92, 0.17, 0.24], 
  VertexStyle -> Darker[RGBColor[0.92, 0.17, 0.24], 0.4], 
  VertexSize -> Tiny, 
  GraphLayout -> {"SpringElectricalEmbedding", 
    "InferentialDistance" -> 200, "StepControl" -> "NonMonotonic"}]

There’s a surprising amount of structure in these graphs. There’s a “central region” near the initial blank-tape configuration (shown highlighted below) in which many different Turing machines end up visiting the same configurations:

With
&#10005

With[{big = 
   SimpleGraph[
    With[{t = 50}, 
     Flatten@Table[
       DirectedEdge @@@ 
        Partition[
         TuringMachine[tm, {{1, t + 1, 0}, ConstantArray[0, 2 t + 1]},
           t], 2, 1], {tm, 0, 4095}]], 
    EdgeStyle -> RGBColor[0.92, 0.17, 0.24], 
    VertexStyle -> Darker[RGBColor[0.92, 0.17, 0.24], 0.4], 
    VertexSize -> Tiny, 
    GraphLayout -> {"SpringElectricalEmbedding", 
      "InferentialDistance" -> 200, 
      "StepControl" -> "NonMonotonic"}]}, 
 HighlightGraph[big, Style[First[VertexList[big]], PointSize[0.04]], 
  PlotRange -> {{55, 85}, {50, 80}}]]

Here’s a 3D rendering of this region:

With
&#10005

With[{big = 
   SimpleGraph[
    With[{t = 50}, 
     Flatten@Table[
       DirectedEdge @@@ 
        Partition[
         TuringMachine[tm, {{1, t + 1, 0}, ConstantArray[0, 2 t + 1]},
           t], 2, 1], {tm, 0, 4095}]], 
    EdgeStyle -> RGBColor[0.92, 0.17, 0.24], 
    VertexStyle -> Darker[RGBColor[0.92, 0.17, 0.24], 0.4], 
    VertexSize -> Tiny, 
    GraphLayout -> {"SpringElectricalEmbedding", 
      "InferentialDistance" -> 200, 
      "StepControl" -> "NonMonotonic"}]}, 
 Graph3D[big, 
  PlotRange -> {{50.32304, 70.32304}, {43.796, 63.796}, {30.87617, 
     50.87617}}, Boxed -> True]]

But away from this region there end up being “spokes” (about 100 of them) corresponding to Turing machines that “independently explore new territory” in the space of configurations.

What are those “configurations on the edge” like? Here are sorted collections of them for the first few steps:

Table
&#10005

Table[Labeled[
  With[{g = 
     SimpleGraph[
      Flatten@Table[
        DirectedEdge @@@ 
         Partition[
          TuringMachine[
           tm, {{1, t + 1, 0}, ConstantArray[0, 2 t + 1]}, t], 2, 
          1], {tm, 0, 4095}]]}, 
   RulePlot[TuringMachine[2506], 
    Sort[Select[VertexList[g], VertexOutDegree[g, #] == 0 &]], 
    Mesh -> All, Frame -> None]], Style[Text[t], 10]], {t, 2, 5}]

For comparison, here is the result for all configurations that can be reached by non-deterministic Turing machines after just 2 steps:

RulePlot[TuringMachine[2506]
&#10005

CloudGet[CloudObject[
  "https://www.wolframcloud.com/obj/wolframphysics/Bulletin/DeltaTM.\
wl"]]; RulePlot[TuringMachine[2506], 
 With[{t = 2}, 
  ToExpression /@ 
   VertexList[
    ResourceFunction["MultiwayTuringMachine"][
     AllDeltaTMRules[{2, 2}], {{1, t + 1, 0}, 
      ConstantArray[0, 2 t + 1]}, t, "StatesGraphStructure"]]], 
 Mesh -> All, Frame -> None]

Here are the results for deterministic Turing machines after more steps:

ParallelTable
&#10005

ParallelTable[
 Labeled[With[{g = 
     SimpleGraph[
      Flatten@Table[
        DirectedEdge @@@ 
         Partition[
          TuringMachine[
           tm, {{1, t + 1, 0}, ConstantArray[0, 2 t + 1]}, t], 2, 
          1], {tm, 0, 4095}]]}, 
   RulePlot[TuringMachine[2506], 
    Sort[Select[VertexList[g], VertexOutDegree[g, #] == 0 &]]]], 
  Style[Text[t], 10]], {t, 10, 50, 10}]

We can also ask which machines are the ones that typically “explore new territory”. Here’s the result for 30 steps:

Keys
&#10005

Cell[CellGroupData[{
Cell[BoxData[
 RowBox[{"With", "[", 
  RowBox[{
   RowBox[{"{", 
    RowBox[{"t", "=", "30"}], "}"}], ",", 
   RowBox[{"Module", "[", 
    RowBox[{
     RowBox[{"{", 
      RowBox[{
       RowBox[{"g", "=", 
        RowBox[{"SimpleGraph", "[", 
         RowBox[{"Flatten", "@", 
          RowBox[{"Table", "[", 
           RowBox[{
            RowBox[{"DirectedEdge", "@@@", 
             RowBox[{"Partition", "[", 
              RowBox[{
               RowBox[{"TuringMachine", "[", 
                RowBox[{"tm", ",", 
                 RowBox[{"{", 
                  RowBox[{
                   RowBox[{"{", 
                    RowBox[{"1", ",", 
                    RowBox[{"t", "+", "1"}], ",", "0"}], "}"}], ",", 
                   RowBox[{"Table", "[", 
                    RowBox[{"0", ",", 
                    RowBox[{
                    RowBox[{"2", "t"}], "+", "1"}]}], "]"}]}], "}"}], 
                 ",", "t"}], "]"}], ",", "2", ",", "1"}], "]"}]}], 
            ",", 
            RowBox[{"{", 
             RowBox[{"tm", ",", "0", ",", "4095"}], "}"}]}], "]"}]}], 
         "]"}]}], ",", 
       RowBox[{"allstates", "=", 
        RowBox[{"Table", "[", 
         RowBox[{
          RowBox[{"TuringMachine", "[", 
           RowBox[{"tm", ",", 
            RowBox[{"{", 
             RowBox[{
              RowBox[{"{", 
               RowBox[{"1", ",", 
                RowBox[{"t", "+", "1"}], ",", "0"}], "}"}], ",", 
              RowBox[{"Table", "[", 
               RowBox[{"0", ",", 
                RowBox[{
                 RowBox[{"2", "t"}], "+", "1"}]}], "]"}]}], "}"}], 
            ",", "t"}], "]"}], ",", 
          RowBox[{"{", 
           RowBox[{"tm", ",", "0", ",", "4095"}], "}"}]}], "]"}]}], 
       ",", "tms"}], "}"}], ",", 
     RowBox[{
      RowBox[{"tms", "=", 
       RowBox[{"Map", "[", 
        RowBox[{
         RowBox[{
          RowBox[{"Position", "[", 
           RowBox[{"allstates", ",", "#"}], "]"}], "&"}], ",", 
         RowBox[{"Select", "[", 
          RowBox[{
           RowBox[{"VertexList", "[", "g", "]"}], ",", 
           RowBox[{
            RowBox[{
             RowBox[{"VertexOutDegree", "[", 
              RowBox[{"g", ",", "#"}], "]"}], "\[Equal]", "0"}], 
            "&"}]}], "]"}]}], "]"}]}], ";", 
      RowBox[{
       RowBox[{
        RowBox[{"(", 
         RowBox[{
          RowBox[{"#", "[", 
           RowBox[{"[", 
            RowBox[{"1", ",", "1"}], "]"}], "]"}], "-", "1"}], ")"}], 
        "&"}], "/@", 
       RowBox[{"tms", "[", 
        RowBox[{"[", 
         RowBox[{
          RowBox[{"Position", "[", 
           RowBox[{
            RowBox[{"Length", "/@", "tms"}], ",", "1"}], "]"}], "//", 
          "Flatten"}], "]"}], "]"}]}]}]}], "]"}]}], "]"}]], "Input"],

Cell[BoxData[
 RowBox[{"Keys", "[", 
  RowBox[{"ReverseSort", "[", 
   RowBox[{"Counts", "[", 
    RowBox[{
     RowBox[{
      RowBox[{"RulePlot", "[", 
       RowBox[{
        RowBox[{"TuringMachine", "[", "#", "]"}], ",", 
        RowBox[{"{", 
         RowBox[{"1", ",", 
          RowBox[{"{", 
           RowBox[{
            RowBox[{"{", "}"}], ",", "0"}], "}"}]}], "}"}], ",", "9", 
        ",", 
        RowBox[{"ImageSize", "\[Rule]", 
         RowBox[{"{", 
          RowBox[{"Automatic", ",", "45"}], "}"}]}], ",", 
        RowBox[{"FrameStyle", "\[Rule]", "LightGray"}]}], "]"}], 
      "&"}], "/@", 
     RowBox[{"{", 
      RowBox[{
      "378", ",", "391", ",", "407", ",", "819", ",", "974", ",", 
       "990", ",", "1331", ",", "1402", ",", "1415", ",", "1431", ",",
        "1439", ",", "1482", ",", "1498", ",", "1506", ",", "1514", 
       ",", "1520", ",", "1528", ",", "1530", ",", "1843", ",", 
       "1914", ",", "1923", ",", "1939", ",", "1955", ",", "1963", 
       ",", "1969", ",", "1971", ",", "1977", ",", "1998", ",", 
       "2006", ",", "2014", ",", "2426", ",", "2451", ",", "2455", 
       ",", "2498", ",", "2506", ",", "2514", ",", "2518", ",", 
       "2522", ",", "2530", ",", "2538", ",", "2546", ",", "2554", 
       ",", "2867", ",", "2947", ",", "2955", ",", "2963", ",", 
       "2971", ",", "2975", ",", "2979", ",", "2987", ",", "2995", 
       ",", "3003", ",", "3034", ",", "3038", ",", "3459", ",", 
       "3479", ",", "3499", ",", "3522", ",", "3530", ",", "3538", 
       ",", "3540", ",", "3554", ",", "3562", ",", "3570", ",", 
       "3578", ",", "3971", ",", "3979", ",", "3995", ",", "3997", 
       ",", "4003", ",", "4011", ",", "4019", ",", "4027", ",", 
       "4042", ",", "4062", ",", "4066"}], "}"}]}], "]"}], "]"}], 
  "]"}]], "Input"]
}, Open  ]]

As we go to more steps, the graph of configurations that can be reached by deterministic Turing machines grows. But does at least the core of it reach some kind of limit after sufficiently many steps? We can get a sense of this by looking—as we have done so many times before—at the growth rate of the geodesic ball in the graph starting from the initial blank-tape configuration. The total number of new configurations that can be reached on each new layer of the geodesic ball is at most 4096—and in reality it’s much smaller. Here are the numbers of new configurations added on successive layers at steps 100, 200, …, 500 in the overall evolution:

ListLinePlot
&#10005

Cell[CellGroupData[{
	Cell[BoxData[
 RowBox[{
  RowBox[{"data", "=", 
   RowBox[{
    RowBox[{
    "ResourceFunction", "[", "\"\<ParallelMapMonitored\>\"", "]"}], 
    "[", 
    RowBox[{
     RowBox[{
      RowBox[{"With", "[", 
       RowBox[{
        RowBox[{"{", 
         RowBox[{"t", "=", "#"}], "}"}], ",", 
        RowBox[{"Differences", "[", 
         RowBox[{"First", "[", 
          RowBox[{
           RowBox[{
            RowBox[{"Values", "[", 
             RowBox[{
              RowBox[{
              "ResourceFunction", "[", 
               "\"\<GraphNeighborhoodVolumes\>\"", "]"}], "[", 
              RowBox[{"#", ",", 
               RowBox[{"{", 
                RowBox[{"{", 
                 RowBox[{
                  RowBox[{"{", 
                   RowBox[{"1", ",", 
                    RowBox[{"t", "+", "1"}], ",", "0"}], "}"}], ",", 
                  RowBox[{"ConstantArray", "[", 
                   RowBox[{"0", ",", 
                    RowBox[{
                    RowBox[{"2", "t"}], "+", "1"}]}], "]"}]}], "}"}], 
                "}"}]}], "]"}], "]"}], "&"}], "[", 
           RowBox[{"Graph", "[", 
            RowBox[{"Flatten", "@", 
             RowBox[{"ParallelTable", "[", 
              RowBox[{
               RowBox[{"DirectedEdge", "@@@", 
                RowBox[{"Partition", "[", 
                 RowBox[{
                  RowBox[{"TuringMachine", "[", 
                   RowBox[{"tm", ",", 
                    RowBox[{"{", 
                    RowBox[{
                    RowBox[{"{", 
                    RowBox[{"1", ",", 
                    RowBox[{"t", "+", "1"}], ",", "0"}], "}"}], ",", 
                    RowBox[{"ConstantArray", "[", 
                    RowBox[{"0", ",", 
                    RowBox[{
                    RowBox[{"2", "t"}], "+", "1"}]}], "]"}]}], "}"}], 
                    ",", "t"}], "]"}], ",", "2", ",", "1"}], "]"}]}], 
               ",", 
               RowBox[{"{", 
                RowBox[{"tm", ",", "0", ",", "4095"}], "}"}]}], 
              "]"}]}], "]"}], "]"}], "]"}], "]"}]}], "]"}], "&"}], 
     ",", 
     RowBox[{"Range", "[", 
      RowBox[{"100", ",", "500", ",", "100"}], "]"}]}], "]"}]}], 
  ";"}]], "Input"],

Cell[BoxData[
 RowBox[{
  RowBox[{"data", "=", 
   RowBox[{"{", 
    RowBox[{
     RowBox[{"{", 
      RowBox[{
      "8", ",", "27", ",", "56", ",", "88", ",", "110", ",", "148", 
       ",", "166", ",", "177", ",", "196", ",", "198", ",", "200", 
       ",", "198", ",", "190", ",", "190", ",", "186", ",", "187", 
       ",", "186", ",", "186", ",", "176", ",", "176", ",", "170", 
       ",", "170", ",", "162", ",", "164", ",", "158", ",", "158", 
       ",", "150", ",", "149", ",", "144", ",", "146", ",", "136", 
       ",", "138", ",", "134", ",", "138", ",", "124", ",", "122", 
       ",", "104", ",", "106", ",", "94", ",", "100", ",", "96", ",", 
       "95", ",", "88", ",", "92", ",", "90", ",", "94", ",", "88", 
       ",", "92", ",", "88", ",", "92", ",", "76", ",", "64", ",", 
       "54", ",", "56", ",", "54", ",", "54", ",", "56", ",", "55", 
       ",", "52", ",", "52", ",", "54", ",", "54", ",", "52", ",", 
       "52", ",", "52", ",", "52", ",", "50", ",", "50", ",", "50", 
       ",", "52", ",", "50", ",", "50", ",", "50", ",", "52", ",", 
       "50", ",", "50", ",", "50", ",", "52", ",", "50", ",", "50", 
       ",", "50", ",", "52", ",", "50", ",", "50", ",", "50", ",", 
       "52", ",", "50", ",", "50", ",", "50", ",", "52", ",", "50", 
       ",", "50", ",", "48", ",", "50", ",", "48", ",", "48", ",", 
       "42", ",", "44", ",", "36", ",", "36"}], "}"}], ",", 
     RowBox[{"{", 
      RowBox[{
      "8", ",", "27", ",", "56", ",", "88", ",", "110", ",", "148", 
       ",", "168", ",", "185", ",", "212", ",", "212", ",", "218", 
       ",", "212", ",", "214", ",", "218", ",", "214", ",", "215", 
       ",", "216", ",", "216", ",", "204", ",", "202", ",", "196", 
       ",", "194", ",", "188", ",", "190", ",", "186", ",", "192", 
       ",", "186", ",", "185", ",", "182", ",", "182", ",", "176", 
       ",", "180", ",", "178", ",", "178", ",", "172", ",", "172", 
       ",", "166", ",", "168", ",", "162", ",", "166", ",", "164", 
       ",", "165", ",", "156", ",", "160", ",", "156", ",", "154", 
       ",", "148", ",", "148", ",", "150", ",", "150", ",", "148", 
       ",", "148", ",", "148", ",", "150", ",", "140", ",", "142", 
       ",", "138", ",", "141", ",", "132", ",", "136", ",", "134", 
       ",", "138", ",", "132", ",", "136", ",", "134", ",", "138", 
       ",", "132", ",", "132", ",", "118", ",", "120", ",", "104", 
       ",", "100", ",", "96", ",", "98", ",", "90", ",", "97", ",", 
       "94", ",", "94", ",", "88", ",", "92", ",", "90", ",", "98", 
       ",", "92", ",", "92", ",", "90", ",", "94", ",", "88", ",", 
       "94", ",", "90", ",", "96", ",", "90", ",", "94", ",", "92", 
       ",", "96", ",", "90", ",", "93", ",", "90", ",", "94", ",", 
       "86", ",", "90", ",", "78", ",", "66", ",", "52", ",", "52", 
       ",", "54", ",", "54", ",", "52", ",", "52", ",", "54", ",", 
       "54", ",", "54", ",", "54", ",", "56", ",", "56", ",", "54", 
       ",", "54", ",", "56", ",", "55", ",", "52", ",", "52", ",", 
       "54", ",", "54", ",", "50", ",", "50", ",", "52", ",", "52", 
       ",", "50", ",", "50", ",", "52", ",", "52", ",", "50", ",", 
       "50", ",", "52", ",", "52", ",", "50", ",", "50", ",", "50", 
       ",", "52", ",", "50", ",", "50", ",", "50", ",", "52", ",", 
       "50", ",", "50", ",", "50", ",", "52", ",", "50", ",", "50", 
       ",", "50", ",", "52", ",", "50", ",", "50", ",", "50", ",", 
       "52", ",", "50", ",", "50", ",", "50", ",", "52", ",", "50", 
       ",", "50", ",", "50", ",", "52", ",", "50", ",", "50", ",", 
       "50", ",", "52", ",", "50", ",", "50", ",", "50", ",", "52", 
       ",", "50", ",", "50", ",", "50", ",", "52", ",", "50", ",", 
       "50", ",", "50", ",", "52", ",", "50", ",", "50", ",", "50", 
       ",", "52", ",", "50", ",", "50", ",", "50", ",", "52", ",", 
       "50", ",", "50", ",", "50", ",", "52", ",", "50", ",", "50", 
       ",", "48", ",", "50", ",", "48", ",", "48", ",", "42", ",", 
       "44", ",", "36", ",", "36"}], "}"}], ",", 
     RowBox[{"{", 
      RowBox[{
      "8", ",", "27", ",", "56", ",", "88", ",", "110", ",", "148", 
       ",", "168", ",", "187", ",", "218", ",", "222", ",", "236", 
       ",", "226", ",", "232", ",", "230", ",", "228", ",", "227", 
       ",", "230", ",", "232", ",", "234", ",", "230", ",", "226", 
       ",", "220", ",", "214", ",", "210", ",", "208", ",", "214", 
       ",", "210", ",", "209", ",", "204", ",", "202", ",", "196", 
       ",", "198", ",", "198", ",", "198", ",", "190", ",", "188", 
       ",", "182", ",", "184", ",", "176", ",", "178", ",", "176", 
       ",", "177", ",", "168", ",", "172", ",", "168", ",", "170", 
       ",", "164", ",", "166", ",", "164", ",", "168", ",", "162", 
       ",", "166", ",", "164", ",", "170", ",", "164", ",", "168", 
       ",", "166", ",", "169", ",", "162", ",", "166", ",", "162", 
       ",", "164", ",", "156", ",", "160", ",", "156", ",", "154", 
       ",", "148", ",", "148", ",", "150", ",", "148", ",", "148", 
       ",", "148", ",", "150", ",", "150", ",", "148", ",", "147", 
       ",", "148", ",", "148", ",", "140", ",", "142", ",", "136", 
       ",", "138", ",", "130", ",", "134", ",", "132", ",", "136", 
       ",", "130", ",", "134", ",", "132", ",", "138", ",", "132", 
       ",", "136", ",", "134", ",", "138", ",", "132", ",", "135", 
       ",", "132", ",", "136", ",", "130", ",", "134", ",", "132", 
       ",", "128", ",", "110", ",", "110", ",", "98", ",", "104", ",",
        "92", ",", "92", ",", "90", ",", "94", ",", "90", ",", "98", 
       ",", "96", ",", "96", ",", "90", ",", "94", ",", "92", ",", 
       "99", ",", "92", ",", "92", ",", "90", ",", "94", ",", "88", 
       ",", "96", ",", "94", ",", "94", ",", "88", ",", "92", ",", 
       "90", ",", "96", ",", "90", ",", "92", ",", "90", ",", "96", 
       ",", "90", ",", "94", ",", "92", ",", "96", ",", "90", ",", 
       "94", ",", "92", ",", "95", ",", "88", ",", "92", ",", "90", 
       ",", "94", ",", "88", ",", "92", ",", "88", ",", "92", ",", 
       "76", ",", "64", ",", "54", ",", "54", ",", "52", ",", "52", 
       ",", "54", ",", "54", ",", "54", ",", "54", ",", "56", ",", 
       "56", ",", "54", ",", "54", ",", "56", ",", "56", ",", "54", 
       ",", "53", ",", "54", ",", "54", ",", "52", ",", "52", ",", 
       "54", ",", "54", ",", "52", ",", "52", ",", "54", ",", "54", 
       ",", "52", ",", "52", ",", "54", ",", "54", ",", "52", ",", 
       "52", ",", "52", ",", "52", ",", "50", ",", "50", ",", "52", 
       ",", "52", ",", "50", ",", "50", ",", "52", ",", "52", ",", 
       "50", ",", "50", ",", "52", ",", "52", ",", "50", ",", "50", 
       ",", "52", ",", "52", ",", "50", ",", "50", ",", "50", ",", 
       "52", ",", "50", ",", "50", ",", "50", ",", "52", ",", "50", 
       ",", "50", ",", "50", ",", "52", ",", "50", ",", "50", ",", 
       "50", ",", "52", ",", "50", ",", "50", ",", "50", ",", "52", 
       ",", "50", ",", "50", ",", "50", ",", "52", ",", "50", ",", 
       "50", ",", "50", ",", "52", ",", "50", ",", "50", ",", "50", 
       ",", "52", ",", "50", ",", "50", ",", "50", ",", "52", ",", 
       "50", ",", "50", ",", "50", ",", "52", ",", "50", ",", "50", 
       ",", "50", ",", "52", ",", "50", ",", "50", ",", "50", ",", 
       "52", ",", "50", ",", "50", ",", "50", ",", "52", ",", "50", 
       ",", "50", ",", "50", ",", "52", ",", "50", ",", "50", ",", 
       "50", ",", "52", ",", "50", ",", "50", ",", "50", ",", "52", 
       ",", "50", ",", "50", ",", "50", ",", "52", ",", "50", ",", 
       "50", ",", "50", ",", "52", ",", "50", ",", "50", ",", "50", 
       ",", "52", ",", "50", ",", "50", ",", "50", ",", "52", ",", 
       "50", ",", "50", ",", "50", ",", "52", ",", "50", ",", "50", 
       ",", "50", ",", "52", ",", "50", ",", "50", ",", "48", ",", 
       "50", ",", "48", ",", "48", ",", "42", ",", "44", ",", "36", 
       ",", "36"}], "}"}], ",", 
     RowBox[{"{", 
      RowBox[{
      "8", ",", "27", ",", "56", ",", "88", ",", "110", ",", "148", 
       ",", "168", ",", "187", ",", "220", ",", "226", ",", "240", 
       ",", "230", ",", "238", ",", "234", ",", "234", ",", "233", 
       ",", "236", ",", "236", ",", "240", ",", "240", ",", "240", 
       ",", "232", ",", "226", ",", "220", ",", "218", ",", "224", 
       ",", "220", ",", "219", ",", "218", ",", "216", ",", "210", 
       ",", "212", ",", "212", ",", "212", ",", "206", ",", "204", 
       ",", "198", ",", "198", ",", "190", ",", "192", ",", "190", 
       ",", "191", ",", "184", ",", "188", ",", "186", ",", "186", 
       ",", "180", ",", "180", ",", "178", ",", "182", ",", "176", 
       ",", "176", ",", "174", ",", "176", ",", "168", ",", "172", 
       ",", "170", ",", "173", ",", "168", ",", "170", ",", "168", 
       ",", "170", ",", "166", ",", "170", ",", "170", ",", "172", 
       ",", "166", ",", "168", ",", "166", ",", "168", ",", "162", 
       ",", "166", ",", "164", ",", "168", ",", "162", ",", "165", 
       ",", "162", ",", "166", ",", "160", ",", "164", ",", "162", 
       ",", "164", ",", "156", ",", "160", ",", "156", ",", "154", 
       ",", "148", ",", "148", ",", "150", ",", "152", ",", "150", 
       ",", "150", ",", "152", ",", "152", ",", "150", ",", "149", 
       ",", "150", ",", "150", ",", "148", ",", "148", ",", "150", 
       ",", "150", ",", "146", ",", "146", ",", "140", ",", "142", 
       ",", "134", ",", "138", ",", "134", ",", "138", ",", "134", 
       ",", "138", ",", "136", ",", "140", ",", "134", ",", "138", 
       ",", "136", ",", "139", ",", "132", ",", "136", ",", "134", 
       ",", "138", ",", "132", ",", "136", ",", "134", ",", "138", 
       ",", "132", ",", "136", ",", "134", ",", "138", ",", "132", 
       ",", "136", ",", "134", ",", "140", ",", "124", ",", "124", 
       ",", "108", ",", "108", ",", "94", ",", "96", ",", "92", ",", 
       "99", ",", "92", ",", "92", ",", "90", ",", "94", ",", "88", 
       ",", "96", ",", "94", ",", "94", ",", "88", ",", "92", ",", 
       "90", ",", "98", ",", "92", ",", "92", ",", "90", ",", "94", 
       ",", "90", ",", "98", ",", "96", ",", "96", ",", "90", ",", 
       "94", ",", "92", ",", "100", ",", "94", ",", "93", ",", "90", 
       ",", "94", ",", "88", ",", "96", ",", "92", ",", "94", ",", 
       "88", ",", "92", ",", "90", ",", "94", ",", "88", ",", "92", 
       ",", "90", ",", "94", ",", "88", ",", "92", ",", "90", ",", 
       "96", ",", "90", ",", "94", ",", "92", ",", "96", ",", "90", 
       ",", "94", ",", "92", ",", "96", ",", "90", ",", "93", ",", 
       "90", ",", "94", ",", "86", ",", "90", ",", "78", ",", "66", 
       ",", "52", ",", "52", ",", "54", ",", "54", ",", "52", ",", 
       "52", ",", "54", ",", "54", ",", "52", ",", "52", ",", "54", 
       ",", "54", ",", "54", ",", "54", ",", "56", ",", "56", ",", 
       "54", ",", "54", ",", "56", ",", "56", ",", "54", ",", "54", 
       ",", "56", ",", "55", ",", "52", ",", "52", ",", "54", ",", 
       "54", ",", "52", ",", "52", ",", "54", ",", "54", ",", "52", 
       ",", "52", ",", "54", ",", "54", ",", "50", ",", "50", ",", 
       "52", ",", "52", ",", "50", ",", "50", ",", "52", ",", "52", 
       ",", "50", ",", "50", ",", "52", ",", "52", ",", "50", ",", 
       "50", ",", "52", ",", "52", ",", "50", ",", "50", ",", "52", 
       ",", "52", ",", "50", ",", "50", ",", "52", ",", "52", ",", 
       "50", ",", "50", ",", "52", ",", "52", ",", "50", ",", "50", 
       ",", "50", ",", "52", ",", "50", ",", "50", ",", "50", ",", 
       "52", ",", "50", ",", "50", ",", "50", ",", "52", ",", "50", 
       ",", "50", ",", "50", ",", "52", ",", "50", ",", "50", ",", 
       "50", ",", "52", ",", "50", ",", "50", ",", "50", ",", "52", 
       ",", "50", ",", "50", ",", "50", ",", "52", ",", "50", ",", 
       "50", ",", "50", ",", "52", ",", "50", ",", "50", ",", "50", 
       ",", "52", ",", "50", ",", "50", ",", "50", ",", "52", ",", 
       "50", ",", "50", ",", "50", ",", "52", ",", "50", ",", "50", 
       ",", "50", ",", "52", ",", "50", ",", "50", ",", "50", ",", 
       "52", ",", "50", ",", "50", ",", "50", ",", "52", ",", "50", 
       ",", "50", ",", "50", ",", "52", ",", "50", ",", "50", ",", 
       "50", ",", "52", ",", "50", ",", "50", ",", "50", ",", "52", 
       ",", "50", ",", "50", ",", "50", ",", "52", ",", "50", ",", 
       "50", ",", "50", ",", "52", ",", "50", ",", "50", ",", "50", 
       ",", "52", ",", "50", ",", "50", ",", "50", ",", "52", ",", 
       "50", ",", "50", ",", "50", ",", "52", ",", "50", ",", "50", 
       ",", "50", ",", "52", ",", "50", ",", "50", ",", "50", ",", 
       "52", ",", "50", ",", "50", ",", "50", ",", "52", ",", "50", 
       ",", "50", ",", "50", ",", "52", ",", "50", ",", "50", ",", 
       "50", ",", "52", ",", "50", ",", "50", ",", "50", ",", "52", 
       ",", "50", ",", "50", ",", "50", ",", "52", ",", "50", ",", 
       "50", ",", "50", ",", "52", ",", "50", ",", "50", ",", "50", 
       ",", "52", ",", "50", ",", "50", ",", "48", ",", "50", ",", 
       "48", ",", "48", ",", "42", ",", "44", ",", "36", ",", "36"}], 
      "}"}], ",", 
     RowBox[{"{", 
      RowBox[{
      "8", ",", "27", ",", "56", ",", "88", ",", "110", ",", "148", 
       ",", "168", ",", "187", ",", "220", ",", "228", ",", "246", 
       ",", "240", ",", "258", ",", "248", ",", "252", ",", "247", 
       ",", "250", ",", "246", ",", "248", ",", "248", ",", "252", 
       ",", "246", ",", "244", ",", "240", ",", "238", ",", "240", 
       ",", "238", ",", "237", ",", "238", ",", "234", ",", "228", 
       ",", "228", ",", "230", ",", "230", ",", "228", ",", "224", 
       ",", "218", ",", "216", ",", "204", ",", "206", ",", "200", 
       ",", "201", ",", "194", ",", "198", ",", "196", ",", "196", 
       ",", "190", ",", "190", ",", "188", ",", "192", ",", "186", 
       ",", "186", ",", "184", ",", "186", ",", "178", ",", "182", 
       ",", "180", ",", "181", ",", "176", ",", "176", ",", "172", 
       ",", "174", ",", "168", ",", "172", ",", "172", ",", "174", 
       ",", "168", ",", "170", ",", "168", ",", "170", ",", "164", 
       ",", "166", ",", "164", ",", "168", ",", "162", ",", "165", 
       ",", "162", ",", "166", ",", "160", ",", "164", ",", "162", 
       ",", "166", ",", "160", ",", "164", ",", "162", ",", "166", 
       ",", "160", ",", "164", ",", "162", ",", "168", ",", "162", 
       ",", "166", ",", "164", ",", "168", ",", "162", ",", "165", 
       ",", "162", ",", "166", ",", "160", ",", "164", ",", "162", 
       ",", "164", ",", "156", ",", "160", ",", "156", ",", "154", 
       ",", "148", ",", "148", ",", "150", ",", "150", ",", "150", 
       ",", "150", ",", "152", ",", "152", ",", "150", ",", "150", 
       ",", "152", ",", "151", ",", "148", ",", "148", ",", "150", 
       ",", "150", ",", "148", ",", "148", ",", "150", ",", "150", 
       ",", "148", ",", "148", ",", "144", ",", "146", ",", "136", 
       ",", "138", ",", "134", ",", "140", ",", "132", ",", "136", 
       ",", "134", ",", "138", ",", "132", ",", "136", ",", "134", 
       ",", "137", ",", "130", ",", "134", ",", "132", ",", "136", 
       ",", "130", ",", "134", ",", "132", ",", "136", ",", "130", 
       ",", "134", ",", "132", ",", "136", ",", "130", ",", "134", 
       ",", "132", ",", "136", ",", "132", ",", "136", ",", "134", 
       ",", "138", ",", "132", ",", "136", ",", "134", ",", "138", 
       ",", "132", ",", "131", ",", "116", ",", "116", ",", "98", ",",
        "102", ",", "98", ",", "96", ",", "88", ",", "92", ",", "90", 
       ",", "98", ",", "92", ",", "92", ",", "90", ",", "94", ",", 
       "88", ",", "96", ",", "94", ",", "96", ",", "90", ",", "94", 
       ",", "92", ",", "100", ",", "94", ",", "94", ",", "92", ",", 
       "96", ",", "90", ",", "97", ",", "94", ",", "94", ",", "88", 
       ",", "92", ",", "90", ",", "98", ",", "92", ",", "92", ",", 
       "90", ",", "94", ",", "88", ",", "96", ",", "94", ",", "94", 
       ",", "88", ",", "92", ",", "90", ",", "98", ",", "94", ",", 
       "94", ",", "92", ",", "96", ",", "90", ",", "94", ",", "92", 
       ",", "96", ",", "90", ",", "94", ",", "92", ",", "95", ",", 
       "88", ",", "92", ",", "90", ",", "94", ",", "88", ",", "92", 
       ",", "90", ",", "94", ",", "88", ",", "92", ",", "90", ",", 
       "94", ",", "88", ",", "92", ",", "90", ",", "94", ",", "88", 
       ",", "92", ",", "90", ",", "96", ",", "90", ",", "94", ",", 
       "90", ",", "94", ",", "78", ",", "66", ",", "56", ",", "56", 
       ",", "54", ",", "54", ",", "56", ",", "55", ",", "52", ",", 
       "52", ",", "54", ",", "54", ",", "52", ",", "52", ",", "54", 
       ",", "54", ",", "52", ",", "52", ",", "54", ",", "54", ",", 
       "52", ",", "52", ",", "54", ",", "54", ",", "52", ",", "52", 
       ",", "54", ",", "54", ",", "54", ",", "54", ",", "56", ",", 
       "56", ",", "54", ",", "54", ",", "54", ",", "54", ",", "52", 
       ",", "52", ",", "54", ",", "54", ",", "52", ",", "51", ",", 
       "52", ",", "52", ",", "50", ",", "50", ",", "52", ",", "52", 
       ",", "50", ",", "50", ",", "52", ",", "52", ",", "50", ",", 
       "50", ",", "52", ",", "52", ",", "50", ",", "50", ",", "52", 
       ",", "52", ",", "50", ",", "50", ",", "52", ",", "52", ",", 
       "50", ",", "50", ",", "52", ",", "52", ",", "50", ",", "50", 
       ",", "52", ",", "52", ",", "50", ",", "50", ",", "52", ",", 
       "52", ",", "50", ",", "50", ",", "52", ",", "52", ",", "50", 
       ",", "50", ",", "52", ",", "52", ",", "50", ",", "50", ",", 
       "50", ",", "52", ",", "50", ",", "50", ",", "50", ",", "52", 
       ",", "50", ",", "50", ",", "50", ",", "52", ",", "50", ",", 
       "50", ",", "50", ",", "52", ",", "50", ",", "50", ",", "50", 
       ",", "52", ",", "50", ",", "50", ",", "50", ",", "52", ",", 
       "50", ",", "50", ",", "50", ",", "52", ",", "50", ",", "50", 
       ",", "50", ",", "52", ",", "50", ",", "50", ",", "50", ",", 
       "52", ",", "50", ",", "50", ",", "50", ",", "52", ",", "50", 
       ",", "50", ",", "50", ",", "52", ",", "50", ",", "50", ",", 
       "50", ",", "52", ",", "50", ",", "50", ",", "50", ",", "52", 
       ",", "50", ",", "50", ",", "50", ",", "52", ",", "50", ",", 
       "50", ",", "50", ",", "52", ",", "50", ",", "50", ",", "50", 
       ",", "52", ",", "50", ",", "50", ",", "50", ",", "52", ",", 
       "50", ",", "50", ",", "50", ",", "52", ",", "50", ",", "50", 
       ",", "50", ",", "52", ",", "50", ",", "50", ",", "50", ",", 
       "52", ",", "50", ",", "50", ",", "50", ",", "52", ",", "50", 
       ",", "50", ",", "50", ",", "52", ",", "50", ",", "50", ",", 
       "50", ",", "52", ",", "50", ",", "50", ",", "50", ",", "52", 
       ",", "50", ",", "50", ",", "50", ",", "52", ",", "50", ",", 
       "50", ",", "50", ",", "52", ",", "50", ",", "50", ",", "50", 
       ",", "52", ",", "50", ",", "50", ",", "50", ",", "52", ",", 
       "50", ",", "50", ",", "50", ",", "52", ",", "50", ",", "50", 
       ",", "50", ",", "52", ",", "50", ",", "50", ",", "50", ",", 
       "52", ",", "50", ",", "50", ",", "50", ",", "52", ",", "50", 
       ",", "50", ",", "50", ",", "52", ",", "50", ",", "50", ",", 
       "50", ",", "52", ",", "50", ",", "50", ",", "50", ",", "52", 
       ",", "50", ",", "50", ",", "50", ",", "52", ",", "50", ",", 
       "50", ",", "50", ",", "52", ",", "50", ",", "50", ",", "50", 
       ",", "52", ",", "50", ",", "50", ",", "50", ",", "52", ",", 
       "50", ",", "50", ",", "48", ",", "50", ",", "48", ",", "48", 
       ",", "42", ",", "44", ",", "36", ",", "36"}], "}"}]}], "}"}]}],
   ";"}]], "Input"],

Cell[BoxData[
 RowBox[{"ListLinePlot", "[", 
  RowBox[{"data", ",", 
   RowBox[{"Frame", "\[Rule]", "True"}], ",", 
   RowBox[{"AspectRatio", "\[Rule]", 
    RowBox[{"1", "/", "3"}]}], ",", 
   RowBox[{"PlotStyle", "\[Rule]", 
    RowBox[{
     RowBox[{
     "ResourceFunction", "[", 
      "\"\<WolframPhysicsProjectStyleData\>\"", "]"}], "[", 
     RowBox[{"\"\<GenericLinePlot\>\"", ",", "\"\<PlotStyles\>\""}], 
     "]"}]}]}], "]"}]], "Input"]
}, Open  ]]

The cause of the “steps down” becomes clearer if one examines more closely the “spokes” in the graph above. Here’s one example:

With
&#10005

With[{big = 
   SimpleGraph[
    With[{t = 50}, 
     Flatten@Table[
       DirectedEdge @@@ 
        Partition[
         TuringMachine[tm, {{1, t + 1, 0}, ConstantArray[0, 2 t + 1]},
           t], 2, 1], {tm, 0, 4095}]], 
    EdgeStyle -> RGBColor[0.92, 0.17, 0.24], 
    VertexStyle -> Darker[RGBColor[0.92, 0.17, 0.24], 0.4], 
    VertexSize -> Tiny, 
    GraphLayout -> {"SpringElectricalEmbedding", 
      "InferentialDistance" -> 200, 
      "StepControl" -> "NonMonotonic"}]}, 
 Show[big, PlotRange -> {{85, 95}, {64, 67}}]]

And basically what’s happening is that multiple Turing machines are tracing out roughly the same sequences of configurations, but some do it “efficiently”, while others “waste time”, for example having the head flip around on alternate steps. The “inner parts” of the spokes—that are closer to the initial node—involve both “inefficient” and more efficient Turing machines. But the “inefficient” Turing machines will simply not get as far, so they do not contribute to the outer layers of the geodesic ball. The final “step down” in the plot above—at basically half the total number of steps used for the Turing machines—involves the “petering out” of the roughly half the Turing machines that effectively “waste half their steps”.

For the “spoke” shown, here are the actual Turing machine histories involved (there are 8 machines that made identical copies of the first history):

Keys
&#10005

Keys[Counts[
  RulePlot[TuringMachine[#], {1, {{}, 0}}, 20, 
     FrameStyle -> LightGray, ImageSize -> {Automatic, 150}] & /@ 
   Union[{3491, 439, 951, 1463, 1488, 1492, 1528, 1975, 2487, 2967, 
     2999, 3479, 3511, 3891, 4023, 1528, 3507, 3891, 1528}]]]

The Cellular Automaton Analog

The kind of graphs we’ve just made for deterministic Turing machines can be made for any family of deterministic computational systems. And in particular they can be made for the (at least for me, much more familiar) case of the 256 k = 2, r = 1 cellular automata. (And, yes, it’s somewhat amazing that in all these years I’ve never made such pictures before—though there’s a note on page 956 of A New Kind of Science that gets close.)

Here are the results for 5 and 10 steps, starting from an initial condition containing a single black cell:

Graph
&#10005

Graph[With[{t = #}, 
    Flatten@Table[
      DirectedEdge @@@ 
       Partition[CellularAutomaton[ru, CenterArray[{1}, 2 t + 1], t], 
        2, 1], {ru, 0, 255}]], 
   EdgeStyle -> RGBColor[0.92, 0.17, 0.24], 
   VertexStyle -> Darker[RGBColor[0.92, 0.17, 0.24], 0.4], 
   GraphLayout -> {"SpringElectricalEmbedding", 
     "InferentialDistance" -> 200, "StepControl" -> "NonMonotonic"}, 
   ImageSize -> 280] & /@ {5, 10}

And here is the result for 50 steps:

Graph
&#10005

Graph[With[{t = 50}, 
  Flatten@Table[
    DirectedEdge @@@ 
     Partition[CellularAutomaton[ru, CenterArray[{1}, 2 t + 1], t], 2,
       1], {ru, 0, 255}]], EdgeStyle -> RGBColor[0.92, 0.17, 0.24], 
 VertexStyle -> Darker[RGBColor[0.92, 0.17, 0.24], 0.4], 
 VertexSize -> Tiny, 
 GraphLayout -> {"SpringElectricalEmbedding", 
   "InferentialDistance" -> 200, "StepControl" -> "NonMonotonic"}]

Here is the result for 10 steps, annotated with the actual cellular automaton evolution for the rules that “reach furthest”:

With
&#10005

With[{t = 10}, 
 With[{g = 
    Graph[Flatten@
      Table[DirectedEdge @@@ 
        Partition[CellularAutomaton[tm, CenterArray[{1}, 2 t + 1], t],
          2, 1], {tm, 0, 255}], 
     EdgeStyle -> RGBColor[0.92, 0.17, 0.24], 
     VertexStyle -> Darker[RGBColor[0.92, 0.17, 0.24], 0.4], 
     GraphLayout -> {"SpringElectricalEmbedding", 
       "InferentialDistance" -> 200, 
       "StepControl" -> "NonMonotonic"}]}, 
  With[{call = 
     Table[CellularAutomaton[ru, CenterArray[{1}, 2 t + 1], t], {ru, 
       0, 255}]}, 
   Graph[g, 
    VertexLabels -> (# -> 
         ArrayPlot[
          CellularAutomaton[
           First@FirstPosition[call, #] - 1, {{1}, 0}, {t, All}], 
          ImageSize -> 35] & /@ 
       Pick[VertexList[g], VertexOutDegree[g], 0])]]]]

It’s slightly easier to see what’s going on if we include only even-numbered rules (which leave a blank state blank):

With
&#10005

With[{t = 10}, 
 With[{g = 
    Graph[Flatten@
      Table[DirectedEdge @@@ 
        Partition[CellularAutomaton[tm, CenterArray[{1}, 2 t + 1], t],
          2, 1], {tm, 0, 255, 2}], 
     EdgeStyle -> RGBColor[0.92, 0.17, 0.24], 
     VertexStyle -> Darker[RGBColor[0.92, 0.17, 0.24], 0.4], 
     GraphLayout -> {"SpringElectricalEmbedding", 
       "InferentialDistance" -> 200, 
       "StepControl" -> "NonMonotonic"}]}, 
  With[{call = 
     Table[CellularAutomaton[ru, CenterArray[{1}, 2 t + 1], t], {ru, 
       0, 255}]}, 
   Graph[g, 
    VertexLabels -> (# -> (ArrayPlot[
           CellularAutomaton[(First[
               Select[First /@ Position[call, #], OddQ]]) - 1, {{1}, 
             0}, {t, All}], ImageSize -> 35]) & /@ 
       Pick[VertexList[g], VertexOutDegree[g], 0])]]]]

It’s an interesting map of “cellular automaton space”. (Note the presence of rule 30 on the lower left, and rule 110 on the lower right.)

The total number of new configurations explored by all rules on successive steps has a more regular form than for Turing machines:

ListLinePlot
&#10005

Cell[CellGroupData[{
Cell[BoxData[
 RowBox[{
  RowBox[{"data", "=", 
   RowBox[{"With", "[", 
    RowBox[{
     RowBox[{"{", 
      RowBox[{"t", "=", "200"}], "}"}], ",", 
     RowBox[{"With", "[", 
      RowBox[{
       RowBox[{"{", 
        RowBox[{"rr", "=", 
         RowBox[{"Table", "[", 
          RowBox[{
           RowBox[{"DirectedEdge", "@@@", 
            RowBox[{"Partition", "[", 
             RowBox[{
              RowBox[{"CellularAutomaton", "[", 
               RowBox[{"ru", ",", 
                RowBox[{"CenterArray", "[", 
                 RowBox[{
                  RowBox[{"{", "1", "}"}], ",", 
                  RowBox[{
                   RowBox[{"2", "t"}], "+", "1"}]}], "]"}], ",", 
                "t"}], "]"}], ",", "2", ",", "1"}], "]"}]}], ",", 
           RowBox[{"{", 
            RowBox[{"ru", ",", "0", ",", "255"}], "}"}]}], "]"}]}], 
        "}"}], ",", 
       RowBox[{"Table", "[", 
        RowBox[{
         RowBox[{"VertexCount", "[", 
          RowBox[{"Graph", "[", 
           RowBox[{"Flatten", "[", 
            RowBox[{"Take", "[", 
             RowBox[{"rr", ",", "All", ",", "u"}], "]"}], "]"}], 
           "]"}], "]"}], ",", 
         RowBox[{"{", 
          RowBox[{"u", ",", "t"}], "}"}]}], "]"}]}], "]"}]}], "]"}]}],
   ";"}]], "Input"],

Cell[BoxData[
 RowBox[{"ListLinePlot", "[", 
  RowBox[{
   RowBox[{"Differences", "[", "data", "]"}], ",", 
   RowBox[{"Frame", "\[Rule]", "True"}], ",", 
   RowBox[{"AspectRatio", "\[Rule]", 
    RowBox[{"1", "/", "3"}]}], ",", 
   RowBox[{"Filling", "\[Rule]", "Axis"}], ",", 
   RowBox[{"PlotStyle", "\[Rule]", 
    RowBox[{
     RowBox[{
     "ResourceFunction", "[", 
      "\"\<WolframPhysicsProjectStyleData\>\"", "]"}], "[", 
     RowBox[{"\"\<GenericLinePlot\>\"", ",", "\"\<PlotStyles\>\""}], 
     "]"}]}]}], "]"}]], "Input"]
}, Open  ]]

The result mostly alternates with period 4 between 72 and 84, though with dips at steps of the form 2m.

If we go for a certain number of steps (say 200), and then look at the geodesic ball centered on the initial condition, the number of configurations in successive layers is just:

ListLinePlot
&#10005

Cell[CellGroupData[{
		Cell[BoxData[
 RowBox[{
  RowBox[{"data", "=", 
   RowBox[{"With", "[", 
    RowBox[{
     RowBox[{"{", 
      RowBox[{"t", "=", "200"}], "}"}], ",", 
     RowBox[{"Differences", "[", 
      RowBox[{"First", "[", 
       RowBox[{
        RowBox[{
         RowBox[{"Values", "[", 
          RowBox[{
           RowBox[{
           "ResourceFunction", "[", 
            "\"\<GraphNeighborhoodVolumes\>\"", "]"}], "[", 
           RowBox[{"#", ",", 
            RowBox[{"{", 
             RowBox[{"CenterArray", "[", 
              RowBox[{
               RowBox[{"{", "1", "}"}], ",", 
               RowBox[{
                RowBox[{"2", "t"}], "+", "1"}]}], "]"}], "}"}]}], 
           "]"}], "]"}], "&"}], "[", 
        RowBox[{"Graph", "[", 
         RowBox[{"Flatten", "@", 
          RowBox[{"ParallelTable", "[", 
           RowBox[{
            RowBox[{"DirectedEdge", "@@@", 
             RowBox[{"Partition", "[", 
              RowBox[{
               RowBox[{"CellularAutomaton", "[", 
                RowBox[{"ru", ",", 
                 RowBox[{"CenterArray", "[", 
                  RowBox[{
                   RowBox[{"{", "1", "}"}], ",", 
                   RowBox[{
                    RowBox[{"2", "t"}], "+", "1"}]}], "]"}], ",", 
                 "t"}], "]"}], ",", "2", ",", "1"}], "]"}]}], ",", 
            RowBox[{"{", 
             RowBox[{"ru", ",", "0", ",", "255"}], "}"}]}], "]"}]}], 
         "]"}], "]"}], "]"}], "]"}]}], "]"}]}], ";"}]], "Input"],

Cell[BoxData[
 RowBox[{"ListLinePlot", "[", 
  RowBox[{"data", ",", 
   RowBox[{"Frame", "\[Rule]", "True"}], ",", 
   RowBox[{"AspectRatio", "\[Rule]", 
    RowBox[{"1", "/", "3"}]}], ",", 
   RowBox[{"Filling", "\[Rule]", "Axis"}], ",", 
   RowBox[{"PlotStyle", "\[Rule]", 
    RowBox[{
     RowBox[{
     "ResourceFunction", "[", 
      "\"\<WolframPhysicsProjectStyleData\>\"", "]"}], "[", 
     RowBox[{"\"\<GenericLinePlot\>\"", ",", "\"\<PlotStyles\>\""}], 
     "]"}]}]}], "]"}]], "Input"]
}, Open  ]]

These results are all for ordinary, deterministic cellular automata. So are there non-deterministic cellular automata? Typically, cellular automata are defined to consistently update every cell at every step. But one can also consider sequential cellular automata, where specific cells are updated at each step—and in this case it is straightforward to define a non-deterministic version, for which things like multiway systems can be constructed. (Note that for a full rulial multiway system, such non-deterministic cellular automata are basically the same as non-deterministic mobile automata, which are close to Turing machines.)

Computation Capabilities and the Structure of Rulial Space

What do the computational capabilities of Turing machines mean for their rulial space? Let’s start with computation universality.

An important fact about deterministic Turing machines is that there are universal ones. Among the 4096 s = 2, k = 2 rules there aren’t any. But as soon one goes to s = 2, k = 3 rules (of which there are 2,985,984) it’s known (thanks to my results in A New Kind of Science, and Alex Smith’s 2007 proof) that there is a universal machine. The rule is:

RulePlot
&#10005

RulePlot[TuringMachine[{596440, 2, 3}]]

Starting from a blank tape, this machine gives

RulePlot
&#10005

RulePlot[TuringMachine[{596440, 2, 3}], {1, {{}, 0}}, 80]

and the corresponding causal graph is:

With
&#10005

With[{t = 2000}, 
 Graph[Rule @@@ 
   TMCausalData[
    TuringMachine[{596440, 2, 3}, {{1, t}, Table[0, 2 t + 1]}, t]], 
  EdgeStyle -> 
   ResourceFunction["WolframPhysicsProjectStyleData"]["CausalGraph", 
    "EdgeStyle"], 
  VertexStyle -> 
   ResourceFunction["WolframPhysicsProjectStyleData"]["CausalGraph", 
    "VertexStyle"]]]

But what does the existence of a universal machine mean in the rulial multiway system? From any given initial condition, any deterministic Turing machine will trace out some trajectory in the rulial multiway graph. And if a machine is universal it means that by appropriately picking its initial conditions it can be “programmed” to “emulate” any other Turing machine, in the sense that its trajectory will track the trajectory of whatever Turing machine it’s emulating. What does “track” mean? Basically, that there’s some fixed scheme that allows one to go from the states of the universal Turing machine to the states of the machine it’s emulating. The “scheme” will correspond to some translation in the rulial multiway graph, and the requirement is that this translation is somehow always limited. In other words, the trajectory of a universal machine will “flail around” as its starting point (i.e. initial condition) moves in the rulial multiway graph, and this “flailing” will be diverse enough that the trajectory can get close to the trajectory of any given other machine.

If, on the other hand, the machine one’s dealing with isn’t universal, then its trajectory won’t “flail around” enough for this work; the trajectory will in a sense be too constrained to successfully “track” all possible other deterministic Turing machine trajectories.

What about non-deterministic Turing machines? What universality can be interpreted to mean in this case is that given a particular initial condition, the output one wants occurs somewhere on the different paths followed by the non-deterministic Turing machine. (If one’s trying to do a decision problem—as in the computational complexity class NP—then one can arrange to “signal that one’s got an answer” through some feature of the Turing machine state.) In the case of “extreme non-determinism”—as used to construct the rulial multiway graph—computation universality in a sense becomes a statement purely about the structure of the rulial multiway graph. And basically it just requires that the rulial multiway graph is sufficiently connected—which is guaranteed if there’s causal invariance (so there’s nothing like an “event horizon” anywhere).

But does one have to allow “extreme non-determinism” to get universality? With s = 2, k = 3 we know that there’s a purely deterministic Turing machine that achieves it. And my guess is that among s = 2, k = 2 there are “slightly multiway” rules that also do. In a standard deterministic s = 2, k = 2 Turing machine, there are 4 cases of the rule that are each specified to have a unique outcome. But what if even just one of those cases in the rule has two outcomes? The rule is non-deterministic, but it can be thought of as just being the result of specifying 5 defining cases for the rule. And it’s my guess that even this will be sufficient to get universality in the system.

A non-deterministic rule like this will not trace out a single path in the rulial multiway graph. Instead, it’ll give a bundle of paths, with different paths corresponding to different non-deterministic choices. But the story of universality is very similar to the deterministic case: one simply has to ask whether anything in the bundle successfully manages to track the trajectory of the machine one’s emulating.

It’s worth remembering that any given rule won’t typically be following geodesics in rulial space. It’ll be following some more circuitous path (or bundle of paths). But let’s say one has some rule that traces out some trajectory—corresponding to performing some computation. The Principle of Computational Equivalence implies that across different possible rules, there’s a standard “maximum computational sophistication” for these computations, and many rules achieve it. But then the principle also implies that there’s equivalence between these maximally sophisticated computations, in the sense that there’s always a limited computation that translates between them.

Let’s think about this in rulial space. Let’s say we have two rules, starting from the same initial condition. Well, then, at the beginning it’s trivial to translate between the rules. But after t steps, the states reached by these rules can have diverged—making it potentially progressively more difficult to translate between them. A key idea of the rulial multiway graph—and rulial space—is that it lets one talk about both computations and translations between them in uniform ways. Let’s say that the trajectories of two rules have gone a certain distance in rulial space. Then one can look at their divergence, and see how long a “translation computation” one has to do to get from one to the other.

In ordinary spacetime, let’s say a certain time t has elapsed. Then we know that the maximum spatial distance that can have been traversed is c t, where c is the speed of light. In rulial space, there’s something directly analogous: in time t, there’s a maximum rulial distance that can be traversed, which we can call ρ t. But here the Principle of Computational Equivalence makes it a crucial contribution: it implies that throughout rulial space, and in all situations, ρ is fixed. It can take an irreducible amount of computational work to successfully translate from the outcome of one rule to another. But this always scales the same way. There’s in effect one scale of computational irreducibility, and it’s characterized by ρ. Like the constancy of the speed of light uniformly limits physical motion, the constancy of ρ uniformly limits rulial motion.

But let’s say you’re trying to get from one point in rulial space to another. If from your starting point you can follow the path of an irreducible—and effectively universal—computation, then you’ll successfully be able to reach the other point. But if from your starting point you can only follow a reducible computation this won’t generally be true. And what this means is that “pockets of computational reducibility” in rulial space act a bit like black holes in physical space. You can get into them from regions of irreducibility, but you can’t get out of them.

There are probably signs of phenomena like this even in the rulial space for simple Turing machines that we’ve explored here. But there’s considerably more that needs to be worked out to be able to make all the necessary connections.

The Emerging Picture of Rulial Space

There are lots of analogies between physical space, the branchial space, and rulial space. For example, in physical space, there are light cones that govern the maximum rate at which effects can propagate between different parts of physical space. In branchial space, there are entanglement cones that govern the maximum rate of quantum entanglement. And in rulial space, one can think of “emulation cones”, which govern the maximum rate at which one description of behavior can be translated into another.

And when it comes to applying these things to modeling the physical universe, a crucial point is that the observer is necessarily part of the system, governed by the same rules as everything else. And that means that the observer can only be sensitive to certain “appropriately modded-out” aspects of the system. But in actually imagining how an observer “perceives” a system it’s almost always convenient to think about coordinatizing the system—by defining some appropriate foliation. In physical space, this involves foliating the causal graph using reference frames like in relativity. In branchial space, it involves our concept of quantum observation frames. And in rulial space, we can invent another such concept: a rulial description frame, or just a rulial frame.

Different rulial frames in effect correspond to describing the evolution of the universe as operating according to different rules. Causal invariance implies that in the end different rulial frames must give equivalent results. But the specific way one describes the time evolution of the universe will depend on what rulial frame one’s using. In one frame one would be describing the universe in one way; in another frame, another way. And the “story one tells” about how the universe evolves will be different in the different frames.

Much like with superposition in quantum mechanics, there’s probably some notion of regions in rulial space, in which one’s somehow viewing the universe as operating according to “rulially entangled” collections of rules.

But while our original motivation was understanding physics, a lot of what we’re studying about rulial space also applies to purely computational systems. For example, we can think of rulial space even without having any notion of physical space. And we can in effect imagine that rulial space is some kind of map of a space of possible rules for computational systems. (Notice that because of computation universality and the Principle of Computational Equivalence it ultimately doesn’t matter what particular type of rule—Turing machine, cellular automaton, combinator, whatever—is used to “parametrize” rulial space.)

Different places in rulial space in some sense correspond to different rules. Paths at different places in rulial space correspond to evolution according to different rules. So what is the analog of motion in rulial space? In effect it’s having a frame which progressively changes the rule one’s using. If one’s trying to find out what happens in one’s system, it’s fundamentally most efficient to “stick with one rule”. If one progressively changes the rule, one’s going to have to keep “translating back” to the original rule, by somehow emulating this rule with whatever rule one’s reached. And the result of this is there’ll be exactly the analog of relativistic time dilation. Faster motion in rulial space leads to slower progression in time. Of course, to discuss this properly, we really have to talk about the rulial multiway causal graph, etc.

But one thing is clear: motion faster than some maximum speed ρ is impossible. From within the system, you simply can’t keep the correct rulial causal connections if you’re changing your rulial location faster than ρ.

In an abstract study of Turing machines, ρ is just an arbitrary parameter. But in the actual physical universe, it must have a definite value, like the speed of light c, or our maximum entanglement speed ζ. It’s difficult even to estimate what ζ might be. And presumably estimating ρ will be even harder. But it’s interesting to discuss at least how we might start to think about estimating ρ.

The first key observation about rulial space is that in our models, it’s discrete. In other words, there’s a discrete space of possible rules. Or, put another way, theories are quantized, and there’s somehow an elementary distance between theories—or a minimum distance in “theory space” between neighboring theories.

But what units is this distance in? Basically it’s in units of rule—or program—size. Given any program—or rule—we can imagine writing that program out in some language (say in Wolfram Language, or as a program for a particular universal Turing machine, or whatever) And now we can characterize the size of the program by just looking at how many tokens it takes to write the program out.

Of course, with different languages, that number will be different—at the simplest level just like the number of decimal digits necessary to represent a number is different from the number of binary digits, or the length of its representation in terms of primes. But it’s just like measuring a length in feet or meters: even though the numerical value is different, we’re still describing the same length.

It’s important to point out that it’s not enough to just measure things in terms of “raw information content”, or ordinary bits, as discussed in information theory. Rather, we want some kind of measure of “semantic information content”: information content that directly tells us what computation to do.

It’s also important to point out that what we need is different from what’s discussed in algorithmic information theory. Once one has a computation universal system, one can always use it to translate from any one language to any other. And in algorithmic information theory the concept is that one can measure the length of a program up to an additive constant by just expecting to include an “emulation program” that adapts to whatever language one’s measuring the length in. But in the usual formalism of algorithmic information theory one doesn’t worry about how long it’s going to take for the emulation to be done; it’s just a question of whether there’s ultimately enough information to do it.

In our setup, however, it does matter how long the emulation takes, because that process of emulation is actually part of our system. And basically we need the number of steps needed for the emulation to be in some sense bounded by a constant.

So, OK, what does this mean for the value of ρ? Its units are presumably program size per unit time. And so to define its value, we’ll have to say how we’re measuring program size. Perhaps we could imagine we write our rules in the Wolfram Language. Then there should be a definite value of ρ for our universe, measured in Wolfram-Language-tokens per second. If we chose to use (2,3)-Turing-machine-tape-values per year then we’d get a different numerical value. But assuming we used the correct conversions, the value would be the same. (And, yes, there’s all sorts of subtlety about constant-time or not emulation, etc.)

In some sense, we may be able to think of ρ as the ultimate “processor speed for the universe”: how fast tokens in whatever language we’re using are being “interpreted” and actually “executed” to determine the behavior of the universe.

Can we estimate the value of ρ? If our units are Wolfram-Language-tokens per second we could start by imagining just computing in the Wolfram Language some piece of the rulial multiway graph for our models and seeing how many operations it takes. To allow “all possible rules” we’d have to increase the possible left- (and right-) hand sides of our rules to reflect the size of the hypergraph representing the universe at each step. But now we’d need to divide by the “number of parallel threads” in the rulial multiway graph. So we can argue that all we’d be left with is something like (size of spatial hypergraph represented in Wolfram Language) / (elementary time).

So, based on our previous estimates (which I don’t consider anything more than vaguely indicative yet) we might conclude that perhaps:

ρ ~ 10450 Wolfram-Language-tokens/second

The number of “parallel threads” in the rulial multiway graph (the rulial analog of Ξ) might then be related to the number of possible hypergraphs that contain about the number of nodes in the universe, or very roughly (10350)^(10350) ≈ . If we ask the total number of Wolfram Language tokens processed by the universe, there’ll be another factor ~10467, but this “parallelism” will completely dominate, and the result will be about:

Wolfram-Language-tokens

OK, so given a value of ρ, how might we conceivably observe it? Presumably there’s an analog of quantum uncertainty in rulial space, that’s somehow proportional to the value of ρ. It’s not completely clear how this would show up, but one possibility is that it would lead to intrinsic limits on inductive inference. For example, given only a limited observation time, it might be fundamentally impossible to determine beyond a certain (“rulial”) accuracy what rule the universe is following in your description language. There’d be a minimum rate of divergence of behaviors from different rules, associated with the minimum distance between theories—and it would take a certain time to distinguish theories at this rate of divergence.

In our models, just like every causal edge in physical and branchial space is associated with energy, so should every causal edge in rulial space be. In other words, the more processing that happens in a particular part of rulial space, the more physical energy one should consider exists there. And just as with the Einstein equations in physical space, or the Feynman path integral in branchial space, we should expect that the presence of energy in a particular region of rulial space should reflect in a deflection of geodesics there.

Geodesics in rulial space are the shortest paths from one configuration of the universe to another, using whatever sequences of rules are needed. But although that’s somewhat like what’s considered at a theoretical level in non-deterministic computation, it’s not something we’re usually familiar with: we’re used to picking a particular description language and sticking with it. So exactly what the interpretation of deflections of geodesics in rulial space should be isn’t clear.

But there are a few other things we can consider. For example, presumably the universe is expanding in rulial space, perhaps implying that in some sense more descriptions of it are becoming possible over time. What about rulial black holes? As mentioned above, parts of rulial space that correspond to computational reducibility should behave like black holes, where in effect “time stops”. Or, in other words, while in most of the universe time is progressing, and irreducible computation is going on, computational reducibility will cause that process to stop in a rulial black hole.

Presumably geodesics near the rulial black hole will be pulled towards it. Somehow when there’s a description language that leads to computational reducibility, languages near it will tend to also stop being able to successfully describe computationally irreducible processes.

Can we estimate the density of rulial black holes? Let’s consider the Turing machine case. In effect we’re going to want to know what the density of non-universality is among all possible non-deterministic Turing machines. Imagine we emulate all Turing machines using a single universal machine. Then this is effectively equivalent to asking what fraction of initial conditions for that machine lead to reducible behaviors—or, in essence, in the traditional characterization of Turing machines, halt. But the probability across all possible inputs that a universal Turing machine will halt is exactly Greg Chaitin’s Ω. In other words, the density of rulial black holes in rulial space is governed by Ω.

But Ω isn’t just a number like π that we can compute as accurately as we want; it’s noncomputable, in the sense that it can’t be computed to arbitrary accuracy in any finite time by a Turing machine. Now, in a sense it’s not too surprising that the density of rulial black holes is noncomputable—because, given computational irreducibility, to determine for certain whether something is truly a rulial black hole from which nothing can escape one might have to watch it for an unbounded amount of time.

But for me there’s something personally interesting about Greg Chaitin’s Ω showing up in any way in a potential description of anything to do with the universe. You see, I’ve had a nearly 40-year-long debate with Greg about whether the universe is “like π” or “like Ω”. In other words, is it possible to have a rule that will let us compute what the universe does just like we can compute (say, in principle, with a Turing machine) the digits of π? Or will we have to go beyond a Turing machine to describe our universe? I’ve always thought that our universe is “like π”; Greg has thought that it might be “like Ω”. But now it looks as if we might both be right!

In our models, we’re saying that we can compute what the universe does, in principle with a Turing machine. But what we’re now finding out is that in the full rulial space, general limiting statements pull in Ω. In a particular rulial observation frame, we’re able to analyze the universe “like π”. But if we want to know about all possible rulial observation frames—or in a sense the space of all possible descriptions of the universe—we’ll be confronted with Ω.

In our models, the actual operation of the universe, traced in a particular rulial observation frame, is assumed never to correspond to anything computationally more powerful than a Turing machine. But let’s say there was a hypercomputer in our universe. What would it look like? It’d be a place where the effective ρ is infinite—a place where rulial geodesics infinitely diverge—a kind of white hole in rulial space (or perhaps a cosmic event horizon). (We can also think about the hypercomputer as introducing infinite-shortcut paths in the rulial multiway graph which ordinary Turing-machine paths can never “catch up to” and therefore causally affect.)

But given a universe that does hypercomputation, we can then imagine defining a rulial multiway graph for it. And then our universe will show up as a black hole in this higher-level rulial space.

But OK, so if there’s one level of hypercomputer, why not consider all possible levels? In other words, why not define a hyperrulial multiway graph in which the possible rules that are used include both ordinary computational ones, but also hypercomputational ones?

And once we’re dealing with hypercomputational systems, we can just keep going, adding in effect more and more levels of oracles—and progressively ascending the arithmetic hierarchy. (The concept of “intermediate degrees” might be thought to lead to something that isn’t a perfect hierarchy—but I suspect that it’s not robust enough to apply to complete rulial spaces.) Within the hyperrulial multiway graph at a particular level, levels below it will be presumably appear as rulial black holes, while ones above will appear as rulial white holes.

And there’s nothing to keep us only considering finite levels of the arithmetic hierarchy; we can also imagine ascending to transfinite levels, and then just keeping going to higher and higher levels of infinity. Of course, according to our models, none of this is relevant to our particular physical universe. But at a theoretical level, we can still at least to some extent “symbolically describe it”, even in our universe.

]]>
https://writings.stephenwolfram.com/2020/06/exploring-rulial-space-the-case-of-turing-machines/feed/ 0
<![CDATA[Event Horizons, Singularities and Other Exotic Spacetime Phenomena]]> https://writings.stephenwolfram.com/2020/05/event-horizons-singularities-and-other-exotic-spacetime-phenomena/ https://writings.stephenwolfram.com/2020/05/event-horizons-singularities-and-other-exotic-spacetime-phenomena/#comments Wed, 20 May 2020 17:58:46 +0000 Stephen Wolfram https://writings.internal.stephenwolfram.com/?p=24554 Wolfram Physics Bulletin Informal updates and commentary on progress in the Wolfram Physics Project Related livestreams Related notebooks Video work logs Related tweets Related livestreams April 29, 2020 (with Jonathan Gorard) May 5, 2020 (with Jonathan Gorard) May 6, 2020 (with Jonathan Gorard, Jose Martin-Garcia and Max Piskunov) Related notebooks BlackHoles-01 (by Stephen Wolfram) BlackHoles-02 [...]]]>

Wolfram Physics Bulletin

Informal updates and commentary on progress in the Wolfram Physics Project

The Structure and Pathologies of Spacetime

In our models, space emerges as the large-scale limit of our spatial hypergraph, while spacetime effectively emerges as the large-scale limit of the causal graph that represents causal relationships between updating events in the spatial hypergraph. An important result is that (subject to various assumptions) there is a continuum limit in which the emergent spacetime follows Einstein’s equations from general relativity.

And given this, it is natural to ask what happens in our models with some of the notable phenomena from general relativity, such as black holes, event horizons and spacetime singularities. I already discussed this to some extent in my technical introduction to our models. My purpose here is to go further, both in more completely understanding the correspondence with general relativity, and in seeing what additional or different phenomena arise in our models.

It should be said at the outset that even after more than 100 years the whole issue of what weird features of spacetime Einstein’s equations can imply remains a rather confusing subject, that is still very far from completely understood. And in some ways I think our models may help clarify what’s going on. Yes, there’s complexity in taking large-scale limits in our models. But unlike with the Einstein equations, which effectively just tell one to “find a spacetime that satisfies certain constraints defined by the equations”, our models give a direct computational way to determine the structure that is supposed to limit to spacetime.

In what follows, we’ll see that our models can reproduce known implications of Einstein’s equations such as black holes, event horizons and spacetime singularities. But they also suggest the possibility of other, in some ways yet more exotic, spacetime phenomena. Some of these may in fact be things that could be found in the Einstein equations; others require descriptions of spacetime more general than the mathematical structure of general relativity can provide (notably in connection with dimension and topology change).

There’s long been a view that at small enough length scales the Einstein equations will have to be supplemented by some lower-level description of spacetime, presumably connected to quantum mechanics. Our models immediately provide a lower-level representation for spacetime in terms of the discrete structure of the spatial hypergraph and the causal graph—with familiar, continuum spacetime emerging as a large-scale limit, much like continuum fluid behavior emerges as a large-scale limit of molecular dynamics.

And there is already a lot that can be said about the structure and behavior of spacetime in our models just on the basis of the spatial hypergraph and the causal graph. But the models also have the feature that they inexorably involve quantum mechanics as a result of the multiway systems obtained by following different possible sequences of updating events. And this means that we can expect to see how various extreme features of spacetime play out at a quantum level, in particular through the multiway causal graph, which includes not only connections associated with ordinary spacetime, but also with branchtime and the branchial space of quantum entanglements.

I won’t go far in this particular bulletin into the exploration of things like the quantum mechanics of black holes, but we’ll get at least an idea of how these kinds of things can be investigated in our models. In addition to seeing the correspondence with what are now standard questions in mathematical physics, we’ll begin to see some indications of more exotic ideas, like the possibility that in our models particles like electrons may correspond to a kind of generalization of black holes.

What General Relativity Says

Perhaps the most famous prediction of general relativity is the existence of black holes. At a mathematical level, a black hole is characterized by the presence of an event horizon that prevents events occurring inside it from affecting ones outside (though events occurring outside can affect what’s inside).

So how does this actually occur in general relativity? Let’s talk about the simplest nontrivial case: the Schwarzschild solution to Einstein’s equations. Physically, the Schwarzschild solution gives the gravitational field outside a spherically symmetric mass. But there’s a wild thing that happens if the mass is high enough and localized enough: one gets a black hole—with an event horizon. The physical story one can tell is that the escape velocity is larger than the speed of light, so nothing can escape. The mathematical story is more subtle and complicated, and took many years to untangle. But in the end there’s a clear description of the event horizon in terms of the causal structure of spacetime: of what events can causally affect what other ones.

But what about the actual Schwarzschild solution? An important simplifying feature is that it’s a solution to Einstein’s equation in the vacuum, not really in any place where there’s actually mass present. Yes, there’s mass that produces the gravitational field. But the Schwarzschild solution just describes the form of the gravitational field outside of the mass. What about in the black hole case?

In a physical black hole created by a collapsing star, there are presumably remnants of the star inside the event horizon. But that’s not what the Schwarzschild solution describes: it just says there’s vacuum everywhere, with one exception—that at the very center of the black hole there’s some kind of singularity. What can one say about this singularity? The equations imply that right at the singularity the curvature of spacetime is infinite. But there’s also something else. Once any geodesic (corresponding, for example, to the world line of a photon) goes inside the event horizon, it’ll only continue for a limited time, always in effect ending up “at the singularity”. There’s no necessary connection between this kind of geodesic incompleteness and infinite curvature; but in a Schwarzschild black hole both occur.

What is really “at” the center of the Schwarzschild black hole? Is it a place where Einstein’s equations don’t apply? Is it even part of the manifold that corresponds to spacetime? The mathematical structure of general relativity says one starts by setting up a manifold, then one puts a metric on it which satisfies Einstein’s equations. There’s no way the dynamics of the system can change the fundamental structure of the manifold. Yes, its curvature can change, but its dimension cannot, and nor can its topology. So if one wants to say that the point at the center of a Schwarzschild black hole “isn’t part of the manifold”, that’s something one has to put in from the beginning, from outside the Einstein equations.

There’s a certain amount that has been done to classify the kinds of singularities that can occur in general relativity. The singularity in a Schwarzschild black hole is a so-called spacelike one—that essentially “cuts off time” for any geodesic, anywhere in space inside the event horizon.

Discovered 50 years after the Schwarzschild solution is the Kerr solution, representing a rotating black hole. Its structure is much wilder than the Schwarzschild solution. A notable feature is the presence of a timelike singularity—in which time can progress, but space is effectively cut off. (Later, we’ll see that spacelike and timelike singularities have quite simple interpretations in our models.) If the angular momentum is below a critical value, there’s an event horizon (or, actually, two) in a Kerr black hole. But above the critical value, there’s no longer an event horizon, and the singularity is “naked”, and potentially able to affect the rest of the universe.

Like the Schwarzschild solution, the Kerr solution is a mathematical construct that defines a static configuration that a gravitational field can have according to Einstein’s equations when no matter is present (and when the underlying manifold has holes cut out for singularities). There has been a long-running debate about what features of such solutions would survive in more realistic situations, such as matter collapsing to form a black hole.

An early conjecture was the weak cosmic censorship hypothesis which stated that in any realistic situation any singularity must be “hidden” behind an event horizon. This meant for example that Kerr-like black holes formed in practice must have angular momenta below the critical value. Numerical simulations did seem to support that supercritical Kerr-like black holes couldn’t form, but a class of constructions were nevertheless found that could in a certain limit generate at least infinitesimal naked singularities.

Ordinary general relativity is firmly rooted to (3+1)-dimensional spacetime. But it can be generalized to higher dimensions. And in this case one finds new and more complex black-hole-like phenomena—and it seems to be easier for naked singularities at least theoretically to arise.

There are lots of other results from general relativity. One example is Penrose’s singularity theorem, which (with various assumptions) implies that (so long as there is nothing with negative mass AKA gravitational repulsion) as soon as geodesics are trapped within a region (e.g. by an event horizon) they must eventually all converge, and thus form a singularity. (The Hawking singularity theorem is basically a time-reversed version, which implies that there must be a singularity at the beginning of the universe.)

Another idea from general relativity is the “no-hair theorem” (or conjecture), which states that, at least from the outside, a limited number of parameters (such as mass and angular momentum) completely characterize any black hole—at least if it’s static. In other words, black holes are in a sense “perfectly smooth” objects; there aren’t gravitational effects outside the event horizon that reveal “inner complexity”. (Note that this is a classical conjecture; it’s quite likely not to be true when quantum effects are included.)

The Einstein equations are nonlinear partial differential equations, and it’s interesting to compare them with other such equations, such as the Navier–Stokes equations for fluid flow. One feature of the Navier–Stokes equations is that for sufficiently high fluid velocities (larger than the speed of sound) shocks develop that involve discontinuities that cannot be directly described by the equations. And particularly when one gets to hypersonic flow what physically happens is that the approximation that the fluid is continuous—and can be modeled by a partial differential equation—breaks down, and the specific dynamics of the molecules in the fluid start to matter.

Does something similar happen in the Einstein equations? It’s not known whether there can be shocks per se. But it seems likely that to understand things like what appear to be singularities one will have to go “underneath” the Einstein equations—as our models do.

What else can one learn from the fluid dynamics analogy? A notable feature of fluid flow is the phenomenon of fluid turbulence, in which random patterns of flow are ubiquitous. It’s still not clear to what extent turbulence is a true feature of the Navier–Stokes equations, and to what extent it’s associated with sensitive dependence on molecular-scale details. I strongly suspect, though, that like in rule 30 (or in the digits of π) the primary effect is an intrinsic generation of randomness, associated with the phenomenon of computational irreducibility. I’d be amazed if something similar doesn’t happen in Einstein’s equations, but it’ll no doubt be mathematically difficult to establish. Plenty of “randomness” is seen in numerical simulations, but absent a precise underlying computational model it’s very difficult to know if the “randomness” is a true feature of the equations that one is trying to approximate, or is just a feature of the approximation scheme used.

In our models, computational irreducibility and intrinsic randomness generation are ubiquitous. But exactly how such “microscopic” randomness will scale up to “gravitational turbulence” isn’t clear.

One further point, applicable to both fluid flow and gravitation, has to do with computational capability. The Principle of Computational Equivalence strongly suggests that in both cases, sophisticated computation will be ubiquitous. One consequence of this will be computation universality. And in fact it seems likely that this will already be manifest even in such simple cases as the interactions of a few fluid vortices, or just three point masses. The result is that highly complex behavior will be possible.

But that doesn’t mean that—for example in the spacetime case—one can’t summarize certain features of the behavior in simple terms, say by describing overall causal structure, or identifying the presence of an event horizon. However, the presence of underlying computational sophistication does mean that there may be computational limitations in coming up with such summaries. For example, to determine whether a certain system has a certain global causal structure valid for all time may in effect require determining the infinite-time behavior of an irreducible computation, which cannot in general be done by a finite computation, and so must be considered formally undecidable.

Identifying Causal Structure

An event horizon is a feature of the global causal structure of a spacetime—a boundary where events “inside” it can’t affect events (or “observers”) “outside” it. In traditional general relativity, it can be mathematically complicated to establish where there’s an event horizon; it effectively requires proving a theorem about how all possible geodesics will be trapped. (In numerical relativity, one can try to just identify “apparent horizons” where geodesics at least seem to be going in directions where they’ll be trapped, even if one can’t be sure what will happen later.)

But in our models, everything is considerably more explicit. We’re dealing with discrete updating events, occurring at discrete points. And at least in principle we can construct causal graphs that fully describe the causal relationships between all possible events that can occur in spacetime.

Here’s an example of such a causal graph:

ResourceFunction
&#10005

ResourceFunction[
  "WolframModel"][{{1, 2}, {2, 3}} -> {{2, 3}, {3, 1}, {4, 
    1}}, Automatic, 11, "LayeredCausalGraph"]

Remember that the only thing that’s ultimately defined by this causal graph is the causal dependency of events—or in effect the partial ordering of events. Time emerges as an overall inexorable progression of events. Space is associated with the relationship of events in slices defined by foliations of the causal graph.

Any given event can affect any event which it can reach by following directed edges in the causal graph, or, in the language of physics, any event which is in its future light cone. But what happens in the infinite limit of the future light cone of a given event? It could be that that infinite limit effectively covers the whole (“spatial”) universe. Or it could be that it only reaches part of the universe. And in that latter case we can expect that there’ll be an event horizon: a boundary to where the effects of our event can reach.

But how can we map which events have how large an effect—or in a sense what the causal structure of spacetime is? Let’s define what we can call a “causal connection graph” that shows the relationships between the future light cones of events. Given two events, it could be that the limits of their future light cones are exactly the same (both covering the whole universe, or both covering the same part of it). In that case, let’s consider these events “causally equivalent”.

In the causal connection graph, the nodes are collections of causally equivalent events. The edges in the graph are determined by the relationships between the future light cones of these collections of events. Consider two collections A and B. If the limit of the future light cone of A contains the limit of the future light cone of B, then we draw a directed edge in the graph from A to B. And if the limit of the future light cone of A intersects the limit of the future light cone of B (but doesn’t contain it), we draw an undirected edge.

There’ll be a causal connection graph defined for events on any spacelike hypersurface that can be specified as a slice through the causal graph. To find the ultimate causal connection graph, we’d then have to look at the infinite limits of future light cones from events in this spacelike hypersurface. But in practice, we can at least try to approximate this by looking not at the infinite limit of the future light cones, but instead at their limit on some spacelike hypersurface “far enough” in the future. (By the way, this is similar to issues that arise in thinking about “absolute” vs. “apparent” horizons in general relativity.)

OK, so let’s look at the causal graph we had above, and consider four events starting at the top:

HighlightGraph
&#10005

HighlightGraph[
 ResourceFunction[
   "WolframModel"][{{1, 2}, {2, 3}} -> {{2, 3}, {3, 1}, {4, 1}}, 
  Automatic, 9, "LayeredCausalGraph"], Range[4], 
 VertexLabels -> Automatic]

The future light cones for events 1 and 2 contain the whole causal graph. But the future light cones for events 3 and 4 are respectively:

With
&#10005

With[{gg = 
     Graph[ResourceFunction[
        "WolframModel"][{{1, 2}, {2, 3}} -> {{2, 3}, {3, 1}, {4, 1}}, 
       Automatic, 9, "LayeredCausalGraph"]]}, 
   HighlightGraph[
    gg, {Style[Subgraph[gg, VertexOutComponent[gg, #, 10]], Red, 
      Thick]}, ImageSize -> 300]] & /@ {3, 4}

These future light cones are distinct. So if we construct the causal connection graph for the spacelike hypersurface containing events 3 and 4, it’ll just consist of two separated nodes. In effect the universe here has broken into two non-communicating subuniverses. In the language of general relativity, we can say that there’s a cosmological event horizon that separates these two subuniverses, and no information can go in either direction between them.

The signature of this in the causal connection graph is quite straightforward. Looking at the first few levels in the causal graph, one has:

Graph
&#10005

Graph[ResourceFunction[
   "WolframModel"][{{1, 2}, {2, 3}} -> {{2, 3}, {3, 1}, {4, 1}}, 
  Automatic, 6, "LayeredCausalGraph"], VertexLabels -> Automatic]

Computing the causal connection graph for successive levels, one gets:

Table
&#10005

Table[Framed[
  Graph[ResourceFunction["CausalConnectionGraph"][
    ResourceFunction[
       "WolframModel"][{{1, 2}, {2, 3}} -> {{2, 3}, {3, 1}, {4, 1}}, 
      Automatic, #, "LayeredCausalGraph"] &, t0, 12], 
   VertexSize -> .4, VertexLabels -> Automatic, 
   ImageSize -> {150, 30}], FrameStyle -> LightGray], {t0, 1, 5}]

At the first and second levels, no “event horizon” has yet formed, and there’s just a single set of causally equivalent events. But at level 3, there start to be two separate sets of causally equivalent events; an “event horizon” has formed.

So what does the spatial hypergraph “underneath” these look like? Here’s how it evolves (using our standard updating order) for the first few steps:

ResourceFunction
&#10005

ResourceFunction["WolframModelPlot"][#, ImageSize -> Tiny] & /@ 
 ResourceFunction[
   "WolframModel"][{{1, 2}, {2, 3}} -> {{2, 3}, {3, 1}, {4, 1}}, 
  Automatic, 10, "StatesList"]

It’s very simple compared to the spatial hypergraph for any “real universe”. But it’s still useful as an example for understanding ideas about causal structure. And what we see is that in this tiny “toy universe”, two “lobes” develop, which evolve like two separate subuniverses, with no causal interdependence.

But while there’s no causal interdependence between the “lobes”, the spatial hypergraph is still connected. In our models, however, there’s nothing to say that the spatial hypergraph can’t actually become disconnected—and here’s an example where it does:

ResourceFunction
&#10005

ResourceFunction[
  "WolframModel"][{{1, 2}, {2, 3}} -> {{4, 1}, {4, 2}, {1, 
    2}}, Automatic, 12, "LayeredCausalGraph"]

Framed
&#10005

Framed[ResourceFunction["WolframModelPlot"][#, ImageSize -> Tiny], 
   FrameStyle -> LightGray] & /@ 
 ResourceFunction[
   "WolframModel"][{{1, 2}, {2, 3}} -> {{4, 1}, {4, 2}, {1, 2}}, 
  Automatic, 10, "StatesList"]

What’s the significance of this? If the spatial hypergraph stays connected, then even if two regions are at some point causally disconnected, it still remains possible for them to reconnect (in effect revealing that one did not have a true event horizon). But if the hypergraph is actually disconnected, no such reconnection is ever possible (unless one has a fundamentally nonlocal rule whose left-hand side is itself a disconnected hypergraph, so that it can effectively pick up elements “anywhere in any universe”, regardless of whether there are any existing relations between the elements).

In traditional general relativity, it is certainly possible to have multiple universes, each with their own disconnected manifold representing space. But while the Einstein equations support the formation of event horizons and causal disconnection, they do not support “forming a new universe” with its own topologically distinct disconnected manifold. To get that requires something like our model, with its much greater flexibility in the fundamental description of space. (In the usual mathematical analysis of general relativity, one defines up front the manifold on which one’s operating, though it’s perhaps conceivable that at least in some limit a metric could develop that’s compatible only with a different topology.)

Note that at the level of the causal connection graph, one just sees progressive formation of subuniverses, with cosmological event horizons; there’s no direct trace of disconnection in the spatial hypergraph:

Table
&#10005

Table[Framed[
  Graph[ResourceFunction["CausalConnectionGraph"][
    ResourceFunction[
       "WolframModel"][{{1, 2}, {2, 3}} -> {{4, 1}, {4, 2}, {1, 2}}, 
      Automatic, #, "LayeredCausalGraph"] &, t0, 12], 
   VertexSize -> .4, ImageSize -> {150, 30}], 
  FrameStyle -> LightGray], {t0, 1, 7}]

Black-Hole-Like Event Horizons

The type of causal disconnection that we’ve discussed so far is bidirectional: information can’t propagate in either direction across the event horizon. But for black holes, the story is different, basically with effects able to flow into the black hole, but not out.

Here’s a very simple example of something like this in our models:

ResourceFunction
&#10005

ResourceFunction[
  "WolframModel"][{{1, 2}, {2, 3}} -> {{4, 1}, {4, 3}, {1, 
    2}}, Automatic, 12, "LayeredCausalGraph"]

In the “universe at large”, represented rather trivially here by the outermost vertical edges, information can propagate back and forth. But if it goes into the “black hole” at the center, it never comes out again.

Here’s the rule that’s being used

RulePlot
&#10005

RulePlot[ResourceFunction[
   "WolframModel"][{{1, 2}, {2, 3}} -> {{4, 1}, {4, 3}, {1, 2}}]]

and here’s what’s going on in the spatial hypergraph:

ResourceFunction
&#10005

ResourceFunction["WolframModelPlot"][#, ImageSize -> Tiny] & /@ 
 ResourceFunction[
   "WolframModel"][{{1, 2}, {2, 3}} -> {{4, 1}, {4, 3}, {1, 2}}, 
  Automatic, 10, "StatesList"]

It’s a bit easier to see what’s happening if we look at every single event in the spatial hypergraph:

Show
&#10005

Show[#, ImageSize -> {60, 30}] & /@ 
 ResourceFunction[
   "WolframModel"][{{1, 2}, {2, 3}} -> {{4, 1}, {4, 3}, {1, 2}}, 
  Automatic, 14, "EventsStatesPlotsList"]

And basically what we see is that events propagate causal effects in both directions on the “ring” that represents the “universe at large”, but any causal effect on the “prong” only goes in one direction, making it correspond to a very simple analog of a black hole.

It is important to note that the black hole “doesn’t form” immediately. The “universe” has to “expand” for a couple of steps before one can distinguish a “black hole” event horizon.

Given the causal graph

ResourceFunction
&#10005

ResourceFunction[
   "WolframModel"][{{1, 2}, {2, 3}} -> {{4, 1}, {4, 3}, {1, 2}}, 
  Automatic, 7]["LayeredCausalGraph", 
 VertexLabels -> Placed[Automatic, {After, Above}]]

one can construct a causal connection graph. Looking at this on successive steps one gets:

Table
&#10005

Table[Framed[Graph[ResourceFunction["CausalConnectionGraph"]
    [ResourceFunction[
       "WolframModel"][{{1, 2}, {2, 3}} -> {{4, 1}, {4, 3}, {1, 2}}, 
      Automatic, #, "LayeredCausalGraph"] &, t0, 12], 
   VertexSize -> .1, VertexLabels -> Automatic, 
   ImageSize -> {150, 30}], FrameStyle -> LightGray], {t0, 1, 7}]

For the first three steps, there’s only one set of causally equivalent events. But by step 4, a second set forms. And there’s now a one-way causal connection between the first set of causally equivalent events and the second: in other words, a “black-hole-like” event horizon has formed.

Let’s look at a slightly more complicated case, though still with a very simple rule:

RulePlot
&#10005

RulePlot[ResourceFunction[
   "WolframModel"][{{1, 2}, {1, 3}} -> {{1, 2}, {2, 4}, {3, 4}}]]

The causal graph in this case is:

ResourceFunction
&#10005

ResourceFunction[
  "WolframModel"][{{1, 2}, {1, 3}} -> {{1, 2}, {2, 4}, {3, 
    4}}, Automatic, 25, "LayeredCausalGraph"]

Looking at the causal connection graph for successive steps, we see that after a little while a “black hole event horizon” forms:

Table
&#10005

Table[Framed[
  Graph[ResourceFunction["CausalConnectionGraph"][
    ResourceFunction[
       "WolframModel"][{{1, 2}, {1, 3}} -> {{1, 2}, {2, 4}, {3, 4}}, 
      Automatic, #, "LayeredCausalGraph"] &, t0, 20], 
   ImageSize -> {120, 30}, VertexSize -> .2], 
  FrameStyle -> LightGray], {t0, 2, 12}]

If we look at forward light cones of different events, we see that some “fill the whole universe”, but others stay localized to the region on the left. One can think of the first set as being the light cones of events that are in the “universe at large”; the second set are the light cones of events that are “trapped inside a black hole”:

With
&#10005

With[{gg = 
     Graph[ResourceFunction[
        "WolframModel"][{{1, 2}, {1, 3}} -> {{1, 2}, {2, 4}, {3, 4}}, 
       Automatic, 24, "LayeredCausalGraph"]]}, 
   HighlightGraph[
    gg, {Style[Subgraph[gg, VertexOutComponent[gg, #, 20]], Red, 
      Thick]}, ImageSize -> 300]] & /@ {12, 13}

Events trapped inside the black hole cannot affect events outside. But events outside can affect events inside, with events on the boundary in effect representing the process of things falling into the black hole. Note that since energy (and mass) are measured by the flux of causal edges through spacelike hypersurfaces, the black hole shown here effectively gains mass through events that deliver things into the black hole. (Our complete universe is also expanding, so there’s no overall energy conservation to be seen here.)

What does the underlying spatial hypergraph look like in this case? Once again, it’s quite simple:

ResourceFunction
&#10005

ResourceFunction["WolframModelPlot"][#, ImageSize -> Tiny] & /@ 
 ResourceFunction[
   "WolframModel"][{{1, 2}, {1, 3}} -> {{1, 2}, {2, 4}, {3, 4}}, 
  Automatic, 14, "StatesList"]

So where is the black hole? We can number the events in the causal graph:

Graph
&#10005

Graph[ResourceFunction[
   "WolframModel"][{{1, 2}, {1, 3}} -> {{1, 2}, {2, 4}, {3, 4}}, 
  Automatic, 13, "LayeredCausalGraph"], VertexLabels -> Automatic]

Then we can match these up with events in the spatial hypergraph:

Row
&#10005

Row[Flatten[
    Riffle[#, {Spacer[10], Text[Style[#, Small]], Spacer[10]} & /@ 
      Range[Length[#] - 1]]] &[
  Show[#, ImageSize -> {60, 30}] & /@ 
   ResourceFunction[
     "WolframModel"][{{1, 2}, {1, 3}} -> {{1, 2}, {2, 4}, {3, 4}}, 
    Automatic, 13, "EventsStatesPlotsList"]]]

The basic conclusion is that the “main circle” acts like a black hole, with the smaller “handle” being like the “rest of the universe”.

Here’s another, slightly less trivial example:

RulePlot
&#10005

RulePlot[ResourceFunction[
   "WolframModel"][{{1, 2, 3}, {4, 5, 3}} -> {{2, 6, 4}, {6, 1, 
     2}, {4, 2, 1}}]]

The causal graph in this case is:

Graph
&#10005

Graph[ResourceFunction[
   "WolframModel"][{{{1, 2, 3}, {4, 5, 3}} -> {{2, 6, 4}, {6, 1, 
      2}, {4, 2, 1}}}, Automatic, 20, "LayeredCausalGraph"], 
 AspectRatio -> 1/2]

Some initial events have light cones which cover the whole space; others always avoid the “spine” on the left, which behaves like a black hole:

With
&#10005

With[{gg = 
     Graph[ResourceFunction[
        "WolframModel"][{{{1, 2, 3}, {4, 5, 3}} -> {{2, 6, 4}, {6, 1, 
           2}, {4, 2, 1}}}, Automatic, 18, "LayeredCausalGraph"]]}, 
   HighlightGraph[
    gg, {Style[Subgraph[gg, VertexOutComponent[gg, #, 10]], Red, 
      Thick]}, ImageSize -> 300, AspectRatio -> 1/2]] & /@ {8, 10}

Here’s the underlying spatial hypergraph:

ResourceFunction
&#10005

ResourceFunction["WolframModelPlot"][#, ImageSize -> Tiny] & /@ 
 ResourceFunction[
   "WolframModel"][{{{1, 2, 3}, {4, 5, 3}} -> {{2, 6, 4}, {6, 1, 
      2}, {4, 2, 1}}}, Automatic, 12, "StatesList"]

Comparing the list of events

Row
&#10005

Row[Flatten[
    Riffle[#, {Spacer[10], Text[Style[#, Small]], Spacer[10]} & /@ 
      Range[Length[#] - 1]]] &[
  Show[#, ImageSize -> {60, 30}] & /@ 
   ResourceFunction[
     "WolframModel"][{{{1, 2, 3}, {4, 5, 3}} -> {{2, 6, 4}, {6, 1, 
        2}, {4, 2, 1}}}, Automatic, 8, "EventsStatesPlotsList"]]]

with the annotated causal graph

Graph
&#10005

Graph[ResourceFunction[
   "WolframModel"][{{{1, 2, 3}, {4, 5, 3}} -> {{2, 6, 4}, {6, 1, 
      2}, {4, 2, 1}}}, Automatic, 9, "LayeredCausalGraph"], 
 AspectRatio -> 1/2, VertexLabels -> Automatic]

we see that again the “black hole” is associated with a definite part of the spatial hypergraph.

Spacelike and Timelike Singularities

Disconnection is one kind of “pathology” that can occur in our models. Another is termination: a configuration can be reached in which the rules no longer apply, and “time stops”. (In the language of term rewriting systems, one can say in such a case that a “normal form” has been reached.)

Here is an example of the spatial hypergraph for a rule in which this happens:

ResourceFunction
&#10005

ResourceFunction["WolframModelPlot"][#, "MaxImageSize" -> 80] & /@ 
 ResourceFunction[
   "WolframModel"][{{x, x}, {y, x}} -> {{y, y}, {y, z}, {y, z}, {z, 
     x}, {w, z}}, Automatic, 20, "StatesList"]

The corresponding causal graph is:

ResourceFunction
&#10005

ResourceFunction[
  "WolframModel"][{{x, x}, {y, x}} -> {{y, y}, {y, z}, {y, z}, {z, 
    x}, {w, z}}, Automatic, 15, "LayeredCausalGraph"]

And given this causal graph, we can see that the future light cone of any event winds up “compressing down” to just the single final event—after which “time stops”.

Is there an analog of this in ordinary general relativity? Yes, it’s just a spacelike singularity—like what occurs in the Schwarzschild solution. In the Schwarzschild solution the spacelike singularity is in the future of events inside the event horizon; here it’s in the future of the “whole universe”. But it’s exactly the same idea. The future of anything that happens—or any geodesic—inevitably winds up in the “dead end” of the causal graph, at which “time stops”.

Here’s a slightly more complicated example that again involves termination, but now with two distinct “final events”:

ResourceFunction
&#10005

ResourceFunction[
  "WolframModel"][{{x, y, z}, {x, u, v}} -> {{y, x, w}, {w, u, s}, {v,
     z, u}}, Automatic, 25, "LayeredCausalGraph"]

Like in a cosmological event horizon, different collections of events in effect lead to different branches of future light cones—though in this case whichever branch is followed, “time eventually stops”.

With
&#10005

With[{gg = 
     Graph[ResourceFunction[
        "WolframModel"][{{x, y, z}, {x, u, v}} -> {{y, x, w}, {w, u, 
          s}, {v, z, u}}, Automatic, 20, "LayeredCausalGraph"]]}, 
   HighlightGraph[
    gg, {Style[Subgraph[gg, VertexOutComponent[gg, #, 10]], Red, 
      Thick]}, ImageSize -> 120]] & /@ {13, 16}

The causal connection graphs in this case basically just indicate the formation of a cosmological event horizon:

Table
&#10005

Table[Framed[
  Graph[ResourceFunction["CausalConnectionGraph"][
    ResourceFunction[
       "WolframModel"][{{x, y, z}, {x, u, v}} -> {{y, x, w}, {w, u, 
         s}, {v, z, u}}, Automatic, #, "LayeredCausalGraph"] &, t0, 
    6], ImageSize -> {120, 30}, VertexSize -> .2], 
  FrameStyle -> LightGray], {t0, 2, 6}]

But now each branch does not lead to a “full subuniverse”; instead they lead to two subuniverses that each end up in a spacelike singularity at which time stops.

By the way, consider a “typical” causal graph like:

ResourceFunction
&#10005

ResourceFunction[
  "WolframModel"][{{1, 2}, {2, 3}} -> {{2, 1}, {2, 3}, {4, 
    1}}, Automatic, 40, "LayeredCausalGraph"]

Starting from any event in this causal graph, its future light cone will presumably eventually “cover the whole universe”. But what about its past light cone? Wherever we start, the past light cone will eventually “compress down” to the single initialization event at the top of our causal graph. In other words—just like in standard general relativity—the beginning of the universe also behaves like a spacelike singularity.

What about timelike singularities? What is their analog in our models? Remember that a spacelike singularity effectively corresponds to “time stopping”. Well, a timelike singularity presumably corresponds to “space stopping”, but time continuing. Here’s an example:

ResourceFunction
&#10005

ResourceFunction[
  "WolframModel"][{{1, 2}, {2, 3}} -> {{2, 3}, {3, 4}, {5, 
    1}}, Automatic, 12, "LayeredCausalGraph"]

In this example, the future light cones of all events concentrate down onto two separated “tracks”, in each of which there is an inexorable progression from one event to the next, with “no room for any space”.

Here’s a minimal version of the same kind of behavior, for the rule:

{{x, x}} {{x, x}, {x, y}}

Show
&#10005

Show[ResourceFunction[
   "WolframModel"][{{x, x}} -> {{x, x}, {x, y}}, {{1, 1}}, 4, 
  "LayeredCausalGraph"], ImageSize -> {Automatic, 300}]

Unsurprisingly, its spatial hypergraph does not succeed in “growing space”:

ResourceFunction
&#10005

ResourceFunction["WolframModelPlot"][#, ImageSize -> 60] & /@ 
 ResourceFunction[
   "WolframModel"][{{x, x}} -> {{x, x}, {x, y}}, {{1, 1}}, 8, 
  "StatesList"]

If one starts looking at other rules, one quickly sees all sorts of strange behavior. The almost trivial unary rule

{{x}} {{x}, {x}}

effectively gives a whole tree of timelike singularities:

ResourceFunction
&#10005

ResourceFunction[
  "WolframModel"][{{x}} -> {{x}, {x}}, {{1}}, 6, "LayeredCausalGraph"]

Here are a few other ways that collections of timelike singularities can be produced:

ResourceFunction
&#10005

ResourceFunction[
  "WolframModel"][{{1, 2}, {1, 3}} -> {{2, 2}, {2, 4}, {3, 
    1}}, Automatic, 20, "LayeredCausalGraph"]

ResourceFunction
&#10005

ResourceFunction[
  "WolframModel"][{{1, 2}, {2, 3}} -> {{4, 4}, {3, 4}, {2, 
    1}}, Automatic, 20, "LayeredCausalGraph"]

ResourceFunction
&#10005

ResourceFunction[
  "WolframModel"][{{1, 2}, {1, 3}} -> {{2, 2}, {3, 2}, {1, 
    4}}, Automatic, 30, "LayeredCausalGraph"]

Notice that for example in the last case only some events don’t lead to timelike singularities. A bit like in a Kerr black hole, it’s both possible to avoid the singularity, and be trapped in it.

But let’s go back to spacelike singularities. We’ve seen examples where “time stops” for the whole universe. But what about for just some events? Here’s a simple example:

FindDeadEnds
&#10005

FindDeadEnds[fun_, t_Integer] := 
  Intersection[Flatten[Position[VertexOutDegree[fun[t + 1]], 0]], 
   Flatten[Position[VertexOutDegree[fun[t]], 0]]];
Function[ru, 
  TimeConstrained[
   HighlightGraph[
    ResourceFunction["WolframModel"][ru, Automatic, 15, 
     "LayeredCausalGraph"], 
    Style[#, Red] & /@ 
     FindDeadEnds[
      ResourceFunction["WolframModel"][ru, Automatic, #, 
        "LayeredCausalGraph"] &, 25], VertexSize -> .3, 
    ImageSize -> {Automatic, 300}], 
   5]][{{1, 2}, {2, 3}} -> {{2, 2}, {1, 4}, {3, 4}}]

For most events, the future light cone continues forever. But that’s not true for the highlighted events. Each of these events is a “dead end”, for which “time stops”.

In this case, the dead ends are associated with spatial disconnections, but this does not need to be true:

Framed
&#10005

Framed[ResourceFunction["WolframModelPlot"][#, "MaxImageSize" -> 60], 
   FrameStyle -> LightGray] & /@ 
 ResourceFunction[
   "WolframModel"][{{1, 2}, {2, 3}} -> {{2, 2}, {1, 4}, {3, 4}}, 
  Automatic, 10, "StatesList"]

Here is a slightly more complicated case:

Function
&#10005

Function[ru, 
  TimeConstrained[
   HighlightGraph[
    ResourceFunction["WolframModel"][ru, Automatic, 17, 
     "LayeredCausalGraph"], 
    Style[#, Red] & /@ 
     FindDeadEnds[
      ResourceFunction["WolframModel"][ru, Automatic, #, 
        "LayeredCausalGraph"] &, 25], VertexSize -> .4, 
    ImageSize -> {Automatic, 300}], 
   5]][{{1, 2}, {3, 2}} -> {{1, 1}, {1, 3}, {4, 2}}]

Again, though, these are “single-event” dead ends, in the sense that after those particular events, time stops. But predecessors of these events still “have a choice”: their future light cones include both the spacelike singularity, and other parts of the causal graph.

It is perfectly possible to have a combination of spacelike and timelike singularities. On the left here is a series of spacelike singularities, while on the right are timelike singularities, effectively all separated by cosmological event horizons:

Function
&#10005

Function[ru, 
  TimeConstrained[
   HighlightGraph[
    ResourceFunction["WolframModel"][ru, Automatic, 18, 
     "LayeredCausalGraph"], 
    Style[#, Red] & /@ 
     FindDeadEnds[
      ResourceFunction["WolframModel"][ru, Automatic, #, 
        "LayeredCausalGraph"] &, 25], VertexSize -> .5, 
    ImageSize -> {Automatic, 300}], 
   5]][{{1, 2}, {3, 2}} -> {{1, 3}, {3, 4}, {4, 1}}]

Recognizing when there’s actually a genuine spacelike singularity can be difficult. Consider the case:

Function
&#10005

Function[ru, 
  TimeConstrained[
   HighlightGraph[
    ResourceFunction["WolframModel"][ru, Automatic, 18, 
     "LayeredCausalGraph"], 
    Style[#, Red] & /@ 
     FindDeadEnds[
      ResourceFunction["WolframModel"][ru, Automatic, #, 
        "LayeredCausalGraph"] &, 25], VertexSize -> .6, 
    ImageSize -> {Automatic, 300}], 
   5]][{{1, 2}, {1, 3}} -> {{2, 4}, {4, 3}, {3, 1}}]

At first it seems as if some of the events in the last few steps we have generated have no successors. But continuing for a few more steps, we find out that these ones do—though now there are new events that seem not to:

Function
&#10005

Function[ru, 
  TimeConstrained[
   HighlightGraph[
    ResourceFunction["WolframModel"][ru, Automatic, 25, 
     "LayeredCausalGraph"], 
    Style[#, Red] & /@ 
     FindDeadEnds[
      ResourceFunction["WolframModel"][ru, Automatic, #, 
        "LayeredCausalGraph"] &, 30], VertexSize -> 1, 
    ImageSize -> {Automatic, 300}], 
   5]][{{1, 2}, {1, 3}} -> {{2, 4}, {4, 3}, {3, 1}}]

Plotting the event numbers for “potential spacelike singularities” against the number of steps of evolution generated, we can see that most events only remain “candidates” for a few steps:

ListPlot
&#10005

ListPlot[Catenate[
  Table[{t, #} & /@ 
    FindDeadEnds[
     ResourceFunction[
        "WolframModel"][{{1, 2}, {1, 3}} -> {{2, 4}, {4, 3}, {3, 1}}, 
       Automatic, #, "LayeredCausalGraph"] &, t], {t, 20}]], 
 Frame -> True]

In the limit of arbitrarily many steps, will any spacelike-singularity events survive? It doesn’t look likely, but it is hard to tell for sure. And this is exactly one of those cases where the general problem is likely to be undecidable: there is no finite computation which can guarantee to give the result.

One feature of all these examples is that they all involve spacelike singularities that affect just single events. At the beginning we also saw examples where “all the events in the universe” eventually wind up at a spacelike singularity. But what about a case that’s more analogous to a Schwarzschild black hole, where a collection of events inside an event horizon wind up at a spacelike singularity, but ones “outside” do not?

I haven’t explicitly found an example where this happens, but I’m confident that one exists, perhaps with slightly more complicated initial conditions than I’ve been using here.

In ordinary general relativity, Penrose’s singularity theorem implies that as soon as there is a trapped surface from which geodesics cannot escape, the geodesics will inevitably reach a singularity. This theorem is known to apply in any number of dimensions (with codimension-2 trapped hypersurfaces). And in our models, it might make one think that as soon as there is a black-hole-like event horizon, there must be a singularity of the kind we have discussed.

But what about a case like the following one we discussed above?

With
&#10005

With[{gg = 
     Graph[ResourceFunction[
        "WolframModel"][{{1, 2}, {1, 3}} -> {{1, 2}, {2, 4}, {3, 4}}, 
       Automatic, 24, "LayeredCausalGraph"]]}, 
   HighlightGraph[
    gg, {Style[Subgraph[gg, VertexOutComponent[gg, #, 20]], Red, 
      Thick]}, ImageSize -> 300]] &@13

There is a “trapped region” in the causal graph, but no sign of a singularity. There seem to be a couple of (not-mutually-exclusive) possibilities for what is going on here. The first is that there is in a sense so much “overall expansion in the universe” and lack of energy conservation (reflected in an increasing flux of causal edges) that the energy conditions in the theorem effectively do not apply. A second possibility is that what we’re seeing is “another universe” forming inside the event horizon. In the Kerr solution, the (probably unrealistic and fragile) mathematics implies that it is in principle possible to “go through” the singularity and emerge into “another universe” that is just as infinite as ours. Perhaps what we are seeing here is a similar phenomenon.

The Distribution of Causal Structures

What kinds of causal structures are possible in our systems? To start answering this, we can explicitly look at all 4702 possible 22  32 rules. We have to pick how many steps after the “beginning of the universe” we want to consider; we’ll start with 5. We also have to pick how many steps we want to use to check causal connectivity; we’ll start with 10. Then here are the possible causal connection graphs that occur, together with how many times they occur:

allrules32
&#10005

allrules32 = {{{1, 1}, {1, 1}} -> {{1, 1}, {1, 1}, {1, 1}}, {{1, 1}, {
    1, 1}} -> {{1, 1}, {1, 1}, {1, 2}}, {{1, 1}, {1, 1}} -> {{1, 1}, {
    1, 1}, {2, 1}}, {{1, 1}, {1, 1}} -> {{1, 1}, {1, 2}, {1, 2}}, {{1,
     1}, {1, 1}} -> {{1, 1}, {1, 2}, {2, 1}}, {{1, 1}, {1, 1}} -> {{1,
     1}, {1, 2}, {2, 2}}, {{1, 1}, {1, 1}} -> {{1, 1}, {1, 2}, {1, 
    3}}, {{1, 1}, {1, 1}} -> {{1, 1}, {1, 2}, {2, 3}}, {{1, 1}, {1, 
    1}} -> {{1, 1}, {1, 2}, {3, 1}}, {{1, 1}, {1, 1}} -> {{1, 1}, {1, 
    2}, {3, 2}}, {{1, 1}, {1, 1}} -> {{1, 1}, {2, 1}, {2, 1}}, {{1, 
    1}, {1, 1}} -> {{1, 1}, {2, 1}, {2, 3}}, {{1, 1}, {1, 1}} -> {{1, 
    1}, {2, 1}, {3, 1}}, {{1, 1}, {1, 1}} -> {{1, 1}, {2, 1}, {3, 
    2}}, {{1, 1}, {1, 1}} -> {{1, 2}, {1, 2}, {1, 2}}, {{1, 1}, {1, 
    1}} -> {{1, 2}, {1, 2}, {2, 1}}, {{1, 1}, {1, 1}} -> {{1, 2}, {1, 
    2}, {1, 3}}, {{1, 1}, {1, 1}} -> {{1, 2}, {1, 2}, {2, 3}}, {{1, 
    1}, {1, 1}} -> {{1, 2}, {2, 1}, {1, 3}}, {{1, 1}, {1, 1}} -> {{1, 
    2}, {1, 2}, {3, 1}}, {{1, 1}, {1, 1}} -> {{1, 2}, {1, 2}, {3, 
    2}}, {{1, 1}, {1, 1}} -> {{1, 2}, {2, 1}, {3, 1}}, {{1, 1}, {1, 
    1}} -> {{1, 2}, {1, 3}, {2, 3}}, {{1, 1}, {1, 1}} -> {{1, 2}, {2, 
    3}, {3, 1}}, {{1, 1}, {1, 1}} -> {{1, 2}, {1, 3}, {1, 4}}, {{1, 
    1}, {1, 1}} -> {{1, 2}, {1, 3}, {2, 4}}, {{1, 1}, {1, 1}} -> {{1, 
    2}, {2, 3}, {3, 4}}, {{1, 1}, {1, 1}} -> {{1, 2}, {1, 3}, {4, 
    1}}, {{1, 1}, {1, 1}} -> {{1, 2}, {1, 3}, {4, 2}}, {{1, 1}, {1, 
    1}} -> {{1, 2}, {2, 3}, {4, 2}}, {{1, 1}, {1, 1}} -> {{1, 2}, {2, 
    3}, {4, 3}}, {{1, 1}, {1, 1}} -> {{1, 2}, {3, 2}, {4, 2}}, {{1, 
    1}, {1, 1}} -> {{2, 1}, {2, 1}, {1, 2}}, {{1, 1}, {1, 1}} -> {{2, 
    1}, {2, 1}, {2, 1}}, {{1, 1}, {1, 1}} -> {{2, 2}, {1, 2}, {1, 
    2}}, {{1, 1}, {1, 1}} -> {{2, 2}, {2, 1}, {1, 1}}, {{1, 1}, {1, 
    1}} -> {{2, 2}, {2, 1}, {1, 2}}, {{1, 1}, {1, 1}} -> {{2, 2}, {2, 
    1}, {2, 1}}, {{1, 1}, {1, 1}} -> {{2, 2}, {2, 2}, {1, 2}}, {{1, 
    1}, {1, 1}} -> {{2, 2}, {2, 2}, {2, 1}}, {{1, 1}, {1, 1}} -> {{2, 
    1}, {1, 2}, {2, 3}}, {{1, 1}, {1, 1}} -> {{2, 1}, {2, 1}, {1, 
    3}}, {{1, 1}, {1, 1}} -> {{2, 1}, {2, 1}, {2, 3}}, {{1, 1}, {1, 
    1}} -> {{2, 2}, {1, 2}, {1, 3}}, {{1, 1}, {1, 1}} -> {{2, 2}, {2, 
    1}, {1, 3}}, {{1, 1}, {1, 1}} -> {{2, 2}, {2, 1}, {2, 3}}, {{1, 
    1}, {1, 1}} -> {{2, 1}, {1, 2}, {3, 2}}, {{1, 1}, {1, 1}} -> {{2, 
    1}, {2, 1}, {3, 1}}, {{1, 1}, {1, 1}} -> {{2, 1}, {2, 1}, {3, 
    2}}, {{1, 1}, {1, 1}} -> {{2, 2}, {1, 2}, {3, 1}}, {{1, 1}, {1, 
    1}} -> {{2, 2}, {1, 2}, {3, 2}}, {{1, 1}, {1, 1}} -> {{2, 2}, {2, 
    1}, {3, 1}}, {{1, 1}, {1, 1}} -> {{2, 2}, {2, 1}, {3, 2}}, {{1, 
    1}, {1, 1}} -> {{2, 1}, {2, 3}, {1, 3}}, {{1, 1}, {1, 1}} -> {{2, 
    2}, {2, 3}, {1, 2}}, {{1, 1}, {1, 1}} -> {{2, 2}, {2, 3}, {1, 
    3}}, {{1, 1}, {1, 1}} -> {{2, 2}, {2, 3}, {3, 1}}, {{1, 1}, {1, 
    1}} -> {{2, 1}, {1, 3}, {3, 4}}, {{1, 1}, {1, 1}} -> {{2, 1}, {2, 
    3}, {1, 4}}, {{1, 1}, {1, 1}} -> {{2, 1}, {2, 3}, {2, 4}}, {{1, 
    1}, {1, 1}} -> {{2, 1}, {1, 3}, {4, 1}}, {{1, 1}, {1, 1}} -> {{2, 
    1}, {1, 3}, {4, 3}}, {{1, 1}, {1, 1}} -> {{2, 1}, {2, 3}, {4, 
    1}}, {{1, 1}, {1, 1}} -> {{2, 1}, {2, 3}, {4, 2}}, {{1, 1}, {1, 
    1}} -> {{2, 2}, {3, 2}, {1, 3}}, {{1, 1}, {1, 1}} -> {{2, 2}, {3, 
    2}, {3, 1}}, {{1, 1}, {1, 1}} -> {{2, 1}, {3, 1}, {4, 1}}, {{1, 
    1}, {1, 1}} -> {{2, 3}, {2, 1}, {3, 1}}, {{1, 1}, {1, 1}} -> {{2, 
    3}, {2, 3}, {1, 2}}, {{1, 1}, {1, 1}} -> {{2, 3}, {2, 3}, {1, 
    3}}, {{1, 1}, {1, 1}} -> {{2, 3}, {2, 3}, {2, 1}}, {{1, 1}, {1, 
    1}} -> {{2, 3}, {2, 3}, {3, 1}}, {{1, 1}, {1, 1}} -> {{2, 3}, {3, 
    2}, {1, 2}}, {{1, 1}, {1, 1}} -> {{2, 3}, {3, 2}, {2, 1}}, {{1, 
    1}, {1, 1}} -> {{2, 3}, {2, 1}, {3, 4}}, {{1, 1}, {1, 1}} -> {{2, 
    3}, {3, 1}, {1, 4}}, {{1, 1}, {1, 1}} -> {{2, 3}, {2, 1}, {4, 
    3}}, {{1, 1}, {1, 1}} -> {{2, 3}, {3, 1}, {4, 1}}, {{1, 1}, {1, 
    1}} -> {{2, 3}, {3, 1}, {4, 3}}, {{1, 1}, {1, 1}} -> {{2, 3}, {2, 
    4}, {1, 2}}, {{1, 1}, {1, 1}} -> {{2, 3}, {2, 4}, {1, 3}}, {{1, 
    1}, {1, 1}} -> {{2, 3}, {2, 4}, {3, 1}}, {{1, 1}, {1, 1}} -> {{2, 
    3}, {3, 4}, {1, 4}}, {{1, 1}, {1, 1}} -> {{2, 3}, {3, 4}, {4, 
    1}}, {{1, 1}, {1, 2}} -> {{1, 1}, {1, 1}, {1, 1}}, {{1, 1}, {1, 
    2}} -> {{1, 1}, {1, 1}, {1, 2}}, {{1, 1}, {1, 2}} -> {{1, 1}, {1, 
    1}, {2, 1}}, {{1, 1}, {1, 2}} -> {{1, 1}, {1, 1}, {2, 2}}, {{1, 
    1}, {1, 2}} -> {{1, 1}, {1, 2}, {1, 2}}, {{1, 1}, {1, 2}} -> {{1, 
    1}, {1, 2}, {2, 1}}, {{1, 1}, {1, 2}} -> {{1, 1}, {1, 2}, {2, 
    2}}, {{1, 1}, {1, 2}} -> {{1, 1}, {2, 1}, {2, 1}}, {{1, 1}, {1, 
    2}} -> {{1, 2}, {1, 2}, {1, 2}}, {{1, 1}, {1, 2}} -> {{1, 2}, {1, 
    2}, {2, 1}}, {{1, 1}, {1, 2}} -> {{2, 1}, {2, 1}, {1, 2}}, {{1, 
    1}, {1, 2}} -> {{2, 1}, {2, 1}, {2, 1}}, {{1, 1}, {1, 2}} -> {{2, 
    2}, {1, 2}, {1, 2}}, {{1, 1}, {1, 2}} -> {{2, 2}, {2, 1}, {1, 
    1}}, {{1, 1}, {1, 2}} -> {{2, 2}, {2, 1}, {1, 2}}, {{1, 1}, {1, 
    2}} -> {{2, 2}, {2, 1}, {2, 1}}, {{1, 1}, {1, 2}} -> {{2, 2}, {2, 
    2}, {1, 1}}, {{1, 1}, {1, 2}} -> {{2, 2}, {2, 2}, {1, 2}}, {{1, 
    1}, {1, 2}} -> {{2, 2}, {2, 2}, {2, 1}}, {{1, 1}, {1, 2}} -> {{2, 
    2}, {2, 2}, {2, 2}}, {{1, 1}, {1, 2}} -> {{1, 1}, {1, 1}, {1, 
    3}}, {{1, 1}, {1, 2}} -> {{1, 1}, {1, 1}, {2, 3}}, {{1, 1}, {1, 
    2}} -> {{1, 1}, {1, 2}, {1, 3}}, {{1, 1}, {1, 2}} -> {{1, 1}, {1, 
    2}, {2, 3}}, {{1, 1}, {1, 2}} -> {{1, 1}, {2, 1}, {2, 3}}, {{1, 
    1}, {1, 2}} -> {{1, 2}, {1, 2}, {1, 3}}, {{1, 1}, {1, 2}} -> {{1, 
    2}, {1, 2}, {2, 3}}, {{1, 1}, {1, 2}} -> {{1, 2}, {2, 1}, {1, 
    3}}, {{1, 1}, {1, 2}} -> {{2, 1}, {1, 2}, {2, 3}}, {{1, 1}, {1, 
    2}} -> {{2, 1}, {2, 1}, {1, 3}}, {{1, 1}, {1, 2}} -> {{2, 1}, {2, 
    1}, {2, 3}}, {{1, 1}, {1, 2}} -> {{2, 2}, {1, 2}, {1, 3}}, {{1, 
    1}, {1, 2}} -> {{2, 2}, {2, 1}, {1, 3}}, {{1, 1}, {1, 2}} -> {{2, 
    2}, {2, 1}, {2, 3}}, {{1, 1}, {1, 2}} -> {{2, 2}, {2, 2}, {1, 
    3}}, {{1, 1}, {1, 2}} -> {{2, 2}, {2, 2}, {2, 3}}, {{1, 1}, {1, 
    2}} -> {{1, 1}, {1, 1}, {3, 1}}, {{1, 1}, {1, 2}} -> {{1, 1}, {1, 
    1}, {3, 2}}, {{1, 1}, {1, 2}} -> {{1, 1}, {1, 2}, {3, 1}}, {{1, 
    1}, {1, 2}} -> {{1, 1}, {1, 2}, {3, 2}}, {{1, 1}, {1, 2}} -> {{1, 
    1}, {2, 1}, {3, 1}}, {{1, 1}, {1, 2}} -> {{1, 1}, {2, 1}, {3, 
    2}}, {{1, 1}, {1, 2}} -> {{1, 2}, {1, 2}, {3, 1}}, {{1, 1}, {1, 
    2}} -> {{1, 2}, {1, 2}, {3, 2}}, {{1, 1}, {1, 2}} -> {{1, 2}, {2, 
    1}, {3, 1}}, {{1, 1}, {1, 2}} -> {{2, 1}, {1, 2}, {3, 2}}, {{1, 
    1}, {1, 2}} -> {{2, 1}, {2, 1}, {3, 1}}, {{1, 1}, {1, 2}} -> {{2, 
    1}, {2, 1}, {3, 2}}, {{1, 1}, {1, 2}} -> {{2, 2}, {1, 2}, {3, 
    1}}, {{1, 1}, {1, 2}} -> {{2, 2}, {1, 2}, {3, 2}}, {{1, 1}, {1, 
    2}} -> {{2, 2}, {2, 1}, {3, 1}}, {{1, 1}, {1, 2}} -> {{2, 2}, {2, 
    1}, {3, 2}}, {{1, 1}, {1, 2}} -> {{2, 2}, {2, 2}, {3, 1}}, {{1, 
    1}, {1, 2}} -> {{2, 2}, {2, 2}, {3, 2}}, {{1, 1}, {1, 2}} -> {{1, 
    1}, {1, 3}, {1, 3}}, {{1, 1}, {1, 2}} -> {{1, 1}, {1, 3}, {2, 
    1}}, {{1, 1}, {1, 2}} -> {{1, 1}, {1, 3}, {2, 2}}, {{1, 1}, {1, 
    2}} -> {{1, 1}, {1, 3}, {2, 3}}, {{1, 1}, {1, 2}} -> {{1, 1}, {1, 
    3}, {3, 1}}, {{1, 1}, {1, 2}} -> {{1, 1}, {1, 3}, {3, 2}}, {{1, 
    1}, {1, 2}} -> {{1, 1}, {1, 3}, {3, 3}}, {{1, 1}, {1, 2}} -> {{1, 
    1}, {2, 3}, {2, 3}}, {{1, 1}, {1, 2}} -> {{1, 1}, {2, 3}, {3, 
    2}}, {{1, 1}, {1, 2}} -> {{1, 2}, {1, 3}, {2, 3}}, {{1, 1}, {1, 
    2}} -> {{1, 2}, {2, 3}, {3, 1}}, {{1, 1}, {1, 2}} -> {{2, 1}, {2, 
    3}, {1, 3}}, {{1, 1}, {1, 2}} -> {{2, 2}, {1, 3}, {1, 3}}, {{1, 
    1}, {1, 2}} -> {{2, 2}, {1, 3}, {3, 1}}, {{1, 1}, {1, 2}} -> {{2, 
    2}, {2, 3}, {1, 1}}, {{1, 1}, {1, 2}} -> {{2, 2}, {2, 3}, {1, 
    2}}, {{1, 1}, {1, 2}} -> {{2, 2}, {2, 3}, {1, 3}}, {{1, 1}, {1, 
    2}} -> {{2, 2}, {2, 3}, {2, 3}}, {{1, 1}, {1, 2}} -> {{2, 2}, {2, 
    3}, {3, 1}}, {{1, 1}, {1, 2}} -> {{2, 2}, {2, 3}, {3, 2}}, {{1, 
    1}, {1, 2}} -> {{2, 2}, {2, 3}, {3, 3}}, {{1, 1}, {1, 2}} -> {{1, 
    1}, {1, 3}, {1, 4}}, {{1, 1}, {1, 2}} -> {{1, 1}, {1, 3}, {2, 
    4}}, {{1, 1}, {1, 2}} -> {{1, 1}, {1, 3}, {3, 4}}, {{1, 1}, {1, 
    2}} -> {{1, 1}, {2, 3}, {2, 4}}, {{1, 1}, {1, 2}} -> {{1, 1}, {2, 
    3}, {3, 4}}, {{1, 1}, {1, 2}} -> {{1, 2}, {1, 3}, {1, 4}}, {{1, 
    1}, {1, 2}} -> {{1, 2}, {1, 3}, {2, 4}}, {{1, 1}, {1, 2}} -> {{1, 
    2}, {2, 3}, {3, 4}}, {{1, 1}, {1, 2}} -> {{2, 1}, {1, 3}, {3, 
    4}}, {{1, 1}, {1, 2}} -> {{2, 1}, {2, 3}, {1, 4}}, {{1, 1}, {1, 
    2}} -> {{2, 1}, {2, 3}, {2, 4}}, {{1, 1}, {1, 2}} -> {{2, 2}, {1, 
    3}, {1, 4}}, {{1, 1}, {1, 2}} -> {{2, 2}, {1, 3}, {3, 4}}, {{1, 
    1}, {1, 2}} -> {{2, 2}, {2, 3}, {1, 4}}, {{1, 1}, {1, 2}} -> {{2, 
    2}, {2, 3}, {2, 4}}, {{1, 1}, {1, 2}} -> {{2, 2}, {2, 3}, {3, 
    4}}, {{1, 1}, {1, 2}} -> {{1, 1}, {1, 3}, {4, 1}}, {{1, 1}, {1, 
    2}} -> {{1, 1}, {1, 3}, {4, 2}}, {{1, 1}, {1, 2}} -> {{1, 1}, {1, 
    3}, {4, 3}}, {{1, 1}, {1, 2}} -> {{1, 1}, {2, 3}, {4, 3}}, {{1, 
    1}, {1, 2}} -> {{1, 2}, {1, 3}, {4, 1}}, {{1, 1}, {1, 2}} -> {{1, 
    2}, {1, 3}, {4, 2}}, {{1, 1}, {1, 2}} -> {{1, 2}, {2, 3}, {4, 
    2}}, {{1, 1}, {1, 2}} -> {{1, 2}, {2, 3}, {4, 3}}, {{1, 1}, {1, 
    2}} -> {{2, 1}, {1, 3}, {4, 1}}, {{1, 1}, {1, 2}} -> {{2, 1}, {1, 
    3}, {4, 3}}, {{1, 1}, {1, 2}} -> {{2, 1}, {2, 3}, {4, 1}}, {{1, 
    1}, {1, 2}} -> {{2, 1}, {2, 3}, {4, 2}}, {{1, 1}, {1, 2}} -> {{2, 
    2}, {1, 3}, {4, 3}}, {{1, 1}, {1, 2}} -> {{2, 2}, {2, 3}, {4, 
    1}}, {{1, 1}, {1, 2}} -> {{2, 2}, {2, 3}, {4, 2}}, {{1, 1}, {1, 
    2}} -> {{2, 2}, {2, 3}, {4, 3}}, {{1, 1}, {1, 2}} -> {{1, 1}, {3, 
    1}, {2, 2}}, {{1, 1}, {1, 2}} -> {{1, 1}, {3, 1}, {2, 3}}, {{1, 
    1}, {1, 2}} -> {{1, 1}, {3, 1}, {3, 1}}, {{1, 1}, {1, 2}} -> {{1, 
    1}, {3, 1}, {3, 2}}, {{1, 1}, {1, 2}} -> {{1, 1}, {3, 2}, {3, 
    2}}, {{1, 1}, {1, 2}} -> {{2, 2}, {3, 1}, {3, 1}}, {{1, 1}, {1, 
    2}} -> {{2, 2}, {3, 2}, {1, 1}}, {{1, 1}, {1, 2}} -> {{2, 2}, {3, 
    2}, {1, 3}}, {{1, 1}, {1, 2}} -> {{2, 2}, {3, 2}, {3, 1}}, {{1, 
    1}, {1, 2}} -> {{2, 2}, {3, 2}, {3, 2}}, {{1, 1}, {1, 2}} -> {{1, 
    1}, {3, 1}, {2, 4}}, {{1, 1}, {1, 2}} -> {{1, 1}, {3, 1}, {3, 
    4}}, {{1, 1}, {1, 2}} -> {{1, 1}, {3, 2}, {2, 4}}, {{1, 1}, {1, 
    2}} -> {{1, 1}, {3, 2}, {3, 4}}, {{1, 1}, {1, 2}} -> {{2, 2}, {3, 
    1}, {1, 4}}, {{1, 1}, {1, 2}} -> {{2, 2}, {3, 1}, {3, 4}}, {{1, 
    1}, {1, 2}} -> {{2, 2}, {3, 2}, {1, 4}}, {{1, 1}, {1, 2}} -> {{2, 
    2}, {3, 2}, {3, 4}}, {{1, 1}, {1, 2}} -> {{1, 1}, {3, 1}, {4, 
    1}}, {{1, 1}, {1, 2}} -> {{1, 1}, {3, 1}, {4, 2}}, {{1, 1}, {1, 
    2}} -> {{1, 1}, {3, 1}, {4, 3}}, {{1, 1}, {1, 2}} -> {{1, 1}, {3, 
    2}, {4, 2}}, {{1, 1}, {1, 2}} -> {{1, 2}, {3, 2}, {4, 2}}, {{1, 
    1}, {1, 2}} -> {{2, 1}, {3, 1}, {4, 1}}, {{1, 1}, {1, 2}} -> {{2, 
    2}, {3, 1}, {4, 1}}, {{1, 1}, {1, 2}} -> {{2, 2}, {3, 2}, {4, 
    1}}, {{1, 1}, {1, 2}} -> {{2, 2}, {3, 2}, {4, 2}}, {{1, 1}, {1, 
    2}} -> {{2, 2}, {3, 2}, {4, 3}}, {{1, 1}, {1, 2}} -> {{1, 1}, {3, 
    4}, {4, 2}}, {{1, 1}, {1, 2}} -> {{2, 2}, {3, 4}, {4, 1}}, {{1, 
    1}, {1, 2}} -> {{1, 3}, {1, 2}, {3, 2}}, {{1, 1}, {1, 2}} -> {{1, 
    3}, {1, 3}, {1, 2}}, {{1, 1}, {1, 2}} -> {{1, 3}, {1, 3}, {1, 
    3}}, {{1, 1}, {1, 2}} -> {{1, 3}, {1, 3}, {2, 1}}, {{1, 1}, {1, 
    2}} -> {{1, 3}, {1, 3}, {2, 3}}, {{1, 1}, {1, 2}} -> {{1, 3}, {1, 
    3}, {3, 1}}, {{1, 1}, {1, 2}} -> {{1, 3}, {1, 3}, {3, 2}}, {{1, 
    1}, {1, 2}} -> {{1, 3}, {3, 1}, {1, 2}}, {{1, 1}, {1, 2}} -> {{1, 
    3}, {3, 1}, {2, 1}}, {{1, 1}, {1, 2}} -> {{1, 3}, {3, 2}, {2, 
    1}}, {{1, 1}, {1, 2}} -> {{2, 3}, {2, 1}, {3, 1}}, {{1, 1}, {1, 
    2}} -> {{2, 3}, {2, 3}, {1, 2}}, {{1, 1}, {1, 2}} -> {{2, 3}, {2, 
    3}, {1, 3}}, {{1, 1}, {1, 2}} -> {{2, 3}, {2, 3}, {2, 1}}, {{1, 
    1}, {1, 2}} -> {{2, 3}, {2, 3}, {2, 3}}, {{1, 1}, {1, 2}} -> {{2, 
    3}, {2, 3}, {3, 1}}, {{1, 1}, {1, 2}} -> {{2, 3}, {2, 3}, {3, 
    2}}, {{1, 1}, {1, 2}} -> {{2, 3}, {3, 2}, {1, 2}}, {{1, 1}, {1, 
    2}} -> {{2, 3}, {3, 2}, {2, 1}}, {{1, 1}, {1, 2}} -> {{1, 3}, {1, 
    2}, {3, 4}}, {{1, 1}, {1, 2}} -> {{1, 3}, {1, 3}, {1, 4}}, {{1, 
    1}, {1, 2}} -> {{1, 3}, {1, 3}, {2, 4}}, {{1, 1}, {1, 2}} -> {{1, 
    3}, {1, 3}, {3, 4}}, {{1, 1}, {1, 2}} -> {{1, 3}, {3, 1}, {1, 
    4}}, {{1, 1}, {1, 2}} -> {{1, 3}, {3, 1}, {2, 4}}, {{1, 1}, {1, 
    2}} -> {{1, 3}, {3, 2}, {2, 4}}, {{1, 1}, {1, 2}} -> {{2, 3}, {2, 
    1}, {3, 4}}, {{1, 1}, {1, 2}} -> {{2, 3}, {2, 3}, {1, 4}}, {{1, 
    1}, {1, 2}} -> {{2, 3}, {2, 3}, {2, 4}}, {{1, 1}, {1, 2}} -> {{2, 
    3}, {2, 3}, {3, 4}}, {{1, 1}, {1, 2}} -> {{2, 3}, {3, 1}, {1, 
    4}}, {{1, 1}, {1, 2}} -> {{2, 3}, {3, 2}, {1, 4}}, {{1, 1}, {1, 
    2}} -> {{2, 3}, {3, 2}, {2, 4}}, {{1, 1}, {1, 2}} -> {{1, 3}, {1, 
    2}, {4, 3}}, {{1, 1}, {1, 2}} -> {{1, 3}, {1, 3}, {4, 1}}, {{1, 
    1}, {1, 2}} -> {{1, 3}, {1, 3}, {4, 2}}, {{1, 1}, {1, 2}} -> {{1, 
    3}, {1, 3}, {4, 3}}, {{1, 1}, {1, 2}} -> {{1, 3}, {2, 3}, {4, 
    3}}, {{1, 1}, {1, 2}} -> {{1, 3}, {3, 1}, {4, 1}}, {{1, 1}, {1, 
    2}} -> {{1, 3}, {3, 1}, {4, 2}}, {{1, 1}, {1, 2}} -> {{1, 3}, {3, 
    2}, {4, 2}}, {{1, 1}, {1, 2}} -> {{1, 3}, {3, 2}, {4, 3}}, {{1, 
    1}, {1, 2}} -> {{2, 3}, {2, 1}, {4, 3}}, {{1, 1}, {1, 2}} -> {{2, 
    3}, {2, 3}, {4, 1}}, {{1, 1}, {1, 2}} -> {{2, 3}, {2, 3}, {4, 
    2}}, {{1, 1}, {1, 2}} -> {{2, 3}, {2, 3}, {4, 3}}, {{1, 1}, {1, 
    2}} -> {{2, 3}, {3, 1}, {4, 1}}, {{1, 1}, {1, 2}} -> {{2, 3}, {3, 
    1}, {4, 3}}, {{1, 1}, {1, 2}} -> {{2, 3}, {3, 2}, {4, 1}}, {{1, 
    1}, {1, 2}} -> {{2, 3}, {3, 2}, {4, 2}}, {{1, 1}, {1, 2}} -> {{1, 
    3}, {1, 4}, {2, 1}}, {{1, 1}, {1, 2}} -> {{1, 3}, {1, 4}, {2, 
    3}}, {{1, 1}, {1, 2}} -> {{1, 3}, {1, 4}, {3, 2}}, {{1, 1}, {1, 
    2}} -> {{1, 3}, {1, 4}, {3, 4}}, {{1, 1}, {1, 2}} -> {{1, 3}, {3, 
    4}, {2, 3}}, {{1, 1}, {1, 2}} -> {{1, 3}, {3, 4}, {2, 4}}, {{1, 
    1}, {1, 2}} -> {{1, 3}, {3, 4}, {4, 1}}, {{1, 1}, {1, 2}} -> {{1, 
    3}, {3, 4}, {4, 2}}, {{1, 1}, {1, 2}} -> {{2, 3}, {2, 4}, {1, 
    2}}, {{1, 1}, {1, 2}} -> {{2, 3}, {2, 4}, {1, 3}}, {{1, 1}, {1, 
    2}} -> {{2, 3}, {2, 4}, {3, 1}}, {{1, 1}, {1, 2}} -> {{2, 3}, {2, 
    4}, {3, 4}}, {{1, 1}, {1, 2}} -> {{2, 3}, {3, 4}, {1, 4}}, {{1, 
    1}, {1, 2}} -> {{2, 3}, {3, 4}, {4, 1}}, {{1, 1}, {1, 2}} -> {{2, 
    3}, {3, 4}, {4, 2}}, {{1, 1}, {1, 2}} -> {{1, 3}, {1, 4}, {1, 
    5}}, {{1, 1}, {1, 2}} -> {{1, 3}, {1, 4}, {2, 5}}, {{1, 1}, {1, 
    2}} -> {{1, 3}, {1, 4}, {3, 5}}, {{1, 1}, {1, 2}} -> {{1, 3}, {3, 
    4}, {2, 5}}, {{1, 1}, {1, 2}} -> {{1, 3}, {3, 4}, {4, 5}}, {{1, 
    1}, {1, 2}} -> {{2, 3}, {2, 4}, {1, 5}}, {{1, 1}, {1, 2}} -> {{2, 
    3}, {2, 4}, {2, 5}}, {{1, 1}, {1, 2}} -> {{2, 3}, {2, 4}, {3, 
    5}}, {{1, 1}, {1, 2}} -> {{2, 3}, {3, 4}, {1, 5}}, {{1, 1}, {1, 
    2}} -> {{2, 3}, {3, 4}, {4, 5}}, {{1, 1}, {1, 2}} -> {{1, 3}, {1, 
    4}, {5, 1}}, {{1, 1}, {1, 2}} -> {{1, 3}, {1, 4}, {5, 2}}, {{1, 
    1}, {1, 2}} -> {{1, 3}, {1, 4}, {5, 3}}, {{1, 1}, {1, 2}} -> {{1, 
    3}, {3, 4}, {5, 2}}, {{1, 1}, {1, 2}} -> {{1, 3}, {3, 4}, {5, 
    3}}, {{1, 1}, {1, 2}} -> {{1, 3}, {3, 4}, {5, 4}}, {{1, 1}, {1, 
    2}} -> {{2, 3}, {2, 4}, {5, 1}}, {{1, 1}, {1, 2}} -> {{2, 3}, {2, 
    4}, {5, 2}}, {{1, 1}, {1, 2}} -> {{2, 3}, {2, 4}, {5, 3}}, {{1, 
    1}, {1, 2}} -> {{2, 3}, {3, 4}, {5, 1}}, {{1, 1}, {1, 2}} -> {{2, 
    3}, {3, 4}, {5, 3}}, {{1, 1}, {1, 2}} -> {{2, 3}, {3, 4}, {5, 
    4}}, {{1, 1}, {1, 2}} -> {{1, 3}, {4, 3}, {2, 5}}, {{1, 1}, {1, 
    2}} -> {{2, 3}, {4, 3}, {1, 5}}, {{1, 1}, {1, 2}} -> {{1, 3}, {4, 
    3}, {5, 2}}, {{1, 1}, {1, 2}} -> {{1, 3}, {4, 3}, {5, 3}}, {{1, 
    1}, {1, 2}} -> {{2, 3}, {4, 3}, {5, 1}}, {{1, 1}, {1, 2}} -> {{2, 
    3}, {4, 3}, {5, 3}}, {{1, 1}, {1, 2}} -> {{3, 1}, {1, 3}, {2, 
    3}}, {{1, 1}, {1, 2}} -> {{3, 1}, {1, 3}, {3, 2}}, {{1, 1}, {1, 
    2}} -> {{3, 1}, {3, 1}, {1, 2}}, {{1, 1}, {1, 2}} -> {{3, 1}, {3, 
    1}, {1, 3}}, {{1, 1}, {1, 2}} -> {{3, 1}, {3, 1}, {2, 1}}, {{1, 
    1}, {1, 2}} -> {{3, 1}, {3, 1}, {2, 3}}, {{1, 1}, {1, 2}} -> {{3, 
    1}, {3, 1}, {3, 1}}, {{1, 1}, {1, 2}} -> {{3, 1}, {3, 1}, {3, 
    2}}, {{1, 1}, {1, 2}} -> {{3, 1}, {3, 2}, {1, 2}}, {{1, 1}, {1, 
    2}} -> {{3, 2}, {2, 3}, {1, 3}}, {{1, 1}, {1, 2}} -> {{3, 2}, {2, 
    3}, {3, 1}}, {{1, 1}, {1, 2}} -> {{3, 2}, {3, 1}, {2, 1}}, {{1, 
    1}, {1, 2}} -> {{3, 2}, {3, 2}, {1, 2}}, {{1, 1}, {1, 2}} -> {{3, 
    2}, {3, 2}, {1, 3}}, {{1, 1}, {1, 2}} -> {{3, 2}, {3, 2}, {2, 
    1}}, {{1, 1}, {1, 2}} -> {{3, 2}, {3, 2}, {2, 3}}, {{1, 1}, {1, 
    2}} -> {{3, 2}, {3, 2}, {3, 1}}, {{1, 1}, {1, 2}} -> {{3, 2}, {3, 
    2}, {3, 2}}, {{1, 1}, {1, 2}} -> {{3, 3}, {1, 3}, {1, 2}}, {{1, 
    1}, {1, 2}} -> {{3, 3}, {1, 3}, {1, 3}}, {{1, 1}, {1, 2}} -> {{3, 
    3}, {1, 3}, {2, 1}}, {{1, 1}, {1, 2}} -> {{3, 3}, {1, 3}, {2, 
    2}}, {{1, 1}, {1, 2}} -> {{3, 3}, {1, 3}, {2, 3}}, {{1, 1}, {1, 
    2}} -> {{3, 3}, {2, 3}, {1, 1}}, {{1, 1}, {1, 2}} -> {{3, 3}, {2, 
    3}, {1, 2}}, {{1, 1}, {1, 2}} -> {{3, 3}, {2, 3}, {2, 1}}, {{1, 
    1}, {1, 2}} -> {{3, 3}, {2, 3}, {2, 3}}, {{1, 1}, {1, 2}} -> {{3, 
    3}, {3, 1}, {1, 1}}, {{1, 1}, {1, 2}} -> {{3, 3}, {3, 1}, {1, 
    2}}, {{1, 1}, {1, 2}} -> {{3, 3}, {3, 1}, {1, 3}}, {{1, 1}, {1, 
    2}} -> {{3, 3}, {3, 1}, {2, 1}}, {{1, 1}, {1, 2}} -> {{3, 3}, {3, 
    1}, {2, 2}}, {{1, 1}, {1, 2}} -> {{3, 3}, {3, 1}, {2, 3}}, {{1, 
    1}, {1, 2}} -> {{3, 3}, {3, 1}, {3, 1}}, {{1, 1}, {1, 2}} -> {{3, 
    3}, {3, 1}, {3, 2}}, {{1, 1}, {1, 2}} -> {{3, 3}, {3, 2}, {1, 
    1}}, {{1, 1}, {1, 2}} -> {{3, 3}, {3, 2}, {1, 2}}, {{1, 1}, {1, 
    2}} -> {{3, 3}, {3, 2}, {1, 3}}, {{1, 1}, {1, 2}} -> {{3, 3}, {3, 
    2}, {2, 1}}, {{1, 1}, {1, 2}} -> {{3, 3}, {3, 2}, {2, 2}}, {{1, 
    1}, {1, 2}} -> {{3, 3}, {3, 2}, {2, 3}}, {{1, 1}, {1, 2}} -> {{3, 
    3}, {3, 2}, {3, 2}}, {{1, 1}, {1, 2}} -> {{3, 3}, {3, 3}, {1, 
    3}}, {{1, 1}, {1, 2}} -> {{3, 3}, {3, 3}, {2, 3}}, {{1, 1}, {1, 
    2}} -> {{3, 3}, {3, 3}, {3, 1}}, {{1, 1}, {1, 2}} -> {{3, 3}, {3, 
    3}, {3, 2}}, {{1, 1}, {1, 2}} -> {{3, 1}, {1, 2}, {2, 4}}, {{1, 
    1}, {1, 2}} -> {{3, 1}, {1, 3}, {3, 4}}, {{1, 1}, {1, 2}} -> {{3, 
    1}, {3, 1}, {1, 4}}, {{1, 1}, {1, 2}} -> {{3, 1}, {3, 1}, {2, 
    4}}, {{1, 1}, {1, 2}} -> {{3, 1}, {3, 1}, {3, 4}}, {{1, 1}, {1, 
    2}} -> {{3, 1}, {3, 2}, {1, 4}}, {{1, 1}, {1, 2}} -> {{3, 1}, {3, 
    2}, {3, 4}}, {{1, 1}, {1, 2}} -> {{3, 2}, {2, 1}, {1, 4}}, {{1, 
    1}, {1, 2}} -> {{3, 2}, {2, 3}, {3, 4}}, {{1, 1}, {1, 2}} -> {{3, 
    2}, {3, 1}, {2, 4}}, {{1, 1}, {1, 2}} -> {{3, 2}, {3, 2}, {1, 
    4}}, {{1, 1}, {1, 2}} -> {{3, 2}, {3, 2}, {2, 4}}, {{1, 1}, {1, 
    2}} -> {{3, 2}, {3, 2}, {3, 4}}, {{1, 1}, {1, 2}} -> {{3, 3}, {1, 
    3}, {1, 4}}, {{1, 1}, {1, 2}} -> {{3, 3}, {1, 3}, {2, 4}}, {{1, 
    1}, {1, 2}} -> {{3, 3}, {2, 3}, {1, 4}}, {{1, 1}, {1, 2}} -> {{3, 
    3}, {2, 3}, {2, 4}}, {{1, 1}, {1, 2}} -> {{3, 3}, {3, 1}, {1, 
    4}}, {{1, 1}, {1, 2}} -> {{3, 3}, {3, 1}, {2, 4}}, {{1, 1}, {1, 
    2}} -> {{3, 3}, {3, 1}, {3, 4}}, {{1, 1}, {1, 2}} -> {{3, 3}, {3, 
    2}, {1, 4}}, {{1, 1}, {1, 2}} -> {{3, 3}, {3, 2}, {2, 4}}, {{1, 
    1}, {1, 2}} -> {{3, 3}, {3, 2}, {3, 4}}, {{1, 1}, {1, 2}} -> {{3, 
    1}, {1, 2}, {4, 1}}, {{1, 1}, {1, 2}} -> {{3, 1}, {1, 2}, {4, 
    2}}, {{1, 1}, {1, 2}} -> {{3, 1}, {1, 3}, {4, 3}}, {{1, 1}, {1, 
    2}} -> {{3, 1}, {3, 1}, {4, 1}}, {{1, 1}, {1, 2}} -> {{3, 1}, {3, 
    1}, {4, 2}}, {{1, 1}, {1, 2}} -> {{3, 1}, {3, 1}, {4, 3}}, {{1, 
    1}, {1, 2}} -> {{3, 1}, {3, 2}, {4, 1}}, {{1, 1}, {1, 2}} -> {{3, 
    1}, {3, 2}, {4, 3}}, {{1, 1}, {1, 2}} -> {{3, 2}, {2, 1}, {4, 
    1}}, {{1, 1}, {1, 2}} -> {{3, 2}, {2, 1}, {4, 2}}, {{1, 1}, {1, 
    2}} -> {{3, 2}, {2, 3}, {4, 3}}, {{1, 1}, {1, 2}} -> {{3, 2}, {3, 
    1}, {4, 2}}, {{1, 1}, {1, 2}} -> {{3, 2}, {3, 2}, {4, 1}}, {{1, 
    1}, {1, 2}} -> {{3, 2}, {3, 2}, {4, 2}}, {{1, 1}, {1, 2}} -> {{3, 
    2}, {3, 2}, {4, 3}}, {{1, 1}, {1, 2}} -> {{3, 3}, {1, 3}, {4, 
    1}}, {{1, 1}, {1, 2}} -> {{3, 3}, {1, 3}, {4, 2}}, {{1, 1}, {1, 
    2}} -> {{3, 3}, {1, 3}, {4, 3}}, {{1, 1}, {1, 2}} -> {{3, 3}, {2, 
    3}, {4, 1}}, {{1, 1}, {1, 2}} -> {{3, 3}, {2, 3}, {4, 2}}, {{1, 
    1}, {1, 2}} -> {{3, 3}, {2, 3}, {4, 3}}, {{1, 1}, {1, 2}} -> {{3, 
    3}, {3, 1}, {4, 1}}, {{1, 1}, {1, 2}} -> {{3, 3}, {3, 1}, {4, 
    2}}, {{1, 1}, {1, 2}} -> {{3, 3}, {3, 1}, {4, 3}}, {{1, 1}, {1, 
    2}} -> {{3, 3}, {3, 2}, {4, 1}}, {{1, 1}, {1, 2}} -> {{3, 3}, {3, 
    2}, {4, 2}}, {{1, 1}, {1, 2}} -> {{3, 3}, {3, 2}, {4, 3}}, {{1, 
    1}, {1, 2}} -> {{3, 1}, {1, 4}, {2, 4}}, {{1, 1}, {1, 2}} -> {{3, 
    1}, {1, 4}, {4, 2}}, {{1, 1}, {1, 2}} -> {{3, 1}, {3, 4}, {1, 
    2}}, {{1, 1}, {1, 2}} -> {{3, 1}, {3, 4}, {1, 4}}, {{1, 1}, {1, 
    2}} -> {{3, 1}, {3, 4}, {2, 1}}, {{1, 1}, {1, 2}} -> {{3, 1}, {3, 
    4}, {2, 3}}, {{1, 1}, {1, 2}} -> {{3, 2}, {2, 4}, {1, 4}}, {{1, 
    1}, {1, 2}} -> {{3, 2}, {2, 4}, {4, 1}}, {{1, 1}, {1, 2}} -> {{3, 
    2}, {3, 4}, {1, 2}}, {{1, 1}, {1, 2}} -> {{3, 2}, {3, 4}, {1, 
    3}}, {{1, 1}, {1, 2}} -> {{3, 2}, {3, 4}, {2, 1}}, {{1, 1}, {1, 
    2}} -> {{3, 2}, {3, 4}, {2, 4}}, {{1, 1}, {1, 2}} -> {{3, 3}, {3, 
    4}, {1, 3}}, {{1, 1}, {1, 2}} -> {{3, 3}, {3, 4}, {1, 4}}, {{1, 
    1}, {1, 2}} -> {{3, 3}, {3, 4}, {2, 3}}, {{1, 1}, {1, 2}} -> {{3, 
    3}, {3, 4}, {2, 4}}, {{1, 1}, {1, 2}} -> {{3, 3}, {3, 4}, {4, 
    1}}, {{1, 1}, {1, 2}} -> {{3, 3}, {3, 4}, {4, 2}}, {{1, 1}, {1, 
    2}} -> {{3, 1}, {1, 4}, {2, 5}}, {{1, 1}, {1, 2}} -> {{3, 1}, {1, 
    4}, {4, 5}}, {{1, 1}, {1, 2}} -> {{3, 1}, {3, 4}, {1, 5}}, {{1, 
    1}, {1, 2}} -> {{3, 1}, {3, 4}, {2, 5}}, {{1, 1}, {1, 2}} -> {{3, 
    1}, {3, 4}, {3, 5}}, {{1, 1}, {1, 2}} -> {{3, 2}, {2, 4}, {1, 
    5}}, {{1, 1}, {1, 2}} -> {{3, 2}, {2, 4}, {4, 5}}, {{1, 1}, {1, 
    2}} -> {{3, 2}, {3, 4}, {1, 5}}, {{1, 1}, {1, 2}} -> {{3, 2}, {3, 
    4}, {2, 5}}, {{1, 1}, {1, 2}} -> {{3, 2}, {3, 4}, {3, 5}}, {{1, 
    1}, {1, 2}} -> {{3, 1}, {1, 4}, {5, 1}}, {{1, 1}, {1, 2}} -> {{3, 
    1}, {1, 4}, {5, 2}}, {{1, 1}, {1, 2}} -> {{3, 1}, {1, 4}, {5, 
    4}}, {{1, 1}, {1, 2}} -> {{3, 1}, {3, 4}, {5, 1}}, {{1, 1}, {1, 
    2}} -> {{3, 1}, {3, 4}, {5, 2}}, {{1, 1}, {1, 2}} -> {{3, 1}, {3, 
    4}, {5, 3}}, {{1, 1}, {1, 2}} -> {{3, 2}, {2, 4}, {5, 1}}, {{1, 
    1}, {1, 2}} -> {{3, 2}, {2, 4}, {5, 2}}, {{1, 1}, {1, 2}} -> {{3, 
    2}, {2, 4}, {5, 4}}, {{1, 1}, {1, 2}} -> {{3, 2}, {3, 4}, {5, 
    1}}, {{1, 1}, {1, 2}} -> {{3, 2}, {3, 4}, {5, 2}}, {{1, 1}, {1, 
    2}} -> {{3, 2}, {3, 4}, {5, 3}}, {{1, 1}, {1, 2}} -> {{3, 3}, {4, 
    3}, {1, 4}}, {{1, 1}, {1, 2}} -> {{3, 3}, {4, 3}, {2, 4}}, {{1, 
    1}, {1, 2}} -> {{3, 3}, {4, 3}, {4, 1}}, {{1, 1}, {1, 2}} -> {{3, 
    3}, {4, 3}, {4, 2}}, {{1, 1}, {1, 2}} -> {{3, 1}, {4, 1}, {2, 
    5}}, {{1, 1}, {1, 2}} -> {{3, 2}, {4, 2}, {1, 5}}, {{1, 1}, {1, 
    2}} -> {{3, 1}, {4, 1}, {5, 1}}, {{1, 1}, {1, 2}} -> {{3, 1}, {4, 
    1}, {5, 2}}, {{1, 1}, {1, 2}} -> {{3, 2}, {4, 2}, {5, 1}}, {{1, 
    1}, {1, 2}} -> {{3, 2}, {4, 2}, {5, 2}}, {{1, 1}, {1, 2}} -> {{3, 
    4}, {3, 1}, {2, 4}}, {{1, 1}, {1, 2}} -> {{3, 4}, {3, 1}, {4, 
    1}}, {{1, 1}, {1, 2}} -> {{3, 4}, {3, 1}, {4, 2}}, {{1, 1}, {1, 
    2}} -> {{3, 4}, {3, 2}, {1, 4}}, {{1, 1}, {1, 2}} -> {{3, 4}, {3, 
    2}, {4, 1}}, {{1, 1}, {1, 2}} -> {{3, 4}, {3, 2}, {4, 2}}, {{1, 
    1}, {1, 2}} -> {{3, 4}, {3, 4}, {1, 3}}, {{1, 1}, {1, 2}} -> {{3, 
    4}, {3, 4}, {1, 4}}, {{1, 1}, {1, 2}} -> {{3, 4}, {3, 4}, {2, 
    3}}, {{1, 1}, {1, 2}} -> {{3, 4}, {3, 4}, {2, 4}}, {{1, 1}, {1, 
    2}} -> {{3, 4}, {3, 4}, {3, 1}}, {{1, 1}, {1, 2}} -> {{3, 4}, {3, 
    4}, {3, 2}}, {{1, 1}, {1, 2}} -> {{3, 4}, {3, 4}, {4, 1}}, {{1, 
    1}, {1, 2}} -> {{3, 4}, {3, 4}, {4, 2}}, {{1, 1}, {1, 2}} -> {{3, 
    4}, {4, 1}, {1, 2}}, {{1, 1}, {1, 2}} -> {{3, 4}, {4, 1}, {2, 
    1}}, {{1, 1}, {1, 2}} -> {{3, 4}, {4, 2}, {1, 2}}, {{1, 1}, {1, 
    2}} -> {{3, 4}, {4, 2}, {2, 1}}, {{1, 1}, {1, 2}} -> {{3, 4}, {4, 
    3}, {1, 3}}, {{1, 1}, {1, 2}} -> {{3, 4}, {4, 3}, {2, 3}}, {{1, 
    1}, {1, 2}} -> {{3, 4}, {4, 3}, {3, 1}}, {{1, 1}, {1, 2}} -> {{3, 
    4}, {4, 3}, {3, 2}}, {{1, 1}, {1, 2}} -> {{3, 4}, {3, 1}, {4, 
    5}}, {{1, 1}, {1, 2}} -> {{3, 4}, {3, 2}, {4, 5}}, {{1, 1}, {1, 
    2}} -> {{3, 4}, {4, 1}, {1, 5}}, {{1, 1}, {1, 2}} -> {{3, 4}, {4, 
    1}, {2, 5}}, {{1, 1}, {1, 2}} -> {{3, 4}, {4, 2}, {1, 5}}, {{1, 
    1}, {1, 2}} -> {{3, 4}, {4, 2}, {2, 5}}, {{1, 1}, {1, 2}} -> {{3, 
    4}, {3, 1}, {5, 4}}, {{1, 1}, {1, 2}} -> {{3, 4}, {3, 2}, {5, 
    4}}, {{1, 1}, {1, 2}} -> {{3, 4}, {4, 1}, {5, 1}}, {{1, 1}, {1, 
    2}} -> {{3, 4}, {4, 1}, {5, 2}}, {{1, 1}, {1, 2}} -> {{3, 4}, {4, 
    1}, {5, 4}}, {{1, 1}, {1, 2}} -> {{3, 4}, {4, 2}, {5, 1}}, {{1, 
    1}, {1, 2}} -> {{3, 4}, {4, 2}, {5, 2}}, {{1, 1}, {1, 2}} -> {{3, 
    4}, {4, 2}, {5, 4}}, {{1, 1}, {1, 2}} -> {{3, 4}, {3, 5}, {1, 
    3}}, {{1, 1}, {1, 2}} -> {{3, 4}, {3, 5}, {1, 4}}, {{1, 1}, {1, 
    2}} -> {{3, 4}, {3, 5}, {2, 3}}, {{1, 1}, {1, 2}} -> {{3, 4}, {3, 
    5}, {2, 4}}, {{1, 1}, {1, 2}} -> {{3, 4}, {3, 5}, {4, 1}}, {{1, 
    1}, {1, 2}} -> {{3, 4}, {3, 5}, {4, 2}}, {{1, 1}, {1, 2}} -> {{3, 
    4}, {4, 5}, {1, 5}}, {{1, 1}, {1, 2}} -> {{3, 4}, {4, 5}, {2, 
    5}}, {{1, 1}, {1, 2}} -> {{3, 4}, {4, 5}, {5, 1}}, {{1, 1}, {1, 
    2}} -> {{3, 4}, {4, 5}, {5, 2}}, {{1, 1}, {2, 1}} -> {{1, 1}, {1, 
    1}, {1, 1}}, {{1, 1}, {2, 1}} -> {{1, 1}, {1, 1}, {1, 2}}, {{1, 
    1}, {2, 1}} -> {{1, 1}, {1, 1}, {2, 1}}, {{1, 1}, {2, 1}} -> {{1, 
    1}, {1, 1}, {2, 2}}, {{1, 1}, {2, 1}} -> {{1, 1}, {1, 2}, {1, 
    2}}, {{1, 1}, {2, 1}} -> {{1, 1}, {1, 2}, {2, 1}}, {{1, 1}, {2, 
    1}} -> {{1, 1}, {1, 2}, {2, 2}}, {{1, 1}, {2, 1}} -> {{1, 1}, {2, 
    1}, {2, 1}}, {{1, 1}, {2, 1}} -> {{1, 2}, {1, 2}, {1, 2}}, {{1, 
    1}, {2, 1}} -> {{1, 2}, {1, 2}, {2, 1}}, {{1, 1}, {2, 1}} -> {{2, 
    1}, {2, 1}, {1, 2}}, {{1, 1}, {2, 1}} -> {{2, 1}, {2, 1}, {2, 
    1}}, {{1, 1}, {2, 1}} -> {{2, 2}, {1, 2}, {1, 2}}, {{1, 1}, {2, 
    1}} -> {{2, 2}, {2, 1}, {1, 1}}, {{1, 1}, {2, 1}} -> {{2, 2}, {2, 
    1}, {1, 2}}, {{1, 1}, {2, 1}} -> {{2, 2}, {2, 1}, {2, 1}}, {{1, 
    1}, {2, 1}} -> {{2, 2}, {2, 2}, {1, 1}}, {{1, 1}, {2, 1}} -> {{2, 
    2}, {2, 2}, {1, 2}}, {{1, 1}, {2, 1}} -> {{2, 2}, {2, 2}, {2, 
    1}}, {{1, 1}, {2, 1}} -> {{2, 2}, {2, 2}, {2, 2}}, {{1, 1}, {2, 
    1}} -> {{1, 1}, {1, 1}, {1, 3}}, {{1, 1}, {2, 1}} -> {{1, 1}, {1, 
    1}, {2, 3}}, {{1, 1}, {2, 1}} -> {{1, 1}, {1, 2}, {1, 3}}, {{1, 
    1}, {2, 1}} -> {{1, 1}, {1, 2}, {2, 3}}, {{1, 1}, {2, 1}} -> {{1, 
    1}, {2, 1}, {2, 3}}, {{1, 1}, {2, 1}} -> {{1, 2}, {1, 2}, {1, 
    3}}, {{1, 1}, {2, 1}} -> {{1, 2}, {1, 2}, {2, 3}}, {{1, 1}, {2, 
    1}} -> {{1, 2}, {2, 1}, {1, 3}}, {{1, 1}, {2, 1}} -> {{2, 1}, {1, 
    2}, {2, 3}}, {{1, 1}, {2, 1}} -> {{2, 1}, {2, 1}, {1, 3}}, {{1, 
    1}, {2, 1}} -> {{2, 1}, {2, 1}, {2, 3}}, {{1, 1}, {2, 1}} -> {{2, 
    2}, {1, 2}, {1, 3}}, {{1, 1}, {2, 1}} -> {{2, 2}, {2, 1}, {1, 
    3}}, {{1, 1}, {2, 1}} -> {{2, 2}, {2, 1}, {2, 3}}, {{1, 1}, {2, 
    1}} -> {{2, 2}, {2, 2}, {1, 3}}, {{1, 1}, {2, 1}} -> {{2, 2}, {2, 
    2}, {2, 3}}, {{1, 1}, {2, 1}} -> {{1, 1}, {1, 1}, {3, 1}}, {{1, 
    1}, {2, 1}} -> {{1, 1}, {1, 1}, {3, 2}}, {{1, 1}, {2, 1}} -> {{1, 
    1}, {1, 2}, {3, 1}}, {{1, 1}, {2, 1}} -> {{1, 1}, {1, 2}, {3, 
    2}}, {{1, 1}, {2, 1}} -> {{1, 1}, {2, 1}, {3, 1}}, {{1, 1}, {2, 
    1}} -> {{1, 1}, {2, 1}, {3, 2}}, {{1, 1}, {2, 1}} -> {{1, 2}, {1, 
    2}, {3, 1}}, {{1, 1}, {2, 1}} -> {{1, 2}, {1, 2}, {3, 2}}, {{1, 
    1}, {2, 1}} -> {{1, 2}, {2, 1}, {3, 1}}, {{1, 1}, {2, 1}} -> {{2, 
    1}, {1, 2}, {3, 2}}, {{1, 1}, {2, 1}} -> {{2, 1}, {2, 1}, {3, 
    1}}, {{1, 1}, {2, 1}} -> {{2, 1}, {2, 1}, {3, 2}}, {{1, 1}, {2, 
    1}} -> {{2, 2}, {1, 2}, {3, 1}}, {{1, 1}, {2, 1}} -> {{2, 2}, {1, 
    2}, {3, 2}}, {{1, 1}, {2, 1}} -> {{2, 2}, {2, 1}, {3, 1}}, {{1, 
    1}, {2, 1}} -> {{2, 2}, {2, 1}, {3, 2}}, {{1, 1}, {2, 1}} -> {{2, 
    2}, {2, 2}, {3, 1}}, {{1, 1}, {2, 1}} -> {{2, 2}, {2, 2}, {3, 
    2}}, {{1, 1}, {2, 1}} -> {{1, 1}, {1, 3}, {1, 3}}, {{1, 1}, {2, 
    1}} -> {{1, 1}, {1, 3}, {2, 1}}, {{1, 1}, {2, 1}} -> {{1, 1}, {1, 
    3}, {2, 2}}, {{1, 1}, {2, 1}} -> {{1, 1}, {1, 3}, {2, 3}}, {{1, 
    1}, {2, 1}} -> {{1, 1}, {1, 3}, {3, 1}}, {{1, 1}, {2, 1}} -> {{1, 
    1}, {1, 3}, {3, 2}}, {{1, 1}, {2, 1}} -> {{1, 1}, {1, 3}, {3, 
    3}}, {{1, 1}, {2, 1}} -> {{1, 1}, {2, 3}, {2, 3}}, {{1, 1}, {2, 
    1}} -> {{1, 1}, {2, 3}, {3, 2}}, {{1, 1}, {2, 1}} -> {{1, 2}, {1, 
    3}, {2, 3}}, {{1, 1}, {2, 1}} -> {{1, 2}, {2, 3}, {3, 1}}, {{1, 
    1}, {2, 1}} -> {{2, 1}, {2, 3}, {1, 3}}, {{1, 1}, {2, 1}} -> {{2, 
    2}, {1, 3}, {1, 3}}, {{1, 1}, {2, 1}} -> {{2, 2}, {1, 3}, {3, 
    1}}, {{1, 1}, {2, 1}} -> {{2, 2}, {2, 3}, {1, 1}}, {{1, 1}, {2, 
    1}} -> {{2, 2}, {2, 3}, {1, 2}}, {{1, 1}, {2, 1}} -> {{2, 2}, {2, 
    3}, {1, 3}}, {{1, 1}, {2, 1}} -> {{2, 2}, {2, 3}, {2, 3}}, {{1, 
    1}, {2, 1}} -> {{2, 2}, {2, 3}, {3, 1}}, {{1, 1}, {2, 1}} -> {{2, 
    2}, {2, 3}, {3, 2}}, {{1, 1}, {2, 1}} -> {{2, 2}, {2, 3}, {3, 
    3}}, {{1, 1}, {2, 1}} -> {{1, 1}, {1, 3}, {1, 4}}, {{1, 1}, {2, 
    1}} -> {{1, 1}, {1, 3}, {2, 4}}, {{1, 1}, {2, 1}} -> {{1, 1}, {1, 
    3}, {3, 4}}, {{1, 1}, {2, 1}} -> {{1, 1}, {2, 3}, {2, 4}}, {{1, 
    1}, {2, 1}} -> {{1, 1}, {2, 3}, {3, 4}}, {{1, 1}, {2, 1}} -> {{1, 
    2}, {1, 3}, {1, 4}}, {{1, 1}, {2, 1}} -> {{1, 2}, {1, 3}, {2, 
    4}}, {{1, 1}, {2, 1}} -> {{1, 2}, {2, 3}, {3, 4}}, {{1, 1}, {2, 
    1}} -> {{2, 1}, {1, 3}, {3, 4}}, {{1, 1}, {2, 1}} -> {{2, 1}, {2, 
    3}, {1, 4}}, {{1, 1}, {2, 1}} -> {{2, 1}, {2, 3}, {2, 4}}, {{1, 
    1}, {2, 1}} -> {{2, 2}, {1, 3}, {1, 4}}, {{1, 1}, {2, 1}} -> {{2, 
    2}, {1, 3}, {3, 4}}, {{1, 1}, {2, 1}} -> {{2, 2}, {2, 3}, {1, 
    4}}, {{1, 1}, {2, 1}} -> {{2, 2}, {2, 3}, {2, 4}}, {{1, 1}, {2, 
    1}} -> {{2, 2}, {2, 3}, {3, 4}}, {{1, 1}, {2, 1}} -> {{1, 1}, {1, 
    3}, {4, 1}}, {{1, 1}, {2, 1}} -> {{1, 1}, {1, 3}, {4, 2}}, {{1, 
    1}, {2, 1}} -> {{1, 1}, {1, 3}, {4, 3}}, {{1, 1}, {2, 1}} -> {{1, 
    1}, {2, 3}, {4, 3}}, {{1, 1}, {2, 1}} -> {{1, 2}, {1, 3}, {4, 
    1}}, {{1, 1}, {2, 1}} -> {{1, 2}, {1, 3}, {4, 2}}, {{1, 1}, {2, 
    1}} -> {{1, 2}, {2, 3}, {4, 2}}, {{1, 1}, {2, 1}} -> {{1, 2}, {2, 
    3}, {4, 3}}, {{1, 1}, {2, 1}} -> {{2, 1}, {1, 3}, {4, 1}}, {{1, 
    1}, {2, 1}} -> {{2, 1}, {1, 3}, {4, 3}}, {{1, 1}, {2, 1}} -> {{2, 
    1}, {2, 3}, {4, 1}}, {{1, 1}, {2, 1}} -> {{2, 1}, {2, 3}, {4, 
    2}}, {{1, 1}, {2, 1}} -> {{2, 2}, {1, 3}, {4, 3}}, {{1, 1}, {2, 
    1}} -> {{2, 2}, {2, 3}, {4, 1}}, {{1, 1}, {2, 1}} -> {{2, 2}, {2, 
    3}, {4, 2}}, {{1, 1}, {2, 1}} -> {{2, 2}, {2, 3}, {4, 3}}, {{1, 
    1}, {2, 1}} -> {{1, 1}, {3, 1}, {2, 2}}, {{1, 1}, {2, 1}} -> {{1, 
    1}, {3, 1}, {2, 3}}, {{1, 1}, {2, 1}} -> {{1, 1}, {3, 1}, {3, 
    1}}, {{1, 1}, {2, 1}} -> {{1, 1}, {3, 1}, {3, 2}}, {{1, 1}, {2, 
    1}} -> {{1, 1}, {3, 2}, {3, 2}}, {{1, 1}, {2, 1}} -> {{2, 2}, {3, 
    1}, {3, 1}}, {{1, 1}, {2, 1}} -> {{2, 2}, {3, 2}, {1, 1}}, {{1, 
    1}, {2, 1}} -> {{2, 2}, {3, 2}, {1, 3}}, {{1, 1}, {2, 1}} -> {{2, 
    2}, {3, 2}, {3, 1}}, {{1, 1}, {2, 1}} -> {{2, 2}, {3, 2}, {3, 
    2}}, {{1, 1}, {2, 1}} -> {{1, 1}, {3, 1}, {2, 4}}, {{1, 1}, {2, 
    1}} -> {{1, 1}, {3, 1}, {3, 4}}, {{1, 1}, {2, 1}} -> {{1, 1}, {3, 
    2}, {2, 4}}, {{1, 1}, {2, 1}} -> {{1, 1}, {3, 2}, {3, 4}}, {{1, 
    1}, {2, 1}} -> {{2, 2}, {3, 1}, {1, 4}}, {{1, 1}, {2, 1}} -> {{2, 
    2}, {3, 1}, {3, 4}}, {{1, 1}, {2, 1}} -> {{2, 2}, {3, 2}, {1, 
    4}}, {{1, 1}, {2, 1}} -> {{2, 2}, {3, 2}, {3, 4}}, {{1, 1}, {2, 
    1}} -> {{1, 1}, {3, 1}, {4, 1}}, {{1, 1}, {2, 1}} -> {{1, 1}, {3, 
    1}, {4, 2}}, {{1, 1}, {2, 1}} -> {{1, 1}, {3, 1}, {4, 3}}, {{1, 
    1}, {2, 1}} -> {{1, 1}, {3, 2}, {4, 2}}, {{1, 1}, {2, 1}} -> {{1, 
    2}, {3, 2}, {4, 2}}, {{1, 1}, {2, 1}} -> {{2, 1}, {3, 1}, {4, 
    1}}, {{1, 1}, {2, 1}} -> {{2, 2}, {3, 1}, {4, 1}}, {{1, 1}, {2, 
    1}} -> {{2, 2}, {3, 2}, {4, 1}}, {{1, 1}, {2, 1}} -> {{2, 2}, {3, 
    2}, {4, 2}}, {{1, 1}, {2, 1}} -> {{2, 2}, {3, 2}, {4, 3}}, {{1, 
    1}, {2, 1}} -> {{1, 1}, {3, 4}, {4, 2}}, {{1, 1}, {2, 1}} -> {{2, 
    2}, {3, 4}, {4, 1}}, {{1, 1}, {2, 1}} -> {{1, 3}, {1, 2}, {3, 
    2}}, {{1, 1}, {2, 1}} -> {{1, 3}, {1, 3}, {1, 2}}, {{1, 1}, {2, 
    1}} -> {{1, 3}, {1, 3}, {1, 3}}, {{1, 1}, {2, 1}} -> {{1, 3}, {1, 
    3}, {2, 1}}, {{1, 1}, {2, 1}} -> {{1, 3}, {1, 3}, {2, 3}}, {{1, 
    1}, {2, 1}} -> {{1, 3}, {1, 3}, {3, 1}}, {{1, 1}, {2, 1}} -> {{1, 
    3}, {1, 3}, {3, 2}}, {{1, 1}, {2, 1}} -> {{1, 3}, {3, 1}, {1, 
    2}}, {{1, 1}, {2, 1}} -> {{1, 3}, {3, 1}, {2, 1}}, {{1, 1}, {2, 
    1}} -> {{1, 3}, {3, 2}, {2, 1}}, {{1, 1}, {2, 1}} -> {{2, 3}, {2, 
    1}, {3, 1}}, {{1, 1}, {2, 1}} -> {{2, 3}, {2, 3}, {1, 2}}, {{1, 
    1}, {2, 1}} -> {{2, 3}, {2, 3}, {1, 3}}, {{1, 1}, {2, 1}} -> {{2, 
    3}, {2, 3}, {2, 1}}, {{1, 1}, {2, 1}} -> {{2, 3}, {2, 3}, {2, 
    3}}, {{1, 1}, {2, 1}} -> {{2, 3}, {2, 3}, {3, 1}}, {{1, 1}, {2, 
    1}} -> {{2, 3}, {2, 3}, {3, 2}}, {{1, 1}, {2, 1}} -> {{2, 3}, {3, 
    2}, {1, 2}}, {{1, 1}, {2, 1}} -> {{2, 3}, {3, 2}, {2, 1}}, {{1, 
    1}, {2, 1}} -> {{1, 3}, {1, 2}, {3, 4}}, {{1, 1}, {2, 1}} -> {{1, 
    3}, {1, 3}, {1, 4}}, {{1, 1}, {2, 1}} -> {{1, 3}, {1, 3}, {2, 
    4}}, {{1, 1}, {2, 1}} -> {{1, 3}, {1, 3}, {3, 4}}, {{1, 1}, {2, 
    1}} -> {{1, 3}, {3, 1}, {1, 4}}, {{1, 1}, {2, 1}} -> {{1, 3}, {3, 
    1}, {2, 4}}, {{1, 1}, {2, 1}} -> {{1, 3}, {3, 2}, {2, 4}}, {{1, 
    1}, {2, 1}} -> {{2, 3}, {2, 1}, {3, 4}}, {{1, 1}, {2, 1}} -> {{2, 
    3}, {2, 3}, {1, 4}}, {{1, 1}, {2, 1}} -> {{2, 3}, {2, 3}, {2, 
    4}}, {{1, 1}, {2, 1}} -> {{2, 3}, {2, 3}, {3, 4}}, {{1, 1}, {2, 
    1}} -> {{2, 3}, {3, 1}, {1, 4}}, {{1, 1}, {2, 1}} -> {{2, 3}, {3, 
    2}, {1, 4}}, {{1, 1}, {2, 1}} -> {{2, 3}, {3, 2}, {2, 4}}, {{1, 
    1}, {2, 1}} -> {{1, 3}, {1, 2}, {4, 3}}, {{1, 1}, {2, 1}} -> {{1, 
    3}, {1, 3}, {4, 1}}, {{1, 1}, {2, 1}} -> {{1, 3}, {1, 3}, {4, 
    2}}, {{1, 1}, {2, 1}} -> {{1, 3}, {1, 3}, {4, 3}}, {{1, 1}, {2, 
    1}} -> {{1, 3}, {2, 3}, {4, 3}}, {{1, 1}, {2, 1}} -> {{1, 3}, {3, 
    1}, {4, 1}}, {{1, 1}, {2, 1}} -> {{1, 3}, {3, 1}, {4, 2}}, {{1, 
    1}, {2, 1}} -> {{1, 3}, {3, 2}, {4, 2}}, {{1, 1}, {2, 1}} -> {{1, 
    3}, {3, 2}, {4, 3}}, {{1, 1}, {2, 1}} -> {{2, 3}, {2, 1}, {4, 
    3}}, {{1, 1}, {2, 1}} -> {{2, 3}, {2, 3}, {4, 1}}, {{1, 1}, {2, 
    1}} -> {{2, 3}, {2, 3}, {4, 2}}, {{1, 1}, {2, 1}} -> {{2, 3}, {2, 
    3}, {4, 3}}, {{1, 1}, {2, 1}} -> {{2, 3}, {3, 1}, {4, 1}}, {{1, 
    1}, {2, 1}} -> {{2, 3}, {3, 1}, {4, 3}}, {{1, 1}, {2, 1}} -> {{2, 
    3}, {3, 2}, {4, 1}}, {{1, 1}, {2, 1}} -> {{2, 3}, {3, 2}, {4, 
    2}}, {{1, 1}, {2, 1}} -> {{1, 3}, {1, 4}, {2, 1}}, {{1, 1}, {2, 
    1}} -> {{1, 3}, {1, 4}, {2, 3}}, {{1, 1}, {2, 1}} -> {{1, 3}, {1, 
    4}, {3, 2}}, {{1, 1}, {2, 1}} -> {{1, 3}, {1, 4}, {3, 4}}, {{1, 
    1}, {2, 1}} -> {{1, 3}, {3, 4}, {2, 3}}, {{1, 1}, {2, 1}} -> {{1, 
    3}, {3, 4}, {2, 4}}, {{1, 1}, {2, 1}} -> {{1, 3}, {3, 4}, {4, 
    1}}, {{1, 1}, {2, 1}} -> {{1, 3}, {3, 4}, {4, 2}}, {{1, 1}, {2, 
    1}} -> {{2, 3}, {2, 4}, {1, 2}}, {{1, 1}, {2, 1}} -> {{2, 3}, {2, 
    4}, {1, 3}}, {{1, 1}, {2, 1}} -> {{2, 3}, {2, 4}, {3, 1}}, {{1, 
    1}, {2, 1}} -> {{2, 3}, {2, 4}, {3, 4}}, {{1, 1}, {2, 1}} -> {{2, 
    3}, {3, 4}, {1, 4}}, {{1, 1}, {2, 1}} -> {{2, 3}, {3, 4}, {4, 
    1}}, {{1, 1}, {2, 1}} -> {{2, 3}, {3, 4}, {4, 2}}, {{1, 1}, {2, 
    1}} -> {{1, 3}, {1, 4}, {1, 5}}, {{1, 1}, {2, 1}} -> {{1, 3}, {1, 
    4}, {2, 5}}, {{1, 1}, {2, 1}} -> {{1, 3}, {1, 4}, {3, 5}}, {{1, 
    1}, {2, 1}} -> {{1, 3}, {3, 4}, {2, 5}}, {{1, 1}, {2, 1}} -> {{1, 
    3}, {3, 4}, {4, 5}}, {{1, 1}, {2, 1}} -> {{2, 3}, {2, 4}, {1, 
    5}}, {{1, 1}, {2, 1}} -> {{2, 3}, {2, 4}, {2, 5}}, {{1, 1}, {2, 
    1}} -> {{2, 3}, {2, 4}, {3, 5}}, {{1, 1}, {2, 1}} -> {{2, 3}, {3, 
    4}, {1, 5}}, {{1, 1}, {2, 1}} -> {{2, 3}, {3, 4}, {4, 5}}, {{1, 
    1}, {2, 1}} -> {{1, 3}, {1, 4}, {5, 1}}, {{1, 1}, {2, 1}} -> {{1, 
    3}, {1, 4}, {5, 2}}, {{1, 1}, {2, 1}} -> {{1, 3}, {1, 4}, {5, 
    3}}, {{1, 1}, {2, 1}} -> {{1, 3}, {3, 4}, {5, 2}}, {{1, 1}, {2, 
    1}} -> {{1, 3}, {3, 4}, {5, 3}}, {{1, 1}, {2, 1}} -> {{1, 3}, {3, 
    4}, {5, 4}}, {{1, 1}, {2, 1}} -> {{2, 3}, {2, 4}, {5, 1}}, {{1, 
    1}, {2, 1}} -> {{2, 3}, {2, 4}, {5, 2}}, {{1, 1}, {2, 1}} -> {{2, 
    3}, {2, 4}, {5, 3}}, {{1, 1}, {2, 1}} -> {{2, 3}, {3, 4}, {5, 
    1}}, {{1, 1}, {2, 1}} -> {{2, 3}, {3, 4}, {5, 3}}, {{1, 1}, {2, 
    1}} -> {{2, 3}, {3, 4}, {5, 4}}, {{1, 1}, {2, 1}} -> {{1, 3}, {4, 
    3}, {2, 5}}, {{1, 1}, {2, 1}} -> {{2, 3}, {4, 3}, {1, 5}}, {{1, 
    1}, {2, 1}} -> {{1, 3}, {4, 3}, {5, 2}}, {{1, 1}, {2, 1}} -> {{1, 
    3}, {4, 3}, {5, 3}}, {{1, 1}, {2, 1}} -> {{2, 3}, {4, 3}, {5, 
    1}}, {{1, 1}, {2, 1}} -> {{2, 3}, {4, 3}, {5, 3}}, {{1, 1}, {2, 
    1}} -> {{3, 1}, {1, 3}, {2, 3}}, {{1, 1}, {2, 1}} -> {{3, 1}, {1, 
    3}, {3, 2}}, {{1, 1}, {2, 1}} -> {{3, 1}, {3, 1}, {1, 2}}, {{1, 
    1}, {2, 1}} -> {{3, 1}, {3, 1}, {1, 3}}, {{1, 1}, {2, 1}} -> {{3, 
    1}, {3, 1}, {2, 1}}, {{1, 1}, {2, 1}} -> {{3, 1}, {3, 1}, {2, 
    3}}, {{1, 1}, {2, 1}} -> {{3, 1}, {3, 1}, {3, 1}}, {{1, 1}, {2, 
    1}} -> {{3, 1}, {3, 1}, {3, 2}}, {{1, 1}, {2, 1}} -> {{3, 1}, {3, 
    2}, {1, 2}}, {{1, 1}, {2, 1}} -> {{3, 2}, {2, 3}, {1, 3}}, {{1, 
    1}, {2, 1}} -> {{3, 2}, {2, 3}, {3, 1}}, {{1, 1}, {2, 1}} -> {{3, 
    2}, {3, 1}, {2, 1}}, {{1, 1}, {2, 1}} -> {{3, 2}, {3, 2}, {1, 
    2}}, {{1, 1}, {2, 1}} -> {{3, 2}, {3, 2}, {1, 3}}, {{1, 1}, {2, 
    1}} -> {{3, 2}, {3, 2}, {2, 1}}, {{1, 1}, {2, 1}} -> {{3, 2}, {3, 
    2}, {2, 3}}, {{1, 1}, {2, 1}} -> {{3, 2}, {3, 2}, {3, 1}}, {{1, 
    1}, {2, 1}} -> {{3, 2}, {3, 2}, {3, 2}}, {{1, 1}, {2, 1}} -> {{3, 
    3}, {1, 3}, {1, 2}}, {{1, 1}, {2, 1}} -> {{3, 3}, {1, 3}, {1, 
    3}}, {{1, 1}, {2, 1}} -> {{3, 3}, {1, 3}, {2, 1}}, {{1, 1}, {2, 
    1}} -> {{3, 3}, {1, 3}, {2, 2}}, {{1, 1}, {2, 1}} -> {{3, 3}, {1, 
    3}, {2, 3}}, {{1, 1}, {2, 1}} -> {{3, 3}, {2, 3}, {1, 1}}, {{1, 
    1}, {2, 1}} -> {{3, 3}, {2, 3}, {1, 2}}, {{1, 1}, {2, 1}} -> {{3, 
    3}, {2, 3}, {2, 1}}, {{1, 1}, {2, 1}} -> {{3, 3}, {2, 3}, {2, 
    3}}, {{1, 1}, {2, 1}} -> {{3, 3}, {3, 1}, {1, 1}}, {{1, 1}, {2, 
    1}} -> {{3, 3}, {3, 1}, {1, 2}}, {{1, 1}, {2, 1}} -> {{3, 3}, {3, 
    1}, {1, 3}}, {{1, 1}, {2, 1}} -> {{3, 3}, {3, 1}, {2, 1}}, {{1, 
    1}, {2, 1}} -> {{3, 3}, {3, 1}, {2, 2}}, {{1, 1}, {2, 1}} -> {{3, 
    3}, {3, 1}, {2, 3}}, {{1, 1}, {2, 1}} -> {{3, 3}, {3, 1}, {3, 
    1}}, {{1, 1}, {2, 1}} -> {{3, 3}, {3, 1}, {3, 2}}, {{1, 1}, {2, 
    1}} -> {{3, 3}, {3, 2}, {1, 1}}, {{1, 1}, {2, 1}} -> {{3, 3}, {3, 
    2}, {1, 2}}, {{1, 1}, {2, 1}} -> {{3, 3}, {3, 2}, {1, 3}}, {{1, 
    1}, {2, 1}} -> {{3, 3}, {3, 2}, {2, 1}}, {{1, 1}, {2, 1}} -> {{3, 
    3}, {3, 2}, {2, 2}}, {{1, 1}, {2, 1}} -> {{3, 3}, {3, 2}, {2, 
    3}}, {{1, 1}, {2, 1}} -> {{3, 3}, {3, 2}, {3, 2}}, {{1, 1}, {2, 
    1}} -> {{3, 3}, {3, 3}, {1, 3}}, {{1, 1}, {2, 1}} -> {{3, 3}, {3, 
    3}, {2, 3}}, {{1, 1}, {2, 1}} -> {{3, 3}, {3, 3}, {3, 1}}, {{1, 
    1}, {2, 1}} -> {{3, 3}, {3, 3}, {3, 2}}, {{1, 1}, {2, 1}} -> {{3, 
    1}, {1, 2}, {2, 4}}, {{1, 1}, {2, 1}} -> {{3, 1}, {1, 3}, {3, 
    4}}, {{1, 1}, {2, 1}} -> {{3, 1}, {3, 1}, {1, 4}}, {{1, 1}, {2, 
    1}} -> {{3, 1}, {3, 1}, {2, 4}}, {{1, 1}, {2, 1}} -> {{3, 1}, {3, 
    1}, {3, 4}}, {{1, 1}, {2, 1}} -> {{3, 1}, {3, 2}, {1, 4}}, {{1, 
    1}, {2, 1}} -> {{3, 1}, {3, 2}, {3, 4}}, {{1, 1}, {2, 1}} -> {{3, 
    2}, {2, 1}, {1, 4}}, {{1, 1}, {2, 1}} -> {{3, 2}, {2, 3}, {3, 
    4}}, {{1, 1}, {2, 1}} -> {{3, 2}, {3, 1}, {2, 4}}, {{1, 1}, {2, 
    1}} -> {{3, 2}, {3, 2}, {1, 4}}, {{1, 1}, {2, 1}} -> {{3, 2}, {3, 
    2}, {2, 4}}, {{1, 1}, {2, 1}} -> {{3, 2}, {3, 2}, {3, 4}}, {{1, 
    1}, {2, 1}} -> {{3, 3}, {1, 3}, {1, 4}}, {{1, 1}, {2, 1}} -> {{3, 
    3}, {1, 3}, {2, 4}}, {{1, 1}, {2, 1}} -> {{3, 3}, {2, 3}, {1, 
    4}}, {{1, 1}, {2, 1}} -> {{3, 3}, {2, 3}, {2, 4}}, {{1, 1}, {2, 
    1}} -> {{3, 3}, {3, 1}, {1, 4}}, {{1, 1}, {2, 1}} -> {{3, 3}, {3, 
    1}, {2, 4}}, {{1, 1}, {2, 1}} -> {{3, 3}, {3, 1}, {3, 4}}, {{1, 
    1}, {2, 1}} -> {{3, 3}, {3, 2}, {1, 4}}, {{1, 1}, {2, 1}} -> {{3, 
    3}, {3, 2}, {2, 4}}, {{1, 1}, {2, 1}} -> {{3, 3}, {3, 2}, {3, 
    4}}, {{1, 1}, {2, 1}} -> {{3, 1}, {1, 2}, {4, 1}}, {{1, 1}, {2, 
    1}} -> {{3, 1}, {1, 2}, {4, 2}}, {{1, 1}, {2, 1}} -> {{3, 1}, {1, 
    3}, {4, 3}}, {{1, 1}, {2, 1}} -> {{3, 1}, {3, 1}, {4, 1}}, {{1, 
    1}, {2, 1}} -> {{3, 1}, {3, 1}, {4, 2}}, {{1, 1}, {2, 1}} -> {{3, 
    1}, {3, 1}, {4, 3}}, {{1, 1}, {2, 1}} -> {{3, 1}, {3, 2}, {4, 
    1}}, {{1, 1}, {2, 1}} -> {{3, 1}, {3, 2}, {4, 3}}, {{1, 1}, {2, 
    1}} -> {{3, 2}, {2, 1}, {4, 1}}, {{1, 1}, {2, 1}} -> {{3, 2}, {2, 
    1}, {4, 2}}, {{1, 1}, {2, 1}} -> {{3, 2}, {2, 3}, {4, 3}}, {{1, 
    1}, {2, 1}} -> {{3, 2}, {3, 1}, {4, 2}}, {{1, 1}, {2, 1}} -> {{3, 
    2}, {3, 2}, {4, 1}}, {{1, 1}, {2, 1}} -> {{3, 2}, {3, 2}, {4, 
    2}}, {{1, 1}, {2, 1}} -> {{3, 2}, {3, 2}, {4, 3}}, {{1, 1}, {2, 
    1}} -> {{3, 3}, {1, 3}, {4, 1}}, {{1, 1}, {2, 1}} -> {{3, 3}, {1, 
    3}, {4, 2}}, {{1, 1}, {2, 1}} -> {{3, 3}, {1, 3}, {4, 3}}, {{1, 
    1}, {2, 1}} -> {{3, 3}, {2, 3}, {4, 1}}, {{1, 1}, {2, 1}} -> {{3, 
    3}, {2, 3}, {4, 2}}, {{1, 1}, {2, 1}} -> {{3, 3}, {2, 3}, {4, 
    3}}, {{1, 1}, {2, 1}} -> {{3, 3}, {3, 1}, {4, 1}}, {{1, 1}, {2, 
    1}} -> {{3, 3}, {3, 1}, {4, 2}}, {{1, 1}, {2, 1}} -> {{3, 3}, {3, 
    1}, {4, 3}}, {{1, 1}, {2, 1}} -> {{3, 3}, {3, 2}, {4, 1}}, {{1, 
    1}, {2, 1}} -> {{3, 3}, {3, 2}, {4, 2}}, {{1, 1}, {2, 1}} -> {{3, 
    3}, {3, 2}, {4, 3}}, {{1, 1}, {2, 1}} -> {{3, 1}, {1, 4}, {2, 
    4}}, {{1, 1}, {2, 1}} -> {{3, 1}, {1, 4}, {4, 2}}, {{1, 1}, {2, 
    1}} -> {{3, 1}, {3, 4}, {1, 2}}, {{1, 1}, {2, 1}} -> {{3, 1}, {3, 
    4}, {1, 4}}, {{1, 1}, {2, 1}} -> {{3, 1}, {3, 4}, {2, 1}}, {{1, 
    1}, {2, 1}} -> {{3, 1}, {3, 4}, {2, 3}}, {{1, 1}, {2, 1}} -> {{3, 
    2}, {2, 4}, {1, 4}}, {{1, 1}, {2, 1}} -> {{3, 2}, {2, 4}, {4, 
    1}}, {{1, 1}, {2, 1}} -> {{3, 2}, {3, 4}, {1, 2}}, {{1, 1}, {2, 
    1}} -> {{3, 2}, {3, 4}, {1, 3}}, {{1, 1}, {2, 1}} -> {{3, 2}, {3, 
    4}, {2, 1}}, {{1, 1}, {2, 1}} -> {{3, 2}, {3, 4}, {2, 4}}, {{1, 
    1}, {2, 1}} -> {{3, 3}, {3, 4}, {1, 3}}, {{1, 1}, {2, 1}} -> {{3, 
    3}, {3, 4}, {1, 4}}, {{1, 1}, {2, 1}} -> {{3, 3}, {3, 4}, {2, 
    3}}, {{1, 1}, {2, 1}} -> {{3, 3}, {3, 4}, {2, 4}}, {{1, 1}, {2, 
    1}} -> {{3, 3}, {3, 4}, {4, 1}}, {{1, 1}, {2, 1}} -> {{3, 3}, {3, 
    4}, {4, 2}}, {{1, 1}, {2, 1}} -> {{3, 1}, {1, 4}, {2, 5}}, {{1, 
    1}, {2, 1}} -> {{3, 1}, {1, 4}, {4, 5}}, {{1, 1}, {2, 1}} -> {{3, 
    1}, {3, 4}, {1, 5}}, {{1, 1}, {2, 1}} -> {{3, 1}, {3, 4}, {2, 
    5}}, {{1, 1}, {2, 1}} -> {{3, 1}, {3, 4}, {3, 5}}, {{1, 1}, {2, 
    1}} -> {{3, 2}, {2, 4}, {1, 5}}, {{1, 1}, {2, 1}} -> {{3, 2}, {2, 
    4}, {4, 5}}, {{1, 1}, {2, 1}} -> {{3, 2}, {3, 4}, {1, 5}}, {{1, 
    1}, {2, 1}} -> {{3, 2}, {3, 4}, {2, 5}}, {{1, 1}, {2, 1}} -> {{3, 
    2}, {3, 4}, {3, 5}}, {{1, 1}, {2, 1}} -> {{3, 1}, {1, 4}, {5, 
    1}}, {{1, 1}, {2, 1}} -> {{3, 1}, {1, 4}, {5, 2}}, {{1, 1}, {2, 
    1}} -> {{3, 1}, {1, 4}, {5, 4}}, {{1, 1}, {2, 1}} -> {{3, 1}, {3, 
    4}, {5, 1}}, {{1, 1}, {2, 1}} -> {{3, 1}, {3, 4}, {5, 2}}, {{1, 
    1}, {2, 1}} -> {{3, 1}, {3, 4}, {5, 3}}, {{1, 1}, {2, 1}} -> {{3, 
    2}, {2, 4}, {5, 1}}, {{1, 1}, {2, 1}} -> {{3, 2}, {2, 4}, {5, 
    2}}, {{1, 1}, {2, 1}} -> {{3, 2}, {2, 4}, {5, 4}}, {{1, 1}, {2, 
    1}} -> {{3, 2}, {3, 4}, {5, 1}}, {{1, 1}, {2, 1}} -> {{3, 2}, {3, 
    4}, {5, 2}}, {{1, 1}, {2, 1}} -> {{3, 2}, {3, 4}, {5, 3}}, {{1, 
    1}, {2, 1}} -> {{3, 3}, {4, 3}, {1, 4}}, {{1, 1}, {2, 1}} -> {{3, 
    3}, {4, 3}, {2, 4}}, {{1, 1}, {2, 1}} -> {{3, 3}, {4, 3}, {4, 
    1}}, {{1, 1}, {2, 1}} -> {{3, 3}, {4, 3}, {4, 2}}, {{1, 1}, {2, 
    1}} -> {{3, 1}, {4, 1}, {2, 5}}, {{1, 1}, {2, 1}} -> {{3, 2}, {4, 
    2}, {1, 5}}, {{1, 1}, {2, 1}} -> {{3, 1}, {4, 1}, {5, 1}}, {{1, 
    1}, {2, 1}} -> {{3, 1}, {4, 1}, {5, 2}}, {{1, 1}, {2, 1}} -> {{3, 
    2}, {4, 2}, {5, 1}}, {{1, 1}, {2, 1}} -> {{3, 2}, {4, 2}, {5, 
    2}}, {{1, 1}, {2, 1}} -> {{3, 4}, {3, 1}, {2, 4}}, {{1, 1}, {2, 
    1}} -> {{3, 4}, {3, 1}, {4, 1}}, {{1, 1}, {2, 1}} -> {{3, 4}, {3, 
    1}, {4, 2}}, {{1, 1}, {2, 1}} -> {{3, 4}, {3, 2}, {1, 4}}, {{1, 
    1}, {2, 1}} -> {{3, 4}, {3, 2}, {4, 1}}, {{1, 1}, {2, 1}} -> {{3, 
    4}, {3, 2}, {4, 2}}, {{1, 1}, {2, 1}} -> {{3, 4}, {3, 4}, {1, 
    3}}, {{1, 1}, {2, 1}} -> {{3, 4}, {3, 4}, {1, 4}}, {{1, 1}, {2, 
    1}} -> {{3, 4}, {3, 4}, {2, 3}}, {{1, 1}, {2, 1}} -> {{3, 4}, {3, 
    4}, {2, 4}}, {{1, 1}, {2, 1}} -> {{3, 4}, {3, 4}, {3, 1}}, {{1, 
    1}, {2, 1}} -> {{3, 4}, {3, 4}, {3, 2}}, {{1, 1}, {2, 1}} -> {{3, 
    4}, {3, 4}, {4, 1}}, {{1, 1}, {2, 1}} -> {{3, 4}, {3, 4}, {4, 
    2}}, {{1, 1}, {2, 1}} -> {{3, 4}, {4, 1}, {1, 2}}, {{1, 1}, {2, 
    1}} -> {{3, 4}, {4, 1}, {2, 1}}, {{1, 1}, {2, 1}} -> {{3, 4}, {4, 
    2}, {1, 2}}, {{1, 1}, {2, 1}} -> {{3, 4}, {4, 2}, {2, 1}}, {{1, 
    1}, {2, 1}} -> {{3, 4}, {4, 3}, {1, 3}}, {{1, 1}, {2, 1}} -> {{3, 
    4}, {4, 3}, {2, 3}}, {{1, 1}, {2, 1}} -> {{3, 4}, {4, 3}, {3, 
    1}}, {{1, 1}, {2, 1}} -> {{3, 4}, {4, 3}, {3, 2}}, {{1, 1}, {2, 
    1}} -> {{3, 4}, {3, 1}, {4, 5}}, {{1, 1}, {2, 1}} -> {{3, 4}, {3, 
    2}, {4, 5}}, {{1, 1}, {2, 1}} -> {{3, 4}, {4, 1}, {1, 5}}, {{1, 
    1}, {2, 1}} -> {{3, 4}, {4, 1}, {2, 5}}, {{1, 1}, {2, 1}} -> {{3, 
    4}, {4, 2}, {1, 5}}, {{1, 1}, {2, 1}} -> {{3, 4}, {4, 2}, {2, 
    5}}, {{1, 1}, {2, 1}} -> {{3, 4}, {3, 1}, {5, 4}}, {{1, 1}, {2, 
    1}} -> {{3, 4}, {3, 2}, {5, 4}}, {{1, 1}, {2, 1}} -> {{3, 4}, {4, 
    1}, {5, 1}}, {{1, 1}, {2, 1}} -> {{3, 4}, {4, 1}, {5, 2}}, {{1, 
    1}, {2, 1}} -> {{3, 4}, {4, 1}, {5, 4}}, {{1, 1}, {2, 1}} -> {{3, 
    4}, {4, 2}, {5, 1}}, {{1, 1}, {2, 1}} -> {{3, 4}, {4, 2}, {5, 
    2}}, {{1, 1}, {2, 1}} -> {{3, 4}, {4, 2}, {5, 4}}, {{1, 1}, {2, 
    1}} -> {{3, 4}, {3, 5}, {1, 3}}, {{1, 1}, {2, 1}} -> {{3, 4}, {3, 
    5}, {1, 4}}, {{1, 1}, {2, 1}} -> {{3, 4}, {3, 5}, {2, 3}}, {{1, 
    1}, {2, 1}} -> {{3, 4}, {3, 5}, {2, 4}}, {{1, 1}, {2, 1}} -> {{3, 
    4}, {3, 5}, {4, 1}}, {{1, 1}, {2, 1}} -> {{3, 4}, {3, 5}, {4, 
    2}}, {{1, 1}, {2, 1}} -> {{3, 4}, {4, 5}, {1, 5}}, {{1, 1}, {2, 
    1}} -> {{3, 4}, {4, 5}, {2, 5}}, {{1, 1}, {2, 1}} -> {{3, 4}, {4, 
    5}, {5, 1}}, {{1, 1}, {2, 1}} -> {{3, 4}, {4, 5}, {5, 2}}, {{1, 
    2}, {1, 2}} -> {{1, 1}, {1, 1}, {1, 1}}, {{1, 2}, {1, 2}} -> {{1, 
    1}, {1, 1}, {1, 2}}, {{1, 2}, {1, 2}} -> {{1, 1}, {1, 1}, {2, 
    1}}, {{1, 2}, {1, 2}} -> {{1, 1}, {1, 1}, {2, 2}}, {{1, 2}, {1, 
    2}} -> {{1, 1}, {1, 2}, {1, 2}}, {{1, 2}, {1, 2}} -> {{1, 1}, {1, 
    2}, {2, 1}}, {{1, 2}, {1, 2}} -> {{1, 1}, {1, 2}, {2, 2}}, {{1, 
    2}, {1, 2}} -> {{1, 1}, {2, 1}, {2, 1}}, {{1, 2}, {1, 2}} -> {{1, 
    2}, {1, 2}, {1, 2}}, {{1, 2}, {1, 2}} -> {{1, 2}, {1, 2}, {2, 
    1}}, {{1, 2}, {1, 2}} -> {{2, 1}, {2, 1}, {1, 2}}, {{1, 2}, {1, 
    2}} -> {{2, 1}, {2, 1}, {2, 1}}, {{1, 2}, {1, 2}} -> {{2, 2}, {1, 
    2}, {1, 2}}, {{1, 2}, {1, 2}} -> {{2, 2}, {2, 1}, {1, 1}}, {{1, 
    2}, {1, 2}} -> {{2, 2}, {2, 1}, {1, 2}}, {{1, 2}, {1, 2}} -> {{2, 
    2}, {2, 1}, {2, 1}}, {{1, 2}, {1, 2}} -> {{2, 2}, {2, 2}, {1, 
    1}}, {{1, 2}, {1, 2}} -> {{2, 2}, {2, 2}, {1, 2}}, {{1, 2}, {1, 
    2}} -> {{2, 2}, {2, 2}, {2, 1}}, {{1, 2}, {1, 2}} -> {{2, 2}, {2, 
    2}, {2, 2}}, {{1, 2}, {2, 1}} -> {{1, 1}, {1, 1}, {1, 1}}, {{1, 
    2}, {2, 1}} -> {{1, 1}, {1, 1}, {1, 2}}, {{1, 2}, {2, 1}} -> {{1, 
    1}, {1, 1}, {2, 1}}, {{1, 2}, {2, 1}} -> {{1, 1}, {1, 1}, {2, 
    2}}, {{1, 2}, {2, 1}} -> {{1, 1}, {1, 2}, {1, 2}}, {{1, 2}, {2, 
    1}} -> {{1, 1}, {1, 2}, {2, 1}}, {{1, 2}, {2, 1}} -> {{1, 1}, {1, 
    2}, {2, 2}}, {{1, 2}, {2, 1}} -> {{1, 1}, {2, 1}, {2, 1}}, {{1, 
    2}, {2, 1}} -> {{1, 2}, {1, 2}, {1, 2}}, {{1, 2}, {2, 1}} -> {{1, 
    2}, {1, 2}, {2, 1}}, {{1, 2}, {1, 2}} -> {{1, 1}, {1, 1}, {1, 
    3}}, {{1, 2}, {1, 2}} -> {{1, 1}, {1, 1}, {2, 3}}, {{1, 2}, {1, 
    2}} -> {{1, 1}, {1, 2}, {1, 3}}, {{1, 2}, {1, 2}} -> {{1, 1}, {1, 
    2}, {2, 3}}, {{1, 2}, {1, 2}} -> {{1, 1}, {2, 1}, {2, 3}}, {{1, 
    2}, {1, 2}} -> {{1, 2}, {1, 2}, {1, 3}}, {{1, 2}, {1, 2}} -> {{1, 
    2}, {1, 2}, {2, 3}}, {{1, 2}, {1, 2}} -> {{1, 2}, {2, 1}, {1, 
    3}}, {{1, 2}, {1, 2}} -> {{2, 1}, {1, 2}, {2, 3}}, {{1, 2}, {1, 
    2}} -> {{2, 1}, {2, 1}, {1, 3}}, {{1, 2}, {1, 2}} -> {{2, 1}, {2, 
    1}, {2, 3}}, {{1, 2}, {1, 2}} -> {{2, 2}, {1, 2}, {1, 3}}, {{1, 
    2}, {1, 2}} -> {{2, 2}, {2, 1}, {1, 3}}, {{1, 2}, {1, 2}} -> {{2, 
    2}, {2, 1}, {2, 3}}, {{1, 2}, {1, 2}} -> {{2, 2}, {2, 2}, {1, 
    3}}, {{1, 2}, {1, 2}} -> {{2, 2}, {2, 2}, {2, 3}}, {{1, 2}, {2, 
    1}} -> {{1, 1}, {1, 1}, {1, 3}}, {{1, 2}, {2, 1}} -> {{1, 1}, {1, 
    1}, {2, 3}}, {{1, 2}, {2, 1}} -> {{1, 1}, {1, 2}, {1, 3}}, {{1, 
    2}, {2, 1}} -> {{1, 1}, {1, 2}, {2, 3}}, {{1, 2}, {2, 1}} -> {{1, 
    1}, {2, 1}, {2, 3}}, {{1, 2}, {2, 1}} -> {{1, 2}, {1, 2}, {1, 
    3}}, {{1, 2}, {2, 1}} -> {{1, 2}, {1, 2}, {2, 3}}, {{1, 2}, {2, 
    1}} -> {{1, 2}, {2, 1}, {1, 3}}, {{1, 2}, {1, 2}} -> {{1, 1}, {1, 
    1}, {3, 1}}, {{1, 2}, {1, 2}} -> {{1, 1}, {1, 1}, {3, 2}}, {{1, 
    2}, {1, 2}} -> {{1, 1}, {1, 2}, {3, 1}}, {{1, 2}, {1, 2}} -> {{1, 
    1}, {1, 2}, {3, 2}}, {{1, 2}, {1, 2}} -> {{1, 1}, {2, 1}, {3, 
    1}}, {{1, 2}, {1, 2}} -> {{1, 1}, {2, 1}, {3, 2}}, {{1, 2}, {1, 
    2}} -> {{1, 2}, {1, 2}, {3, 1}}, {{1, 2}, {1, 2}} -> {{1, 2}, {1, 
    2}, {3, 2}}, {{1, 2}, {1, 2}} -> {{1, 2}, {2, 1}, {3, 1}}, {{1, 
    2}, {1, 2}} -> {{2, 1}, {1, 2}, {3, 2}}, {{1, 2}, {1, 2}} -> {{2, 
    1}, {2, 1}, {3, 1}}, {{1, 2}, {1, 2}} -> {{2, 1}, {2, 1}, {3, 
    2}}, {{1, 2}, {1, 2}} -> {{2, 2}, {1, 2}, {3, 1}}, {{1, 2}, {1, 
    2}} -> {{2, 2}, {1, 2}, {3, 2}}, {{1, 2}, {1, 2}} -> {{2, 2}, {2, 
    1}, {3, 1}}, {{1, 2}, {1, 2}} -> {{2, 2}, {2, 1}, {3, 2}}, {{1, 
    2}, {1, 2}} -> {{2, 2}, {2, 2}, {3, 1}}, {{1, 2}, {1, 2}} -> {{2, 
    2}, {2, 2}, {3, 2}}, {{1, 2}, {2, 1}} -> {{1, 1}, {1, 1}, {3, 
    1}}, {{1, 2}, {2, 1}} -> {{1, 1}, {1, 1}, {3, 2}}, {{1, 2}, {2, 
    1}} -> {{1, 1}, {1, 2}, {3, 1}}, {{1, 2}, {2, 1}} -> {{1, 1}, {1, 
    2}, {3, 2}}, {{1, 2}, {2, 1}} -> {{1, 1}, {2, 1}, {3, 1}}, {{1, 
    2}, {2, 1}} -> {{1, 1}, {2, 1}, {3, 2}}, {{1, 2}, {2, 1}} -> {{1, 
    2}, {1, 2}, {3, 1}}, {{1, 2}, {2, 1}} -> {{1, 2}, {1, 2}, {3, 
    2}}, {{1, 2}, {2, 1}} -> {{1, 2}, {2, 1}, {3, 1}}, {{1, 2}, {1, 
    2}} -> {{1, 1}, {1, 3}, {1, 3}}, {{1, 2}, {1, 2}} -> {{1, 1}, {1, 
    3}, {2, 1}}, {{1, 2}, {1, 2}} -> {{1, 1}, {1, 3}, {2, 2}}, {{1, 
    2}, {1, 2}} -> {{1, 1}, {1, 3}, {2, 3}}, {{1, 2}, {1, 2}} -> {{1, 
    1}, {1, 3}, {3, 1}}, {{1, 2}, {1, 2}} -> {{1, 1}, {1, 3}, {3, 
    2}}, {{1, 2}, {1, 2}} -> {{1, 1}, {1, 3}, {3, 3}}, {{1, 2}, {1, 
    2}} -> {{1, 1}, {2, 3}, {2, 3}}, {{1, 2}, {1, 2}} -> {{1, 1}, {2, 
    3}, {3, 2}}, {{1, 2}, {1, 2}} -> {{1, 2}, {1, 3}, {2, 3}}, {{1, 
    2}, {1, 2}} -> {{1, 2}, {2, 3}, {3, 1}}, {{1, 2}, {1, 2}} -> {{2, 
    1}, {2, 3}, {1, 3}}, {{1, 2}, {1, 2}} -> {{2, 2}, {1, 3}, {1, 
    3}}, {{1, 2}, {1, 2}} -> {{2, 2}, {1, 3}, {3, 1}}, {{1, 2}, {1, 
    2}} -> {{2, 2}, {2, 3}, {1, 1}}, {{1, 2}, {1, 2}} -> {{2, 2}, {2, 
    3}, {1, 2}}, {{1, 2}, {1, 2}} -> {{2, 2}, {2, 3}, {1, 3}}, {{1, 
    2}, {1, 2}} -> {{2, 2}, {2, 3}, {2, 3}}, {{1, 2}, {1, 2}} -> {{2, 
    2}, {2, 3}, {3, 1}}, {{1, 2}, {1, 2}} -> {{2, 2}, {2, 3}, {3, 
    2}}, {{1, 2}, {1, 2}} -> {{2, 2}, {2, 3}, {3, 3}}, {{1, 2}, {2, 
    1}} -> {{1, 1}, {1, 3}, {1, 3}}, {{1, 2}, {2, 1}} -> {{1, 1}, {1, 
    3}, {2, 1}}, {{1, 2}, {2, 1}} -> {{1, 1}, {1, 3}, {2, 2}}, {{1, 
    2}, {2, 1}} -> {{1, 1}, {1, 3}, {2, 3}}, {{1, 2}, {2, 1}} -> {{1, 
    1}, {1, 3}, {3, 1}}, {{1, 2}, {2, 1}} -> {{1, 1}, {1, 3}, {3, 
    2}}, {{1, 2}, {2, 1}} -> {{1, 1}, {1, 3}, {3, 3}}, {{1, 2}, {2, 
    1}} -> {{1, 1}, {2, 3}, {2, 3}}, {{1, 2}, {2, 1}} -> {{1, 1}, {2, 
    3}, {3, 2}}, {{1, 2}, {2, 1}} -> {{1, 2}, {1, 3}, {2, 3}}, {{1, 
    2}, {2, 1}} -> {{1, 2}, {2, 3}, {3, 1}}, {{1, 2}, {1, 2}} -> {{1, 
    1}, {1, 3}, {1, 4}}, {{1, 2}, {1, 2}} -> {{1, 1}, {1, 3}, {2, 
    4}}, {{1, 2}, {1, 2}} -> {{1, 1}, {1, 3}, {3, 4}}, {{1, 2}, {1, 
    2}} -> {{1, 1}, {2, 3}, {2, 4}}, {{1, 2}, {1, 2}} -> {{1, 1}, {2, 
    3}, {3, 4}}, {{1, 2}, {1, 2}} -> {{1, 2}, {1, 3}, {1, 4}}, {{1, 
    2}, {1, 2}} -> {{1, 2}, {1, 3}, {2, 4}}, {{1, 2}, {1, 2}} -> {{1, 
    2}, {2, 3}, {3, 4}}, {{1, 2}, {1, 2}} -> {{2, 1}, {1, 3}, {3, 
    4}}, {{1, 2}, {1, 2}} -> {{2, 1}, {2, 3}, {1, 4}}, {{1, 2}, {1, 
    2}} -> {{2, 1}, {2, 3}, {2, 4}}, {{1, 2}, {1, 2}} -> {{2, 2}, {1, 
    3}, {1, 4}}, {{1, 2}, {1, 2}} -> {{2, 2}, {1, 3}, {3, 4}}, {{1, 
    2}, {1, 2}} -> {{2, 2}, {2, 3}, {1, 4}}, {{1, 2}, {1, 2}} -> {{2, 
    2}, {2, 3}, {2, 4}}, {{1, 2}, {1, 2}} -> {{2, 2}, {2, 3}, {3, 
    4}}, {{1, 2}, {2, 1}} -> {{1, 1}, {1, 3}, {1, 4}}, {{1, 2}, {2, 
    1}} -> {{1, 1}, {1, 3}, {2, 4}}, {{1, 2}, {2, 1}} -> {{1, 1}, {1, 
    3}, {3, 4}}, {{1, 2}, {2, 1}} -> {{1, 1}, {2, 3}, {2, 4}}, {{1, 
    2}, {2, 1}} -> {{1, 1}, {2, 3}, {3, 4}}, {{1, 2}, {2, 1}} -> {{1, 
    2}, {1, 3}, {1, 4}}, {{1, 2}, {2, 1}} -> {{1, 2}, {1, 3}, {2, 
    4}}, {{1, 2}, {2, 1}} -> {{1, 2}, {2, 3}, {3, 4}}, {{1, 2}, {1, 
    2}} -> {{1, 1}, {1, 3}, {4, 1}}, {{1, 2}, {1, 2}} -> {{1, 1}, {1, 
    3}, {4, 2}}, {{1, 2}, {1, 2}} -> {{1, 1}, {1, 3}, {4, 3}}, {{1, 
    2}, {1, 2}} -> {{1, 1}, {2, 3}, {4, 3}}, {{1, 2}, {1, 2}} -> {{1, 
    2}, {1, 3}, {4, 1}}, {{1, 2}, {1, 2}} -> {{1, 2}, {1, 3}, {4, 
    2}}, {{1, 2}, {1, 2}} -> {{1, 2}, {2, 3}, {4, 2}}, {{1, 2}, {1, 
    2}} -> {{1, 2}, {2, 3}, {4, 3}}, {{1, 2}, {1, 2}} -> {{2, 1}, {1, 
    3}, {4, 1}}, {{1, 2}, {1, 2}} -> {{2, 1}, {1, 3}, {4, 3}}, {{1, 
    2}, {1, 2}} -> {{2, 1}, {2, 3}, {4, 1}}, {{1, 2}, {1, 2}} -> {{2, 
    1}, {2, 3}, {4, 2}}, {{1, 2}, {1, 2}} -> {{2, 2}, {1, 3}, {4, 
    3}}, {{1, 2}, {1, 2}} -> {{2, 2}, {2, 3}, {4, 1}}, {{1, 2}, {1, 
    2}} -> {{2, 2}, {2, 3}, {4, 2}}, {{1, 2}, {1, 2}} -> {{2, 2}, {2, 
    3}, {4, 3}}, {{1, 2}, {2, 1}} -> {{1, 1}, {1, 3}, {4, 1}}, {{1, 
    2}, {2, 1}} -> {{1, 1}, {1, 3}, {4, 2}}, {{1, 2}, {2, 1}} -> {{1, 
    1}, {1, 3}, {4, 3}}, {{1, 2}, {2, 1}} -> {{1, 1}, {2, 3}, {4, 
    3}}, {{1, 2}, {2, 1}} -> {{1, 2}, {1, 3}, {4, 1}}, {{1, 2}, {2, 
    1}} -> {{1, 2}, {1, 3}, {4, 2}}, {{1, 2}, {2, 1}} -> {{1, 2}, {2, 
    3}, {4, 2}}, {{1, 2}, {2, 1}} -> {{1, 2}, {2, 3}, {4, 3}}, {{1, 
    2}, {1, 2}} -> {{1, 1}, {3, 1}, {2, 2}}, {{1, 2}, {1, 2}} -> {{1, 
    1}, {3, 1}, {2, 3}}, {{1, 2}, {1, 2}} -> {{1, 1}, {3, 1}, {3, 
    1}}, {{1, 2}, {1, 2}} -> {{1, 1}, {3, 1}, {3, 2}}, {{1, 2}, {1, 
    2}} -> {{1, 1}, {3, 2}, {3, 2}}, {{1, 2}, {1, 2}} -> {{2, 2}, {3, 
    1}, {3, 1}}, {{1, 2}, {1, 2}} -> {{2, 2}, {3, 2}, {1, 1}}, {{1, 
    2}, {1, 2}} -> {{2, 2}, {3, 2}, {1, 3}}, {{1, 2}, {1, 2}} -> {{2, 
    2}, {3, 2}, {3, 1}}, {{1, 2}, {1, 2}} -> {{2, 2}, {3, 2}, {3, 
    2}}, {{1, 2}, {2, 1}} -> {{1, 1}, {3, 1}, {2, 2}}, {{1, 2}, {2, 
    1}} -> {{1, 1}, {3, 1}, {2, 3}}, {{1, 2}, {2, 1}} -> {{1, 1}, {3, 
    1}, {3, 1}}, {{1, 2}, {2, 1}} -> {{1, 1}, {3, 1}, {3, 2}}, {{1, 
    2}, {2, 1}} -> {{1, 1}, {3, 2}, {3, 2}}, {{1, 2}, {1, 2}} -> {{1, 
    1}, {3, 1}, {2, 4}}, {{1, 2}, {1, 2}} -> {{1, 1}, {3, 1}, {3, 
    4}}, {{1, 2}, {1, 2}} -> {{1, 1}, {3, 2}, {2, 4}}, {{1, 2}, {1, 
    2}} -> {{1, 1}, {3, 2}, {3, 4}}, {{1, 2}, {1, 2}} -> {{2, 2}, {3, 
    1}, {1, 4}}, {{1, 2}, {1, 2}} -> {{2, 2}, {3, 1}, {3, 4}}, {{1, 
    2}, {1, 2}} -> {{2, 2}, {3, 2}, {1, 4}}, {{1, 2}, {1, 2}} -> {{2, 
    2}, {3, 2}, {3, 4}}, {{1, 2}, {2, 1}} -> {{1, 1}, {3, 1}, {2, 
    4}}, {{1, 2}, {2, 1}} -> {{1, 1}, {3, 1}, {3, 4}}, {{1, 2}, {2, 
    1}} -> {{1, 1}, {3, 2}, {2, 4}}, {{1, 2}, {2, 1}} -> {{1, 1}, {3, 
    2}, {3, 4}}, {{1, 2}, {1, 2}} -> {{1, 1}, {3, 1}, {4, 1}}, {{1, 
    2}, {1, 2}} -> {{1, 1}, {3, 1}, {4, 2}}, {{1, 2}, {1, 2}} -> {{1, 
    1}, {3, 1}, {4, 3}}, {{1, 2}, {1, 2}} -> {{1, 1}, {3, 2}, {4, 
    2}}, {{1, 2}, {1, 2}} -> {{1, 2}, {3, 2}, {4, 2}}, {{1, 2}, {1, 
    2}} -> {{2, 1}, {3, 1}, {4, 1}}, {{1, 2}, {1, 2}} -> {{2, 2}, {3, 
    1}, {4, 1}}, {{1, 2}, {1, 2}} -> {{2, 2}, {3, 2}, {4, 1}}, {{1, 
    2}, {1, 2}} -> {{2, 2}, {3, 2}, {4, 2}}, {{1, 2}, {1, 2}} -> {{2, 
    2}, {3, 2}, {4, 3}}, {{1, 2}, {2, 1}} -> {{1, 1}, {3, 1}, {4, 
    1}}, {{1, 2}, {2, 1}} -> {{1, 1}, {3, 1}, {4, 2}}, {{1, 2}, {2, 
    1}} -> {{1, 1}, {3, 1}, {4, 3}}, {{1, 2}, {2, 1}} -> {{1, 1}, {3, 
    2}, {4, 2}}, {{1, 2}, {2, 1}} -> {{1, 2}, {3, 2}, {4, 2}}, {{1, 
    2}, {1, 2}} -> {{1, 1}, {3, 4}, {4, 2}}, {{1, 2}, {1, 2}} -> {{2, 
    2}, {3, 4}, {4, 1}}, {{1, 2}, {2, 1}} -> {{1, 1}, {3, 4}, {4, 
    2}}, {{1, 2}, {1, 2}} -> {{1, 3}, {1, 2}, {3, 2}}, {{1, 2}, {1, 
    2}} -> {{1, 3}, {1, 3}, {1, 2}}, {{1, 2}, {1, 2}} -> {{1, 3}, {1, 
    3}, {1, 3}}, {{1, 2}, {1, 2}} -> {{1, 3}, {1, 3}, {2, 1}}, {{1, 
    2}, {1, 2}} -> {{1, 3}, {1, 3}, {2, 3}}, {{1, 2}, {1, 2}} -> {{1, 
    3}, {1, 3}, {3, 1}}, {{1, 2}, {1, 2}} -> {{1, 3}, {1, 3}, {3, 
    2}}, {{1, 2}, {1, 2}} -> {{1, 3}, {3, 1}, {1, 2}}, {{1, 2}, {1, 
    2}} -> {{1, 3}, {3, 1}, {2, 1}}, {{1, 2}, {1, 2}} -> {{1, 3}, {3, 
    2}, {2, 1}}, {{1, 2}, {1, 2}} -> {{2, 3}, {2, 1}, {3, 1}}, {{1, 
    2}, {1, 2}} -> {{2, 3}, {2, 3}, {1, 2}}, {{1, 2}, {1, 2}} -> {{2, 
    3}, {2, 3}, {1, 3}}, {{1, 2}, {1, 2}} -> {{2, 3}, {2, 3}, {2, 
    1}}, {{1, 2}, {1, 2}} -> {{2, 3}, {2, 3}, {2, 3}}, {{1, 2}, {1, 
    2}} -> {{2, 3}, {2, 3}, {3, 1}}, {{1, 2}, {1, 2}} -> {{2, 3}, {2, 
    3}, {3, 2}}, {{1, 2}, {1, 2}} -> {{2, 3}, {3, 2}, {1, 2}}, {{1, 
    2}, {1, 2}} -> {{2, 3}, {3, 2}, {2, 1}}, {{1, 2}, {2, 1}} -> {{1, 
    3}, {1, 2}, {3, 2}}, {{1, 2}, {2, 1}} -> {{1, 3}, {1, 3}, {1, 
    2}}, {{1, 2}, {2, 1}} -> {{1, 3}, {1, 3}, {1, 3}}, {{1, 2}, {2, 
    1}} -> {{1, 3}, {1, 3}, {2, 1}}, {{1, 2}, {2, 1}} -> {{1, 3}, {1, 
    3}, {2, 3}}, {{1, 2}, {2, 1}} -> {{1, 3}, {1, 3}, {3, 1}}, {{1, 
    2}, {2, 1}} -> {{1, 3}, {1, 3}, {3, 2}}, {{1, 2}, {2, 1}} -> {{1, 
    3}, {3, 1}, {1, 2}}, {{1, 2}, {2, 1}} -> {{1, 3}, {3, 1}, {2, 
    1}}, {{1, 2}, {1, 2}} -> {{1, 3}, {1, 2}, {3, 4}}, {{1, 2}, {1, 
    2}} -> {{1, 3}, {1, 3}, {1, 4}}, {{1, 2}, {1, 2}} -> {{1, 3}, {1, 
    3}, {2, 4}}, {{1, 2}, {1, 2}} -> {{1, 3}, {1, 3}, {3, 4}}, {{1, 
    2}, {1, 2}} -> {{1, 3}, {3, 1}, {1, 4}}, {{1, 2}, {1, 2}} -> {{1, 
    3}, {3, 1}, {2, 4}}, {{1, 2}, {1, 2}} -> {{1, 3}, {3, 2}, {2, 
    4}}, {{1, 2}, {1, 2}} -> {{2, 3}, {2, 1}, {3, 4}}, {{1, 2}, {1, 
    2}} -> {{2, 3}, {2, 3}, {1, 4}}, {{1, 2}, {1, 2}} -> {{2, 3}, {2, 
    3}, {2, 4}}, {{1, 2}, {1, 2}} -> {{2, 3}, {2, 3}, {3, 4}}, {{1, 
    2}, {1, 2}} -> {{2, 3}, {3, 1}, {1, 4}}, {{1, 2}, {1, 2}} -> {{2, 
    3}, {3, 2}, {1, 4}}, {{1, 2}, {1, 2}} -> {{2, 3}, {3, 2}, {2, 
    4}}, {{1, 2}, {2, 1}} -> {{1, 3}, {1, 2}, {3, 4}}, {{1, 2}, {2, 
    1}} -> {{1, 3}, {1, 3}, {1, 4}}, {{1, 2}, {2, 1}} -> {{1, 3}, {1, 
    3}, {2, 4}}, {{1, 2}, {2, 1}} -> {{1, 3}, {1, 3}, {3, 4}}, {{1, 
    2}, {2, 1}} -> {{1, 3}, {3, 1}, {1, 4}}, {{1, 2}, {2, 1}} -> {{1, 
    3}, {3, 1}, {2, 4}}, {{1, 2}, {2, 1}} -> {{1, 3}, {3, 2}, {2, 
    4}}, {{1, 2}, {1, 2}} -> {{1, 3}, {1, 2}, {4, 3}}, {{1, 2}, {1, 
    2}} -> {{1, 3}, {1, 3}, {4, 1}}, {{1, 2}, {1, 2}} -> {{1, 3}, {1, 
    3}, {4, 2}}, {{1, 2}, {1, 2}} -> {{1, 3}, {1, 3}, {4, 3}}, {{1, 
    2}, {1, 2}} -> {{1, 3}, {2, 3}, {4, 3}}, {{1, 2}, {1, 2}} -> {{1, 
    3}, {3, 1}, {4, 1}}, {{1, 2}, {1, 2}} -> {{1, 3}, {3, 1}, {4, 
    2}}, {{1, 2}, {1, 2}} -> {{1, 3}, {3, 2}, {4, 2}}, {{1, 2}, {1, 
    2}} -> {{1, 3}, {3, 2}, {4, 3}}, {{1, 2}, {1, 2}} -> {{2, 3}, {2, 
    1}, {4, 3}}, {{1, 2}, {1, 2}} -> {{2, 3}, {2, 3}, {4, 1}}, {{1, 
    2}, {1, 2}} -> {{2, 3}, {2, 3}, {4, 2}}, {{1, 2}, {1, 2}} -> {{2, 
    3}, {2, 3}, {4, 3}}, {{1, 2}, {1, 2}} -> {{2, 3}, {3, 1}, {4, 
    1}}, {{1, 2}, {1, 2}} -> {{2, 3}, {3, 1}, {4, 3}}, {{1, 2}, {1, 
    2}} -> {{2, 3}, {3, 2}, {4, 1}}, {{1, 2}, {1, 2}} -> {{2, 3}, {3, 
    2}, {4, 2}}, {{1, 2}, {2, 1}} -> {{1, 3}, {1, 2}, {4, 3}}, {{1, 
    2}, {2, 1}} -> {{1, 3}, {1, 3}, {4, 1}}, {{1, 2}, {2, 1}} -> {{1, 
    3}, {1, 3}, {4, 2}}, {{1, 2}, {2, 1}} -> {{1, 3}, {1, 3}, {4, 
    3}}, {{1, 2}, {2, 1}} -> {{1, 3}, {2, 3}, {4, 3}}, {{1, 2}, {2, 
    1}} -> {{1, 3}, {3, 1}, {4, 1}}, {{1, 2}, {2, 1}} -> {{1, 3}, {3, 
    1}, {4, 2}}, {{1, 2}, {2, 1}} -> {{1, 3}, {3, 2}, {4, 2}}, {{1, 
    2}, {2, 1}} -> {{1, 3}, {3, 2}, {4, 3}}, {{1, 2}, {1, 2}} -> {{1, 
    3}, {1, 4}, {2, 1}}, {{1, 2}, {1, 2}} -> {{1, 3}, {1, 4}, {2, 
    3}}, {{1, 2}, {1, 2}} -> {{1, 3}, {1, 4}, {3, 2}}, {{1, 2}, {1, 
    2}} -> {{1, 3}, {1, 4}, {3, 4}}, {{1, 2}, {1, 2}} -> {{1, 3}, {3, 
    4}, {2, 3}}, {{1, 2}, {1, 2}} -> {{1, 3}, {3, 4}, {2, 4}}, {{1, 
    2}, {1, 2}} -> {{1, 3}, {3, 4}, {4, 1}}, {{1, 2}, {1, 2}} -> {{1, 
    3}, {3, 4}, {4, 2}}, {{1, 2}, {1, 2}} -> {{2, 3}, {2, 4}, {1, 
    2}}, {{1, 2}, {1, 2}} -> {{2, 3}, {2, 4}, {1, 3}}, {{1, 2}, {1, 
    2}} -> {{2, 3}, {2, 4}, {3, 1}}, {{1, 2}, {1, 2}} -> {{2, 3}, {2, 
    4}, {3, 4}}, {{1, 2}, {1, 2}} -> {{2, 3}, {3, 4}, {1, 4}}, {{1, 
    2}, {1, 2}} -> {{2, 3}, {3, 4}, {4, 1}}, {{1, 2}, {1, 2}} -> {{2, 
    3}, {3, 4}, {4, 2}}, {{1, 2}, {2, 1}} -> {{1, 3}, {1, 4}, {2, 
    1}}, {{1, 2}, {2, 1}} -> {{1, 3}, {1, 4}, {2, 3}}, {{1, 2}, {2, 
    1}} -> {{1, 3}, {1, 4}, {3, 2}}, {{1, 2}, {2, 1}} -> {{1, 3}, {1, 
    4}, {3, 4}}, {{1, 2}, {2, 1}} -> {{1, 3}, {3, 4}, {2, 3}}, {{1, 
    2}, {2, 1}} -> {{1, 3}, {3, 4}, {2, 4}}, {{1, 2}, {2, 1}} -> {{1, 
    3}, {3, 4}, {4, 1}}, {{1, 2}, {2, 1}} -> {{1, 3}, {3, 4}, {4, 
    2}}, {{1, 2}, {1, 2}} -> {{1, 3}, {1, 4}, {1, 5}}, {{1, 2}, {1, 
    2}} -> {{1, 3}, {1, 4}, {2, 5}}, {{1, 2}, {1, 2}} -> {{1, 3}, {1, 
    4}, {3, 5}}, {{1, 2}, {1, 2}} -> {{1, 3}, {3, 4}, {2, 5}}, {{1, 
    2}, {1, 2}} -> {{1, 3}, {3, 4}, {4, 5}}, {{1, 2}, {1, 2}} -> {{2, 
    3}, {2, 4}, {1, 5}}, {{1, 2}, {1, 2}} -> {{2, 3}, {2, 4}, {2, 
    5}}, {{1, 2}, {1, 2}} -> {{2, 3}, {2, 4}, {3, 5}}, {{1, 2}, {1, 
    2}} -> {{2, 3}, {3, 4}, {1, 5}}, {{1, 2}, {1, 2}} -> {{2, 3}, {3, 
    4}, {4, 5}}, {{1, 2}, {2, 1}} -> {{1, 3}, {1, 4}, {1, 5}}, {{1, 
    2}, {2, 1}} -> {{1, 3}, {1, 4}, {2, 5}}, {{1, 2}, {2, 1}} -> {{1, 
    3}, {1, 4}, {3, 5}}, {{1, 2}, {2, 1}} -> {{1, 3}, {3, 4}, {2, 
    5}}, {{1, 2}, {2, 1}} -> {{1, 3}, {3, 4}, {4, 5}}, {{1, 2}, {1, 
    2}} -> {{1, 3}, {1, 4}, {5, 1}}, {{1, 2}, {1, 2}} -> {{1, 3}, {1, 
    4}, {5, 2}}, {{1, 2}, {1, 2}} -> {{1, 3}, {1, 4}, {5, 3}}, {{1, 
    2}, {1, 2}} -> {{1, 3}, {3, 4}, {5, 2}}, {{1, 2}, {1, 2}} -> {{1, 
    3}, {3, 4}, {5, 3}}, {{1, 2}, {1, 2}} -> {{1, 3}, {3, 4}, {5, 
    4}}, {{1, 2}, {1, 2}} -> {{2, 3}, {2, 4}, {5, 1}}, {{1, 2}, {1, 
    2}} -> {{2, 3}, {2, 4}, {5, 2}}, {{1, 2}, {1, 2}} -> {{2, 3}, {2, 
    4}, {5, 3}}, {{1, 2}, {1, 2}} -> {{2, 3}, {3, 4}, {5, 1}}, {{1, 
    2}, {1, 2}} -> {{2, 3}, {3, 4}, {5, 3}}, {{1, 2}, {1, 2}} -> {{2, 
    3}, {3, 4}, {5, 4}}, {{1, 2}, {2, 1}} -> {{1, 3}, {1, 4}, {5, 
    1}}, {{1, 2}, {2, 1}} -> {{1, 3}, {1, 4}, {5, 2}}, {{1, 2}, {2, 
    1}} -> {{1, 3}, {1, 4}, {5, 3}}, {{1, 2}, {2, 1}} -> {{1, 3}, {3, 
    4}, {5, 2}}, {{1, 2}, {2, 1}} -> {{1, 3}, {3, 4}, {5, 3}}, {{1, 
    2}, {2, 1}} -> {{1, 3}, {3, 4}, {5, 4}}, {{1, 2}, {1, 2}} -> {{1, 
    3}, {4, 3}, {2, 5}}, {{1, 2}, {1, 2}} -> {{2, 3}, {4, 3}, {1, 
    5}}, {{1, 2}, {2, 1}} -> {{1, 3}, {4, 3}, {2, 5}}, {{1, 2}, {1, 
    2}} -> {{1, 3}, {4, 3}, {5, 2}}, {{1, 2}, {1, 2}} -> {{1, 3}, {4, 
    3}, {5, 3}}, {{1, 2}, {1, 2}} -> {{2, 3}, {4, 3}, {5, 1}}, {{1, 
    2}, {1, 2}} -> {{2, 3}, {4, 3}, {5, 3}}, {{1, 2}, {2, 1}} -> {{1, 
    3}, {4, 3}, {5, 2}}, {{1, 2}, {2, 1}} -> {{1, 3}, {4, 3}, {5, 
    3}}, {{1, 2}, {1, 2}} -> {{3, 1}, {1, 3}, {2, 3}}, {{1, 2}, {1, 
    2}} -> {{3, 1}, {1, 3}, {3, 2}}, {{1, 2}, {1, 2}} -> {{3, 1}, {3, 
    1}, {1, 2}}, {{1, 2}, {1, 2}} -> {{3, 1}, {3, 1}, {1, 3}}, {{1, 
    2}, {1, 2}} -> {{3, 1}, {3, 1}, {2, 1}}, {{1, 2}, {1, 2}} -> {{3, 
    1}, {3, 1}, {2, 3}}, {{1, 2}, {1, 2}} -> {{3, 1}, {3, 1}, {3, 
    1}}, {{1, 2}, {1, 2}} -> {{3, 1}, {3, 1}, {3, 2}}, {{1, 2}, {1, 
    2}} -> {{3, 1}, {3, 2}, {1, 2}}, {{1, 2}, {1, 2}} -> {{3, 2}, {2, 
    3}, {1, 3}}, {{1, 2}, {1, 2}} -> {{3, 2}, {2, 3}, {3, 1}}, {{1, 
    2}, {1, 2}} -> {{3, 2}, {3, 1}, {2, 1}}, {{1, 2}, {1, 2}} -> {{3, 
    2}, {3, 2}, {1, 2}}, {{1, 2}, {1, 2}} -> {{3, 2}, {3, 2}, {1, 
    3}}, {{1, 2}, {1, 2}} -> {{3, 2}, {3, 2}, {2, 1}}, {{1, 2}, {1, 
    2}} -> {{3, 2}, {3, 2}, {2, 3}}, {{1, 2}, {1, 2}} -> {{3, 2}, {3, 
    2}, {3, 1}}, {{1, 2}, {1, 2}} -> {{3, 2}, {3, 2}, {3, 2}}, {{1, 
    2}, {1, 2}} -> {{3, 3}, {1, 3}, {1, 2}}, {{1, 2}, {1, 2}} -> {{3, 
    3}, {1, 3}, {1, 3}}, {{1, 2}, {1, 2}} -> {{3, 3}, {1, 3}, {2, 
    1}}, {{1, 2}, {1, 2}} -> {{3, 3}, {1, 3}, {2, 2}}, {{1, 2}, {1, 
    2}} -> {{3, 3}, {1, 3}, {2, 3}}, {{1, 2}, {1, 2}} -> {{3, 3}, {2, 
    3}, {1, 1}}, {{1, 2}, {1, 2}} -> {{3, 3}, {2, 3}, {1, 2}}, {{1, 
    2}, {1, 2}} -> {{3, 3}, {2, 3}, {2, 1}}, {{1, 2}, {1, 2}} -> {{3, 
    3}, {2, 3}, {2, 3}}, {{1, 2}, {1, 2}} -> {{3, 3}, {3, 1}, {1, 
    1}}, {{1, 2}, {1, 2}} -> {{3, 3}, {3, 1}, {1, 2}}, {{1, 2}, {1, 
    2}} -> {{3, 3}, {3, 1}, {1, 3}}, {{1, 2}, {1, 2}} -> {{3, 3}, {3, 
    1}, {2, 1}}, {{1, 2}, {1, 2}} -> {{3, 3}, {3, 1}, {2, 2}}, {{1, 
    2}, {1, 2}} -> {{3, 3}, {3, 1}, {2, 3}}, {{1, 2}, {1, 2}} -> {{3, 
    3}, {3, 1}, {3, 1}}, {{1, 2}, {1, 2}} -> {{3, 3}, {3, 1}, {3, 
    2}}, {{1, 2}, {1, 2}} -> {{3, 3}, {3, 2}, {1, 1}}, {{1, 2}, {1, 
    2}} -> {{3, 3}, {3, 2}, {1, 2}}, {{1, 2}, {1, 2}} -> {{3, 3}, {3, 
    2}, {1, 3}}, {{1, 2}, {1, 2}} -> {{3, 3}, {3, 2}, {2, 1}}, {{1, 
    2}, {1, 2}} -> {{3, 3}, {3, 2}, {2, 2}}, {{1, 2}, {1, 2}} -> {{3, 
    3}, {3, 2}, {2, 3}}, {{1, 2}, {1, 2}} -> {{3, 3}, {3, 2}, {3, 
    2}}, {{1, 2}, {1, 2}} -> {{3, 3}, {3, 3}, {1, 3}}, {{1, 2}, {1, 
    2}} -> {{3, 3}, {3, 3}, {2, 3}}, {{1, 2}, {1, 2}} -> {{3, 3}, {3, 
    3}, {3, 1}}, {{1, 2}, {1, 2}} -> {{3, 3}, {3, 3}, {3, 2}}, {{1, 
    2}, {2, 1}} -> {{3, 1}, {1, 3}, {2, 3}}, {{1, 2}, {2, 1}} -> {{3, 
    1}, {1, 3}, {3, 2}}, {{1, 2}, {2, 1}} -> {{3, 1}, {3, 1}, {1, 
    2}}, {{1, 2}, {2, 1}} -> {{3, 1}, {3, 1}, {1, 3}}, {{1, 2}, {2, 
    1}} -> {{3, 1}, {3, 1}, {2, 1}}, {{1, 2}, {2, 1}} -> {{3, 1}, {3, 
    1}, {2, 3}}, {{1, 2}, {2, 1}} -> {{3, 1}, {3, 1}, {3, 1}}, {{1, 
    2}, {2, 1}} -> {{3, 1}, {3, 1}, {3, 2}}, {{1, 2}, {2, 1}} -> {{3, 
    1}, {3, 2}, {1, 2}}, {{1, 2}, {2, 1}} -> {{3, 3}, {1, 3}, {1, 
    2}}, {{1, 2}, {2, 1}} -> {{3, 3}, {1, 3}, {1, 3}}, {{1, 2}, {2, 
    1}} -> {{3, 3}, {1, 3}, {2, 1}}, {{1, 2}, {2, 1}} -> {{3, 3}, {1, 
    3}, {2, 2}}, {{1, 2}, {2, 1}} -> {{3, 3}, {1, 3}, {2, 3}}, {{1, 
    2}, {2, 1}} -> {{3, 3}, {3, 1}, {1, 1}}, {{1, 2}, {2, 1}} -> {{3, 
    3}, {3, 1}, {1, 2}}, {{1, 2}, {2, 1}} -> {{3, 3}, {3, 1}, {1, 
    3}}, {{1, 2}, {2, 1}} -> {{3, 3}, {3, 1}, {2, 1}}, {{1, 2}, {2, 
    1}} -> {{3, 3}, {3, 1}, {2, 2}}, {{1, 2}, {2, 1}} -> {{3, 3}, {3, 
    1}, {2, 3}}, {{1, 2}, {2, 1}} -> {{3, 3}, {3, 1}, {3, 1}}, {{1, 
    2}, {2, 1}} -> {{3, 3}, {3, 1}, {3, 2}}, {{1, 2}, {2, 1}} -> {{3, 
    3}, {3, 3}, {1, 3}}, {{1, 2}, {2, 1}} -> {{3, 3}, {3, 3}, {3, 
    1}}, {{1, 2}, {1, 2}} -> {{3, 1}, {1, 2}, {2, 4}}, {{1, 2}, {1, 
    2}} -> {{3, 1}, {1, 3}, {3, 4}}, {{1, 2}, {1, 2}} -> {{3, 1}, {3, 
    1}, {1, 4}}, {{1, 2}, {1, 2}} -> {{3, 1}, {3, 1}, {2, 4}}, {{1, 
    2}, {1, 2}} -> {{3, 1}, {3, 1}, {3, 4}}, {{1, 2}, {1, 2}} -> {{3, 
    1}, {3, 2}, {1, 4}}, {{1, 2}, {1, 2}} -> {{3, 1}, {3, 2}, {3, 
    4}}, {{1, 2}, {1, 2}} -> {{3, 2}, {2, 1}, {1, 4}}, {{1, 2}, {1, 
    2}} -> {{3, 2}, {2, 3}, {3, 4}}, {{1, 2}, {1, 2}} -> {{3, 2}, {3, 
    1}, {2, 4}}, {{1, 2}, {1, 2}} -> {{3, 2}, {3, 2}, {1, 4}}, {{1, 
    2}, {1, 2}} -> {{3, 2}, {3, 2}, {2, 4}}, {{1, 2}, {1, 2}} -> {{3, 
    2}, {3, 2}, {3, 4}}, {{1, 2}, {1, 2}} -> {{3, 3}, {1, 3}, {1, 
    4}}, {{1, 2}, {1, 2}} -> {{3, 3}, {1, 3}, {2, 4}}, {{1, 2}, {1, 
    2}} -> {{3, 3}, {2, 3}, {1, 4}}, {{1, 2}, {1, 2}} -> {{3, 3}, {2, 
    3}, {2, 4}}, {{1, 2}, {1, 2}} -> {{3, 3}, {3, 1}, {1, 4}}, {{1, 
    2}, {1, 2}} -> {{3, 3}, {3, 1}, {2, 4}}, {{1, 2}, {1, 2}} -> {{3, 
    3}, {3, 1}, {3, 4}}, {{1, 2}, {1, 2}} -> {{3, 3}, {3, 2}, {1, 
    4}}, {{1, 2}, {1, 2}} -> {{3, 3}, {3, 2}, {2, 4}}, {{1, 2}, {1, 
    2}} -> {{3, 3}, {3, 2}, {3, 4}}, {{1, 2}, {2, 1}} -> {{3, 1}, {1, 
    2}, {2, 4}}, {{1, 2}, {2, 1}} -> {{3, 1}, {1, 3}, {3, 4}}, {{1, 
    2}, {2, 1}} -> {{3, 1}, {3, 1}, {1, 4}}, {{1, 2}, {2, 1}} -> {{3, 
    1}, {3, 1}, {2, 4}}, {{1, 2}, {2, 1}} -> {{3, 1}, {3, 1}, {3, 
    4}}, {{1, 2}, {2, 1}} -> {{3, 1}, {3, 2}, {1, 4}}, {{1, 2}, {2, 
    1}} -> {{3, 1}, {3, 2}, {3, 4}}, {{1, 2}, {2, 1}} -> {{3, 3}, {1, 
    3}, {1, 4}}, {{1, 2}, {2, 1}} -> {{3, 3}, {1, 3}, {2, 4}}, {{1, 
    2}, {2, 1}} -> {{3, 3}, {3, 1}, {1, 4}}, {{1, 2}, {2, 1}} -> {{3, 
    3}, {3, 1}, {2, 4}}, {{1, 2}, {2, 1}} -> {{3, 3}, {3, 1}, {3, 
    4}}, {{1, 2}, {1, 2}} -> {{3, 1}, {1, 2}, {4, 1}}, {{1, 2}, {1, 
    2}} -> {{3, 1}, {1, 2}, {4, 2}}, {{1, 2}, {1, 2}} -> {{3, 1}, {1, 
    3}, {4, 3}}, {{1, 2}, {1, 2}} -> {{3, 1}, {3, 1}, {4, 1}}, {{1, 
    2}, {1, 2}} -> {{3, 1}, {3, 1}, {4, 2}}, {{1, 2}, {1, 2}} -> {{3, 
    1}, {3, 1}, {4, 3}}, {{1, 2}, {1, 2}} -> {{3, 1}, {3, 2}, {4, 
    1}}, {{1, 2}, {1, 2}} -> {{3, 1}, {3, 2}, {4, 3}}, {{1, 2}, {1, 
    2}} -> {{3, 2}, {2, 1}, {4, 1}}, {{1, 2}, {1, 2}} -> {{3, 2}, {2, 
    1}, {4, 2}}, {{1, 2}, {1, 2}} -> {{3, 2}, {2, 3}, {4, 3}}, {{1, 
    2}, {1, 2}} -> {{3, 2}, {3, 1}, {4, 2}}, {{1, 2}, {1, 2}} -> {{3, 
    2}, {3, 2}, {4, 1}}, {{1, 2}, {1, 2}} -> {{3, 2}, {3, 2}, {4, 
    2}}, {{1, 2}, {1, 2}} -> {{3, 2}, {3, 2}, {4, 3}}, {{1, 2}, {1, 
    2}} -> {{3, 3}, {1, 3}, {4, 1}}, {{1, 2}, {1, 2}} -> {{3, 3}, {1, 
    3}, {4, 2}}, {{1, 2}, {1, 2}} -> {{3, 3}, {1, 3}, {4, 3}}, {{1, 
    2}, {1, 2}} -> {{3, 3}, {2, 3}, {4, 1}}, {{1, 2}, {1, 2}} -> {{3, 
    3}, {2, 3}, {4, 2}}, {{1, 2}, {1, 2}} -> {{3, 3}, {2, 3}, {4, 
    3}}, {{1, 2}, {1, 2}} -> {{3, 3}, {3, 1}, {4, 1}}, {{1, 2}, {1, 
    2}} -> {{3, 3}, {3, 1}, {4, 2}}, {{1, 2}, {1, 2}} -> {{3, 3}, {3, 
    1}, {4, 3}}, {{1, 2}, {1, 2}} -> {{3, 3}, {3, 2}, {4, 1}}, {{1, 
    2}, {1, 2}} -> {{3, 3}, {3, 2}, {4, 2}}, {{1, 2}, {1, 2}} -> {{3, 
    3}, {3, 2}, {4, 3}}, {{1, 2}, {2, 1}} -> {{3, 1}, {1, 2}, {4, 
    1}}, {{1, 2}, {2, 1}} -> {{3, 1}, {1, 2}, {4, 2}}, {{1, 2}, {2, 
    1}} -> {{3, 1}, {1, 3}, {4, 3}}, {{1, 2}, {2, 1}} -> {{3, 1}, {3, 
    1}, {4, 1}}, {{1, 2}, {2, 1}} -> {{3, 1}, {3, 1}, {4, 2}}, {{1, 
    2}, {2, 1}} -> {{3, 1}, {3, 1}, {4, 3}}, {{1, 2}, {2, 1}} -> {{3, 
    1}, {3, 2}, {4, 1}}, {{1, 2}, {2, 1}} -> {{3, 1}, {3, 2}, {4, 
    3}}, {{1, 2}, {2, 1}} -> {{3, 3}, {1, 3}, {4, 1}}, {{1, 2}, {2, 
    1}} -> {{3, 3}, {1, 3}, {4, 2}}, {{1, 2}, {2, 1}} -> {{3, 3}, {1, 
    3}, {4, 3}}, {{1, 2}, {2, 1}} -> {{3, 3}, {3, 1}, {4, 1}}, {{1, 
    2}, {2, 1}} -> {{3, 3}, {3, 1}, {4, 2}}, {{1, 2}, {2, 1}} -> {{3, 
    3}, {3, 1}, {4, 3}}, {{1, 2}, {1, 2}} -> {{3, 1}, {1, 4}, {2, 
    4}}, {{1, 2}, {1, 2}} -> {{3, 1}, {1, 4}, {4, 2}}, {{1, 2}, {1, 
    2}} -> {{3, 1}, {3, 4}, {1, 2}}, {{1, 2}, {1, 2}} -> {{3, 1}, {3, 
    4}, {1, 4}}, {{1, 2}, {1, 2}} -> {{3, 1}, {3, 4}, {2, 1}}, {{1, 
    2}, {1, 2}} -> {{3, 1}, {3, 4}, {2, 3}}, {{1, 2}, {1, 2}} -> {{3, 
    2}, {2, 4}, {1, 4}}, {{1, 2}, {1, 2}} -> {{3, 2}, {2, 4}, {4, 
    1}}, {{1, 2}, {1, 2}} -> {{3, 2}, {3, 4}, {1, 2}}, {{1, 2}, {1, 
    2}} -> {{3, 2}, {3, 4}, {1, 3}}, {{1, 2}, {1, 2}} -> {{3, 2}, {3, 
    4}, {2, 1}}, {{1, 2}, {1, 2}} -> {{3, 2}, {3, 4}, {2, 4}}, {{1, 
    2}, {1, 2}} -> {{3, 3}, {3, 4}, {1, 3}}, {{1, 2}, {1, 2}} -> {{3, 
    3}, {3, 4}, {1, 4}}, {{1, 2}, {1, 2}} -> {{3, 3}, {3, 4}, {2, 
    3}}, {{1, 2}, {1, 2}} -> {{3, 3}, {3, 4}, {2, 4}}, {{1, 2}, {1, 
    2}} -> {{3, 3}, {3, 4}, {4, 1}}, {{1, 2}, {1, 2}} -> {{3, 3}, {3, 
    4}, {4, 2}}, {{1, 2}, {2, 1}} -> {{3, 1}, {1, 4}, {2, 4}}, {{1, 
    2}, {2, 1}} -> {{3, 1}, {1, 4}, {4, 2}}, {{1, 2}, {2, 1}} -> {{3, 
    1}, {3, 4}, {1, 2}}, {{1, 2}, {2, 1}} -> {{3, 1}, {3, 4}, {1, 
    4}}, {{1, 2}, {2, 1}} -> {{3, 1}, {3, 4}, {2, 1}}, {{1, 2}, {2, 
    1}} -> {{3, 1}, {3, 4}, {2, 3}}, {{1, 2}, {2, 1}} -> {{3, 3}, {3, 
    4}, {1, 3}}, {{1, 2}, {2, 1}} -> {{3, 3}, {3, 4}, {1, 4}}, {{1, 
    2}, {2, 1}} -> {{3, 3}, {3, 4}, {4, 1}}, {{1, 2}, {1, 2}} -> {{3, 
    1}, {1, 4}, {2, 5}}, {{1, 2}, {1, 2}} -> {{3, 1}, {1, 4}, {4, 
    5}}, {{1, 2}, {1, 2}} -> {{3, 1}, {3, 4}, {1, 5}}, {{1, 2}, {1, 
    2}} -> {{3, 1}, {3, 4}, {2, 5}}, {{1, 2}, {1, 2}} -> {{3, 1}, {3, 
    4}, {3, 5}}, {{1, 2}, {1, 2}} -> {{3, 2}, {2, 4}, {1, 5}}, {{1, 
    2}, {1, 2}} -> {{3, 2}, {2, 4}, {4, 5}}, {{1, 2}, {1, 2}} -> {{3, 
    2}, {3, 4}, {1, 5}}, {{1, 2}, {1, 2}} -> {{3, 2}, {3, 4}, {2, 
    5}}, {{1, 2}, {1, 2}} -> {{3, 2}, {3, 4}, {3, 5}}, {{1, 2}, {2, 
    1}} -> {{3, 1}, {1, 4}, {2, 5}}, {{1, 2}, {2, 1}} -> {{3, 1}, {1, 
    4}, {4, 5}}, {{1, 2}, {2, 1}} -> {{3, 1}, {3, 4}, {1, 5}}, {{1, 
    2}, {2, 1}} -> {{3, 1}, {3, 4}, {2, 5}}, {{1, 2}, {2, 1}} -> {{3, 
    1}, {3, 4}, {3, 5}}, {{1, 2}, {1, 2}} -> {{3, 1}, {1, 4}, {5, 
    1}}, {{1, 2}, {1, 2}} -> {{3, 1}, {1, 4}, {5, 2}}, {{1, 2}, {1, 
    2}} -> {{3, 1}, {1, 4}, {5, 4}}, {{1, 2}, {1, 2}} -> {{3, 1}, {3, 
    4}, {5, 1}}, {{1, 2}, {1, 2}} -> {{3, 1}, {3, 4}, {5, 2}}, {{1, 
    2}, {1, 2}} -> {{3, 1}, {3, 4}, {5, 3}}, {{1, 2}, {1, 2}} -> {{3, 
    2}, {2, 4}, {5, 1}}, {{1, 2}, {1, 2}} -> {{3, 2}, {2, 4}, {5, 
    2}}, {{1, 2}, {1, 2}} -> {{3, 2}, {2, 4}, {5, 4}}, {{1, 2}, {1, 
    2}} -> {{3, 2}, {3, 4}, {5, 1}}, {{1, 2}, {1, 2}} -> {{3, 2}, {3, 
    4}, {5, 2}}, {{1, 2}, {1, 2}} -> {{3, 2}, {3, 4}, {5, 3}}, {{1, 
    2}, {2, 1}} -> {{3, 1}, {1, 4}, {5, 1}}, {{1, 2}, {2, 1}} -> {{3, 
    1}, {1, 4}, {5, 2}}, {{1, 2}, {2, 1}} -> {{3, 1}, {1, 4}, {5, 
    4}}, {{1, 2}, {2, 1}} -> {{3, 1}, {3, 4}, {5, 1}}, {{1, 2}, {2, 
    1}} -> {{3, 1}, {3, 4}, {5, 2}}, {{1, 2}, {2, 1}} -> {{3, 1}, {3, 
    4}, {5, 3}}, {{1, 2}, {1, 2}} -> {{3, 3}, {4, 3}, {1, 4}}, {{1, 
    2}, {1, 2}} -> {{3, 3}, {4, 3}, {2, 4}}, {{1, 2}, {1, 2}} -> {{3, 
    3}, {4, 3}, {4, 1}}, {{1, 2}, {1, 2}} -> {{3, 3}, {4, 3}, {4, 
    2}}, {{1, 2}, {2, 1}} -> {{3, 3}, {4, 3}, {1, 4}}, {{1, 2}, {2, 
    1}} -> {{3, 3}, {4, 3}, {4, 1}}, {{1, 2}, {1, 2}} -> {{3, 1}, {4, 
    1}, {2, 5}}, {{1, 2}, {1, 2}} -> {{3, 2}, {4, 2}, {1, 5}}, {{1, 
    2}, {2, 1}} -> {{3, 1}, {4, 1}, {2, 5}}, {{1, 2}, {1, 2}} -> {{3, 
    1}, {4, 1}, {5, 1}}, {{1, 2}, {1, 2}} -> {{3, 1}, {4, 1}, {5, 
    2}}, {{1, 2}, {1, 2}} -> {{3, 2}, {4, 2}, {5, 1}}, {{1, 2}, {1, 
    2}} -> {{3, 2}, {4, 2}, {5, 2}}, {{1, 2}, {2, 1}} -> {{3, 1}, {4, 
    1}, {5, 1}}, {{1, 2}, {2, 1}} -> {{3, 1}, {4, 1}, {5, 2}}, {{1, 
    2}, {1, 2}} -> {{3, 4}, {3, 1}, {2, 4}}, {{1, 2}, {1, 2}} -> {{3, 
    4}, {3, 1}, {4, 1}}, {{1, 2}, {1, 2}} -> {{3, 4}, {3, 1}, {4, 
    2}}, {{1, 2}, {1, 2}} -> {{3, 4}, {3, 2}, {1, 4}}, {{1, 2}, {1, 
    2}} -> {{3, 4}, {3, 2}, {4, 1}}, {{1, 2}, {1, 2}} -> {{3, 4}, {3, 
    2}, {4, 2}}, {{1, 2}, {1, 2}} -> {{3, 4}, {3, 4}, {1, 3}}, {{1, 
    2}, {1, 2}} -> {{3, 4}, {3, 4}, {1, 4}}, {{1, 2}, {1, 2}} -> {{3, 
    4}, {3, 4}, {2, 3}}, {{1, 2}, {1, 2}} -> {{3, 4}, {3, 4}, {2, 
    4}}, {{1, 2}, {1, 2}} -> {{3, 4}, {3, 4}, {3, 1}}, {{1, 2}, {1, 
    2}} -> {{3, 4}, {3, 4}, {3, 2}}, {{1, 2}, {1, 2}} -> {{3, 4}, {3, 
    4}, {4, 1}}, {{1, 2}, {1, 2}} -> {{3, 4}, {3, 4}, {4, 2}}, {{1, 
    2}, {1, 2}} -> {{3, 4}, {4, 1}, {1, 2}}, {{1, 2}, {1, 2}} -> {{3, 
    4}, {4, 1}, {2, 1}}, {{1, 2}, {1, 2}} -> {{3, 4}, {4, 2}, {1, 
    2}}, {{1, 2}, {1, 2}} -> {{3, 4}, {4, 2}, {2, 1}}, {{1, 2}, {1, 
    2}} -> {{3, 4}, {4, 3}, {1, 3}}, {{1, 2}, {1, 2}} -> {{3, 4}, {4, 
    3}, {2, 3}}, {{1, 2}, {1, 2}} -> {{3, 4}, {4, 3}, {3, 1}}, {{1, 
    2}, {1, 2}} -> {{3, 4}, {4, 3}, {3, 2}}, {{1, 2}, {2, 1}} -> {{3, 
    4}, {3, 1}, {2, 4}}, {{1, 2}, {2, 1}} -> {{3, 4}, {3, 1}, {4, 
    1}}, {{1, 2}, {2, 1}} -> {{3, 4}, {3, 1}, {4, 2}}, {{1, 2}, {2, 
    1}} -> {{3, 4}, {3, 4}, {1, 3}}, {{1, 2}, {2, 1}} -> {{3, 4}, {3, 
    4}, {1, 4}}, {{1, 2}, {2, 1}} -> {{3, 4}, {3, 4}, {3, 1}}, {{1, 
    2}, {2, 1}} -> {{3, 4}, {3, 4}, {4, 1}}, {{1, 2}, {2, 1}} -> {{3, 
    4}, {4, 1}, {1, 2}}, {{1, 2}, {2, 1}} -> {{3, 4}, {4, 1}, {2, 
    1}}, {{1, 2}, {2, 1}} -> {{3, 4}, {4, 3}, {1, 3}}, {{1, 2}, {2, 
    1}} -> {{3, 4}, {4, 3}, {3, 1}}, {{1, 2}, {1, 2}} -> {{3, 4}, {3, 
    1}, {4, 5}}, {{1, 2}, {1, 2}} -> {{3, 4}, {3, 2}, {4, 5}}, {{1, 
    2}, {1, 2}} -> {{3, 4}, {4, 1}, {1, 5}}, {{1, 2}, {1, 2}} -> {{3, 
    4}, {4, 1}, {2, 5}}, {{1, 2}, {1, 2}} -> {{3, 4}, {4, 2}, {1, 
    5}}, {{1, 2}, {1, 2}} -> {{3, 4}, {4, 2}, {2, 5}}, {{1, 2}, {2, 
    1}} -> {{3, 4}, {3, 1}, {4, 5}}, {{1, 2}, {2, 1}} -> {{3, 4}, {4, 
    1}, {1, 5}}, {{1, 2}, {2, 1}} -> {{3, 4}, {4, 1}, {2, 5}}, {{1, 
    2}, {1, 2}} -> {{3, 4}, {3, 1}, {5, 4}}, {{1, 2}, {1, 2}} -> {{3, 
    4}, {3, 2}, {5, 4}}, {{1, 2}, {1, 2}} -> {{3, 4}, {4, 1}, {5, 
    1}}, {{1, 2}, {1, 2}} -> {{3, 4}, {4, 1}, {5, 2}}, {{1, 2}, {1, 
    2}} -> {{3, 4}, {4, 1}, {5, 4}}, {{1, 2}, {1, 2}} -> {{3, 4}, {4, 
    2}, {5, 1}}, {{1, 2}, {1, 2}} -> {{3, 4}, {4, 2}, {5, 2}}, {{1, 
    2}, {1, 2}} -> {{3, 4}, {4, 2}, {5, 4}}, {{1, 2}, {2, 1}} -> {{3, 
    4}, {3, 1}, {5, 4}}, {{1, 2}, {2, 1}} -> {{3, 4}, {4, 1}, {5, 
    1}}, {{1, 2}, {2, 1}} -> {{3, 4}, {4, 1}, {5, 2}}, {{1, 2}, {2, 
    1}} -> {{3, 4}, {4, 1}, {5, 4}}, {{1, 2}, {1, 2}} -> {{3, 4}, {3, 
    5}, {1, 3}}, {{1, 2}, {1, 2}} -> {{3, 4}, {3, 5}, {1, 4}}, {{1, 
    2}, {1, 2}} -> {{3, 4}, {3, 5}, {2, 3}}, {{1, 2}, {1, 2}} -> {{3, 
    4}, {3, 5}, {2, 4}}, {{1, 2}, {1, 2}} -> {{3, 4}, {3, 5}, {4, 
    1}}, {{1, 2}, {1, 2}} -> {{3, 4}, {3, 5}, {4, 2}}, {{1, 2}, {1, 
    2}} -> {{3, 4}, {4, 5}, {1, 5}}, {{1, 2}, {1, 2}} -> {{3, 4}, {4, 
    5}, {2, 5}}, {{1, 2}, {1, 2}} -> {{3, 4}, {4, 5}, {5, 1}}, {{1, 
    2}, {1, 2}} -> {{3, 4}, {4, 5}, {5, 2}}, {{1, 2}, {2, 1}} -> {{3, 
    4}, {3, 5}, {1, 3}}, {{1, 2}, {2, 1}} -> {{3, 4}, {3, 5}, {1, 
    4}}, {{1, 2}, {2, 1}} -> {{3, 4}, {3, 5}, {4, 1}}, {{1, 2}, {2, 
    1}} -> {{3, 4}, {4, 5}, {1, 5}}, {{1, 2}, {2, 1}} -> {{3, 4}, {4, 
    5}, {5, 1}}, {{1, 2}, {1, 3}} -> {{1, 1}, {1, 1}, {1, 1}}, {{1, 
    2}, {1, 3}} -> {{1, 1}, {1, 1}, {1, 2}}, {{1, 2}, {1, 3}} -> {{1, 
    1}, {1, 1}, {2, 1}}, {{1, 2}, {1, 3}} -> {{1, 1}, {1, 1}, {2, 
    2}}, {{1, 2}, {1, 3}} -> {{1, 1}, {1, 1}, {2, 3}}, {{1, 2}, {1, 
    3}} -> {{1, 1}, {1, 2}, {1, 2}}, {{1, 2}, {1, 3}} -> {{1, 1}, {1, 
    2}, {1, 3}}, {{1, 2}, {1, 3}} -> {{1, 1}, {1, 2}, {2, 1}}, {{1, 
    2}, {1, 3}} -> {{1, 1}, {1, 2}, {2, 2}}, {{1, 2}, {1, 3}} -> {{1, 
    1}, {1, 2}, {2, 3}}, {{1, 2}, {1, 3}} -> {{1, 1}, {1, 2}, {3, 
    1}}, {{1, 2}, {1, 3}} -> {{1, 1}, {1, 2}, {3, 2}}, {{1, 2}, {1, 
    3}} -> {{1, 1}, {1, 2}, {3, 3}}, {{1, 2}, {1, 3}} -> {{1, 1}, {2, 
    1}, {2, 1}}, {{1, 2}, {1, 3}} -> {{1, 1}, {2, 1}, {2, 3}}, {{1, 
    2}, {1, 3}} -> {{1, 1}, {2, 1}, {3, 1}}, {{1, 2}, {1, 3}} -> {{1, 
    1}, {2, 1}, {3, 2}}, {{1, 2}, {1, 3}} -> {{1, 1}, {2, 1}, {3, 
    3}}, {{1, 2}, {1, 3}} -> {{1, 1}, {2, 2}, {3, 3}}, {{1, 2}, {1, 
    3}} -> {{1, 1}, {2, 3}, {2, 3}}, {{1, 2}, {1, 3}} -> {{1, 1}, {2, 
    3}, {3, 2}}, {{1, 2}, {1, 3}} -> {{1, 2}, {1, 2}, {1, 2}}, {{1, 
    2}, {1, 3}} -> {{1, 2}, {1, 2}, {1, 3}}, {{1, 2}, {1, 3}} -> {{1, 
    2}, {1, 2}, {2, 1}}, {{1, 2}, {1, 3}} -> {{1, 2}, {1, 2}, {2, 
    3}}, {{1, 2}, {1, 3}} -> {{1, 2}, {1, 2}, {3, 1}}, {{1, 2}, {1, 
    3}} -> {{1, 2}, {1, 2}, {3, 2}}, {{1, 2}, {1, 3}} -> {{1, 2}, {1, 
    3}, {2, 3}}, {{1, 2}, {1, 3}} -> {{1, 2}, {2, 1}, {1, 3}}, {{1, 
    2}, {1, 3}} -> {{1, 2}, {2, 1}, {3, 1}}, {{1, 2}, {1, 3}} -> {{1, 
    2}, {2, 3}, {3, 1}}, {{1, 2}, {1, 3}} -> {{2, 1}, {1, 2}, {2, 
    3}}, {{1, 2}, {1, 3}} -> {{2, 1}, {1, 2}, {3, 2}}, {{1, 2}, {1, 
    3}} -> {{2, 1}, {2, 1}, {1, 2}}, {{1, 2}, {1, 3}} -> {{2, 1}, {2, 
    1}, {1, 3}}, {{1, 2}, {1, 3}} -> {{2, 1}, {2, 1}, {2, 1}}, {{1, 
    2}, {1, 3}} -> {{2, 1}, {2, 1}, {2, 3}}, {{1, 2}, {1, 3}} -> {{2, 
    1}, {2, 1}, {3, 1}}, {{1, 2}, {1, 3}} -> {{2, 1}, {2, 1}, {3, 
    2}}, {{1, 2}, {1, 3}} -> {{2, 1}, {2, 3}, {1, 3}}, {{1, 2}, {1, 
    3}} -> {{2, 2}, {1, 2}, {1, 2}}, {{1, 2}, {1, 3}} -> {{2, 2}, {1, 
    2}, {1, 3}}, {{1, 2}, {1, 3}} -> {{2, 2}, {1, 2}, {3, 1}}, {{1, 
    2}, {1, 3}} -> {{2, 2}, {1, 2}, {3, 2}}, {{1, 2}, {1, 3}} -> {{2, 
    2}, {1, 2}, {3, 3}}, {{1, 2}, {1, 3}} -> {{2, 2}, {1, 3}, {1, 
    3}}, {{1, 2}, {1, 3}} -> {{2, 2}, {1, 3}, {3, 1}}, {{1, 2}, {1, 
    3}} -> {{2, 2}, {2, 1}, {1, 1}}, {{1, 2}, {1, 3}} -> {{2, 2}, {2, 
    1}, {1, 2}}, {{1, 2}, {1, 3}} -> {{2, 2}, {2, 1}, {1, 3}}, {{1, 
    2}, {1, 3}} -> {{2, 2}, {2, 1}, {2, 1}}, {{1, 2}, {1, 3}} -> {{2, 
    2}, {2, 1}, {2, 3}}, {{1, 2}, {1, 3}} -> {{2, 2}, {2, 1}, {3, 
    1}}, {{1, 2}, {1, 3}} -> {{2, 2}, {2, 1}, {3, 2}}, {{1, 2}, {1, 
    3}} -> {{2, 2}, {2, 1}, {3, 3}}, {{1, 2}, {1, 3}} -> {{2, 2}, {2, 
    2}, {1, 1}}, {{1, 2}, {1, 3}} -> {{2, 2}, {2, 2}, {1, 2}}, {{1, 
    2}, {1, 3}} -> {{2, 2}, {2, 2}, {1, 3}}, {{1, 2}, {1, 3}} -> {{2, 
    2}, {2, 2}, {2, 1}}, {{1, 2}, {1, 3}} -> {{2, 2}, {2, 2}, {2, 
    2}}, {{1, 2}, {1, 3}} -> {{2, 2}, {2, 2}, {2, 3}}, {{1, 2}, {1, 
    3}} -> {{2, 2}, {2, 2}, {3, 1}}, {{1, 2}, {1, 3}} -> {{2, 2}, {2, 
    2}, {3, 2}}, {{1, 2}, {1, 3}} -> {{2, 2}, {2, 2}, {3, 3}}, {{1, 
    2}, {1, 3}} -> {{2, 2}, {2, 3}, {1, 1}}, {{1, 2}, {1, 3}} -> {{2, 
    2}, {2, 3}, {1, 2}}, {{1, 2}, {1, 3}} -> {{2, 2}, {2, 3}, {1, 
    3}}, {{1, 2}, {1, 3}} -> {{2, 2}, {2, 3}, {2, 3}}, {{1, 2}, {1, 
    3}} -> {{2, 2}, {2, 3}, {3, 1}}, {{1, 2}, {1, 3}} -> {{2, 2}, {2, 
    3}, {3, 2}}, {{1, 2}, {1, 3}} -> {{2, 2}, {2, 3}, {3, 3}}, {{1, 
    2}, {1, 3}} -> {{2, 2}, {3, 1}, {3, 1}}, {{1, 2}, {1, 3}} -> {{2, 
    2}, {3, 2}, {1, 1}}, {{1, 2}, {1, 3}} -> {{2, 2}, {3, 2}, {1, 
    3}}, {{1, 2}, {1, 3}} -> {{2, 2}, {3, 2}, {3, 1}}, {{1, 2}, {1, 
    3}} -> {{2, 2}, {3, 2}, {3, 2}}, {{1, 2}, {1, 3}} -> {{2, 3}, {2, 
    1}, {3, 1}}, {{1, 2}, {1, 3}} -> {{2, 3}, {2, 3}, {1, 2}}, {{1, 
    2}, {1, 3}} -> {{2, 3}, {2, 3}, {1, 3}}, {{1, 2}, {1, 3}} -> {{2, 
    3}, {2, 3}, {2, 1}}, {{1, 2}, {1, 3}} -> {{2, 3}, {2, 3}, {2, 
    3}}, {{1, 2}, {1, 3}} -> {{2, 3}, {2, 3}, {3, 1}}, {{1, 2}, {1, 
    3}} -> {{2, 3}, {2, 3}, {3, 2}}, {{1, 2}, {1, 3}} -> {{2, 3}, {3, 
    2}, {1, 2}}, {{1, 2}, {1, 3}} -> {{2, 3}, {3, 2}, {2, 1}}, {{1, 
    2}, {2, 3}} -> {{1, 1}, {1, 1}, {1, 1}}, {{1, 2}, {2, 3}} -> {{1, 
    1}, {1, 1}, {1, 2}}, {{1, 2}, {2, 3}} -> {{1, 1}, {1, 1}, {1, 
    3}}, {{1, 2}, {2, 3}} -> {{1, 1}, {1, 1}, {2, 1}}, {{1, 2}, {2, 
    3}} -> {{1, 1}, {1, 1}, {2, 2}}, {{1, 2}, {2, 3}} -> {{1, 1}, {1, 
    1}, {2, 3}}, {{1, 2}, {2, 3}} -> {{1, 1}, {1, 1}, {3, 1}}, {{1, 
    2}, {2, 3}} -> {{1, 1}, {1, 1}, {3, 2}}, {{1, 2}, {2, 3}} -> {{1, 
    1}, {1, 1}, {3, 3}}, {{1, 2}, {2, 3}} -> {{1, 1}, {1, 2}, {1, 
    2}}, {{1, 2}, {2, 3}} -> {{1, 1}, {1, 2}, {1, 3}}, {{1, 2}, {2, 
    3}} -> {{1, 1}, {1, 2}, {2, 1}}, {{1, 2}, {2, 3}} -> {{1, 1}, {1, 
    2}, {2, 2}}, {{1, 2}, {2, 3}} -> {{1, 1}, {1, 2}, {2, 3}}, {{1, 
    2}, {2, 3}} -> {{1, 1}, {1, 2}, {3, 1}}, {{1, 2}, {2, 3}} -> {{1, 
    1}, {1, 2}, {3, 2}}, {{1, 2}, {2, 3}} -> {{1, 1}, {1, 2}, {3, 
    3}}, {{1, 2}, {2, 3}} -> {{1, 1}, {1, 3}, {1, 3}}, {{1, 2}, {2, 
    3}} -> {{1, 1}, {1, 3}, {2, 1}}, {{1, 2}, {2, 3}} -> {{1, 1}, {1, 
    3}, {2, 2}}, {{1, 2}, {2, 3}} -> {{1, 1}, {1, 3}, {2, 3}}, {{1, 
    2}, {2, 3}} -> {{1, 1}, {1, 3}, {3, 1}}, {{1, 2}, {2, 3}} -> {{1, 
    1}, {1, 3}, {3, 2}}, {{1, 2}, {2, 3}} -> {{1, 1}, {1, 3}, {3, 
    3}}, {{1, 2}, {2, 3}} -> {{1, 1}, {2, 1}, {2, 1}}, {{1, 2}, {2, 
    3}} -> {{1, 1}, {2, 1}, {2, 3}}, {{1, 2}, {2, 3}} -> {{1, 1}, {2, 
    1}, {3, 1}}, {{1, 2}, {2, 3}} -> {{1, 1}, {2, 1}, {3, 2}}, {{1, 
    2}, {2, 3}} -> {{1, 1}, {2, 1}, {3, 3}}, {{1, 2}, {2, 3}} -> {{1, 
    1}, {2, 2}, {3, 3}}, {{1, 2}, {2, 3}} -> {{1, 1}, {2, 3}, {2, 
    3}}, {{1, 2}, {2, 3}} -> {{1, 1}, {2, 3}, {3, 2}}, {{1, 2}, {2, 
    3}} -> {{1, 1}, {3, 1}, {2, 2}}, {{1, 2}, {2, 3}} -> {{1, 1}, {3, 
    1}, {2, 3}}, {{1, 2}, {2, 3}} -> {{1, 1}, {3, 1}, {3, 1}}, {{1, 
    2}, {2, 3}} -> {{1, 1}, {3, 1}, {3, 2}}, {{1, 2}, {2, 3}} -> {{1, 
    1}, {3, 2}, {3, 2}}, {{1, 2}, {2, 3}} -> {{1, 2}, {1, 2}, {1, 
    2}}, {{1, 2}, {2, 3}} -> {{1, 2}, {1, 2}, {1, 3}}, {{1, 2}, {2, 
    3}} -> {{1, 2}, {1, 2}, {2, 1}}, {{1, 2}, {2, 3}} -> {{1, 2}, {1, 
    2}, {2, 3}}, {{1, 2}, {2, 3}} -> {{1, 2}, {1, 2}, {3, 1}}, {{1, 
    2}, {2, 3}} -> {{1, 2}, {1, 2}, {3, 2}}, {{1, 2}, {2, 3}} -> {{1, 
    2}, {1, 3}, {2, 3}}, {{1, 2}, {2, 3}} -> {{1, 2}, {2, 1}, {1, 
    3}}, {{1, 2}, {2, 3}} -> {{1, 2}, {2, 1}, {3, 1}}, {{1, 2}, {2, 
    3}} -> {{1, 2}, {2, 3}, {3, 1}}, {{1, 2}, {2, 3}} -> {{1, 3}, {1, 
    2}, {3, 2}}, {{1, 2}, {2, 3}} -> {{1, 3}, {1, 3}, {1, 2}}, {{1, 
    2}, {2, 3}} -> {{1, 3}, {1, 3}, {1, 3}}, {{1, 2}, {2, 3}} -> {{1, 
    3}, {1, 3}, {2, 1}}, {{1, 2}, {2, 3}} -> {{1, 3}, {1, 3}, {2, 
    3}}, {{1, 2}, {2, 3}} -> {{1, 3}, {1, 3}, {3, 1}}, {{1, 2}, {2, 
    3}} -> {{1, 3}, {1, 3}, {3, 2}}, {{1, 2}, {2, 3}} -> {{1, 3}, {3, 
    1}, {1, 2}}, {{1, 2}, {2, 3}} -> {{1, 3}, {3, 1}, {2, 1}}, {{1, 
    2}, {2, 3}} -> {{1, 3}, {3, 2}, {2, 1}}, {{1, 2}, {2, 3}} -> {{2, 
    1}, {1, 2}, {2, 3}}, {{1, 2}, {2, 3}} -> {{2, 1}, {1, 2}, {3, 
    2}}, {{1, 2}, {2, 3}} -> {{2, 1}, {2, 1}, {1, 2}}, {{1, 2}, {2, 
    3}} -> {{2, 1}, {2, 1}, {1, 3}}, {{1, 2}, {2, 3}} -> {{2, 1}, {2, 
    1}, {2, 1}}, {{1, 2}, {2, 3}} -> {{2, 1}, {2, 1}, {2, 3}}, {{1, 
    2}, {2, 3}} -> {{2, 1}, {2, 1}, {3, 1}}, {{1, 2}, {2, 3}} -> {{2, 
    1}, {2, 1}, {3, 2}}, {{1, 2}, {2, 3}} -> {{2, 1}, {2, 3}, {1, 
    3}}, {{1, 2}, {2, 3}} -> {{2, 2}, {1, 2}, {1, 2}}, {{1, 2}, {2, 
    3}} -> {{2, 2}, {1, 2}, {1, 3}}, {{1, 2}, {2, 3}} -> {{2, 2}, {1, 
    2}, {3, 1}}, {{1, 2}, {2, 3}} -> {{2, 2}, {1, 2}, {3, 2}}, {{1, 
    2}, {2, 3}} -> {{2, 2}, {1, 2}, {3, 3}}, {{1, 2}, {2, 3}} -> {{2, 
    2}, {1, 3}, {1, 3}}, {{1, 2}, {2, 3}} -> {{2, 2}, {1, 3}, {3, 
    1}}, {{1, 2}, {2, 3}} -> {{2, 2}, {2, 1}, {1, 1}}, {{1, 2}, {2, 
    3}} -> {{2, 2}, {2, 1}, {1, 2}}, {{1, 2}, {2, 3}} -> {{2, 2}, {2, 
    1}, {1, 3}}, {{1, 2}, {2, 3}} -> {{2, 2}, {2, 1}, {2, 1}}, {{1, 
    2}, {2, 3}} -> {{2, 2}, {2, 1}, {2, 3}}, {{1, 2}, {2, 3}} -> {{2, 
    2}, {2, 1}, {3, 1}}, {{1, 2}, {2, 3}} -> {{2, 2}, {2, 1}, {3, 
    2}}, {{1, 2}, {2, 3}} -> {{2, 2}, {2, 1}, {3, 3}}, {{1, 2}, {2, 
    3}} -> {{2, 2}, {2, 2}, {1, 1}}, {{1, 2}, {2, 3}} -> {{2, 2}, {2, 
    2}, {1, 2}}, {{1, 2}, {2, 3}} -> {{2, 2}, {2, 2}, {1, 3}}, {{1, 
    2}, {2, 3}} -> {{2, 2}, {2, 2}, {2, 1}}, {{1, 2}, {2, 3}} -> {{2, 
    2}, {2, 2}, {2, 2}}, {{1, 2}, {2, 3}} -> {{2, 2}, {2, 2}, {2, 
    3}}, {{1, 2}, {2, 3}} -> {{2, 2}, {2, 2}, {3, 1}}, {{1, 2}, {2, 
    3}} -> {{2, 2}, {2, 2}, {3, 2}}, {{1, 2}, {2, 3}} -> {{2, 2}, {2, 
    2}, {3, 3}}, {{1, 2}, {2, 3}} -> {{2, 2}, {2, 3}, {1, 1}}, {{1, 
    2}, {2, 3}} -> {{2, 2}, {2, 3}, {1, 2}}, {{1, 2}, {2, 3}} -> {{2, 
    2}, {2, 3}, {1, 3}}, {{1, 2}, {2, 3}} -> {{2, 2}, {2, 3}, {2, 
    3}}, {{1, 2}, {2, 3}} -> {{2, 2}, {2, 3}, {3, 1}}, {{1, 2}, {2, 
    3}} -> {{2, 2}, {2, 3}, {3, 2}}, {{1, 2}, {2, 3}} -> {{2, 2}, {2, 
    3}, {3, 3}}, {{1, 2}, {2, 3}} -> {{2, 2}, {3, 1}, {3, 1}}, {{1, 
    2}, {2, 3}} -> {{2, 2}, {3, 2}, {1, 1}}, {{1, 2}, {2, 3}} -> {{2, 
    2}, {3, 2}, {1, 3}}, {{1, 2}, {2, 3}} -> {{2, 2}, {3, 2}, {3, 
    1}}, {{1, 2}, {2, 3}} -> {{2, 2}, {3, 2}, {3, 2}}, {{1, 2}, {2, 
    3}} -> {{2, 3}, {2, 1}, {3, 1}}, {{1, 2}, {2, 3}} -> {{2, 3}, {2, 
    3}, {1, 2}}, {{1, 2}, {2, 3}} -> {{2, 3}, {2, 3}, {1, 3}}, {{1, 
    2}, {2, 3}} -> {{2, 3}, {2, 3}, {2, 1}}, {{1, 2}, {2, 3}} -> {{2, 
    3}, {2, 3}, {2, 3}}, {{1, 2}, {2, 3}} -> {{2, 3}, {2, 3}, {3, 
    1}}, {{1, 2}, {2, 3}} -> {{2, 3}, {2, 3}, {3, 2}}, {{1, 2}, {2, 
    3}} -> {{2, 3}, {3, 2}, {1, 2}}, {{1, 2}, {2, 3}} -> {{2, 3}, {3, 
    2}, {2, 1}}, {{1, 2}, {2, 3}} -> {{3, 1}, {1, 3}, {2, 3}}, {{1, 
    2}, {2, 3}} -> {{3, 1}, {1, 3}, {3, 2}}, {{1, 2}, {2, 3}} -> {{3, 
    1}, {3, 1}, {1, 2}}, {{1, 2}, {2, 3}} -> {{3, 1}, {3, 1}, {1, 
    3}}, {{1, 2}, {2, 3}} -> {{3, 1}, {3, 1}, {2, 1}}, {{1, 2}, {2, 
    3}} -> {{3, 1}, {3, 1}, {2, 3}}, {{1, 2}, {2, 3}} -> {{3, 1}, {3, 
    1}, {3, 1}}, {{1, 2}, {2, 3}} -> {{3, 1}, {3, 1}, {3, 2}}, {{1, 
    2}, {2, 3}} -> {{3, 1}, {3, 2}, {1, 2}}, {{1, 2}, {2, 3}} -> {{3, 
    2}, {2, 3}, {1, 3}}, {{1, 2}, {2, 3}} -> {{3, 2}, {2, 3}, {3, 
    1}}, {{1, 2}, {2, 3}} -> {{3, 2}, {3, 1}, {2, 1}}, {{1, 2}, {2, 
    3}} -> {{3, 2}, {3, 2}, {1, 2}}, {{1, 2}, {2, 3}} -> {{3, 2}, {3, 
    2}, {1, 3}}, {{1, 2}, {2, 3}} -> {{3, 2}, {3, 2}, {2, 1}}, {{1, 
    2}, {2, 3}} -> {{3, 2}, {3, 2}, {2, 3}}, {{1, 2}, {2, 3}} -> {{3, 
    2}, {3, 2}, {3, 1}}, {{1, 2}, {2, 3}} -> {{3, 2}, {3, 2}, {3, 
    2}}, {{1, 2}, {2, 3}} -> {{3, 3}, {1, 2}, {1, 2}}, {{1, 2}, {2, 
    3}} -> {{3, 3}, {1, 2}, {2, 1}}, {{1, 2}, {2, 3}} -> {{3, 3}, {1, 
    3}, {1, 2}}, {{1, 2}, {2, 3}} -> {{3, 3}, {1, 3}, {1, 3}}, {{1, 
    2}, {2, 3}} -> {{3, 3}, {1, 3}, {2, 1}}, {{1, 2}, {2, 3}} -> {{3, 
    3}, {1, 3}, {2, 2}}, {{1, 2}, {2, 3}} -> {{3, 3}, {1, 3}, {2, 
    3}}, {{1, 2}, {2, 3}} -> {{3, 3}, {2, 1}, {2, 1}}, {{1, 2}, {2, 
    3}} -> {{3, 3}, {2, 3}, {1, 1}}, {{1, 2}, {2, 3}} -> {{3, 3}, {2, 
    3}, {1, 2}}, {{1, 2}, {2, 3}} -> {{3, 3}, {2, 3}, {2, 1}}, {{1, 
    2}, {2, 3}} -> {{3, 3}, {2, 3}, {2, 3}}, {{1, 2}, {2, 3}} -> {{3, 
    3}, {3, 1}, {1, 1}}, {{1, 2}, {2, 3}} -> {{3, 3}, {3, 1}, {1, 
    2}}, {{1, 2}, {2, 3}} -> {{3, 3}, {3, 1}, {1, 3}}, {{1, 2}, {2, 
    3}} -> {{3, 3}, {3, 1}, {2, 1}}, {{1, 2}, {2, 3}} -> {{3, 3}, {3, 
    1}, {2, 2}}, {{1, 2}, {2, 3}} -> {{3, 3}, {3, 1}, {2, 3}}, {{1, 
    2}, {2, 3}} -> {{3, 3}, {3, 1}, {3, 1}}, {{1, 2}, {2, 3}} -> {{3, 
    3}, {3, 1}, {3, 2}}, {{1, 2}, {2, 3}} -> {{3, 3}, {3, 2}, {1, 
    1}}, {{1, 2}, {2, 3}} -> {{3, 3}, {3, 2}, {1, 2}}, {{1, 2}, {2, 
    3}} -> {{3, 3}, {3, 2}, {1, 3}}, {{1, 2}, {2, 3}} -> {{3, 3}, {3, 
    2}, {2, 1}}, {{1, 2}, {2, 3}} -> {{3, 3}, {3, 2}, {2, 2}}, {{1, 
    2}, {2, 3}} -> {{3, 3}, {3, 2}, {2, 3}}, {{1, 2}, {2, 3}} -> {{3, 
    3}, {3, 2}, {3, 2}}, {{1, 2}, {2, 3}} -> {{3, 3}, {3, 3}, {1, 
    1}}, {{1, 2}, {2, 3}} -> {{3, 3}, {3, 3}, {1, 2}}, {{1, 2}, {2, 
    3}} -> {{3, 3}, {3, 3}, {1, 3}}, {{1, 2}, {2, 3}} -> {{3, 3}, {3, 
    3}, {2, 1}}, {{1, 2}, {2, 3}} -> {{3, 3}, {3, 3}, {2, 2}}, {{1, 
    2}, {2, 3}} -> {{3, 3}, {3, 3}, {2, 3}}, {{1, 2}, {2, 3}} -> {{3, 
    3}, {3, 3}, {3, 1}}, {{1, 2}, {2, 3}} -> {{3, 3}, {3, 3}, {3, 
    2}}, {{1, 2}, {2, 3}} -> {{3, 3}, {3, 3}, {3, 3}}, {{1, 2}, {1, 
    3}} -> {{1, 1}, {1, 1}, {1, 4}}, {{1, 2}, {1, 3}} -> {{1, 1}, {1, 
    1}, {2, 4}}, {{1, 2}, {1, 3}} -> {{1, 1}, {1, 2}, {1, 4}}, {{1, 
    2}, {1, 3}} -> {{1, 1}, {1, 2}, {2, 4}}, {{1, 2}, {1, 3}} -> {{1, 
    1}, {1, 2}, {3, 4}}, {{1, 2}, {1, 3}} -> {{1, 1}, {2, 1}, {2, 
    4}}, {{1, 2}, {1, 3}} -> {{1, 1}, {2, 1}, {3, 4}}, {{1, 2}, {1, 
    3}} -> {{1, 1}, {2, 2}, {3, 4}}, {{1, 2}, {1, 3}} -> {{1, 1}, {2, 
    3}, {2, 4}}, {{1, 2}, {1, 3}} -> {{1, 1}, {2, 3}, {3, 4}}, {{1, 
    2}, {1, 3}} -> {{1, 2}, {1, 2}, {1, 4}}, {{1, 2}, {1, 3}} -> {{1, 
    2}, {1, 2}, {2, 4}}, {{1, 2}, {1, 3}} -> {{1, 2}, {1, 2}, {3, 
    4}}, {{1, 2}, {1, 3}} -> {{1, 2}, {1, 3}, {1, 4}}, {{1, 2}, {1, 
    3}} -> {{1, 2}, {1, 3}, {2, 4}}, {{1, 2}, {1, 3}} -> {{1, 2}, {2, 
    1}, {1, 4}}, {{1, 2}, {1, 3}} -> {{1, 2}, {2, 1}, {3, 4}}, {{1, 
    2}, {1, 3}} -> {{1, 2}, {2, 3}, {3, 4}}, {{1, 2}, {1, 3}} -> {{2, 
    1}, {1, 2}, {2, 4}}, {{1, 2}, {1, 3}} -> {{2, 1}, {1, 3}, {3, 
    4}}, {{1, 2}, {1, 3}} -> {{2, 1}, {2, 1}, {1, 4}}, {{1, 2}, {1, 
    3}} -> {{2, 1}, {2, 1}, {2, 4}}, {{1, 2}, {1, 3}} -> {{2, 1}, {2, 
    1}, {3, 4}}, {{1, 2}, {1, 3}} -> {{2, 1}, {2, 3}, {1, 4}}, {{1, 
    2}, {1, 3}} -> {{2, 1}, {2, 3}, {2, 4}}, {{1, 2}, {1, 3}} -> {{2, 
    2}, {1, 2}, {1, 4}}, {{1, 2}, {1, 3}} -> {{2, 2}, {1, 2}, {3, 
    4}}, {{1, 2}, {1, 3}} -> {{2, 2}, {1, 3}, {1, 4}}, {{1, 2}, {1, 
    3}} -> {{2, 2}, {1, 3}, {3, 4}}, {{1, 2}, {1, 3}} -> {{2, 2}, {2, 
    1}, {1, 4}}, {{1, 2}, {1, 3}} -> {{2, 2}, {2, 1}, {2, 4}}, {{1, 
    2}, {1, 3}} -> {{2, 2}, {2, 1}, {3, 4}}, {{1, 2}, {1, 3}} -> {{2, 
    2}, {2, 2}, {1, 4}}, {{1, 2}, {1, 3}} -> {{2, 2}, {2, 2}, {2, 
    4}}, {{1, 2}, {1, 3}} -> {{2, 2}, {2, 2}, {3, 4}}, {{1, 2}, {1, 
    3}} -> {{2, 2}, {2, 3}, {1, 4}}, {{1, 2}, {1, 3}} -> {{2, 2}, {2, 
    3}, {2, 4}}, {{1, 2}, {1, 3}} -> {{2, 2}, {2, 3}, {3, 4}}, {{1, 
    2}, {1, 3}} -> {{2, 2}, {3, 1}, {1, 4}}, {{1, 2}, {1, 3}} -> {{2, 
    2}, {3, 1}, {3, 4}}, {{1, 2}, {1, 3}} -> {{2, 2}, {3, 2}, {1, 
    4}}, {{1, 2}, {1, 3}} -> {{2, 2}, {3, 2}, {3, 4}}, {{1, 2}, {1, 
    3}} -> {{2, 2}, {3, 3}, {1, 4}}, {{1, 2}, {1, 3}} -> {{2, 3}, {2, 
    1}, {3, 4}}, {{1, 2}, {1, 3}} -> {{2, 3}, {2, 3}, {1, 4}}, {{1, 
    2}, {1, 3}} -> {{2, 3}, {2, 3}, {2, 4}}, {{1, 2}, {1, 3}} -> {{2, 
    3}, {2, 3}, {3, 4}}, {{1, 2}, {1, 3}} -> {{2, 3}, {3, 1}, {1, 
    4}}, {{1, 2}, {1, 3}} -> {{2, 3}, {3, 2}, {1, 4}}, {{1, 2}, {1, 
    3}} -> {{2, 3}, {3, 2}, {2, 4}}, {{1, 2}, {2, 3}} -> {{1, 1}, {1, 
    1}, {1, 4}}, {{1, 2}, {2, 3}} -> {{1, 1}, {1, 1}, {2, 4}}, {{1, 
    2}, {2, 3}} -> {{1, 1}, {1, 1}, {3, 4}}, {{1, 2}, {2, 3}} -> {{1, 
    1}, {1, 2}, {1, 4}}, {{1, 2}, {2, 3}} -> {{1, 1}, {1, 2}, {2, 
    4}}, {{1, 2}, {2, 3}} -> {{1, 1}, {1, 2}, {3, 4}}, {{1, 2}, {2, 
    3}} -> {{1, 1}, {1, 3}, {1, 4}}, {{1, 2}, {2, 3}} -> {{1, 1}, {1, 
    3}, {2, 4}}, {{1, 2}, {2, 3}} -> {{1, 1}, {1, 3}, {3, 4}}, {{1, 
    2}, {2, 3}} -> {{1, 1}, {2, 1}, {2, 4}}, {{1, 2}, {2, 3}} -> {{1, 
    1}, {2, 1}, {3, 4}}, {{1, 2}, {2, 3}} -> {{1, 1}, {2, 2}, {3, 
    4}}, {{1, 2}, {2, 3}} -> {{1, 1}, {2, 3}, {2, 4}}, {{1, 2}, {2, 
    3}} -> {{1, 1}, {2, 3}, {3, 4}}, {{1, 2}, {2, 3}} -> {{1, 1}, {3, 
    1}, {2, 4}}, {{1, 2}, {2, 3}} -> {{1, 1}, {3, 1}, {3, 4}}, {{1, 
    2}, {2, 3}} -> {{1, 1}, {3, 2}, {2, 4}}, {{1, 2}, {2, 3}} -> {{1, 
    1}, {3, 2}, {3, 4}}, {{1, 2}, {2, 3}} -> {{1, 1}, {3, 3}, {2, 
    4}}, {{1, 2}, {2, 3}} -> {{1, 2}, {1, 2}, {1, 4}}, {{1, 2}, {2, 
    3}} -> {{1, 2}, {1, 2}, {2, 4}}, {{1, 2}, {2, 3}} -> {{1, 2}, {1, 
    2}, {3, 4}}, {{1, 2}, {2, 3}} -> {{1, 2}, {1, 3}, {1, 4}}, {{1, 
    2}, {2, 3}} -> {{1, 2}, {1, 3}, {2, 4}}, {{1, 2}, {2, 3}} -> {{1, 
    2}, {2, 1}, {1, 4}}, {{1, 2}, {2, 3}} -> {{1, 2}, {2, 1}, {3, 
    4}}, {{1, 2}, {2, 3}} -> {{1, 2}, {2, 3}, {3, 4}}, {{1, 2}, {2, 
    3}} -> {{1, 3}, {1, 2}, {3, 4}}, {{1, 2}, {2, 3}} -> {{1, 3}, {1, 
    3}, {1, 4}}, {{1, 2}, {2, 3}} -> {{1, 3}, {1, 3}, {2, 4}}, {{1, 
    2}, {2, 3}} -> {{1, 3}, {1, 3}, {3, 4}}, {{1, 2}, {2, 3}} -> {{1, 
    3}, {3, 1}, {1, 4}}, {{1, 2}, {2, 3}} -> {{1, 3}, {3, 1}, {2, 
    4}}, {{1, 2}, {2, 3}} -> {{1, 3}, {3, 2}, {2, 4}}, {{1, 2}, {2, 
    3}} -> {{2, 1}, {1, 2}, {2, 4}}, {{1, 2}, {2, 3}} -> {{2, 1}, {1, 
    3}, {3, 4}}, {{1, 2}, {2, 3}} -> {{2, 1}, {2, 1}, {1, 4}}, {{1, 
    2}, {2, 3}} -> {{2, 1}, {2, 1}, {2, 4}}, {{1, 2}, {2, 3}} -> {{2, 
    1}, {2, 1}, {3, 4}}, {{1, 2}, {2, 3}} -> {{2, 1}, {2, 3}, {1, 
    4}}, {{1, 2}, {2, 3}} -> {{2, 1}, {2, 3}, {2, 4}}, {{1, 2}, {2, 
    3}} -> {{2, 2}, {1, 2}, {1, 4}}, {{1, 2}, {2, 3}} -> {{2, 2}, {1, 
    2}, {3, 4}}, {{1, 2}, {2, 3}} -> {{2, 2}, {1, 3}, {1, 4}}, {{1, 
    2}, {2, 3}} -> {{2, 2}, {1, 3}, {3, 4}}, {{1, 2}, {2, 3}} -> {{2, 
    2}, {2, 1}, {1, 4}}, {{1, 2}, {2, 3}} -> {{2, 2}, {2, 1}, {2, 
    4}}, {{1, 2}, {2, 3}} -> {{2, 2}, {2, 1}, {3, 4}}, {{1, 2}, {2, 
    3}} -> {{2, 2}, {2, 2}, {1, 4}}, {{1, 2}, {2, 3}} -> {{2, 2}, {2, 
    2}, {2, 4}}, {{1, 2}, {2, 3}} -> {{2, 2}, {2, 2}, {3, 4}}, {{1, 
    2}, {2, 3}} -> {{2, 2}, {2, 3}, {1, 4}}, {{1, 2}, {2, 3}} -> {{2, 
    2}, {2, 3}, {2, 4}}, {{1, 2}, {2, 3}} -> {{2, 2}, {2, 3}, {3, 
    4}}, {{1, 2}, {2, 3}} -> {{2, 2}, {3, 1}, {1, 4}}, {{1, 2}, {2, 
    3}} -> {{2, 2}, {3, 1}, {3, 4}}, {{1, 2}, {2, 3}} -> {{2, 2}, {3, 
    2}, {1, 4}}, {{1, 2}, {2, 3}} -> {{2, 2}, {3, 2}, {3, 4}}, {{1, 
    2}, {2, 3}} -> {{2, 2}, {3, 3}, {1, 4}}, {{1, 2}, {2, 3}} -> {{2, 
    3}, {2, 1}, {3, 4}}, {{1, 2}, {2, 3}} -> {{2, 3}, {2, 3}, {1, 
    4}}, {{1, 2}, {2, 3}} -> {{2, 3}, {2, 3}, {2, 4}}, {{1, 2}, {2, 
    3}} -> {{2, 3}, {2, 3}, {3, 4}}, {{1, 2}, {2, 3}} -> {{2, 3}, {3, 
    1}, {1, 4}}, {{1, 2}, {2, 3}} -> {{2, 3}, {3, 2}, {1, 4}}, {{1, 
    2}, {2, 3}} -> {{2, 3}, {3, 2}, {2, 4}}, {{1, 2}, {2, 3}} -> {{3, 
    1}, {1, 2}, {2, 4}}, {{1, 2}, {2, 3}} -> {{3, 1}, {1, 3}, {3, 
    4}}, {{1, 2}, {2, 3}} -> {{3, 1}, {3, 1}, {1, 4}}, {{1, 2}, {2, 
    3}} -> {{3, 1}, {3, 1}, {2, 4}}, {{1, 2}, {2, 3}} -> {{3, 1}, {3, 
    1}, {3, 4}}, {{1, 2}, {2, 3}} -> {{3, 1}, {3, 2}, {1, 4}}, {{1, 
    2}, {2, 3}} -> {{3, 1}, {3, 2}, {3, 4}}, {{1, 2}, {2, 3}} -> {{3, 
    2}, {2, 1}, {1, 4}}, {{1, 2}, {2, 3}} -> {{3, 2}, {2, 3}, {3, 
    4}}, {{1, 2}, {2, 3}} -> {{3, 2}, {3, 1}, {2, 4}}, {{1, 2}, {2, 
    3}} -> {{3, 2}, {3, 2}, {1, 4}}, {{1, 2}, {2, 3}} -> {{3, 2}, {3, 
    2}, {2, 4}}, {{1, 2}, {2, 3}} -> {{3, 2}, {3, 2}, {3, 4}}, {{1, 
    2}, {2, 3}} -> {{3, 3}, {1, 2}, {1, 4}}, {{1, 2}, {2, 3}} -> {{3, 
    3}, {1, 2}, {2, 4}}, {{1, 2}, {2, 3}} -> {{3, 3}, {1, 3}, {1, 
    4}}, {{1, 2}, {2, 3}} -> {{3, 3}, {1, 3}, {2, 4}}, {{1, 2}, {2, 
    3}} -> {{3, 3}, {2, 1}, {1, 4}}, {{1, 2}, {2, 3}} -> {{3, 3}, {2, 
    1}, {2, 4}}, {{1, 2}, {2, 3}} -> {{3, 3}, {2, 3}, {1, 4}}, {{1, 
    2}, {2, 3}} -> {{3, 3}, {2, 3}, {2, 4}}, {{1, 2}, {2, 3}} -> {{3, 
    3}, {3, 1}, {1, 4}}, {{1, 2}, {2, 3}} -> {{3, 3}, {3, 1}, {2, 
    4}}, {{1, 2}, {2, 3}} -> {{3, 3}, {3, 1}, {3, 4}}, {{1, 2}, {2, 
    3}} -> {{3, 3}, {3, 2}, {1, 4}}, {{1, 2}, {2, 3}} -> {{3, 3}, {3, 
    2}, {2, 4}}, {{1, 2}, {2, 3}} -> {{3, 3}, {3, 2}, {3, 4}}, {{1, 
    2}, {2, 3}} -> {{3, 3}, {3, 3}, {1, 4}}, {{1, 2}, {2, 3}} -> {{3, 
    3}, {3, 3}, {2, 4}}, {{1, 2}, {2, 3}} -> {{3, 3}, {3, 3}, {3, 
    4}}, {{1, 2}, {1, 3}} -> {{1, 1}, {1, 1}, {4, 1}}, {{1, 2}, {1, 
    3}} -> {{1, 1}, {1, 1}, {4, 2}}, {{1, 2}, {1, 3}} -> {{1, 1}, {1, 
    2}, {4, 1}}, {{1, 2}, {1, 3}} -> {{1, 1}, {1, 2}, {4, 2}}, {{1, 
    2}, {1, 3}} -> {{1, 1}, {1, 2}, {4, 3}}, {{1, 2}, {1, 3}} -> {{1, 
    1}, {2, 1}, {4, 1}}, {{1, 2}, {1, 3}} -> {{1, 1}, {2, 1}, {4, 
    2}}, {{1, 2}, {1, 3}} -> {{1, 1}, {2, 1}, {4, 3}}, {{1, 2}, {1, 
    3}} -> {{1, 1}, {2, 2}, {4, 3}}, {{1, 2}, {1, 3}} -> {{1, 1}, {2, 
    3}, {4, 3}}, {{1, 2}, {1, 3}} -> {{1, 2}, {1, 2}, {4, 1}}, {{1, 
    2}, {1, 3}} -> {{1, 2}, {1, 2}, {4, 2}}, {{1, 2}, {1, 3}} -> {{1, 
    2}, {1, 2}, {4, 3}}, {{1, 2}, {1, 3}} -> {{1, 2}, {1, 3}, {4, 
    1}}, {{1, 2}, {1, 3}} -> {{1, 2}, {1, 3}, {4, 2}}, {{1, 2}, {1, 
    3}} -> {{1, 2}, {2, 1}, {4, 1}}, {{1, 2}, {1, 3}} -> {{1, 2}, {2, 
    1}, {4, 3}}, {{1, 2}, {1, 3}} -> {{1, 2}, {2, 3}, {4, 2}}, {{1, 
    2}, {1, 3}} -> {{1, 2}, {2, 3}, {4, 3}}, {{1, 2}, {1, 3}} -> {{1, 
    2}, {3, 2}, {4, 2}}, {{1, 2}, {1, 3}} -> {{2, 1}, {1, 2}, {4, 
    2}}, {{1, 2}, {1, 3}} -> {{2, 1}, {1, 3}, {4, 1}}, {{1, 2}, {1, 
    3}} -> {{2, 1}, {1, 3}, {4, 3}}, {{1, 2}, {1, 3}} -> {{2, 1}, {2, 
    1}, {4, 1}}, {{1, 2}, {1, 3}} -> {{2, 1}, {2, 1}, {4, 2}}, {{1, 
    2}, {1, 3}} -> {{2, 1}, {2, 1}, {4, 3}}, {{1, 2}, {1, 3}} -> {{2, 
    1}, {2, 3}, {4, 1}}, {{1, 2}, {1, 3}} -> {{2, 1}, {2, 3}, {4, 
    2}}, {{1, 2}, {1, 3}} -> {{2, 1}, {3, 1}, {4, 1}}, {{1, 2}, {1, 
    3}} -> {{2, 2}, {1, 2}, {4, 1}}, {{1, 2}, {1, 3}} -> {{2, 2}, {1, 
    2}, {4, 2}}, {{1, 2}, {1, 3}} -> {{2, 2}, {1, 2}, {4, 3}}, {{1, 
    2}, {1, 3}} -> {{2, 2}, {1, 3}, {4, 3}}, {{1, 2}, {1, 3}} -> {{2, 
    2}, {2, 1}, {4, 1}}, {{1, 2}, {1, 3}} -> {{2, 2}, {2, 1}, {4, 
    2}}, {{1, 2}, {1, 3}} -> {{2, 2}, {2, 1}, {4, 3}}, {{1, 2}, {1, 
    3}} -> {{2, 2}, {2, 2}, {4, 1}}, {{1, 2}, {1, 3}} -> {{2, 2}, {2, 
    2}, {4, 2}}, {{1, 2}, {1, 3}} -> {{2, 2}, {2, 2}, {4, 3}}, {{1, 
    2}, {1, 3}} -> {{2, 2}, {2, 3}, {4, 1}}, {{1, 2}, {1, 3}} -> {{2, 
    2}, {2, 3}, {4, 2}}, {{1, 2}, {1, 3}} -> {{2, 2}, {2, 3}, {4, 
    3}}, {{1, 2}, {1, 3}} -> {{2, 2}, {3, 1}, {4, 1}}, {{1, 2}, {1, 
    3}} -> {{2, 2}, {3, 2}, {4, 1}}, {{1, 2}, {1, 3}} -> {{2, 2}, {3, 
    2}, {4, 2}}, {{1, 2}, {1, 3}} -> {{2, 2}, {3, 2}, {4, 3}}, {{1, 
    2}, {1, 3}} -> {{2, 2}, {3, 3}, {4, 1}}, {{1, 2}, {1, 3}} -> {{2, 
    3}, {2, 1}, {4, 3}}, {{1, 2}, {1, 3}} -> {{2, 3}, {2, 3}, {4, 
    1}}, {{1, 2}, {1, 3}} -> {{2, 3}, {2, 3}, {4, 2}}, {{1, 2}, {1, 
    3}} -> {{2, 3}, {2, 3}, {4, 3}}, {{1, 2}, {1, 3}} -> {{2, 3}, {3, 
    1}, {4, 1}}, {{1, 2}, {1, 3}} -> {{2, 3}, {3, 1}, {4, 3}}, {{1, 
    2}, {1, 3}} -> {{2, 3}, {3, 2}, {4, 1}}, {{1, 2}, {1, 3}} -> {{2, 
    3}, {3, 2}, {4, 2}}, {{1, 2}, {2, 3}} -> {{1, 1}, {1, 1}, {4, 
    1}}, {{1, 2}, {2, 3}} -> {{1, 1}, {1, 1}, {4, 2}}, {{1, 2}, {2, 
    3}} -> {{1, 1}, {1, 1}, {4, 3}}, {{1, 2}, {2, 3}} -> {{1, 1}, {1, 
    2}, {4, 1}}, {{1, 2}, {2, 3}} -> {{1, 1}, {1, 2}, {4, 2}}, {{1, 
    2}, {2, 3}} -> {{1, 1}, {1, 2}, {4, 3}}, {{1, 2}, {2, 3}} -> {{1, 
    1}, {1, 3}, {4, 1}}, {{1, 2}, {2, 3}} -> {{1, 1}, {1, 3}, {4, 
    2}}, {{1, 2}, {2, 3}} -> {{1, 1}, {1, 3}, {4, 3}}, {{1, 2}, {2, 
    3}} -> {{1, 1}, {2, 1}, {4, 1}}, {{1, 2}, {2, 3}} -> {{1, 1}, {2, 
    1}, {4, 2}}, {{1, 2}, {2, 3}} -> {{1, 1}, {2, 1}, {4, 3}}, {{1, 
    2}, {2, 3}} -> {{1, 1}, {2, 2}, {4, 3}}, {{1, 2}, {2, 3}} -> {{1, 
    1}, {2, 3}, {4, 3}}, {{1, 2}, {2, 3}} -> {{1, 1}, {3, 1}, {4, 
    1}}, {{1, 2}, {2, 3}} -> {{1, 1}, {3, 1}, {4, 2}}, {{1, 2}, {2, 
    3}} -> {{1, 1}, {3, 1}, {4, 3}}, {{1, 2}, {2, 3}} -> {{1, 1}, {3, 
    2}, {4, 2}}, {{1, 2}, {2, 3}} -> {{1, 1}, {3, 3}, {4, 2}}, {{1, 
    2}, {2, 3}} -> {{1, 2}, {1, 2}, {4, 1}}, {{1, 2}, {2, 3}} -> {{1, 
    2}, {1, 2}, {4, 2}}, {{1, 2}, {2, 3}} -> {{1, 2}, {1, 2}, {4, 
    3}}, {{1, 2}, {2, 3}} -> {{1, 2}, {1, 3}, {4, 1}}, {{1, 2}, {2, 
    3}} -> {{1, 2}, {1, 3}, {4, 2}}, {{1, 2}, {2, 3}} -> {{1, 2}, {2, 
    1}, {4, 1}}, {{1, 2}, {2, 3}} -> {{1, 2}, {2, 1}, {4, 3}}, {{1, 
    2}, {2, 3}} -> {{1, 2}, {2, 3}, {4, 2}}, {{1, 2}, {2, 3}} -> {{1, 
    2}, {2, 3}, {4, 3}}, {{1, 2}, {2, 3}} -> {{1, 2}, {3, 2}, {4, 
    2}}, {{1, 2}, {2, 3}} -> {{1, 3}, {1, 2}, {4, 3}}, {{1, 2}, {2, 
    3}} -> {{1, 3}, {1, 3}, {4, 1}}, {{1, 2}, {2, 3}} -> {{1, 3}, {1, 
    3}, {4, 2}}, {{1, 2}, {2, 3}} -> {{1, 3}, {1, 3}, {4, 3}}, {{1, 
    2}, {2, 3}} -> {{1, 3}, {2, 3}, {4, 3}}, {{1, 2}, {2, 3}} -> {{1, 
    3}, {3, 1}, {4, 1}}, {{1, 2}, {2, 3}} -> {{1, 3}, {3, 1}, {4, 
    2}}, {{1, 2}, {2, 3}} -> {{1, 3}, {3, 2}, {4, 2}}, {{1, 2}, {2, 
    3}} -> {{1, 3}, {3, 2}, {4, 3}}, {{1, 2}, {2, 3}} -> {{2, 1}, {1, 
    2}, {4, 2}}, {{1, 2}, {2, 3}} -> {{2, 1}, {1, 3}, {4, 1}}, {{1, 
    2}, {2, 3}} -> {{2, 1}, {1, 3}, {4, 3}}, {{1, 2}, {2, 3}} -> {{2, 
    1}, {2, 1}, {4, 1}}, {{1, 2}, {2, 3}} -> {{2, 1}, {2, 1}, {4, 
    2}}, {{1, 2}, {2, 3}} -> {{2, 1}, {2, 1}, {4, 3}}, {{1, 2}, {2, 
    3}} -> {{2, 1}, {2, 3}, {4, 1}}, {{1, 2}, {2, 3}} -> {{2, 1}, {2, 
    3}, {4, 2}}, {{1, 2}, {2, 3}} -> {{2, 1}, {3, 1}, {4, 1}}, {{1, 
    2}, {2, 3}} -> {{2, 2}, {1, 2}, {4, 1}}, {{1, 2}, {2, 3}} -> {{2, 
    2}, {1, 2}, {4, 2}}, {{1, 2}, {2, 3}} -> {{2, 2}, {1, 2}, {4, 
    3}}, {{1, 2}, {2, 3}} -> {{2, 2}, {1, 3}, {4, 3}}, {{1, 2}, {2, 
    3}} -> {{2, 2}, {2, 1}, {4, 1}}, {{1, 2}, {2, 3}} -> {{2, 2}, {2, 
    1}, {4, 2}}, {{1, 2}, {2, 3}} -> {{2, 2}, {2, 1}, {4, 3}}, {{1, 
    2}, {2, 3}} -> {{2, 2}, {2, 2}, {4, 1}}, {{1, 2}, {2, 3}} -> {{2, 
    2}, {2, 2}, {4, 2}}, {{1, 2}, {2, 3}} -> {{2, 2}, {2, 2}, {4, 
    3}}, {{1, 2}, {2, 3}} -> {{2, 2}, {2, 3}, {4, 1}}, {{1, 2}, {2, 
    3}} -> {{2, 2}, {2, 3}, {4, 2}}, {{1, 2}, {2, 3}} -> {{2, 2}, {2, 
    3}, {4, 3}}, {{1, 2}, {2, 3}} -> {{2, 2}, {3, 1}, {4, 1}}, {{1, 
    2}, {2, 3}} -> {{2, 2}, {3, 2}, {4, 1}}, {{1, 2}, {2, 3}} -> {{2, 
    2}, {3, 2}, {4, 2}}, {{1, 2}, {2, 3}} -> {{2, 2}, {3, 2}, {4, 
    3}}, {{1, 2}, {2, 3}} -> {{2, 2}, {3, 3}, {4, 1}}, {{1, 2}, {2, 
    3}} -> {{2, 3}, {2, 1}, {4, 3}}, {{1, 2}, {2, 3}} -> {{2, 3}, {2, 
    3}, {4, 1}}, {{1, 2}, {2, 3}} -> {{2, 3}, {2, 3}, {4, 2}}, {{1, 
    2}, {2, 3}} -> {{2, 3}, {2, 3}, {4, 3}}, {{1, 2}, {2, 3}} -> {{2, 
    3}, {3, 1}, {4, 1}}, {{1, 2}, {2, 3}} -> {{2, 3}, {3, 1}, {4, 
    3}}, {{1, 2}, {2, 3}} -> {{2, 3}, {3, 2}, {4, 1}}, {{1, 2}, {2, 
    3}} -> {{2, 3}, {3, 2}, {4, 2}}, {{1, 2}, {2, 3}} -> {{3, 1}, {1, 
    2}, {4, 1}}, {{1, 2}, {2, 3}} -> {{3, 1}, {1, 2}, {4, 2}}, {{1, 
    2}, {2, 3}} -> {{3, 1}, {1, 3}, {4, 3}}, {{1, 2}, {2, 3}} -> {{3, 
    1}, {3, 1}, {4, 1}}, {{1, 2}, {2, 3}} -> {{3, 1}, {3, 1}, {4, 
    2}}, {{1, 2}, {2, 3}} -> {{3, 1}, {3, 1}, {4, 3}}, {{1, 2}, {2, 
    3}} -> {{3, 1}, {3, 2}, {4, 1}}, {{1, 2}, {2, 3}} -> {{3, 1}, {3, 
    2}, {4, 3}}, {{1, 2}, {2, 3}} -> {{3, 2}, {2, 1}, {4, 1}}, {{1, 
    2}, {2, 3}} -> {{3, 2}, {2, 1}, {4, 2}}, {{1, 2}, {2, 3}} -> {{3, 
    2}, {2, 3}, {4, 3}}, {{1, 2}, {2, 3}} -> {{3, 2}, {3, 1}, {4, 
    2}}, {{1, 2}, {2, 3}} -> {{3, 2}, {3, 2}, {4, 1}}, {{1, 2}, {2, 
    3}} -> {{3, 2}, {3, 2}, {4, 2}}, {{1, 2}, {2, 3}} -> {{3, 2}, {3, 
    2}, {4, 3}}, {{1, 2}, {2, 3}} -> {{3, 3}, {1, 2}, {4, 2}}, {{1, 
    2}, {2, 3}} -> {{3, 3}, {1, 3}, {4, 1}}, {{1, 2}, {2, 3}} -> {{3, 
    3}, {1, 3}, {4, 2}}, {{1, 2}, {2, 3}} -> {{3, 3}, {1, 3}, {4, 
    3}}, {{1, 2}, {2, 3}} -> {{3, 3}, {2, 1}, {4, 1}}, {{1, 2}, {2, 
    3}} -> {{3, 3}, {2, 3}, {4, 1}}, {{1, 2}, {2, 3}} -> {{3, 3}, {2, 
    3}, {4, 2}}, {{1, 2}, {2, 3}} -> {{3, 3}, {2, 3}, {4, 3}}, {{1, 
    2}, {2, 3}} -> {{3, 3}, {3, 1}, {4, 1}}, {{1, 2}, {2, 3}} -> {{3, 
    3}, {3, 1}, {4, 2}}, {{1, 2}, {2, 3}} -> {{3, 3}, {3, 1}, {4, 
    3}}, {{1, 2}, {2, 3}} -> {{3, 3}, {3, 2}, {4, 1}}, {{1, 2}, {2, 
    3}} -> {{3, 3}, {3, 2}, {4, 2}}, {{1, 2}, {2, 3}} -> {{3, 3}, {3, 
    2}, {4, 3}}, {{1, 2}, {2, 3}} -> {{3, 3}, {3, 3}, {4, 1}}, {{1, 
    2}, {2, 3}} -> {{3, 3}, {3, 3}, {4, 2}}, {{1, 2}, {2, 3}} -> {{3, 
    3}, {3, 3}, {4, 3}}, {{1, 2}, {1, 3}} -> {{1, 1}, {1, 4}, {1, 
    4}}, {{1, 2}, {1, 3}} -> {{1, 1}, {1, 4}, {2, 1}}, {{1, 2}, {1, 
    3}} -> {{1, 1}, {1, 4}, {2, 2}}, {{1, 2}, {1, 3}} -> {{1, 1}, {1, 
    4}, {2, 3}}, {{1, 2}, {1, 3}} -> {{1, 1}, {1, 4}, {2, 4}}, {{1, 
    2}, {1, 3}} -> {{1, 1}, {1, 4}, {4, 1}}, {{1, 2}, {1, 3}} -> {{1, 
    1}, {1, 4}, {4, 2}}, {{1, 2}, {1, 3}} -> {{1, 1}, {1, 4}, {4, 
    4}}, {{1, 2}, {1, 3}} -> {{1, 1}, {2, 4}, {2, 4}}, {{1, 2}, {1, 
    3}} -> {{1, 1}, {2, 4}, {3, 4}}, {{1, 2}, {1, 3}} -> {{1, 1}, {2, 
    4}, {4, 2}}, {{1, 2}, {1, 3}} -> {{1, 1}, {2, 4}, {4, 3}}, {{1, 
    2}, {1, 3}} -> {{1, 2}, {1, 4}, {2, 3}}, {{1, 2}, {1, 3}} -> {{1, 
    2}, {1, 4}, {2, 4}}, {{1, 2}, {1, 3}} -> {{1, 2}, {1, 4}, {3, 
    1}}, {{1, 2}, {1, 3}} -> {{1, 2}, {1, 4}, {3, 2}}, {{1, 2}, {1, 
    3}} -> {{1, 2}, {2, 4}, {3, 2}}, {{1, 2}, {1, 3}} -> {{1, 2}, {2, 
    4}, {3, 4}}, {{1, 2}, {1, 3}} -> {{1, 2}, {2, 4}, {4, 1}}, {{1, 
    2}, {1, 3}} -> {{1, 2}, {2, 4}, {4, 3}}, {{1, 2}, {1, 3}} -> {{2, 
    1}, {1, 4}, {3, 1}}, {{1, 2}, {1, 3}} -> {{2, 1}, {1, 4}, {3, 
    4}}, {{1, 2}, {1, 3}} -> {{2, 1}, {1, 4}, {4, 3}}, {{1, 2}, {1, 
    3}} -> {{2, 1}, {2, 4}, {1, 3}}, {{1, 2}, {1, 3}} -> {{2, 1}, {2, 
    4}, {1, 4}}, {{1, 2}, {1, 3}} -> {{2, 1}, {2, 4}, {3, 1}}, {{1, 
    2}, {1, 3}} -> {{2, 1}, {2, 4}, {3, 2}}, {{1, 2}, {1, 3}} -> {{2, 
    2}, {1, 4}, {1, 4}}, {{1, 2}, {1, 3}} -> {{2, 2}, {1, 4}, {3, 
    4}}, {{1, 2}, {1, 3}} -> {{2, 2}, {1, 4}, {4, 1}}, {{1, 2}, {1, 
    3}} -> {{2, 2}, {1, 4}, {4, 3}}, {{1, 2}, {1, 3}} -> {{2, 2}, {2, 
    4}, {1, 1}}, {{1, 2}, {1, 3}} -> {{2, 2}, {2, 4}, {1, 2}}, {{1, 
    2}, {1, 3}} -> {{2, 2}, {2, 4}, {1, 3}}, {{1, 2}, {1, 3}} -> {{2, 
    2}, {2, 4}, {1, 4}}, {{1, 2}, {1, 3}} -> {{2, 2}, {2, 4}, {2, 
    4}}, {{1, 2}, {1, 3}} -> {{2, 2}, {2, 4}, {3, 1}}, {{1, 2}, {1, 
    3}} -> {{2, 2}, {2, 4}, {3, 2}}, {{1, 2}, {1, 3}} -> {{2, 2}, {2, 
    4}, {3, 3}}, {{1, 2}, {1, 3}} -> {{2, 2}, {2, 4}, {3, 4}}, {{1, 
    2}, {1, 3}} -> {{2, 2}, {2, 4}, {4, 1}}, {{1, 2}, {1, 3}} -> {{2, 
    2}, {2, 4}, {4, 2}}, {{1, 2}, {1, 3}} -> {{2, 2}, {2, 4}, {4, 
    3}}, {{1, 2}, {1, 3}} -> {{2, 2}, {2, 4}, {4, 4}}, {{1, 2}, {1, 
    3}} -> {{2, 2}, {3, 4}, {3, 4}}, {{1, 2}, {1, 3}} -> {{2, 2}, {3, 
    4}, {4, 1}}, {{1, 2}, {1, 3}} -> {{2, 2}, {3, 4}, {4, 3}}, {{1, 
    2}, {1, 3}} -> {{2, 3}, {2, 4}, {1, 2}}, {{1, 2}, {1, 3}} -> {{2, 
    3}, {2, 4}, {1, 3}}, {{1, 2}, {1, 3}} -> {{2, 3}, {2, 4}, {3, 
    1}}, {{1, 2}, {1, 3}} -> {{2, 3}, {2, 4}, {3, 4}}, {{1, 2}, {1, 
    3}} -> {{2, 3}, {3, 4}, {1, 4}}, {{1, 2}, {1, 3}} -> {{2, 3}, {3, 
    4}, {4, 1}}, {{1, 2}, {1, 3}} -> {{2, 3}, {3, 4}, {4, 2}}, {{1, 
    2}, {2, 3}} -> {{1, 1}, {1, 4}, {1, 4}}, {{1, 2}, {2, 3}} -> {{1, 
    1}, {1, 4}, {2, 1}}, {{1, 2}, {2, 3}} -> {{1, 1}, {1, 4}, {2, 
    2}}, {{1, 2}, {2, 3}} -> {{1, 1}, {1, 4}, {2, 3}}, {{1, 2}, {2, 
    3}} -> {{1, 1}, {1, 4}, {2, 4}}, {{1, 2}, {2, 3}} -> {{1, 1}, {1, 
    4}, {3, 1}}, {{1, 2}, {2, 3}} -> {{1, 1}, {1, 4}, {3, 2}}, {{1, 
    2}, {2, 3}} -> {{1, 1}, {1, 4}, {3, 3}}, {{1, 2}, {2, 3}} -> {{1, 
    1}, {1, 4}, {3, 4}}, {{1, 2}, {2, 3}} -> {{1, 1}, {1, 4}, {4, 
    1}}, {{1, 2}, {2, 3}} -> {{1, 1}, {1, 4}, {4, 2}}, {{1, 2}, {2, 
    3}} -> {{1, 1}, {1, 4}, {4, 3}}, {{1, 2}, {2, 3}} -> {{1, 1}, {1, 
    4}, {4, 4}}, {{1, 2}, {2, 3}} -> {{1, 1}, {2, 4}, {2, 4}}, {{1, 
    2}, {2, 3}} -> {{1, 1}, {2, 4}, {3, 4}}, {{1, 2}, {2, 3}} -> {{1, 
    1}, {2, 4}, {4, 2}}, {{1, 2}, {2, 3}} -> {{1, 1}, {2, 4}, {4, 
    3}}, {{1, 2}, {2, 3}} -> {{1, 1}, {3, 4}, {3, 4}}, {{1, 2}, {2, 
    3}} -> {{1, 1}, {3, 4}, {4, 2}}, {{1, 2}, {2, 3}} -> {{1, 1}, {3, 
    4}, {4, 3}}, {{1, 2}, {2, 3}} -> {{1, 2}, {1, 4}, {2, 3}}, {{1, 
    2}, {2, 3}} -> {{1, 2}, {1, 4}, {2, 4}}, {{1, 2}, {2, 3}} -> {{1, 
    2}, {1, 4}, {3, 1}}, {{1, 2}, {2, 3}} -> {{1, 2}, {1, 4}, {3, 
    2}}, {{1, 2}, {2, 3}} -> {{1, 2}, {2, 4}, {3, 2}}, {{1, 2}, {2, 
    3}} -> {{1, 2}, {2, 4}, {3, 4}}, {{1, 2}, {2, 3}} -> {{1, 2}, {2, 
    4}, {4, 1}}, {{1, 2}, {2, 3}} -> {{1, 2}, {2, 4}, {4, 3}}, {{1, 
    2}, {2, 3}} -> {{1, 3}, {1, 4}, {2, 1}}, {{1, 2}, {2, 3}} -> {{1, 
    3}, {1, 4}, {2, 3}}, {{1, 2}, {2, 3}} -> {{1, 3}, {1, 4}, {3, 
    2}}, {{1, 2}, {2, 3}} -> {{1, 3}, {1, 4}, {3, 4}}, {{1, 2}, {2, 
    3}} -> {{1, 3}, {3, 4}, {2, 3}}, {{1, 2}, {2, 3}} -> {{1, 3}, {3, 
    4}, {2, 4}}, {{1, 2}, {2, 3}} -> {{1, 3}, {3, 4}, {4, 1}}, {{1, 
    2}, {2, 3}} -> {{1, 3}, {3, 4}, {4, 2}}, {{1, 2}, {2, 3}} -> {{2, 
    1}, {1, 4}, {3, 1}}, {{1, 2}, {2, 3}} -> {{2, 1}, {1, 4}, {3, 
    4}}, {{1, 2}, {2, 3}} -> {{2, 1}, {1, 4}, {4, 3}}, {{1, 2}, {2, 
    3}} -> {{2, 1}, {2, 4}, {1, 3}}, {{1, 2}, {2, 3}} -> {{2, 1}, {2, 
    4}, {1, 4}}, {{1, 2}, {2, 3}} -> {{2, 1}, {2, 4}, {3, 1}}, {{1, 
    2}, {2, 3}} -> {{2, 1}, {2, 4}, {3, 2}}, {{1, 2}, {2, 3}} -> {{2, 
    2}, {1, 4}, {1, 4}}, {{1, 2}, {2, 3}} -> {{2, 2}, {1, 4}, {3, 
    4}}, {{1, 2}, {2, 3}} -> {{2, 2}, {1, 4}, {4, 1}}, {{1, 2}, {2, 
    3}} -> {{2, 2}, {1, 4}, {4, 3}}, {{1, 2}, {2, 3}} -> {{2, 2}, {2, 
    4}, {1, 1}}, {{1, 2}, {2, 3}} -> {{2, 2}, {2, 4}, {1, 2}}, {{1, 
    2}, {2, 3}} -> {{2, 2}, {2, 4}, {1, 3}}, {{1, 2}, {2, 3}} -> {{2, 
    2}, {2, 4}, {1, 4}}, {{1, 2}, {2, 3}} -> {{2, 2}, {2, 4}, {2, 
    4}}, {{1, 2}, {2, 3}} -> {{2, 2}, {2, 4}, {3, 1}}, {{1, 2}, {2, 
    3}} -> {{2, 2}, {2, 4}, {3, 2}}, {{1, 2}, {2, 3}} -> {{2, 2}, {2, 
    4}, {3, 3}}, {{1, 2}, {2, 3}} -> {{2, 2}, {2, 4}, {3, 4}}, {{1, 
    2}, {2, 3}} -> {{2, 2}, {2, 4}, {4, 1}}, {{1, 2}, {2, 3}} -> {{2, 
    2}, {2, 4}, {4, 2}}, {{1, 2}, {2, 3}} -> {{2, 2}, {2, 4}, {4, 
    3}}, {{1, 2}, {2, 3}} -> {{2, 2}, {2, 4}, {4, 4}}, {{1, 2}, {2, 
    3}} -> {{2, 2}, {3, 4}, {3, 4}}, {{1, 2}, {2, 3}} -> {{2, 2}, {3, 
    4}, {4, 1}}, {{1, 2}, {2, 3}} -> {{2, 2}, {3, 4}, {4, 3}}, {{1, 
    2}, {2, 3}} -> {{2, 3}, {2, 4}, {1, 2}}, {{1, 2}, {2, 3}} -> {{2, 
    3}, {2, 4}, {1, 3}}, {{1, 2}, {2, 3}} -> {{2, 3}, {2, 4}, {3, 
    1}}, {{1, 2}, {2, 3}} -> {{2, 3}, {2, 4}, {3, 4}}, {{1, 2}, {2, 
    3}} -> {{2, 3}, {3, 4}, {1, 4}}, {{1, 2}, {2, 3}} -> {{2, 3}, {3, 
    4}, {4, 1}}, {{1, 2}, {2, 3}} -> {{2, 3}, {3, 4}, {4, 2}}, {{1, 
    2}, {2, 3}} -> {{3, 1}, {1, 4}, {2, 4}}, {{1, 2}, {2, 3}} -> {{3, 
    1}, {1, 4}, {4, 2}}, {{1, 2}, {2, 3}} -> {{3, 1}, {3, 4}, {1, 
    2}}, {{1, 2}, {2, 3}} -> {{3, 1}, {3, 4}, {1, 4}}, {{1, 2}, {2, 
    3}} -> {{3, 1}, {3, 4}, {2, 1}}, {{1, 2}, {2, 3}} -> {{3, 1}, {3, 
    4}, {2, 3}}, {{1, 2}, {2, 3}} -> {{3, 2}, {2, 4}, {1, 4}}, {{1, 
    2}, {2, 3}} -> {{3, 2}, {2, 4}, {4, 1}}, {{1, 2}, {2, 3}} -> {{3, 
    2}, {3, 4}, {1, 2}}, {{1, 2}, {2, 3}} -> {{3, 2}, {3, 4}, {1, 
    3}}, {{1, 2}, {2, 3}} -> {{3, 2}, {3, 4}, {2, 1}}, {{1, 2}, {2, 
    3}} -> {{3, 2}, {3, 4}, {2, 4}}, {{1, 2}, {2, 3}} -> {{3, 3}, {1, 
    4}, {1, 4}}, {{1, 2}, {2, 3}} -> {{3, 3}, {1, 4}, {2, 4}}, {{1, 
    2}, {2, 3}} -> {{3, 3}, {1, 4}, {4, 1}}, {{1, 2}, {2, 3}} -> {{3, 
    3}, {1, 4}, {4, 2}}, {{1, 2}, {2, 3}} -> {{3, 3}, {2, 4}, {2, 
    4}}, {{1, 2}, {2, 3}} -> {{3, 3}, {2, 4}, {4, 1}}, {{1, 2}, {2, 
    3}} -> {{3, 3}, {2, 4}, {4, 2}}, {{1, 2}, {2, 3}} -> {{3, 3}, {3, 
    4}, {1, 1}}, {{1, 2}, {2, 3}} -> {{3, 3}, {3, 4}, {1, 2}}, {{1, 
    2}, {2, 3}} -> {{3, 3}, {3, 4}, {1, 3}}, {{1, 2}, {2, 3}} -> {{3, 
    3}, {3, 4}, {1, 4}}, {{1, 2}, {2, 3}} -> {{3, 3}, {3, 4}, {2, 
    1}}, {{1, 2}, {2, 3}} -> {{3, 3}, {3, 4}, {2, 2}}, {{1, 2}, {2, 
    3}} -> {{3, 3}, {3, 4}, {2, 3}}, {{1, 2}, {2, 3}} -> {{3, 3}, {3, 
    4}, {2, 4}}, {{1, 2}, {2, 3}} -> {{3, 3}, {3, 4}, {3, 4}}, {{1, 
    2}, {2, 3}} -> {{3, 3}, {3, 4}, {4, 1}}, {{1, 2}, {2, 3}} -> {{3, 
    3}, {3, 4}, {4, 2}}, {{1, 2}, {2, 3}} -> {{3, 3}, {3, 4}, {4, 
    3}}, {{1, 2}, {2, 3}} -> {{3, 3}, {3, 4}, {4, 4}}, {{1, 2}, {1, 
    3}} -> {{1, 1}, {1, 4}, {1, 5}}, {{1, 2}, {1, 3}} -> {{1, 1}, {1, 
    4}, {2, 5}}, {{1, 2}, {1, 3}} -> {{1, 1}, {1, 4}, {4, 5}}, {{1, 
    2}, {1, 3}} -> {{1, 1}, {2, 4}, {2, 5}}, {{1, 2}, {1, 3}} -> {{1, 
    1}, {2, 4}, {3, 5}}, {{1, 2}, {1, 3}} -> {{1, 1}, {2, 4}, {4, 
    5}}, {{1, 2}, {1, 3}} -> {{1, 2}, {1, 4}, {1, 5}}, {{1, 2}, {1, 
    3}} -> {{1, 2}, {1, 4}, {2, 5}}, {{1, 2}, {1, 3}} -> {{1, 2}, {1, 
    4}, {3, 5}}, {{1, 2}, {1, 3}} -> {{1, 2}, {2, 4}, {3, 5}}, {{1, 
    2}, {1, 3}} -> {{1, 2}, {2, 4}, {4, 5}}, {{1, 2}, {1, 3}} -> {{2, 
    1}, {1, 4}, {3, 5}}, {{1, 2}, {1, 3}} -> {{2, 1}, {1, 4}, {4, 
    5}}, {{1, 2}, {1, 3}} -> {{2, 1}, {2, 4}, {1, 5}}, {{1, 2}, {1, 
    3}} -> {{2, 1}, {2, 4}, {2, 5}}, {{1, 2}, {1, 3}} -> {{2, 1}, {2, 
    4}, {3, 5}}, {{1, 2}, {1, 3}} -> {{2, 2}, {1, 4}, {1, 5}}, {{1, 
    2}, {1, 3}} -> {{2, 2}, {1, 4}, {3, 5}}, {{1, 2}, {1, 3}} -> {{2, 
    2}, {1, 4}, {4, 5}}, {{1, 2}, {1, 3}} -> {{2, 2}, {2, 4}, {1, 
    5}}, {{1, 2}, {1, 3}} -> {{2, 2}, {2, 4}, {2, 5}}, {{1, 2}, {1, 
    3}} -> {{2, 2}, {2, 4}, {3, 5}}, {{1, 2}, {1, 3}} -> {{2, 2}, {2, 
    4}, {4, 5}}, {{1, 2}, {1, 3}} -> {{2, 2}, {3, 4}, {3, 5}}, {{1, 
    2}, {1, 3}} -> {{2, 2}, {3, 4}, {4, 5}}, {{1, 2}, {1, 3}} -> {{2, 
    3}, {2, 4}, {1, 5}}, {{1, 2}, {1, 3}} -> {{2, 3}, {2, 4}, {2, 
    5}}, {{1, 2}, {1, 3}} -> {{2, 3}, {2, 4}, {3, 5}}, {{1, 2}, {1, 
    3}} -> {{2, 3}, {3, 4}, {1, 5}}, {{1, 2}, {1, 3}} -> {{2, 3}, {3, 
    4}, {4, 5}}, {{1, 2}, {2, 3}} -> {{1, 1}, {1, 4}, {1, 5}}, {{1, 
    2}, {2, 3}} -> {{1, 1}, {1, 4}, {2, 5}}, {{1, 2}, {2, 3}} -> {{1, 
    1}, {1, 4}, {3, 5}}, {{1, 2}, {2, 3}} -> {{1, 1}, {1, 4}, {4, 
    5}}, {{1, 2}, {2, 3}} -> {{1, 1}, {2, 4}, {2, 5}}, {{1, 2}, {2, 
    3}} -> {{1, 1}, {2, 4}, {3, 5}}, {{1, 2}, {2, 3}} -> {{1, 1}, {2, 
    4}, {4, 5}}, {{1, 2}, {2, 3}} -> {{1, 1}, {3, 4}, {3, 5}}, {{1, 
    2}, {2, 3}} -> {{1, 1}, {3, 4}, {4, 5}}, {{1, 2}, {2, 3}} -> {{1, 
    2}, {1, 4}, {1, 5}}, {{1, 2}, {2, 3}} -> {{1, 2}, {1, 4}, {2, 
    5}}, {{1, 2}, {2, 3}} -> {{1, 2}, {1, 4}, {3, 5}}, {{1, 2}, {2, 
    3}} -> {{1, 2}, {2, 4}, {3, 5}}, {{1, 2}, {2, 3}} -> {{1, 2}, {2, 
    4}, {4, 5}}, {{1, 2}, {2, 3}} -> {{1, 3}, {1, 4}, {1, 5}}, {{1, 
    2}, {2, 3}} -> {{1, 3}, {1, 4}, {2, 5}}, {{1, 2}, {2, 3}} -> {{1, 
    3}, {1, 4}, {3, 5}}, {{1, 2}, {2, 3}} -> {{1, 3}, {3, 4}, {2, 
    5}}, {{1, 2}, {2, 3}} -> {{1, 3}, {3, 4}, {4, 5}}, {{1, 2}, {2, 
    3}} -> {{2, 1}, {1, 4}, {3, 5}}, {{1, 2}, {2, 3}} -> {{2, 1}, {1, 
    4}, {4, 5}}, {{1, 2}, {2, 3}} -> {{2, 1}, {2, 4}, {1, 5}}, {{1, 
    2}, {2, 3}} -> {{2, 1}, {2, 4}, {2, 5}}, {{1, 2}, {2, 3}} -> {{2, 
    1}, {2, 4}, {3, 5}}, {{1, 2}, {2, 3}} -> {{2, 2}, {1, 4}, {1, 
    5}}, {{1, 2}, {2, 3}} -> {{2, 2}, {1, 4}, {3, 5}}, {{1, 2}, {2, 
    3}} -> {{2, 2}, {1, 4}, {4, 5}}, {{1, 2}, {2, 3}} -> {{2, 2}, {2, 
    4}, {1, 5}}, {{1, 2}, {2, 3}} -> {{2, 2}, {2, 4}, {2, 5}}, {{1, 
    2}, {2, 3}} -> {{2, 2}, {2, 4}, {3, 5}}, {{1, 2}, {2, 3}} -> {{2, 
    2}, {2, 4}, {4, 5}}, {{1, 2}, {2, 3}} -> {{2, 2}, {3, 4}, {3, 
    5}}, {{1, 2}, {2, 3}} -> {{2, 2}, {3, 4}, {4, 5}}, {{1, 2}, {2, 
    3}} -> {{2, 3}, {2, 4}, {1, 5}}, {{1, 2}, {2, 3}} -> {{2, 3}, {2, 
    4}, {2, 5}}, {{1, 2}, {2, 3}} -> {{2, 3}, {2, 4}, {3, 5}}, {{1, 
    2}, {2, 3}} -> {{2, 3}, {3, 4}, {1, 5}}, {{1, 2}, {2, 3}} -> {{2, 
    3}, {3, 4}, {4, 5}}, {{1, 2}, {2, 3}} -> {{3, 1}, {1, 4}, {2, 
    5}}, {{1, 2}, {2, 3}} -> {{3, 1}, {1, 4}, {4, 5}}, {{1, 2}, {2, 
    3}} -> {{3, 1}, {3, 4}, {1, 5}}, {{1, 2}, {2, 3}} -> {{3, 1}, {3, 
    4}, {2, 5}}, {{1, 2}, {2, 3}} -> {{3, 1}, {3, 4}, {3, 5}}, {{1, 
    2}, {2, 3}} -> {{3, 2}, {2, 4}, {1, 5}}, {{1, 2}, {2, 3}} -> {{3, 
    2}, {2, 4}, {4, 5}}, {{1, 2}, {2, 3}} -> {{3, 2}, {3, 4}, {1, 
    5}}, {{1, 2}, {2, 3}} -> {{3, 2}, {3, 4}, {2, 5}}, {{1, 2}, {2, 
    3}} -> {{3, 2}, {3, 4}, {3, 5}}, {{1, 2}, {2, 3}} -> {{3, 3}, {1, 
    4}, {1, 5}}, {{1, 2}, {2, 3}} -> {{3, 3}, {1, 4}, {2, 5}}, {{1, 
    2}, {2, 3}} -> {{3, 3}, {1, 4}, {4, 5}}, {{1, 2}, {2, 3}} -> {{3, 
    3}, {2, 4}, {2, 5}}, {{1, 2}, {2, 3}} -> {{3, 3}, {2, 4}, {4, 
    5}}, {{1, 2}, {2, 3}} -> {{3, 3}, {3, 4}, {1, 5}}, {{1, 2}, {2, 
    3}} -> {{3, 3}, {3, 4}, {2, 5}}, {{1, 2}, {2, 3}} -> {{3, 3}, {3, 
    4}, {3, 5}}, {{1, 2}, {2, 3}} -> {{3, 3}, {3, 4}, {4, 5}}, {{1, 
    2}, {1, 3}} -> {{1, 1}, {1, 4}, {5, 1}}, {{1, 2}, {1, 3}} -> {{1, 
    1}, {1, 4}, {5, 2}}, {{1, 2}, {1, 3}} -> {{1, 1}, {1, 4}, {5, 
    4}}, {{1, 2}, {1, 3}} -> {{1, 1}, {2, 4}, {5, 3}}, {{1, 2}, {1, 
    3}} -> {{1, 1}, {2, 4}, {5, 4}}, {{1, 2}, {1, 3}} -> {{1, 2}, {1, 
    4}, {5, 1}}, {{1, 2}, {1, 3}} -> {{1, 2}, {1, 4}, {5, 2}}, {{1, 
    2}, {1, 3}} -> {{1, 2}, {1, 4}, {5, 3}}, {{1, 2}, {1, 3}} -> {{1, 
    2}, {2, 4}, {5, 2}}, {{1, 2}, {1, 3}} -> {{1, 2}, {2, 4}, {5, 
    3}}, {{1, 2}, {1, 3}} -> {{1, 2}, {2, 4}, {5, 4}}, {{1, 2}, {1, 
    3}} -> {{2, 1}, {1, 4}, {5, 1}}, {{1, 2}, {1, 3}} -> {{2, 1}, {1, 
    4}, {5, 3}}, {{1, 2}, {1, 3}} -> {{2, 1}, {1, 4}, {5, 4}}, {{1, 
    2}, {1, 3}} -> {{2, 1}, {2, 4}, {5, 1}}, {{1, 2}, {1, 3}} -> {{2, 
    1}, {2, 4}, {5, 2}}, {{1, 2}, {1, 3}} -> {{2, 1}, {2, 4}, {5, 
    3}}, {{1, 2}, {1, 3}} -> {{2, 2}, {1, 4}, {5, 3}}, {{1, 2}, {1, 
    3}} -> {{2, 2}, {1, 4}, {5, 4}}, {{1, 2}, {1, 3}} -> {{2, 2}, {2, 
    4}, {5, 1}}, {{1, 2}, {1, 3}} -> {{2, 2}, {2, 4}, {5, 2}}, {{1, 
    2}, {1, 3}} -> {{2, 2}, {2, 4}, {5, 3}}, {{1, 2}, {1, 3}} -> {{2, 
    2}, {2, 4}, {5, 4}}, {{1, 2}, {1, 3}} -> {{2, 2}, {3, 4}, {5, 
    1}}, {{1, 2}, {1, 3}} -> {{2, 2}, {3, 4}, {5, 4}}, {{1, 2}, {1, 
    3}} -> {{2, 3}, {2, 4}, {5, 1}}, {{1, 2}, {1, 3}} -> {{2, 3}, {2, 
    4}, {5, 2}}, {{1, 2}, {1, 3}} -> {{2, 3}, {2, 4}, {5, 3}}, {{1, 
    2}, {1, 3}} -> {{2, 3}, {3, 4}, {5, 1}}, {{1, 2}, {1, 3}} -> {{2, 
    3}, {3, 4}, {5, 3}}, {{1, 2}, {1, 3}} -> {{2, 3}, {3, 4}, {5, 
    4}}, {{1, 2}, {2, 3}} -> {{1, 1}, {1, 4}, {5, 1}}, {{1, 2}, {2, 
    3}} -> {{1, 1}, {1, 4}, {5, 2}}, {{1, 2}, {2, 3}} -> {{1, 1}, {1, 
    4}, {5, 3}}, {{1, 2}, {2, 3}} -> {{1, 1}, {1, 4}, {5, 4}}, {{1, 
    2}, {2, 3}} -> {{1, 1}, {2, 4}, {5, 3}}, {{1, 2}, {2, 3}} -> {{1, 
    1}, {2, 4}, {5, 4}}, {{1, 2}, {2, 3}} -> {{1, 1}, {3, 4}, {5, 
    2}}, {{1, 2}, {2, 3}} -> {{1, 1}, {3, 4}, {5, 4}}, {{1, 2}, {2, 
    3}} -> {{1, 2}, {1, 4}, {5, 1}}, {{1, 2}, {2, 3}} -> {{1, 2}, {1, 
    4}, {5, 2}}, {{1, 2}, {2, 3}} -> {{1, 2}, {1, 4}, {5, 3}}, {{1, 
    2}, {2, 3}} -> {{1, 2}, {2, 4}, {5, 2}}, {{1, 2}, {2, 3}} -> {{1, 
    2}, {2, 4}, {5, 3}}, {{1, 2}, {2, 3}} -> {{1, 2}, {2, 4}, {5, 
    4}}, {{1, 2}, {2, 3}} -> {{1, 3}, {1, 4}, {5, 1}}, {{1, 2}, {2, 
    3}} -> {{1, 3}, {1, 4}, {5, 2}}, {{1, 2}, {2, 3}} -> {{1, 3}, {1, 
    4}, {5, 3}}, {{1, 2}, {2, 3}} -> {{1, 3}, {3, 4}, {5, 2}}, {{1, 
    2}, {2, 3}} -> {{1, 3}, {3, 4}, {5, 3}}, {{1, 2}, {2, 3}} -> {{1, 
    3}, {3, 4}, {5, 4}}, {{1, 2}, {2, 3}} -> {{2, 1}, {1, 4}, {5, 
    1}}, {{1, 2}, {2, 3}} -> {{2, 1}, {1, 4}, {5, 3}}, {{1, 2}, {2, 
    3}} -> {{2, 1}, {1, 4}, {5, 4}}, {{1, 2}, {2, 3}} -> {{2, 1}, {2, 
    4}, {5, 1}}, {{1, 2}, {2, 3}} -> {{2, 1}, {2, 4}, {5, 2}}, {{1, 
    2}, {2, 3}} -> {{2, 1}, {2, 4}, {5, 3}}, {{1, 2}, {2, 3}} -> {{2, 
    2}, {1, 4}, {5, 3}}, {{1, 2}, {2, 3}} -> {{2, 2}, {1, 4}, {5, 
    4}}, {{1, 2}, {2, 3}} -> {{2, 2}, {2, 4}, {5, 1}}, {{1, 2}, {2, 
    3}} -> {{2, 2}, {2, 4}, {5, 2}}, {{1, 2}, {2, 3}} -> {{2, 2}, {2, 
    4}, {5, 3}}, {{1, 2}, {2, 3}} -> {{2, 2}, {2, 4}, {5, 4}}, {{1, 
    2}, {2, 3}} -> {{2, 2}, {3, 4}, {5, 1}}, {{1, 2}, {2, 3}} -> {{2, 
    2}, {3, 4}, {5, 4}}, {{1, 2}, {2, 3}} -> {{2, 3}, {2, 4}, {5, 
    1}}, {{1, 2}, {2, 3}} -> {{2, 3}, {2, 4}, {5, 2}}, {{1, 2}, {2, 
    3}} -> {{2, 3}, {2, 4}, {5, 3}}, {{1, 2}, {2, 3}} -> {{2, 3}, {3, 
    4}, {5, 1}}, {{1, 2}, {2, 3}} -> {{2, 3}, {3, 4}, {5, 3}}, {{1, 
    2}, {2, 3}} -> {{2, 3}, {3, 4}, {5, 4}}, {{1, 2}, {2, 3}} -> {{3, 
    1}, {1, 4}, {5, 1}}, {{1, 2}, {2, 3}} -> {{3, 1}, {1, 4}, {5, 
    2}}, {{1, 2}, {2, 3}} -> {{3, 1}, {1, 4}, {5, 4}}, {{1, 2}, {2, 
    3}} -> {{3, 1}, {3, 4}, {5, 1}}, {{1, 2}, {2, 3}} -> {{3, 1}, {3, 
    4}, {5, 2}}, {{1, 2}, {2, 3}} -> {{3, 1}, {3, 4}, {5, 3}}, {{1, 
    2}, {2, 3}} -> {{3, 2}, {2, 4}, {5, 1}}, {{1, 2}, {2, 3}} -> {{3, 
    2}, {2, 4}, {5, 2}}, {{1, 2}, {2, 3}} -> {{3, 2}, {2, 4}, {5, 
    4}}, {{1, 2}, {2, 3}} -> {{3, 2}, {3, 4}, {5, 1}}, {{1, 2}, {2, 
    3}} -> {{3, 2}, {3, 4}, {5, 2}}, {{1, 2}, {2, 3}} -> {{3, 2}, {3, 
    4}, {5, 3}}, {{1, 2}, {2, 3}} -> {{3, 3}, {1, 4}, {5, 2}}, {{1, 
    2}, {2, 3}} -> {{3, 3}, {1, 4}, {5, 4}}, {{1, 2}, {2, 3}} -> {{3, 
    3}, {2, 4}, {5, 1}}, {{1, 2}, {2, 3}} -> {{3, 3}, {2, 4}, {5, 
    4}}, {{1, 2}, {2, 3}} -> {{3, 3}, {3, 4}, {5, 1}}, {{1, 2}, {2, 
    3}} -> {{3, 3}, {3, 4}, {5, 2}}, {{1, 2}, {2, 3}} -> {{3, 3}, {3, 
    4}, {5, 3}}, {{1, 2}, {2, 3}} -> {{3, 3}, {3, 4}, {5, 4}}, {{1, 
    2}, {1, 3}} -> {{1, 1}, {4, 1}, {2, 2}}, {{1, 2}, {1, 3}} -> {{1, 
    1}, {4, 1}, {2, 3}}, {{1, 2}, {1, 3}} -> {{1, 1}, {4, 1}, {2, 
    4}}, {{1, 2}, {1, 3}} -> {{1, 1}, {4, 1}, {4, 1}}, {{1, 2}, {1, 
    3}} -> {{1, 1}, {4, 1}, {4, 2}}, {{1, 2}, {1, 3}} -> {{1, 1}, {4, 
    2}, {2, 3}}, {{1, 2}, {1, 3}} -> {{1, 1}, {4, 2}, {4, 2}}, {{1, 
    2}, {1, 3}} -> {{1, 1}, {4, 2}, {4, 3}}, {{1, 2}, {1, 3}} -> {{2, 
    2}, {4, 1}, {1, 3}}, {{1, 2}, {1, 3}} -> {{2, 2}, {4, 1}, {4, 
    1}}, {{1, 2}, {1, 3}} -> {{2, 2}, {4, 1}, {4, 3}}, {{1, 2}, {1, 
    3}} -> {{2, 2}, {4, 2}, {1, 1}}, {{1, 2}, {1, 3}} -> {{2, 2}, {4, 
    2}, {1, 3}}, {{1, 2}, {1, 3}} -> {{2, 2}, {4, 2}, {1, 4}}, {{1, 
    2}, {1, 3}} -> {{2, 2}, {4, 2}, {3, 1}}, {{1, 2}, {1, 3}} -> {{2, 
    2}, {4, 2}, {3, 3}}, {{1, 2}, {1, 3}} -> {{2, 2}, {4, 2}, {3, 
    4}}, {{1, 2}, {1, 3}} -> {{2, 2}, {4, 2}, {4, 1}}, {{1, 2}, {1, 
    3}} -> {{2, 2}, {4, 2}, {4, 2}}, {{1, 2}, {1, 3}} -> {{2, 2}, {4, 
    2}, {4, 3}}, {{1, 2}, {1, 3}} -> {{2, 2}, {4, 3}, {3, 1}}, {{1, 
    2}, {1, 3}} -> {{2, 2}, {4, 3}, {4, 3}}, {{1, 2}, {2, 3}} -> {{1, 
    1}, {4, 1}, {2, 2}}, {{1, 2}, {2, 3}} -> {{1, 1}, {4, 1}, {2, 
    3}}, {{1, 2}, {2, 3}} -> {{1, 1}, {4, 1}, {2, 4}}, {{1, 2}, {2, 
    3}} -> {{1, 1}, {4, 1}, {3, 2}}, {{1, 2}, {2, 3}} -> {{1, 1}, {4, 
    1}, {3, 3}}, {{1, 2}, {2, 3}} -> {{1, 1}, {4, 1}, {3, 4}}, {{1, 
    2}, {2, 3}} -> {{1, 1}, {4, 1}, {4, 1}}, {{1, 2}, {2, 3}} -> {{1, 
    1}, {4, 1}, {4, 2}}, {{1, 2}, {2, 3}} -> {{1, 1}, {4, 1}, {4, 
    3}}, {{1, 2}, {2, 3}} -> {{1, 1}, {4, 2}, {2, 3}}, {{1, 2}, {2, 
    3}} -> {{1, 1}, {4, 2}, {4, 2}}, {{1, 2}, {2, 3}} -> {{1, 1}, {4, 
    2}, {4, 3}}, {{1, 2}, {2, 3}} -> {{1, 1}, {4, 3}, {3, 2}}, {{1, 
    2}, {2, 3}} -> {{1, 1}, {4, 3}, {4, 3}}, {{1, 2}, {2, 3}} -> {{2, 
    2}, {4, 1}, {1, 3}}, {{1, 2}, {2, 3}} -> {{2, 2}, {4, 1}, {4, 
    1}}, {{1, 2}, {2, 3}} -> {{2, 2}, {4, 1}, {4, 3}}, {{1, 2}, {2, 
    3}} -> {{2, 2}, {4, 2}, {1, 1}}, {{1, 2}, {2, 3}} -> {{2, 2}, {4, 
    2}, {1, 3}}, {{1, 2}, {2, 3}} -> {{2, 2}, {4, 2}, {1, 4}}, {{1, 
    2}, {2, 3}} -> {{2, 2}, {4, 2}, {3, 1}}, {{1, 2}, {2, 3}} -> {{2, 
    2}, {4, 2}, {3, 3}}, {{1, 2}, {2, 3}} -> {{2, 2}, {4, 2}, {3, 
    4}}, {{1, 2}, {2, 3}} -> {{2, 2}, {4, 2}, {4, 1}}, {{1, 2}, {2, 
    3}} -> {{2, 2}, {4, 2}, {4, 2}}, {{1, 2}, {2, 3}} -> {{2, 2}, {4, 
    2}, {4, 3}}, {{1, 2}, {2, 3}} -> {{2, 2}, {4, 3}, {3, 1}}, {{1, 
    2}, {2, 3}} -> {{2, 2}, {4, 3}, {4, 3}}, {{1, 2}, {2, 3}} -> {{3, 
    3}, {4, 1}, {1, 2}}, {{1, 2}, {2, 3}} -> {{3, 3}, {4, 1}, {4, 
    1}}, {{1, 2}, {2, 3}} -> {{3, 3}, {4, 1}, {4, 2}}, {{1, 2}, {2, 
    3}} -> {{3, 3}, {4, 2}, {2, 1}}, {{1, 2}, {2, 3}} -> {{3, 3}, {4, 
    2}, {4, 2}}, {{1, 2}, {2, 3}} -> {{3, 3}, {4, 3}, {1, 1}}, {{1, 
    2}, {2, 3}} -> {{3, 3}, {4, 3}, {1, 2}}, {{1, 2}, {2, 3}} -> {{3, 
    3}, {4, 3}, {1, 4}}, {{1, 2}, {2, 3}} -> {{3, 3}, {4, 3}, {2, 
    1}}, {{1, 2}, {2, 3}} -> {{3, 3}, {4, 3}, {2, 2}}, {{1, 2}, {2, 
    3}} -> {{3, 3}, {4, 3}, {2, 4}}, {{1, 2}, {2, 3}} -> {{3, 3}, {4, 
    3}, {4, 1}}, {{1, 2}, {2, 3}} -> {{3, 3}, {4, 3}, {4, 2}}, {{1, 
    2}, {2, 3}} -> {{3, 3}, {4, 3}, {4, 3}}, {{1, 2}, {1, 3}} -> {{1, 
    1}, {4, 1}, {2, 5}}, {{1, 2}, {1, 3}} -> {{1, 1}, {4, 1}, {4, 
    5}}, {{1, 2}, {1, 3}} -> {{1, 1}, {4, 2}, {2, 5}}, {{1, 2}, {1, 
    3}} -> {{1, 1}, {4, 2}, {4, 5}}, {{1, 2}, {1, 3}} -> {{1, 2}, {4, 
    2}, {3, 5}}, {{1, 2}, {1, 3}} -> {{2, 1}, {4, 1}, {3, 5}}, {{1, 
    2}, {1, 3}} -> {{2, 2}, {4, 1}, {1, 5}}, {{1, 2}, {1, 3}} -> {{2, 
    2}, {4, 1}, {4, 5}}, {{1, 2}, {1, 3}} -> {{2, 2}, {4, 2}, {1, 
    5}}, {{1, 2}, {1, 3}} -> {{2, 2}, {4, 2}, {3, 5}}, {{1, 2}, {1, 
    3}} -> {{2, 2}, {4, 2}, {4, 5}}, {{1, 2}, {1, 3}} -> {{2, 2}, {4, 
    3}, {3, 5}}, {{1, 2}, {1, 3}} -> {{2, 2}, {4, 3}, {4, 5}}, {{1, 
    2}, {1, 3}} -> {{2, 3}, {4, 3}, {1, 5}}, {{1, 2}, {2, 3}} -> {{1, 
    1}, {4, 1}, {2, 5}}, {{1, 2}, {2, 3}} -> {{1, 1}, {4, 1}, {3, 
    5}}, {{1, 2}, {2, 3}} -> {{1, 1}, {4, 1}, {4, 5}}, {{1, 2}, {2, 
    3}} -> {{1, 1}, {4, 2}, {2, 5}}, {{1, 2}, {2, 3}} -> {{1, 1}, {4, 
    2}, {4, 5}}, {{1, 2}, {2, 3}} -> {{1, 1}, {4, 3}, {3, 5}}, {{1, 
    2}, {2, 3}} -> {{1, 1}, {4, 3}, {4, 5}}, {{1, 2}, {2, 3}} -> {{1, 
    2}, {4, 2}, {3, 5}}, {{1, 2}, {2, 3}} -> {{1, 3}, {4, 3}, {2, 
    5}}, {{1, 2}, {2, 3}} -> {{2, 1}, {4, 1}, {3, 5}}, {{1, 2}, {2, 
    3}} -> {{2, 2}, {4, 1}, {1, 5}}, {{1, 2}, {2, 3}} -> {{2, 2}, {4, 
    1}, {4, 5}}, {{1, 2}, {2, 3}} -> {{2, 2}, {4, 2}, {1, 5}}, {{1, 
    2}, {2, 3}} -> {{2, 2}, {4, 2}, {3, 5}}, {{1, 2}, {2, 3}} -> {{2, 
    2}, {4, 2}, {4, 5}}, {{1, 2}, {2, 3}} -> {{2, 2}, {4, 3}, {3, 
    5}}, {{1, 2}, {2, 3}} -> {{2, 2}, {4, 3}, {4, 5}}, {{1, 2}, {2, 
    3}} -> {{2, 3}, {4, 3}, {1, 5}}, {{1, 2}, {2, 3}} -> {{3, 1}, {4, 
    1}, {2, 5}}, {{1, 2}, {2, 3}} -> {{3, 2}, {4, 2}, {1, 5}}, {{1, 
    2}, {2, 3}} -> {{3, 3}, {4, 1}, {1, 5}}, {{1, 2}, {2, 3}} -> {{3, 
    3}, {4, 1}, {4, 5}}, {{1, 2}, {2, 3}} -> {{3, 3}, {4, 2}, {2, 
    5}}, {{1, 2}, {2, 3}} -> {{3, 3}, {4, 2}, {4, 5}}, {{1, 2}, {2, 
    3}} -> {{3, 3}, {4, 3}, {1, 5}}, {{1, 2}, {2, 3}} -> {{3, 3}, {4, 
    3}, {2, 5}}, {{1, 2}, {2, 3}} -> {{3, 3}, {4, 3}, {4, 5}}, {{1, 
    2}, {1, 3}} -> {{1, 1}, {4, 1}, {5, 1}}, {{1, 2}, {1, 3}} -> {{1, 
    1}, {4, 1}, {5, 2}}, {{1, 2}, {1, 3}} -> {{1, 1}, {4, 1}, {5, 
    4}}, {{1, 2}, {1, 3}} -> {{1, 1}, {4, 2}, {5, 2}}, {{1, 2}, {1, 
    3}} -> {{1, 1}, {4, 2}, {5, 3}}, {{1, 2}, {1, 3}} -> {{1, 2}, {4, 
    2}, {5, 2}}, {{1, 2}, {1, 3}} -> {{1, 2}, {4, 2}, {5, 3}}, {{1, 
    2}, {1, 3}} -> {{2, 1}, {4, 1}, {5, 1}}, {{1, 2}, {1, 3}} -> {{2, 
    1}, {4, 1}, {5, 3}}, {{1, 2}, {1, 3}} -> {{2, 2}, {4, 1}, {5, 
    1}}, {{1, 2}, {1, 3}} -> {{2, 2}, {4, 1}, {5, 3}}, {{1, 2}, {1, 
    3}} -> {{2, 2}, {4, 2}, {5, 1}}, {{1, 2}, {1, 3}} -> {{2, 2}, {4, 
    2}, {5, 2}}, {{1, 2}, {1, 3}} -> {{2, 2}, {4, 2}, {5, 3}}, {{1, 
    2}, {1, 3}} -> {{2, 2}, {4, 2}, {5, 4}}, {{1, 2}, {1, 3}} -> {{2, 
    2}, {4, 3}, {5, 3}}, {{1, 2}, {1, 3}} -> {{2, 3}, {4, 3}, {5, 
    1}}, {{1, 2}, {1, 3}} -> {{2, 3}, {4, 3}, {5, 3}}, {{1, 2}, {2, 
    3}} -> {{1, 1}, {4, 1}, {5, 1}}, {{1, 2}, {2, 3}} -> {{1, 1}, {4, 
    1}, {5, 2}}, {{1, 2}, {2, 3}} -> {{1, 1}, {4, 1}, {5, 3}}, {{1, 
    2}, {2, 3}} -> {{1, 1}, {4, 1}, {5, 4}}, {{1, 2}, {2, 3}} -> {{1, 
    1}, {4, 2}, {5, 2}}, {{1, 2}, {2, 3}} -> {{1, 1}, {4, 2}, {5, 
    3}}, {{1, 2}, {2, 3}} -> {{1, 1}, {4, 3}, {5, 3}}, {{1, 2}, {2, 
    3}} -> {{1, 2}, {4, 2}, {5, 2}}, {{1, 2}, {2, 3}} -> {{1, 2}, {4, 
    2}, {5, 3}}, {{1, 2}, {2, 3}} -> {{1, 3}, {4, 3}, {5, 2}}, {{1, 
    2}, {2, 3}} -> {{1, 3}, {4, 3}, {5, 3}}, {{1, 2}, {2, 3}} -> {{2, 
    1}, {4, 1}, {5, 1}}, {{1, 2}, {2, 3}} -> {{2, 1}, {4, 1}, {5, 
    3}}, {{1, 2}, {2, 3}} -> {{2, 2}, {4, 1}, {5, 1}}, {{1, 2}, {2, 
    3}} -> {{2, 2}, {4, 1}, {5, 3}}, {{1, 2}, {2, 3}} -> {{2, 2}, {4, 
    2}, {5, 1}}, {{1, 2}, {2, 3}} -> {{2, 2}, {4, 2}, {5, 2}}, {{1, 
    2}, {2, 3}} -> {{2, 2}, {4, 2}, {5, 3}}, {{1, 2}, {2, 3}} -> {{2, 
    2}, {4, 2}, {5, 4}}, {{1, 2}, {2, 3}} -> {{2, 2}, {4, 3}, {5, 
    3}}, {{1, 2}, {2, 3}} -> {{2, 3}, {4, 3}, {5, 1}}, {{1, 2}, {2, 
    3}} -> {{2, 3}, {4, 3}, {5, 3}}, {{1, 2}, {2, 3}} -> {{3, 1}, {4, 
    1}, {5, 1}}, {{1, 2}, {2, 3}} -> {{3, 1}, {4, 1}, {5, 2}}, {{1, 
    2}, {2, 3}} -> {{3, 2}, {4, 2}, {5, 1}}, {{1, 2}, {2, 3}} -> {{3, 
    2}, {4, 2}, {5, 2}}, {{1, 2}, {2, 3}} -> {{3, 3}, {4, 1}, {5, 
    1}}, {{1, 2}, {2, 3}} -> {{3, 3}, {4, 1}, {5, 2}}, {{1, 2}, {2, 
    3}} -> {{3, 3}, {4, 2}, {5, 2}}, {{1, 2}, {2, 3}} -> {{3, 3}, {4, 
    3}, {5, 1}}, {{1, 2}, {2, 3}} -> {{3, 3}, {4, 3}, {5, 2}}, {{1, 
    2}, {2, 3}} -> {{3, 3}, {4, 3}, {5, 3}}, {{1, 2}, {2, 3}} -> {{3, 
    3}, {4, 3}, {5, 4}}, {{1, 2}, {1, 3}} -> {{1, 1}, {4, 5}, {5, 
    2}}, {{1, 2}, {1, 3}} -> {{2, 2}, {4, 5}, {5, 1}}, {{1, 2}, {1, 
    3}} -> {{2, 2}, {4, 5}, {5, 3}}, {{1, 2}, {2, 3}} -> {{1, 1}, {4, 
    5}, {5, 2}}, {{1, 2}, {2, 3}} -> {{1, 1}, {4, 5}, {5, 3}}, {{1, 
    2}, {2, 3}} -> {{2, 2}, {4, 5}, {5, 1}}, {{1, 2}, {2, 3}} -> {{2, 
    2}, {4, 5}, {5, 3}}, {{1, 2}, {2, 3}} -> {{3, 3}, {4, 5}, {5, 
    1}}, {{1, 2}, {2, 3}} -> {{3, 3}, {4, 5}, {5, 2}}, {{1, 2}, {1, 
    3}} -> {{1, 4}, {1, 2}, {3, 4}}, {{1, 2}, {1, 3}} -> {{1, 4}, {1, 
    2}, {4, 2}}, {{1, 2}, {1, 3}} -> {{1, 4}, {1, 2}, {4, 3}}, {{1, 
    2}, {1, 3}} -> {{1, 4}, {1, 4}, {1, 2}}, {{1, 2}, {1, 3}} -> {{1, 
    4}, {1, 4}, {1, 4}}, {{1, 2}, {1, 3}} -> {{1, 4}, {1, 4}, {2, 
    1}}, {{1, 2}, {1, 3}} -> {{1, 4}, {1, 4}, {2, 3}}, {{1, 2}, {1, 
    3}} -> {{1, 4}, {1, 4}, {2, 4}}, {{1, 2}, {1, 3}} -> {{1, 4}, {1, 
    4}, {4, 1}}, {{1, 2}, {1, 3}} -> {{1, 4}, {1, 4}, {4, 2}}, {{1, 
    2}, {1, 3}} -> {{1, 4}, {2, 4}, {3, 4}}, {{1, 2}, {1, 3}} -> {{1, 
    4}, {4, 1}, {1, 2}}, {{1, 2}, {1, 3}} -> {{1, 4}, {4, 1}, {2, 
    1}}, {{1, 2}, {1, 3}} -> {{1, 4}, {4, 1}, {2, 3}}, {{1, 2}, {1, 
    3}} -> {{1, 4}, {4, 2}, {2, 1}}, {{1, 2}, {1, 3}} -> {{1, 4}, {4, 
    2}, {2, 3}}, {{1, 2}, {1, 3}} -> {{1, 4}, {4, 2}, {3, 2}}, {{1, 
    2}, {1, 3}} -> {{1, 4}, {4, 2}, {3, 4}}, {{1, 2}, {1, 3}} -> {{2, 
    4}, {2, 1}, {3, 4}}, {{1, 2}, {1, 3}} -> {{2, 4}, {2, 1}, {4, 
    1}}, {{1, 2}, {1, 3}} -> {{2, 4}, {2, 1}, {4, 3}}, {{1, 2}, {1, 
    3}} -> {{2, 4}, {2, 3}, {1, 4}}, {{1, 2}, {1, 3}} -> {{2, 4}, {2, 
    3}, {4, 1}}, {{1, 2}, {1, 3}} -> {{2, 4}, {2, 3}, {4, 3}}, {{1, 
    2}, {1, 3}} -> {{2, 4}, {2, 4}, {1, 2}}, {{1, 2}, {1, 3}} -> {{2, 
    4}, {2, 4}, {1, 3}}, {{1, 2}, {1, 3}} -> {{2, 4}, {2, 4}, {1, 
    4}}, {{1, 2}, {1, 3}} -> {{2, 4}, {2, 4}, {2, 1}}, {{1, 2}, {1, 
    3}} -> {{2, 4}, {2, 4}, {2, 3}}, {{1, 2}, {1, 3}} -> {{2, 4}, {2, 
    4}, {2, 4}}, {{1, 2}, {1, 3}} -> {{2, 4}, {2, 4}, {3, 1}}, {{1, 
    2}, {1, 3}} -> {{2, 4}, {2, 4}, {3, 2}}, {{1, 2}, {1, 3}} -> {{2, 
    4}, {2, 4}, {3, 4}}, {{1, 2}, {1, 3}} -> {{2, 4}, {2, 4}, {4, 
    1}}, {{1, 2}, {1, 3}} -> {{2, 4}, {2, 4}, {4, 2}}, {{1, 2}, {1, 
    3}} -> {{2, 4}, {2, 4}, {4, 3}}, {{1, 2}, {1, 3}} -> {{2, 4}, {4, 
    1}, {1, 3}}, {{1, 2}, {1, 3}} -> {{2, 4}, {4, 1}, {3, 1}}, {{1, 
    2}, {1, 3}} -> {{2, 4}, {4, 1}, {3, 4}}, {{1, 2}, {1, 3}} -> {{2, 
    4}, {4, 2}, {1, 2}}, {{1, 2}, {1, 3}} -> {{2, 4}, {4, 2}, {1, 
    3}}, {{1, 2}, {1, 3}} -> {{2, 4}, {4, 2}, {2, 1}}, {{1, 2}, {1, 
    3}} -> {{2, 4}, {4, 2}, {2, 3}}, {{1, 2}, {1, 3}} -> {{2, 4}, {4, 
    2}, {3, 1}}, {{1, 2}, {1, 3}} -> {{2, 4}, {4, 2}, {3, 2}}, {{1, 
    2}, {1, 3}} -> {{2, 4}, {4, 3}, {1, 3}}, {{1, 2}, {1, 3}} -> {{2, 
    4}, {4, 3}, {3, 1}}, {{1, 2}, {2, 3}} -> {{1, 4}, {1, 2}, {3, 
    4}}, {{1, 2}, {2, 3}} -> {{1, 4}, {1, 2}, {4, 2}}, {{1, 2}, {2, 
    3}} -> {{1, 4}, {1, 2}, {4, 3}}, {{1, 2}, {2, 3}} -> {{1, 4}, {1, 
    3}, {2, 4}}, {{1, 2}, {2, 3}} -> {{1, 4}, {1, 3}, {4, 2}}, {{1, 
    2}, {2, 3}} -> {{1, 4}, {1, 3}, {4, 3}}, {{1, 2}, {2, 3}} -> {{1, 
    4}, {1, 4}, {1, 2}}, {{1, 2}, {2, 3}} -> {{1, 4}, {1, 4}, {1, 
    3}}, {{1, 2}, {2, 3}} -> {{1, 4}, {1, 4}, {1, 4}}, {{1, 2}, {2, 
    3}} -> {{1, 4}, {1, 4}, {2, 1}}, {{1, 2}, {2, 3}} -> {{1, 4}, {1, 
    4}, {2, 3}}, {{1, 2}, {2, 3}} -> {{1, 4}, {1, 4}, {2, 4}}, {{1, 
    2}, {2, 3}} -> {{1, 4}, {1, 4}, {3, 1}}, {{1, 2}, {2, 3}} -> {{1, 
    4}, {1, 4}, {3, 2}}, {{1, 2}, {2, 3}} -> {{1, 4}, {1, 4}, {3, 
    4}}, {{1, 2}, {2, 3}} -> {{1, 4}, {1, 4}, {4, 1}}, {{1, 2}, {2, 
    3}} -> {{1, 4}, {1, 4}, {4, 2}}, {{1, 2}, {2, 3}} -> {{1, 4}, {1, 
    4}, {4, 3}}, {{1, 2}, {2, 3}} -> {{1, 4}, {2, 4}, {3, 4}}, {{1, 
    2}, {2, 3}} -> {{1, 4}, {4, 1}, {1, 2}}, {{1, 2}, {2, 3}} -> {{1, 
    4}, {4, 1}, {1, 3}}, {{1, 2}, {2, 3}} -> {{1, 4}, {4, 1}, {2, 
    1}}, {{1, 2}, {2, 3}} -> {{1, 4}, {4, 1}, {2, 3}}, {{1, 2}, {2, 
    3}} -> {{1, 4}, {4, 1}, {3, 1}}, {{1, 2}, {2, 3}} -> {{1, 4}, {4, 
    1}, {3, 2}}, {{1, 2}, {2, 3}} -> {{1, 4}, {4, 2}, {2, 1}}, {{1, 
    2}, {2, 3}} -> {{1, 4}, {4, 2}, {2, 3}}, {{1, 2}, {2, 3}} -> {{1, 
    4}, {4, 2}, {3, 2}}, {{1, 2}, {2, 3}} -> {{1, 4}, {4, 2}, {3, 
    4}}, {{1, 2}, {2, 3}} -> {{1, 4}, {4, 3}, {2, 3}}, {{1, 2}, {2, 
    3}} -> {{1, 4}, {4, 3}, {2, 4}}, {{1, 2}, {2, 3}} -> {{1, 4}, {4, 
    3}, {3, 1}}, {{1, 2}, {2, 3}} -> {{1, 4}, {4, 3}, {3, 2}}, {{1, 
    2}, {2, 3}} -> {{2, 4}, {2, 1}, {3, 4}}, {{1, 2}, {2, 3}} -> {{2, 
    4}, {2, 1}, {4, 1}}, {{1, 2}, {2, 3}} -> {{2, 4}, {2, 1}, {4, 
    3}}, {{1, 2}, {2, 3}} -> {{2, 4}, {2, 3}, {1, 4}}, {{1, 2}, {2, 
    3}} -> {{2, 4}, {2, 3}, {4, 1}}, {{1, 2}, {2, 3}} -> {{2, 4}, {2, 
    3}, {4, 3}}, {{1, 2}, {2, 3}} -> {{2, 4}, {2, 4}, {1, 2}}, {{1, 
    2}, {2, 3}} -> {{2, 4}, {2, 4}, {1, 3}}, {{1, 2}, {2, 3}} -> {{2, 
    4}, {2, 4}, {1, 4}}, {{1, 2}, {2, 3}} -> {{2, 4}, {2, 4}, {2, 
    1}}, {{1, 2}, {2, 3}} -> {{2, 4}, {2, 4}, {2, 3}}, {{1, 2}, {2, 
    3}} -> {{2, 4}, {2, 4}, {2, 4}}, {{1, 2}, {2, 3}} -> {{2, 4}, {2, 
    4}, {3, 1}}, {{1, 2}, {2, 3}} -> {{2, 4}, {2, 4}, {3, 2}}, {{1, 
    2}, {2, 3}} -> {{2, 4}, {2, 4}, {3, 4}}, {{1, 2}, {2, 3}} -> {{2, 
    4}, {2, 4}, {4, 1}}, {{1, 2}, {2, 3}} -> {{2, 4}, {2, 4}, {4, 
    2}}, {{1, 2}, {2, 3}} -> {{2, 4}, {2, 4}, {4, 3}}, {{1, 2}, {2, 
    3}} -> {{2, 4}, {4, 1}, {1, 3}}, {{1, 2}, {2, 3}} -> {{2, 4}, {4, 
    1}, {3, 1}}, {{1, 2}, {2, 3}} -> {{2, 4}, {4, 1}, {3, 4}}, {{1, 
    2}, {2, 3}} -> {{2, 4}, {4, 2}, {1, 2}}, {{1, 2}, {2, 3}} -> {{2, 
    4}, {4, 2}, {1, 3}}, {{1, 2}, {2, 3}} -> {{2, 4}, {4, 2}, {2, 
    1}}, {{1, 2}, {2, 3}} -> {{2, 4}, {4, 2}, {2, 3}}, {{1, 2}, {2, 
    3}} -> {{2, 4}, {4, 2}, {3, 1}}, {{1, 2}, {2, 3}} -> {{2, 4}, {4, 
    2}, {3, 2}}, {{1, 2}, {2, 3}} -> {{2, 4}, {4, 3}, {1, 3}}, {{1, 
    2}, {2, 3}} -> {{2, 4}, {4, 3}, {3, 1}}, {{1, 2}, {2, 3}} -> {{2, 
    4}, {4, 3}, {3, 2}}, {{1, 2}, {2, 3}} -> {{3, 4}, {3, 1}, {2, 
    4}}, {{1, 2}, {2, 3}} -> {{3, 4}, {3, 1}, {4, 1}}, {{1, 2}, {2, 
    3}} -> {{3, 4}, {3, 1}, {4, 2}}, {{1, 2}, {2, 3}} -> {{3, 4}, {3, 
    2}, {1, 4}}, {{1, 2}, {2, 3}} -> {{3, 4}, {3, 2}, {4, 1}}, {{1, 
    2}, {2, 3}} -> {{3, 4}, {3, 2}, {4, 2}}, {{1, 2}, {2, 3}} -> {{3, 
    4}, {3, 4}, {1, 2}}, {{1, 2}, {2, 3}} -> {{3, 4}, {3, 4}, {1, 
    3}}, {{1, 2}, {2, 3}} -> {{3, 4}, {3, 4}, {1, 4}}, {{1, 2}, {2, 
    3}} -> {{3, 4}, {3, 4}, {2, 1}}, {{1, 2}, {2, 3}} -> {{3, 4}, {3, 
    4}, {2, 3}}, {{1, 2}, {2, 3}} -> {{3, 4}, {3, 4}, {2, 4}}, {{1, 
    2}, {2, 3}} -> {{3, 4}, {3, 4}, {3, 1}}, {{1, 2}, {2, 3}} -> {{3, 
    4}, {3, 4}, {3, 2}}, {{1, 2}, {2, 3}} -> {{3, 4}, {3, 4}, {3, 
    4}}, {{1, 2}, {2, 3}} -> {{3, 4}, {3, 4}, {4, 1}}, {{1, 2}, {2, 
    3}} -> {{3, 4}, {3, 4}, {4, 2}}, {{1, 2}, {2, 3}} -> {{3, 4}, {3, 
    4}, {4, 3}}, {{1, 2}, {2, 3}} -> {{3, 4}, {4, 1}, {1, 2}}, {{1, 
    2}, {2, 3}} -> {{3, 4}, {4, 1}, {2, 1}}, {{1, 2}, {2, 3}} -> {{3, 
    4}, {4, 2}, {1, 2}}, {{1, 2}, {2, 3}} -> {{3, 4}, {4, 2}, {2, 
    1}}, {{1, 2}, {2, 3}} -> {{3, 4}, {4, 3}, {1, 2}}, {{1, 2}, {2, 
    3}} -> {{3, 4}, {4, 3}, {1, 3}}, {{1, 2}, {2, 3}} -> {{3, 4}, {4, 
    3}, {2, 1}}, {{1, 2}, {2, 3}} -> {{3, 4}, {4, 3}, {2, 3}}, {{1, 
    2}, {2, 3}} -> {{3, 4}, {4, 3}, {3, 1}}, {{1, 2}, {2, 3}} -> {{3, 
    4}, {4, 3}, {3, 2}}, {{1, 2}, {1, 3}} -> {{1, 4}, {1, 2}, {4, 
    5}}, {{1, 2}, {1, 3}} -> {{1, 4}, {1, 4}, {1, 5}}, {{1, 2}, {1, 
    3}} -> {{1, 4}, {1, 4}, {2, 5}}, {{1, 2}, {1, 3}} -> {{1, 4}, {1, 
    4}, {4, 5}}, {{1, 2}, {1, 3}} -> {{1, 4}, {2, 4}, {3, 5}}, {{1, 
    2}, {1, 3}} -> {{1, 4}, {4, 1}, {1, 5}}, {{1, 2}, {1, 3}} -> {{1, 
    4}, {4, 1}, {2, 5}}, {{1, 2}, {1, 3}} -> {{1, 4}, {4, 2}, {2, 
    5}}, {{1, 2}, {1, 3}} -> {{1, 4}, {4, 2}, {3, 5}}, {{1, 2}, {1, 
    3}} -> {{2, 4}, {2, 1}, {4, 5}}, {{1, 2}, {1, 3}} -> {{2, 4}, {2, 
    3}, {4, 5}}, {{1, 2}, {1, 3}} -> {{2, 4}, {2, 4}, {1, 5}}, {{1, 
    2}, {1, 3}} -> {{2, 4}, {2, 4}, {2, 5}}, {{1, 2}, {1, 3}} -> {{2, 
    4}, {2, 4}, {3, 5}}, {{1, 2}, {1, 3}} -> {{2, 4}, {2, 4}, {4, 
    5}}, {{1, 2}, {1, 3}} -> {{2, 4}, {3, 4}, {1, 5}}, {{1, 2}, {1, 
    3}} -> {{2, 4}, {4, 1}, {1, 5}}, {{1, 2}, {1, 3}} -> {{2, 4}, {4, 
    1}, {3, 5}}, {{1, 2}, {1, 3}} -> {{2, 4}, {4, 2}, {1, 5}}, {{1, 
    2}, {1, 3}} -> {{2, 4}, {4, 2}, {2, 5}}, {{1, 2}, {1, 3}} -> {{2, 
    4}, {4, 2}, {3, 5}}, {{1, 2}, {1, 3}} -> {{2, 4}, {4, 3}, {1, 
    5}}, {{1, 2}, {1, 3}} -> {{2, 4}, {4, 3}, {3, 5}}, {{1, 2}, {2, 
    3}} -> {{1, 4}, {1, 2}, {4, 5}}, {{1, 2}, {2, 3}} -> {{1, 4}, {1, 
    3}, {4, 5}}, {{1, 2}, {2, 3}} -> {{1, 4}, {1, 4}, {1, 5}}, {{1, 
    2}, {2, 3}} -> {{1, 4}, {1, 4}, {2, 5}}, {{1, 2}, {2, 3}} -> {{1, 
    4}, {1, 4}, {3, 5}}, {{1, 2}, {2, 3}} -> {{1, 4}, {1, 4}, {4, 
    5}}, {{1, 2}, {2, 3}} -> {{1, 4}, {2, 4}, {3, 5}}, {{1, 2}, {2, 
    3}} -> {{1, 4}, {3, 4}, {2, 5}}, {{1, 2}, {2, 3}} -> {{1, 4}, {4, 
    1}, {1, 5}}, {{1, 2}, {2, 3}} -> {{1, 4}, {4, 1}, {2, 5}}, {{1, 
    2}, {2, 3}} -> {{1, 4}, {4, 1}, {3, 5}}, {{1, 2}, {2, 3}} -> {{1, 
    4}, {4, 2}, {2, 5}}, {{1, 2}, {2, 3}} -> {{1, 4}, {4, 2}, {3, 
    5}}, {{1, 2}, {2, 3}} -> {{1, 4}, {4, 3}, {2, 5}}, {{1, 2}, {2, 
    3}} -> {{1, 4}, {4, 3}, {3, 5}}, {{1, 2}, {2, 3}} -> {{2, 4}, {2, 
    1}, {4, 5}}, {{1, 2}, {2, 3}} -> {{2, 4}, {2, 3}, {4, 5}}, {{1, 
    2}, {2, 3}} -> {{2, 4}, {2, 4}, {1, 5}}, {{1, 2}, {2, 3}} -> {{2, 
    4}, {2, 4}, {2, 5}}, {{1, 2}, {2, 3}} -> {{2, 4}, {2, 4}, {3, 
    5}}, {{1, 2}, {2, 3}} -> {{2, 4}, {2, 4}, {4, 5}}, {{1, 2}, {2, 
    3}} -> {{2, 4}, {3, 4}, {1, 5}}, {{1, 2}, {2, 3}} -> {{2, 4}, {4, 
    1}, {1, 5}}, {{1, 2}, {2, 3}} -> {{2, 4}, {4, 1}, {3, 5}}, {{1, 
    2}, {2, 3}} -> {{2, 4}, {4, 2}, {1, 5}}, {{1, 2}, {2, 3}} -> {{2, 
    4}, {4, 2}, {2, 5}}, {{1, 2}, {2, 3}} -> {{2, 4}, {4, 2}, {3, 
    5}}, {{1, 2}, {2, 3}} -> {{2, 4}, {4, 3}, {1, 5}}, {{1, 2}, {2, 
    3}} -> {{2, 4}, {4, 3}, {3, 5}}, {{1, 2}, {2, 3}} -> {{3, 4}, {3, 
    1}, {4, 5}}, {{1, 2}, {2, 3}} -> {{3, 4}, {3, 2}, {4, 5}}, {{1, 
    2}, {2, 3}} -> {{3, 4}, {3, 4}, {1, 5}}, {{1, 2}, {2, 3}} -> {{3, 
    4}, {3, 4}, {2, 5}}, {{1, 2}, {2, 3}} -> {{3, 4}, {3, 4}, {3, 
    5}}, {{1, 2}, {2, 3}} -> {{3, 4}, {3, 4}, {4, 5}}, {{1, 2}, {2, 
    3}} -> {{3, 4}, {4, 1}, {1, 5}}, {{1, 2}, {2, 3}} -> {{3, 4}, {4, 
    1}, {2, 5}}, {{1, 2}, {2, 3}} -> {{3, 4}, {4, 2}, {1, 5}}, {{1, 
    2}, {2, 3}} -> {{3, 4}, {4, 2}, {2, 5}}, {{1, 2}, {2, 3}} -> {{3, 
    4}, {4, 3}, {1, 5}}, {{1, 2}, {2, 3}} -> {{3, 4}, {4, 3}, {2, 
    5}}, {{1, 2}, {2, 3}} -> {{3, 4}, {4, 3}, {3, 5}}, {{1, 2}, {1, 
    3}} -> {{1, 4}, {1, 2}, {5, 4}}, {{1, 2}, {1, 3}} -> {{1, 4}, {1, 
    4}, {5, 1}}, {{1, 2}, {1, 3}} -> {{1, 4}, {1, 4}, {5, 2}}, {{1, 
    2}, {1, 3}} -> {{1, 4}, {1, 4}, {5, 4}}, {{1, 2}, {1, 3}} -> {{1, 
    4}, {2, 4}, {5, 3}}, {{1, 2}, {1, 3}} -> {{1, 4}, {2, 4}, {5, 
    4}}, {{1, 2}, {1, 3}} -> {{1, 4}, {4, 1}, {5, 1}}, {{1, 2}, {1, 
    3}} -> {{1, 4}, {4, 1}, {5, 2}}, {{1, 2}, {1, 3}} -> {{1, 4}, {4, 
    2}, {5, 2}}, {{1, 2}, {1, 3}} -> {{1, 4}, {4, 2}, {5, 3}}, {{1, 
    2}, {1, 3}} -> {{1, 4}, {4, 2}, {5, 4}}, {{1, 2}, {1, 3}} -> {{2, 
    4}, {2, 1}, {5, 4}}, {{1, 2}, {1, 3}} -> {{2, 4}, {2, 3}, {5, 
    4}}, {{1, 2}, {1, 3}} -> {{2, 4}, {2, 4}, {5, 1}}, {{1, 2}, {1, 
    3}} -> {{2, 4}, {2, 4}, {5, 2}}, {{1, 2}, {1, 3}} -> {{2, 4}, {2, 
    4}, {5, 3}}, {{1, 2}, {1, 3}} -> {{2, 4}, {2, 4}, {5, 4}}, {{1, 
    2}, {1, 3}} -> {{2, 4}, {3, 4}, {5, 1}}, {{1, 2}, {1, 3}} -> {{2, 
    4}, {3, 4}, {5, 4}}, {{1, 2}, {1, 3}} -> {{2, 4}, {4, 1}, {5, 
    1}}, {{1, 2}, {1, 3}} -> {{2, 4}, {4, 1}, {5, 3}}, {{1, 2}, {1, 
    3}} -> {{2, 4}, {4, 1}, {5, 4}}, {{1, 2}, {1, 3}} -> {{2, 4}, {4, 
    2}, {5, 1}}, {{1, 2}, {1, 3}} -> {{2, 4}, {4, 2}, {5, 2}}, {{1, 
    2}, {1, 3}} -> {{2, 4}, {4, 2}, {5, 3}}, {{1, 2}, {1, 3}} -> {{2, 
    4}, {4, 3}, {5, 1}}, {{1, 2}, {1, 3}} -> {{2, 4}, {4, 3}, {5, 
    3}}, {{1, 2}, {1, 3}} -> {{2, 4}, {4, 3}, {5, 4}}, {{1, 2}, {2, 
    3}} -> {{1, 4}, {1, 2}, {5, 4}}, {{1, 2}, {2, 3}} -> {{1, 4}, {1, 
    3}, {5, 4}}, {{1, 2}, {2, 3}} -> {{1, 4}, {1, 4}, {5, 1}}, {{1, 
    2}, {2, 3}} -> {{1, 4}, {1, 4}, {5, 2}}, {{1, 2}, {2, 3}} -> {{1, 
    4}, {1, 4}, {5, 3}}, {{1, 2}, {2, 3}} -> {{1, 4}, {1, 4}, {5, 
    4}}, {{1, 2}, {2, 3}} -> {{1, 4}, {2, 4}, {5, 3}}, {{1, 2}, {2, 
    3}} -> {{1, 4}, {2, 4}, {5, 4}}, {{1, 2}, {2, 3}} -> {{1, 4}, {3, 
    4}, {5, 2}}, {{1, 2}, {2, 3}} -> {{1, 4}, {3, 4}, {5, 4}}, {{1, 
    2}, {2, 3}} -> {{1, 4}, {4, 1}, {5, 1}}, {{1, 2}, {2, 3}} -> {{1, 
    4}, {4, 1}, {5, 2}}, {{1, 2}, {2, 3}} -> {{1, 4}, {4, 1}, {5, 
    3}}, {{1, 2}, {2, 3}} -> {{1, 4}, {4, 2}, {5, 2}}, {{1, 2}, {2, 
    3}} -> {{1, 4}, {4, 2}, {5, 3}}, {{1, 2}, {2, 3}} -> {{1, 4}, {4, 
    2}, {5, 4}}, {{1, 2}, {2, 3}} -> {{1, 4}, {4, 3}, {5, 2}}, {{1, 
    2}, {2, 3}} -> {{1, 4}, {4, 3}, {5, 3}}, {{1, 2}, {2, 3}} -> {{1, 
    4}, {4, 3}, {5, 4}}, {{1, 2}, {2, 3}} -> {{2, 4}, {2, 1}, {5, 
    4}}, {{1, 2}, {2, 3}} -> {{2, 4}, {2, 3}, {5, 4}}, {{1, 2}, {2, 
    3}} -> {{2, 4}, {2, 4}, {5, 1}}, {{1, 2}, {2, 3}} -> {{2, 4}, {2, 
    4}, {5, 2}}, {{1, 2}, {2, 3}} -> {{2, 4}, {2, 4}, {5, 3}}, {{1, 
    2}, {2, 3}} -> {{2, 4}, {2, 4}, {5, 4}}, {{1, 2}, {2, 3}} -> {{2, 
    4}, {3, 4}, {5, 1}}, {{1, 2}, {2, 3}} -> {{2, 4}, {3, 4}, {5, 
    4}}, {{1, 2}, {2, 3}} -> {{2, 4}, {4, 1}, {5, 1}}, {{1, 2}, {2, 
    3}} -> {{2, 4}, {4, 1}, {5, 3}}, {{1, 2}, {2, 3}} -> {{2, 4}, {4, 
    1}, {5, 4}}, {{1, 2}, {2, 3}} -> {{2, 4}, {4, 2}, {5, 1}}, {{1, 
    2}, {2, 3}} -> {{2, 4}, {4, 2}, {5, 2}}, {{1, 2}, {2, 3}} -> {{2, 
    4}, {4, 2}, {5, 3}}, {{1, 2}, {2, 3}} -> {{2, 4}, {4, 3}, {5, 
    1}}, {{1, 2}, {2, 3}} -> {{2, 4}, {4, 3}, {5, 3}}, {{1, 2}, {2, 
    3}} -> {{2, 4}, {4, 3}, {5, 4}}, {{1, 2}, {2, 3}} -> {{3, 4}, {3, 
    1}, {5, 4}}, {{1, 2}, {2, 3}} -> {{3, 4}, {3, 2}, {5, 4}}, {{1, 
    2}, {2, 3}} -> {{3, 4}, {3, 4}, {5, 1}}, {{1, 2}, {2, 3}} -> {{3, 
    4}, {3, 4}, {5, 2}}, {{1, 2}, {2, 3}} -> {{3, 4}, {3, 4}, {5, 
    3}}, {{1, 2}, {2, 3}} -> {{3, 4}, {3, 4}, {5, 4}}, {{1, 2}, {2, 
    3}} -> {{3, 4}, {4, 1}, {5, 1}}, {{1, 2}, {2, 3}} -> {{3, 4}, {4, 
    1}, {5, 2}}, {{1, 2}, {2, 3}} -> {{3, 4}, {4, 1}, {5, 4}}, {{1, 
    2}, {2, 3}} -> {{3, 4}, {4, 2}, {5, 1}}, {{1, 2}, {2, 3}} -> {{3, 
    4}, {4, 2}, {5, 2}}, {{1, 2}, {2, 3}} -> {{3, 4}, {4, 2}, {5, 
    4}}, {{1, 2}, {2, 3}} -> {{3, 4}, {4, 3}, {5, 1}}, {{1, 2}, {2, 
    3}} -> {{3, 4}, {4, 3}, {5, 2}}, {{1, 2}, {2, 3}} -> {{3, 4}, {4, 
    3}, {5, 3}}, {{1, 2}, {1, 3}} -> {{1, 4}, {1, 5}, {2, 1}}, {{1, 
    2}, {1, 3}} -> {{1, 4}, {1, 5}, {2, 3}}, {{1, 2}, {1, 3}} -> {{1, 
    4}, {1, 5}, {2, 4}}, {{1, 2}, {1, 3}} -> {{1, 4}, {1, 5}, {4, 
    2}}, {{1, 2}, {1, 3}} -> {{1, 4}, {1, 5}, {4, 5}}, {{1, 2}, {1, 
    3}} -> {{1, 4}, {4, 5}, {2, 3}}, {{1, 2}, {1, 3}} -> {{1, 4}, {4, 
    5}, {2, 4}}, {{1, 2}, {1, 3}} -> {{1, 4}, {4, 5}, {2, 5}}, {{1, 
    2}, {1, 3}} -> {{1, 4}, {4, 5}, {5, 1}}, {{1, 2}, {1, 3}} -> {{1, 
    4}, {4, 5}, {5, 2}}, {{1, 2}, {1, 3}} -> {{2, 4}, {2, 5}, {1, 
    2}}, {{1, 2}, {1, 3}} -> {{2, 4}, {2, 5}, {1, 3}}, {{1, 2}, {1, 
    3}} -> {{2, 4}, {2, 5}, {1, 4}}, {{1, 2}, {1, 3}} -> {{2, 4}, {2, 
    5}, {3, 1}}, {{1, 2}, {1, 3}} -> {{2, 4}, {2, 5}, {3, 2}}, {{1, 
    2}, {1, 3}} -> {{2, 4}, {2, 5}, {3, 4}}, {{1, 2}, {1, 3}} -> {{2, 
    4}, {2, 5}, {4, 1}}, {{1, 2}, {1, 3}} -> {{2, 4}, {2, 5}, {4, 
    3}}, {{1, 2}, {1, 3}} -> {{2, 4}, {2, 5}, {4, 5}}, {{1, 2}, {1, 
    3}} -> {{2, 4}, {4, 5}, {1, 3}}, {{1, 2}, {1, 3}} -> {{2, 4}, {4, 
    5}, {1, 5}}, {{1, 2}, {1, 3}} -> {{2, 4}, {4, 5}, {3, 1}}, {{1, 
    2}, {1, 3}} -> {{2, 4}, {4, 5}, {3, 4}}, {{1, 2}, {1, 3}} -> {{2, 
    4}, {4, 5}, {3, 5}}, {{1, 2}, {1, 3}} -> {{2, 4}, {4, 5}, {5, 
    1}}, {{1, 2}, {1, 3}} -> {{2, 4}, {4, 5}, {5, 2}}, {{1, 2}, {1, 
    3}} -> {{2, 4}, {4, 5}, {5, 3}}, {{1, 2}, {2, 3}} -> {{1, 4}, {1, 
    5}, {2, 1}}, {{1, 2}, {2, 3}} -> {{1, 4}, {1, 5}, {2, 3}}, {{1, 
    2}, {2, 3}} -> {{1, 4}, {1, 5}, {2, 4}}, {{1, 2}, {2, 3}} -> {{1, 
    4}, {1, 5}, {3, 1}}, {{1, 2}, {2, 3}} -> {{1, 4}, {1, 5}, {3, 
    2}}, {{1, 2}, {2, 3}} -> {{1, 4}, {1, 5}, {3, 4}}, {{1, 2}, {2, 
    3}} -> {{1, 4}, {1, 5}, {4, 2}}, {{1, 2}, {2, 3}} -> {{1, 4}, {1, 
    5}, {4, 3}}, {{1, 2}, {2, 3}} -> {{1, 4}, {1, 5}, {4, 5}}, {{1, 
    2}, {2, 3}} -> {{1, 4}, {4, 5}, {2, 3}}, {{1, 2}, {2, 3}} -> {{1, 
    4}, {4, 5}, {2, 4}}, {{1, 2}, {2, 3}} -> {{1, 4}, {4, 5}, {2, 
    5}}, {{1, 2}, {2, 3}} -> {{1, 4}, {4, 5}, {3, 2}}, {{1, 2}, {2, 
    3}} -> {{1, 4}, {4, 5}, {3, 4}}, {{1, 2}, {2, 3}} -> {{1, 4}, {4, 
    5}, {3, 5}}, {{1, 2}, {2, 3}} -> {{1, 4}, {4, 5}, {5, 1}}, {{1, 
    2}, {2, 3}} -> {{1, 4}, {4, 5}, {5, 2}}, {{1, 2}, {2, 3}} -> {{1, 
    4}, {4, 5}, {5, 3}}, {{1, 2}, {2, 3}} -> {{2, 4}, {2, 5}, {1, 
    2}}, {{1, 2}, {2, 3}} -> {{2, 4}, {2, 5}, {1, 3}}, {{1, 2}, {2, 
    3}} -> {{2, 4}, {2, 5}, {1, 4}}, {{1, 2}, {2, 3}} -> {{2, 4}, {2, 
    5}, {3, 1}}, {{1, 2}, {2, 3}} -> {{2, 4}, {2, 5}, {3, 2}}, {{1, 
    2}, {2, 3}} -> {{2, 4}, {2, 5}, {3, 4}}, {{1, 2}, {2, 3}} -> {{2, 
    4}, {2, 5}, {4, 1}}, {{1, 2}, {2, 3}} -> {{2, 4}, {2, 5}, {4, 
    3}}, {{1, 2}, {2, 3}} -> {{2, 4}, {2, 5}, {4, 5}}, {{1, 2}, {2, 
    3}} -> {{2, 4}, {4, 5}, {1, 3}}, {{1, 2}, {2, 3}} -> {{2, 4}, {4, 
    5}, {1, 5}}, {{1, 2}, {2, 3}} -> {{2, 4}, {4, 5}, {3, 1}}, {{1, 
    2}, {2, 3}} -> {{2, 4}, {4, 5}, {3, 4}}, {{1, 2}, {2, 3}} -> {{2, 
    4}, {4, 5}, {3, 5}}, {{1, 2}, {2, 3}} -> {{2, 4}, {4, 5}, {5, 
    1}}, {{1, 2}, {2, 3}} -> {{2, 4}, {4, 5}, {5, 2}}, {{1, 2}, {2, 
    3}} -> {{2, 4}, {4, 5}, {5, 3}}, {{1, 2}, {2, 3}} -> {{3, 4}, {3, 
    5}, {1, 2}}, {{1, 2}, {2, 3}} -> {{3, 4}, {3, 5}, {1, 3}}, {{1, 
    2}, {2, 3}} -> {{3, 4}, {3, 5}, {1, 4}}, {{1, 2}, {2, 3}} -> {{3, 
    4}, {3, 5}, {2, 1}}, {{1, 2}, {2, 3}} -> {{3, 4}, {3, 5}, {2, 
    3}}, {{1, 2}, {2, 3}} -> {{3, 4}, {3, 5}, {2, 4}}, {{1, 2}, {2, 
    3}} -> {{3, 4}, {3, 5}, {4, 1}}, {{1, 2}, {2, 3}} -> {{3, 4}, {3, 
    5}, {4, 2}}, {{1, 2}, {2, 3}} -> {{3, 4}, {3, 5}, {4, 5}}, {{1, 
    2}, {2, 3}} -> {{3, 4}, {4, 5}, {1, 2}}, {{1, 2}, {2, 3}} -> {{3, 
    4}, {4, 5}, {1, 5}}, {{1, 2}, {2, 3}} -> {{3, 4}, {4, 5}, {2, 
    1}}, {{1, 2}, {2, 3}} -> {{3, 4}, {4, 5}, {2, 5}}, {{1, 2}, {2, 
    3}} -> {{3, 4}, {4, 5}, {5, 1}}, {{1, 2}, {2, 3}} -> {{3, 4}, {4, 
    5}, {5, 2}}, {{1, 2}, {2, 3}} -> {{3, 4}, {4, 5}, {5, 3}}, {{1, 
    2}, {1, 3}} -> {{1, 4}, {1, 5}, {1, 6}}, {{1, 2}, {1, 3}} -> {{1, 
    4}, {1, 5}, {2, 6}}, {{1, 2}, {1, 3}} -> {{1, 4}, {1, 5}, {4, 
    6}}, {{1, 2}, {1, 3}} -> {{1, 4}, {2, 5}, {3, 6}}, {{1, 2}, {1, 
    3}} -> {{1, 4}, {4, 5}, {2, 6}}, {{1, 2}, {1, 3}} -> {{1, 4}, {4, 
    5}, {5, 6}}, {{1, 2}, {1, 3}} -> {{2, 4}, {2, 5}, {1, 6}}, {{1, 
    2}, {1, 3}} -> {{2, 4}, {2, 5}, {2, 6}}, {{1, 2}, {1, 3}} -> {{2, 
    4}, {2, 5}, {3, 6}}, {{1, 2}, {1, 3}} -> {{2, 4}, {2, 5}, {4, 
    6}}, {{1, 2}, {1, 3}} -> {{2, 4}, {4, 5}, {1, 6}}, {{1, 2}, {1, 
    3}} -> {{2, 4}, {4, 5}, {3, 6}}, {{1, 2}, {1, 3}} -> {{2, 4}, {4, 
    5}, {5, 6}}, {{1, 2}, {2, 3}} -> {{1, 4}, {1, 5}, {1, 6}}, {{1, 
    2}, {2, 3}} -> {{1, 4}, {1, 5}, {2, 6}}, {{1, 2}, {2, 3}} -> {{1, 
    4}, {1, 5}, {3, 6}}, {{1, 2}, {2, 3}} -> {{1, 4}, {1, 5}, {4, 
    6}}, {{1, 2}, {2, 3}} -> {{1, 4}, {2, 5}, {3, 6}}, {{1, 2}, {2, 
    3}} -> {{1, 4}, {4, 5}, {2, 6}}, {{1, 2}, {2, 3}} -> {{1, 4}, {4, 
    5}, {3, 6}}, {{1, 2}, {2, 3}} -> {{1, 4}, {4, 5}, {5, 6}}, {{1, 
    2}, {2, 3}} -> {{2, 4}, {2, 5}, {1, 6}}, {{1, 2}, {2, 3}} -> {{2, 
    4}, {2, 5}, {2, 6}}, {{1, 2}, {2, 3}} -> {{2, 4}, {2, 5}, {3, 
    6}}, {{1, 2}, {2, 3}} -> {{2, 4}, {2, 5}, {4, 6}}, {{1, 2}, {2, 
    3}} -> {{2, 4}, {4, 5}, {1, 6}}, {{1, 2}, {2, 3}} -> {{2, 4}, {4, 
    5}, {3, 6}}, {{1, 2}, {2, 3}} -> {{2, 4}, {4, 5}, {5, 6}}, {{1, 
    2}, {2, 3}} -> {{3, 4}, {3, 5}, {1, 6}}, {{1, 2}, {2, 3}} -> {{3, 
    4}, {3, 5}, {2, 6}}, {{1, 2}, {2, 3}} -> {{3, 4}, {3, 5}, {3, 
    6}}, {{1, 2}, {2, 3}} -> {{3, 4}, {3, 5}, {4, 6}}, {{1, 2}, {2, 
    3}} -> {{3, 4}, {4, 5}, {1, 6}}, {{1, 2}, {2, 3}} -> {{3, 4}, {4, 
    5}, {2, 6}}, {{1, 2}, {2, 3}} -> {{3, 4}, {4, 5}, {5, 6}}, {{1, 
    2}, {1, 3}} -> {{1, 4}, {1, 5}, {6, 1}}, {{1, 2}, {1, 3}} -> {{1, 
    4}, {1, 5}, {6, 2}}, {{1, 2}, {1, 3}} -> {{1, 4}, {1, 5}, {6, 
    4}}, {{1, 2}, {1, 3}} -> {{1, 4}, {2, 5}, {6, 3}}, {{1, 2}, {1, 
    3}} -> {{1, 4}, {4, 5}, {6, 2}}, {{1, 2}, {1, 3}} -> {{1, 4}, {4, 
    5}, {6, 4}}, {{1, 2}, {1, 3}} -> {{1, 4}, {4, 5}, {6, 5}}, {{1, 
    2}, {1, 3}} -> {{2, 4}, {2, 5}, {6, 1}}, {{1, 2}, {1, 3}} -> {{2, 
    4}, {2, 5}, {6, 2}}, {{1, 2}, {1, 3}} -> {{2, 4}, {2, 5}, {6, 
    3}}, {{1, 2}, {1, 3}} -> {{2, 4}, {2, 5}, {6, 4}}, {{1, 2}, {1, 
    3}} -> {{2, 4}, {3, 5}, {6, 1}}, {{1, 2}, {1, 3}} -> {{2, 4}, {4, 
    5}, {6, 1}}, {{1, 2}, {1, 3}} -> {{2, 4}, {4, 5}, {6, 3}}, {{1, 
    2}, {1, 3}} -> {{2, 4}, {4, 5}, {6, 4}}, {{1, 2}, {1, 3}} -> {{2, 
    4}, {4, 5}, {6, 5}}, {{1, 2}, {2, 3}} -> {{1, 4}, {1, 5}, {6, 
    1}}, {{1, 2}, {2, 3}} -> {{1, 4}, {1, 5}, {6, 2}}, {{1, 2}, {2, 
    3}} -> {{1, 4}, {1, 5}, {6, 3}}, {{1, 2}, {2, 3}} -> {{1, 4}, {1, 
    5}, {6, 4}}, {{1, 2}, {2, 3}} -> {{1, 4}, {2, 5}, {6, 3}}, {{1, 
    2}, {2, 3}} -> {{1, 4}, {3, 5}, {6, 2}}, {{1, 2}, {2, 3}} -> {{1, 
    4}, {4, 5}, {6, 2}}, {{1, 2}, {2, 3}} -> {{1, 4}, {4, 5}, {6, 
    3}}, {{1, 2}, {2, 3}} -> {{1, 4}, {4, 5}, {6, 4}}, {{1, 2}, {2, 
    3}} -> {{1, 4}, {4, 5}, {6, 5}}, {{1, 2}, {2, 3}} -> {{2, 4}, {2, 
    5}, {6, 1}}, {{1, 2}, {2, 3}} -> {{2, 4}, {2, 5}, {6, 2}}, {{1, 
    2}, {2, 3}} -> {{2, 4}, {2, 5}, {6, 3}}, {{1, 2}, {2, 3}} -> {{2, 
    4}, {2, 5}, {6, 4}}, {{1, 2}, {2, 3}} -> {{2, 4}, {3, 5}, {6, 
    1}}, {{1, 2}, {2, 3}} -> {{2, 4}, {4, 5}, {6, 1}}, {{1, 2}, {2, 
    3}} -> {{2, 4}, {4, 5}, {6, 3}}, {{1, 2}, {2, 3}} -> {{2, 4}, {4, 
    5}, {6, 4}}, {{1, 2}, {2, 3}} -> {{2, 4}, {4, 5}, {6, 5}}, {{1, 
    2}, {2, 3}} -> {{3, 4}, {3, 5}, {6, 1}}, {{1, 2}, {2, 3}} -> {{3, 
    4}, {3, 5}, {6, 2}}, {{1, 2}, {2, 3}} -> {{3, 4}, {3, 5}, {6, 
    3}}, {{1, 2}, {2, 3}} -> {{3, 4}, {3, 5}, {6, 4}}, {{1, 2}, {2, 
    3}} -> {{3, 4}, {4, 5}, {6, 1}}, {{1, 2}, {2, 3}} -> {{3, 4}, {4, 
    5}, {6, 2}}, {{1, 2}, {2, 3}} -> {{3, 4}, {4, 5}, {6, 4}}, {{1, 
    2}, {2, 3}} -> {{3, 4}, {4, 5}, {6, 5}}, {{1, 2}, {1, 3}} -> {{1, 
    4}, {5, 4}, {2, 3}}, {{1, 2}, {1, 3}} -> {{2, 4}, {5, 4}, {1, 
    3}}, {{1, 2}, {1, 3}} -> {{2, 4}, {5, 4}, {3, 1}}, {{1, 2}, {2, 
    3}} -> {{1, 4}, {5, 4}, {2, 3}}, {{1, 2}, {2, 3}} -> {{1, 4}, {5, 
    4}, {3, 2}}, {{1, 2}, {2, 3}} -> {{2, 4}, {5, 4}, {1, 3}}, {{1, 
    2}, {2, 3}} -> {{2, 4}, {5, 4}, {3, 1}}, {{1, 2}, {2, 3}} -> {{3, 
    4}, {5, 4}, {1, 2}}, {{1, 2}, {2, 3}} -> {{3, 4}, {5, 4}, {2, 
    1}}, {{1, 2}, {1, 3}} -> {{1, 4}, {5, 4}, {2, 6}}, {{1, 2}, {1, 
    3}} -> {{2, 4}, {5, 4}, {1, 6}}, {{1, 2}, {1, 3}} -> {{2, 4}, {5, 
    4}, {3, 6}}, {{1, 2}, {2, 3}} -> {{1, 4}, {5, 4}, {2, 6}}, {{1, 
    2}, {2, 3}} -> {{1, 4}, {5, 4}, {3, 6}}, {{1, 2}, {2, 3}} -> {{2, 
    4}, {5, 4}, {1, 6}}, {{1, 2}, {2, 3}} -> {{2, 4}, {5, 4}, {3, 
    6}}, {{1, 2}, {2, 3}} -> {{3, 4}, {5, 4}, {1, 6}}, {{1, 2}, {2, 
    3}} -> {{3, 4}, {5, 4}, {2, 6}}, {{1, 2}, {1, 3}} -> {{1, 4}, {5, 
    2}, {6, 3}}, {{1, 2}, {1, 3}} -> {{1, 4}, {5, 4}, {6, 2}}, {{1, 
    2}, {1, 3}} -> {{1, 4}, {5, 4}, {6, 4}}, {{1, 2}, {1, 3}} -> {{2, 
    4}, {5, 1}, {6, 3}}, {{1, 2}, {1, 3}} -> {{2, 4}, {5, 4}, {6, 
    1}}, {{1, 2}, {1, 3}} -> {{2, 4}, {5, 4}, {6, 3}}, {{1, 2}, {1, 
    3}} -> {{2, 4}, {5, 4}, {6, 4}}, {{1, 2}, {2, 3}} -> {{1, 4}, {5, 
    2}, {6, 3}}, {{1, 2}, {2, 3}} -> {{1, 4}, {5, 4}, {6, 2}}, {{1, 
    2}, {2, 3}} -> {{1, 4}, {5, 4}, {6, 3}}, {{1, 2}, {2, 3}} -> {{1, 
    4}, {5, 4}, {6, 4}}, {{1, 2}, {2, 3}} -> {{2, 4}, {5, 1}, {6, 
    3}}, {{1, 2}, {2, 3}} -> {{2, 4}, {5, 4}, {6, 1}}, {{1, 2}, {2, 
    3}} -> {{2, 4}, {5, 4}, {6, 3}}, {{1, 2}, {2, 3}} -> {{2, 4}, {5, 
    4}, {6, 4}}, {{1, 2}, {2, 3}} -> {{3, 4}, {5, 1}, {6, 2}}, {{1, 
    2}, {2, 3}} -> {{3, 4}, {5, 4}, {6, 1}}, {{1, 2}, {2, 3}} -> {{3, 
    4}, {5, 4}, {6, 2}}, {{1, 2}, {2, 3}} -> {{3, 4}, {5, 4}, {6, 
    4}}, {{1, 2}, {1, 3}} -> {{4, 1}, {1, 2}, {2, 3}}, {{1, 2}, {1, 
    3}} -> {{4, 1}, {1, 2}, {3, 2}}, {{1, 2}, {1, 3}} -> {{4, 1}, {1, 
    4}, {2, 4}}, {{1, 2}, {1, 3}} -> {{4, 1}, {1, 4}, {4, 2}}, {{1, 
    2}, {1, 3}} -> {{4, 1}, {4, 1}, {1, 2}}, {{1, 2}, {1, 3}} -> {{4, 
    1}, {4, 1}, {1, 4}}, {{1, 2}, {1, 3}} -> {{4, 1}, {4, 1}, {2, 
    1}}, {{1, 2}, {1, 3}} -> {{4, 1}, {4, 1}, {2, 3}}, {{1, 2}, {1, 
    3}} -> {{4, 1}, {4, 1}, {2, 4}}, {{1, 2}, {1, 3}} -> {{4, 1}, {4, 
    1}, {4, 1}}, {{1, 2}, {1, 3}} -> {{4, 1}, {4, 1}, {4, 2}}, {{1, 
    2}, {1, 3}} -> {{4, 1}, {4, 2}, {1, 2}}, {{1, 2}, {1, 3}} -> {{4, 
    1}, {4, 2}, {1, 3}}, {{1, 2}, {1, 3}} -> {{4, 1}, {4, 2}, {3, 
    1}}, {{1, 2}, {1, 3}} -> {{4, 1}, {4, 2}, {3, 4}}, {{1, 2}, {1, 
    3}} -> {{4, 1}, {4, 2}, {4, 3}}, {{1, 2}, {1, 3}} -> {{4, 2}, {2, 
    1}, {1, 3}}, {{1, 2}, {1, 3}} -> {{4, 2}, {2, 1}, {3, 1}}, {{1, 
    2}, {1, 3}} -> {{4, 2}, {2, 3}, {1, 3}}, {{1, 2}, {1, 3}} -> {{4, 
    2}, {2, 3}, {3, 1}}, {{1, 2}, {1, 3}} -> {{4, 2}, {2, 4}, {1, 
    4}}, {{1, 2}, {1, 3}} -> {{4, 2}, {2, 4}, {3, 4}}, {{1, 2}, {1, 
    3}} -> {{4, 2}, {2, 4}, {4, 1}}, {{1, 2}, {1, 3}} -> {{4, 2}, {2, 
    4}, {4, 3}}, {{1, 2}, {1, 3}} -> {{4, 2}, {4, 1}, {2, 1}}, {{1, 
    2}, {1, 3}} -> {{4, 2}, {4, 1}, {2, 3}}, {{1, 2}, {1, 3}} -> {{4, 
    2}, {4, 1}, {3, 2}}, {{1, 2}, {1, 3}} -> {{4, 2}, {4, 2}, {1, 
    2}}, {{1, 2}, {1, 3}} -> {{4, 2}, {4, 2}, {1, 3}}, {{1, 2}, {1, 
    3}} -> {{4, 2}, {4, 2}, {1, 4}}, {{1, 2}, {1, 3}} -> {{4, 2}, {4, 
    2}, {2, 1}}, {{1, 2}, {1, 3}} -> {{4, 2}, {4, 2}, {2, 3}}, {{1, 
    2}, {1, 3}} -> {{4, 2}, {4, 2}, {2, 4}}, {{1, 2}, {1, 3}} -> {{4, 
    2}, {4, 2}, {3, 1}}, {{1, 2}, {1, 3}} -> {{4, 2}, {4, 2}, {3, 
    2}}, {{1, 2}, {1, 3}} -> {{4, 2}, {4, 2}, {3, 4}}, {{1, 2}, {1, 
    3}} -> {{4, 2}, {4, 2}, {4, 1}}, {{1, 2}, {1, 3}} -> {{4, 2}, {4, 
    2}, {4, 2}}, {{1, 2}, {1, 3}} -> {{4, 2}, {4, 2}, {4, 3}}, {{1, 
    2}, {1, 3}} -> {{4, 2}, {4, 3}, {1, 2}}, {{1, 2}, {1, 3}} -> {{4, 
    2}, {4, 3}, {1, 4}}, {{1, 2}, {1, 3}} -> {{4, 2}, {4, 3}, {2, 
    1}}, {{1, 2}, {1, 3}} -> {{4, 2}, {4, 3}, {2, 3}}, {{1, 2}, {1, 
    3}} -> {{4, 4}, {1, 4}, {1, 2}}, {{1, 2}, {1, 3}} -> {{4, 4}, {1, 
    4}, {1, 4}}, {{1, 2}, {1, 3}} -> {{4, 4}, {1, 4}, {2, 1}}, {{1, 
    2}, {1, 3}} -> {{4, 4}, {1, 4}, {2, 2}}, {{1, 2}, {1, 3}} -> {{4, 
    4}, {1, 4}, {2, 3}}, {{1, 2}, {1, 3}} -> {{4, 4}, {1, 4}, {2, 
    4}}, {{1, 2}, {1, 3}} -> {{4, 4}, {2, 4}, {1, 1}}, {{1, 2}, {1, 
    3}} -> {{4, 4}, {2, 4}, {1, 2}}, {{1, 2}, {1, 3}} -> {{4, 4}, {2, 
    4}, {1, 3}}, {{1, 2}, {1, 3}} -> {{4, 4}, {2, 4}, {2, 1}}, {{1, 
    2}, {1, 3}} -> {{4, 4}, {2, 4}, {2, 3}}, {{1, 2}, {1, 3}} -> {{4, 
    4}, {2, 4}, {2, 4}}, {{1, 2}, {1, 3}} -> {{4, 4}, {2, 4}, {3, 
    1}}, {{1, 2}, {1, 3}} -> {{4, 4}, {2, 4}, {3, 2}}, {{1, 2}, {1, 
    3}} -> {{4, 4}, {2, 4}, {3, 3}}, {{1, 2}, {1, 3}} -> {{4, 4}, {2, 
    4}, {3, 4}}, {{1, 2}, {1, 3}} -> {{4, 4}, {4, 1}, {1, 1}}, {{1, 
    2}, {1, 3}} -> {{4, 4}, {4, 1}, {1, 2}}, {{1, 2}, {1, 3}} -> {{4, 
    4}, {4, 1}, {1, 4}}, {{1, 2}, {1, 3}} -> {{4, 4}, {4, 1}, {2, 
    1}}, {{1, 2}, {1, 3}} -> {{4, 4}, {4, 1}, {2, 2}}, {{1, 2}, {1, 
    3}} -> {{4, 4}, {4, 1}, {2, 3}}, {{1, 2}, {1, 3}} -> {{4, 4}, {4, 
    1}, {2, 4}}, {{1, 2}, {1, 3}} -> {{4, 4}, {4, 1}, {4, 1}}, {{1, 
    2}, {1, 3}} -> {{4, 4}, {4, 1}, {4, 2}}, {{1, 2}, {1, 3}} -> {{4, 
    4}, {4, 2}, {1, 1}}, {{1, 2}, {1, 3}} -> {{4, 4}, {4, 2}, {1, 
    2}}, {{1, 2}, {1, 3}} -> {{4, 4}, {4, 2}, {1, 3}}, {{1, 2}, {1, 
    3}} -> {{4, 4}, {4, 2}, {1, 4}}, {{1, 2}, {1, 3}} -> {{4, 4}, {4, 
    2}, {2, 1}}, {{1, 2}, {1, 3}} -> {{4, 4}, {4, 2}, {2, 2}}, {{1, 
    2}, {1, 3}} -> {{4, 4}, {4, 2}, {2, 3}}, {{1, 2}, {1, 3}} -> {{4, 
    4}, {4, 2}, {2, 4}}, {{1, 2}, {1, 3}} -> {{4, 4}, {4, 2}, {3, 
    1}}, {{1, 2}, {1, 3}} -> {{4, 4}, {4, 2}, {3, 2}}, {{1, 2}, {1, 
    3}} -> {{4, 4}, {4, 2}, {3, 3}}, {{1, 2}, {1, 3}} -> {{4, 4}, {4, 
    2}, {3, 4}}, {{1, 2}, {1, 3}} -> {{4, 4}, {4, 2}, {4, 2}}, {{1, 
    2}, {1, 3}} -> {{4, 4}, {4, 2}, {4, 3}}, {{1, 2}, {1, 3}} -> {{4, 
    4}, {4, 4}, {1, 4}}, {{1, 2}, {1, 3}} -> {{4, 4}, {4, 4}, {2, 
    4}}, {{1, 2}, {1, 3}} -> {{4, 4}, {4, 4}, {4, 1}}, {{1, 2}, {1, 
    3}} -> {{4, 4}, {4, 4}, {4, 2}}, {{1, 2}, {2, 3}} -> {{4, 1}, {1, 
    2}, {2, 3}}, {{1, 2}, {2, 3}} -> {{4, 1}, {1, 2}, {3, 2}}, {{1, 
    2}, {2, 3}} -> {{4, 1}, {1, 3}, {2, 3}}, {{1, 2}, {2, 3}} -> {{4, 
    1}, {1, 3}, {3, 2}}, {{1, 2}, {2, 3}} -> {{4, 1}, {1, 4}, {2, 
    4}}, {{1, 2}, {2, 3}} -> {{4, 1}, {1, 4}, {3, 4}}, {{1, 2}, {2, 
    3}} -> {{4, 1}, {1, 4}, {4, 2}}, {{1, 2}, {2, 3}} -> {{4, 1}, {1, 
    4}, {4, 3}}, {{1, 2}, {2, 3}} -> {{4, 1}, {4, 1}, {1, 2}}, {{1, 
    2}, {2, 3}} -> {{4, 1}, {4, 1}, {1, 3}}, {{1, 2}, {2, 3}} -> {{4, 
    1}, {4, 1}, {1, 4}}, {{1, 2}, {2, 3}} -> {{4, 1}, {4, 1}, {2, 
    1}}, {{1, 2}, {2, 3}} -> {{4, 1}, {4, 1}, {2, 3}}, {{1, 2}, {2, 
    3}} -> {{4, 1}, {4, 1}, {2, 4}}, {{1, 2}, {2, 3}} -> {{4, 1}, {4, 
    1}, {3, 1}}, {{1, 2}, {2, 3}} -> {{4, 1}, {4, 1}, {3, 2}}, {{1, 
    2}, {2, 3}} -> {{4, 1}, {4, 1}, {3, 4}}, {{1, 2}, {2, 3}} -> {{4, 
    1}, {4, 1}, {4, 1}}, {{1, 2}, {2, 3}} -> {{4, 1}, {4, 1}, {4, 
    2}}, {{1, 2}, {2, 3}} -> {{4, 1}, {4, 1}, {4, 3}}, {{1, 2}, {2, 
    3}} -> {{4, 1}, {4, 2}, {1, 2}}, {{1, 2}, {2, 3}} -> {{4, 1}, {4, 
    2}, {1, 3}}, {{1, 2}, {2, 3}} -> {{4, 1}, {4, 2}, {3, 1}}, {{1, 
    2}, {2, 3}} -> {{4, 1}, {4, 2}, {3, 4}}, {{1, 2}, {2, 3}} -> {{4, 
    1}, {4, 2}, {4, 3}}, {{1, 2}, {2, 3}} -> {{4, 1}, {4, 3}, {1, 
    2}}, {{1, 2}, {2, 3}} -> {{4, 1}, {4, 3}, {1, 3}}, {{1, 2}, {2, 
    3}} -> {{4, 1}, {4, 3}, {2, 1}}, {{1, 2}, {2, 3}} -> {{4, 1}, {4, 
    3}, {2, 4}}, {{1, 2}, {2, 3}} -> {{4, 2}, {2, 1}, {1, 3}}, {{1, 
    2}, {2, 3}} -> {{4, 2}, {2, 1}, {3, 1}}, {{1, 2}, {2, 3}} -> {{4, 
    2}, {2, 3}, {1, 3}}, {{1, 2}, {2, 3}} -> {{4, 2}, {2, 3}, {3, 
    1}}, {{1, 2}, {2, 3}} -> {{4, 2}, {2, 4}, {1, 4}}, {{1, 2}, {2, 
    3}} -> {{4, 2}, {2, 4}, {3, 4}}, {{1, 2}, {2, 3}} -> {{4, 2}, {2, 
    4}, {4, 1}}, {{1, 2}, {2, 3}} -> {{4, 2}, {2, 4}, {4, 3}}, {{1, 
    2}, {2, 3}} -> {{4, 2}, {4, 1}, {2, 1}}, {{1, 2}, {2, 3}} -> {{4, 
    2}, {4, 1}, {2, 3}}, {{1, 2}, {2, 3}} -> {{4, 2}, {4, 1}, {3, 
    2}}, {{1, 2}, {2, 3}} -> {{4, 2}, {4, 2}, {1, 2}}, {{1, 2}, {2, 
    3}} -> {{4, 2}, {4, 2}, {1, 3}}, {{1, 2}, {2, 3}} -> {{4, 2}, {4, 
    2}, {1, 4}}, {{1, 2}, {2, 3}} -> {{4, 2}, {4, 2}, {2, 1}}, {{1, 
    2}, {2, 3}} -> {{4, 2}, {4, 2}, {2, 3}}, {{1, 2}, {2, 3}} -> {{4, 
    2}, {4, 2}, {2, 4}}, {{1, 2}, {2, 3}} -> {{4, 2}, {4, 2}, {3, 
    1}}, {{1, 2}, {2, 3}} -> {{4, 2}, {4, 2}, {3, 2}}, {{1, 2}, {2, 
    3}} -> {{4, 2}, {4, 2}, {3, 4}}, {{1, 2}, {2, 3}} -> {{4, 2}, {4, 
    2}, {4, 1}}, {{1, 2}, {2, 3}} -> {{4, 2}, {4, 2}, {4, 2}}, {{1, 
    2}, {2, 3}} -> {{4, 2}, {4, 2}, {4, 3}}, {{1, 2}, {2, 3}} -> {{4, 
    2}, {4, 3}, {1, 2}}, {{1, 2}, {2, 3}} -> {{4, 2}, {4, 3}, {1, 
    4}}, {{1, 2}, {2, 3}} -> {{4, 2}, {4, 3}, {2, 1}}, {{1, 2}, {2, 
    3}} -> {{4, 2}, {4, 3}, {2, 3}}, {{1, 2}, {2, 3}} -> {{4, 3}, {3, 
    1}, {1, 2}}, {{1, 2}, {2, 3}} -> {{4, 3}, {3, 1}, {2, 1}}, {{1, 
    2}, {2, 3}} -> {{4, 3}, {3, 2}, {1, 2}}, {{1, 2}, {2, 3}} -> {{4, 
    3}, {3, 2}, {2, 1}}, {{1, 2}, {2, 3}} -> {{4, 3}, {3, 4}, {1, 
    4}}, {{1, 2}, {2, 3}} -> {{4, 3}, {3, 4}, {2, 4}}, {{1, 2}, {2, 
    3}} -> {{4, 3}, {3, 4}, {4, 1}}, {{1, 2}, {2, 3}} -> {{4, 3}, {3, 
    4}, {4, 2}}, {{1, 2}, {2, 3}} -> {{4, 3}, {4, 1}, {2, 3}}, {{1, 
    2}, {2, 3}} -> {{4, 3}, {4, 1}, {3, 1}}, {{1, 2}, {2, 3}} -> {{4, 
    3}, {4, 1}, {3, 2}}, {{1, 2}, {2, 3}} -> {{4, 3}, {4, 2}, {1, 
    3}}, {{1, 2}, {2, 3}} -> {{4, 3}, {4, 2}, {3, 1}}, {{1, 2}, {2, 
    3}} -> {{4, 3}, {4, 2}, {3, 2}}, {{1, 2}, {2, 3}} -> {{4, 3}, {4, 
    3}, {1, 2}}, {{1, 2}, {2, 3}} -> {{4, 3}, {4, 3}, {1, 3}}, {{1, 
    2}, {2, 3}} -> {{4, 3}, {4, 3}, {1, 4}}, {{1, 2}, {2, 3}} -> {{4, 
    3}, {4, 3}, {2, 1}}, {{1, 2}, {2, 3}} -> {{4, 3}, {4, 3}, {2, 
    3}}, {{1, 2}, {2, 3}} -> {{4, 3}, {4, 3}, {2, 4}}, {{1, 2}, {2, 
    3}} -> {{4, 3}, {4, 3}, {3, 1}}, {{1, 2}, {2, 3}} -> {{4, 3}, {4, 
    3}, {3, 2}}, {{1, 2}, {2, 3}} -> {{4, 3}, {4, 3}, {3, 4}}, {{1, 
    2}, {2, 3}} -> {{4, 3}, {4, 3}, {4, 1}}, {{1, 2}, {2, 3}} -> {{4, 
    3}, {4, 3}, {4, 2}}, {{1, 2}, {2, 3}} -> {{4, 3}, {4, 3}, {4, 
    3}}, {{1, 2}, {2, 3}} -> {{4, 4}, {1, 4}, {1, 2}}, {{1, 2}, {2, 
    3}} -> {{4, 4}, {1, 4}, {1, 3}}, {{1, 2}, {2, 3}} -> {{4, 4}, {1, 
    4}, {1, 4}}, {{1, 2}, {2, 3}} -> {{4, 4}, {1, 4}, {2, 1}}, {{1, 
    2}, {2, 3}} -> {{4, 4}, {1, 4}, {2, 2}}, {{1, 2}, {2, 3}} -> {{4, 
    4}, {1, 4}, {2, 3}}, {{1, 2}, {2, 3}} -> {{4, 4}, {1, 4}, {2, 
    4}}, {{1, 2}, {2, 3}} -> {{4, 4}, {1, 4}, {3, 1}}, {{1, 2}, {2, 
    3}} -> {{4, 4}, {1, 4}, {3, 2}}, {{1, 2}, {2, 3}} -> {{4, 4}, {1, 
    4}, {3, 3}}, {{1, 2}, {2, 3}} -> {{4, 4}, {1, 4}, {3, 4}}, {{1, 
    2}, {2, 3}} -> {{4, 4}, {2, 4}, {1, 1}}, {{1, 2}, {2, 3}} -> {{4, 
    4}, {2, 4}, {1, 2}}, {{1, 2}, {2, 3}} -> {{4, 4}, {2, 4}, {1, 
    3}}, {{1, 2}, {2, 3}} -> {{4, 4}, {2, 4}, {2, 1}}, {{1, 2}, {2, 
    3}} -> {{4, 4}, {2, 4}, {2, 3}}, {{1, 2}, {2, 3}} -> {{4, 4}, {2, 
    4}, {2, 4}}, {{1, 2}, {2, 3}} -> {{4, 4}, {2, 4}, {3, 1}}, {{1, 
    2}, {2, 3}} -> {{4, 4}, {2, 4}, {3, 2}}, {{1, 2}, {2, 3}} -> {{4, 
    4}, {2, 4}, {3, 3}}, {{1, 2}, {2, 3}} -> {{4, 4}, {2, 4}, {3, 
    4}}, {{1, 2}, {2, 3}} -> {{4, 4}, {3, 4}, {1, 1}}, {{1, 2}, {2, 
    3}} -> {{4, 4}, {3, 4}, {1, 2}}, {{1, 2}, {2, 3}} -> {{4, 4}, {3, 
    4}, {1, 3}}, {{1, 2}, {2, 3}} -> {{4, 4}, {3, 4}, {2, 1}}, {{1, 
    2}, {2, 3}} -> {{4, 4}, {3, 4}, {2, 2}}, {{1, 2}, {2, 3}} -> {{4, 
    4}, {3, 4}, {2, 3}}, {{1, 2}, {2, 3}} -> {{4, 4}, {3, 4}, {3, 
    1}}, {{1, 2}, {2, 3}} -> {{4, 4}, {3, 4}, {3, 2}}, {{1, 2}, {2, 
    3}} -> {{4, 4}, {3, 4}, {3, 4}}, {{1, 2}, {2, 3}} -> {{4, 4}, {4, 
    1}, {1, 1}}, {{1, 2}, {2, 3}} -> {{4, 4}, {4, 1}, {1, 2}}, {{1, 
    2}, {2, 3}} -> {{4, 4}, {4, 1}, {1, 3}}, {{1, 2}, {2, 3}} -> {{4, 
    4}, {4, 1}, {1, 4}}, {{1, 2}, {2, 3}} -> {{4, 4}, {4, 1}, {2, 
    1}}, {{1, 2}, {2, 3}} -> {{4, 4}, {4, 1}, {2, 2}}, {{1, 2}, {2, 
    3}} -> {{4, 4}, {4, 1}, {2, 3}}, {{1, 2}, {2, 3}} -> {{4, 4}, {4, 
    1}, {2, 4}}, {{1, 2}, {2, 3}} -> {{4, 4}, {4, 1}, {3, 1}}, {{1, 
    2}, {2, 3}} -> {{4, 4}, {4, 1}, {3, 2}}, {{1, 2}, {2, 3}} -> {{4, 
    4}, {4, 1}, {3, 3}}, {{1, 2}, {2, 3}} -> {{4, 4}, {4, 1}, {3, 
    4}}, {{1, 2}, {2, 3}} -> {{4, 4}, {4, 1}, {4, 1}}, {{1, 2}, {2, 
    3}} -> {{4, 4}, {4, 1}, {4, 2}}, {{1, 2}, {2, 3}} -> {{4, 4}, {4, 
    1}, {4, 3}}, {{1, 2}, {2, 3}} -> {{4, 4}, {4, 2}, {1, 1}}, {{1, 
    2}, {2, 3}} -> {{4, 4}, {4, 2}, {1, 2}}, {{1, 2}, {2, 3}} -> {{4, 
    4}, {4, 2}, {1, 3}}, {{1, 2}, {2, 3}} -> {{4, 4}, {4, 2}, {1, 
    4}}, {{1, 2}, {2, 3}} -> {{4, 4}, {4, 2}, {2, 1}}, {{1, 2}, {2, 
    3}} -> {{4, 4}, {4, 2}, {2, 2}}, {{1, 2}, {2, 3}} -> {{4, 4}, {4, 
    2}, {2, 3}}, {{1, 2}, {2, 3}} -> {{4, 4}, {4, 2}, {2, 4}}, {{1, 
    2}, {2, 3}} -> {{4, 4}, {4, 2}, {3, 1}}, {{1, 2}, {2, 3}} -> {{4, 
    4}, {4, 2}, {3, 2}}, {{1, 2}, {2, 3}} -> {{4, 4}, {4, 2}, {3, 
    3}}, {{1, 2}, {2, 3}} -> {{4, 4}, {4, 2}, {3, 4}}, {{1, 2}, {2, 
    3}} -> {{4, 4}, {4, 2}, {4, 2}}, {{1, 2}, {2, 3}} -> {{4, 4}, {4, 
    2}, {4, 3}}, {{1, 2}, {2, 3}} -> {{4, 4}, {4, 3}, {1, 1}}, {{1, 
    2}, {2, 3}} -> {{4, 4}, {4, 3}, {1, 2}}, {{1, 2}, {2, 3}} -> {{4, 
    4}, {4, 3}, {1, 3}}, {{1, 2}, {2, 3}} -> {{4, 4}, {4, 3}, {1, 
    4}}, {{1, 2}, {2, 3}} -> {{4, 4}, {4, 3}, {2, 1}}, {{1, 2}, {2, 
    3}} -> {{4, 4}, {4, 3}, {2, 2}}, {{1, 2}, {2, 3}} -> {{4, 4}, {4, 
    3}, {2, 3}}, {{1, 2}, {2, 3}} -> {{4, 4}, {4, 3}, {2, 4}}, {{1, 
    2}, {2, 3}} -> {{4, 4}, {4, 3}, {3, 1}}, {{1, 2}, {2, 3}} -> {{4, 
    4}, {4, 3}, {3, 2}}, {{1, 2}, {2, 3}} -> {{4, 4}, {4, 3}, {3, 
    3}}, {{1, 2}, {2, 3}} -> {{4, 4}, {4, 3}, {3, 4}}, {{1, 2}, {2, 
    3}} -> {{4, 4}, {4, 3}, {4, 3}}, {{1, 2}, {2, 3}} -> {{4, 4}, {4, 
    4}, {1, 4}}, {{1, 2}, {2, 3}} -> {{4, 4}, {4, 4}, {2, 4}}, {{1, 
    2}, {2, 3}} -> {{4, 4}, {4, 4}, {3, 4}}, {{1, 2}, {2, 3}} -> {{4, 
    4}, {4, 4}, {4, 1}}, {{1, 2}, {2, 3}} -> {{4, 4}, {4, 4}, {4, 
    2}}, {{1, 2}, {2, 3}} -> {{4, 4}, {4, 4}, {4, 3}}, {{1, 2}, {1, 
    3}} -> {{4, 1}, {1, 2}, {2, 5}}, {{1, 2}, {1, 3}} -> {{4, 1}, {1, 
    2}, {3, 5}}, {{1, 2}, {1, 3}} -> {{4, 1}, {1, 4}, {4, 5}}, {{1, 
    2}, {1, 3}} -> {{4, 1}, {4, 1}, {1, 5}}, {{1, 2}, {1, 3}} -> {{4, 
    1}, {4, 1}, {2, 5}}, {{1, 2}, {1, 3}} -> {{4, 1}, {4, 1}, {4, 
    5}}, {{1, 2}, {1, 3}} -> {{4, 1}, {4, 2}, {1, 5}}, {{1, 2}, {1, 
    3}} -> {{4, 1}, {4, 2}, {3, 5}}, {{1, 2}, {1, 3}} -> {{4, 1}, {4, 
    2}, {4, 5}}, {{1, 2}, {1, 3}} -> {{4, 2}, {2, 1}, {1, 5}}, {{1, 
    2}, {1, 3}} -> {{4, 2}, {2, 1}, {3, 5}}, {{1, 2}, {1, 3}} -> {{4, 
    2}, {2, 3}, {1, 5}}, {{1, 2}, {1, 3}} -> {{4, 2}, {2, 3}, {3, 
    5}}, {{1, 2}, {1, 3}} -> {{4, 2}, {2, 4}, {4, 5}}, {{1, 2}, {1, 
    3}} -> {{4, 2}, {4, 1}, {2, 5}}, {{1, 2}, {1, 3}} -> {{4, 2}, {4, 
    2}, {1, 5}}, {{1, 2}, {1, 3}} -> {{4, 2}, {4, 2}, {2, 5}}, {{1, 
    2}, {1, 3}} -> {{4, 2}, {4, 2}, {3, 5}}, {{1, 2}, {1, 3}} -> {{4, 
    2}, {4, 2}, {4, 5}}, {{1, 2}, {1, 3}} -> {{4, 2}, {4, 3}, {1, 
    5}}, {{1, 2}, {1, 3}} -> {{4, 2}, {4, 3}, {2, 5}}, {{1, 2}, {1, 
    3}} -> {{4, 2}, {4, 3}, {4, 5}}, {{1, 2}, {1, 3}} -> {{4, 4}, {1, 
    4}, {1, 5}}, {{1, 2}, {1, 3}} -> {{4, 4}, {1, 4}, {2, 5}}, {{1, 
    2}, {1, 3}} -> {{4, 4}, {2, 4}, {1, 5}}, {{1, 2}, {1, 3}} -> {{4, 
    4}, {2, 4}, {2, 5}}, {{1, 2}, {1, 3}} -> {{4, 4}, {2, 4}, {3, 
    5}}, {{1, 2}, {1, 3}} -> {{4, 4}, {4, 1}, {1, 5}}, {{1, 2}, {1, 
    3}} -> {{4, 4}, {4, 1}, {2, 5}}, {{1, 2}, {1, 3}} -> {{4, 4}, {4, 
    1}, {4, 5}}, {{1, 2}, {1, 3}} -> {{4, 4}, {4, 2}, {1, 5}}, {{1, 
    2}, {1, 3}} -> {{4, 4}, {4, 2}, {2, 5}}, {{1, 2}, {1, 3}} -> {{4, 
    4}, {4, 2}, {3, 5}}, {{1, 2}, {1, 3}} -> {{4, 4}, {4, 2}, {4, 
    5}}, {{1, 2}, {2, 3}} -> {{4, 1}, {1, 2}, {2, 5}}, {{1, 2}, {2, 
    3}} -> {{4, 1}, {1, 2}, {3, 5}}, {{1, 2}, {2, 3}} -> {{4, 1}, {1, 
    3}, {2, 5}}, {{1, 2}, {2, 3}} -> {{4, 1}, {1, 3}, {3, 5}}, {{1, 
    2}, {2, 3}} -> {{4, 1}, {1, 4}, {4, 5}}, {{1, 2}, {2, 3}} -> {{4, 
    1}, {4, 1}, {1, 5}}, {{1, 2}, {2, 3}} -> {{4, 1}, {4, 1}, {2, 
    5}}, {{1, 2}, {2, 3}} -> {{4, 1}, {4, 1}, {3, 5}}, {{1, 2}, {2, 
    3}} -> {{4, 1}, {4, 1}, {4, 5}}, {{1, 2}, {2, 3}} -> {{4, 1}, {4, 
    2}, {1, 5}}, {{1, 2}, {2, 3}} -> {{4, 1}, {4, 2}, {3, 5}}, {{1, 
    2}, {2, 3}} -> {{4, 1}, {4, 2}, {4, 5}}, {{1, 2}, {2, 3}} -> {{4, 
    1}, {4, 3}, {1, 5}}, {{1, 2}, {2, 3}} -> {{4, 1}, {4, 3}, {2, 
    5}}, {{1, 2}, {2, 3}} -> {{4, 1}, {4, 3}, {4, 5}}, {{1, 2}, {2, 
    3}} -> {{4, 2}, {2, 1}, {1, 5}}, {{1, 2}, {2, 3}} -> {{4, 2}, {2, 
    1}, {3, 5}}, {{1, 2}, {2, 3}} -> {{4, 2}, {2, 3}, {1, 5}}, {{1, 
    2}, {2, 3}} -> {{4, 2}, {2, 3}, {3, 5}}, {{1, 2}, {2, 3}} -> {{4, 
    2}, {2, 4}, {4, 5}}, {{1, 2}, {2, 3}} -> {{4, 2}, {4, 1}, {2, 
    5}}, {{1, 2}, {2, 3}} -> {{4, 2}, {4, 2}, {1, 5}}, {{1, 2}, {2, 
    3}} -> {{4, 2}, {4, 2}, {2, 5}}, {{1, 2}, {2, 3}} -> {{4, 2}, {4, 
    2}, {3, 5}}, {{1, 2}, {2, 3}} -> {{4, 2}, {4, 2}, {4, 5}}, {{1, 
    2}, {2, 3}} -> {{4, 2}, {4, 3}, {1, 5}}, {{1, 2}, {2, 3}} -> {{4, 
    2}, {4, 3}, {2, 5}}, {{1, 2}, {2, 3}} -> {{4, 2}, {4, 3}, {4, 
    5}}, {{1, 2}, {2, 3}} -> {{4, 3}, {3, 1}, {1, 5}}, {{1, 2}, {2, 
    3}} -> {{4, 3}, {3, 1}, {2, 5}}, {{1, 2}, {2, 3}} -> {{4, 3}, {3, 
    2}, {1, 5}}, {{1, 2}, {2, 3}} -> {{4, 3}, {3, 2}, {2, 5}}, {{1, 
    2}, {2, 3}} -> {{4, 3}, {3, 4}, {4, 5}}, {{1, 2}, {2, 3}} -> {{4, 
    3}, {4, 1}, {3, 5}}, {{1, 2}, {2, 3}} -> {{4, 3}, {4, 2}, {3, 
    5}}, {{1, 2}, {2, 3}} -> {{4, 3}, {4, 3}, {1, 5}}, {{1, 2}, {2, 
    3}} -> {{4, 3}, {4, 3}, {2, 5}}, {{1, 2}, {2, 3}} -> {{4, 3}, {4, 
    3}, {3, 5}}, {{1, 2}, {2, 3}} -> {{4, 3}, {4, 3}, {4, 5}}, {{1, 
    2}, {2, 3}} -> {{4, 4}, {1, 4}, {1, 5}}, {{1, 2}, {2, 3}} -> {{4, 
    4}, {1, 4}, {2, 5}}, {{1, 2}, {2, 3}} -> {{4, 4}, {1, 4}, {3, 
    5}}, {{1, 2}, {2, 3}} -> {{4, 4}, {2, 4}, {1, 5}}, {{1, 2}, {2, 
    3}} -> {{4, 4}, {2, 4}, {2, 5}}, {{1, 2}, {2, 3}} -> {{4, 4}, {2, 
    4}, {3, 5}}, {{1, 2}, {2, 3}} -> {{4, 4}, {3, 4}, {1, 5}}, {{1, 
    2}, {2, 3}} -> {{4, 4}, {3, 4}, {2, 5}}, {{1, 2}, {2, 3}} -> {{4, 
    4}, {3, 4}, {3, 5}}, {{1, 2}, {2, 3}} -> {{4, 4}, {4, 1}, {1, 
    5}}, {{1, 2}, {2, 3}} -> {{4, 4}, {4, 1}, {2, 5}}, {{1, 2}, {2, 
    3}} -> {{4, 4}, {4, 1}, {3, 5}}, {{1, 2}, {2, 3}} -> {{4, 4}, {4, 
    1}, {4, 5}}, {{1, 2}, {2, 3}} -> {{4, 4}, {4, 2}, {1, 5}}, {{1, 
    2}, {2, 3}} -> {{4, 4}, {4, 2}, {2, 5}}, {{1, 2}, {2, 3}} -> {{4, 
    4}, {4, 2}, {3, 5}}, {{1, 2}, {2, 3}} -> {{4, 4}, {4, 2}, {4, 
    5}}, {{1, 2}, {2, 3}} -> {{4, 4}, {4, 3}, {1, 5}}, {{1, 2}, {2, 
    3}} -> {{4, 4}, {4, 3}, {2, 5}}, {{1, 2}, {2, 3}} -> {{4, 4}, {4, 
    3}, {3, 5}}, {{1, 2}, {2, 3}} -> {{4, 4}, {4, 3}, {4, 5}}, {{1, 
    2}, {1, 3}} -> {{4, 1}, {1, 2}, {5, 1}}, {{1, 2}, {1, 3}} -> {{4, 
    1}, {1, 2}, {5, 2}}, {{1, 2}, {1, 3}} -> {{4, 1}, {1, 2}, {5, 
    3}}, {{1, 2}, {1, 3}} -> {{4, 1}, {1, 4}, {5, 4}}, {{1, 2}, {1, 
    3}} -> {{4, 1}, {4, 1}, {5, 1}}, {{1, 2}, {1, 3}} -> {{4, 1}, {4, 
    1}, {5, 2}}, {{1, 2}, {1, 3}} -> {{4, 1}, {4, 1}, {5, 4}}, {{1, 
    2}, {1, 3}} -> {{4, 1}, {4, 2}, {5, 1}}, {{1, 2}, {1, 3}} -> {{4, 
    1}, {4, 2}, {5, 3}}, {{1, 2}, {1, 3}} -> {{4, 1}, {4, 2}, {5, 
    4}}, {{1, 2}, {1, 3}} -> {{4, 2}, {2, 1}, {5, 1}}, {{1, 2}, {1, 
    3}} -> {{4, 2}, {2, 1}, {5, 2}}, {{1, 2}, {1, 3}} -> {{4, 2}, {2, 
    1}, {5, 3}}, {{1, 2}, {1, 3}} -> {{4, 2}, {2, 3}, {5, 1}}, {{1, 
    2}, {1, 3}} -> {{4, 2}, {2, 3}, {5, 2}}, {{1, 2}, {1, 3}} -> {{4, 
    2}, {2, 3}, {5, 3}}, {{1, 2}, {1, 3}} -> {{4, 2}, {2, 4}, {5, 
    4}}, {{1, 2}, {1, 3}} -> {{4, 2}, {4, 1}, {5, 2}}, {{1, 2}, {1, 
    3}} -> {{4, 2}, {4, 2}, {5, 1}}, {{1, 2}, {1, 3}} -> {{4, 2}, {4, 
    2}, {5, 2}}, {{1, 2}, {1, 3}} -> {{4, 2}, {4, 2}, {5, 3}}, {{1, 
    2}, {1, 3}} -> {{4, 2}, {4, 2}, {5, 4}}, {{1, 2}, {1, 3}} -> {{4, 
    2}, {4, 3}, {5, 1}}, {{1, 2}, {1, 3}} -> {{4, 2}, {4, 3}, {5, 
    2}}, {{1, 2}, {1, 3}} -> {{4, 2}, {4, 3}, {5, 4}}, {{1, 2}, {1, 
    3}} -> {{4, 4}, {1, 4}, {5, 1}}, {{1, 2}, {1, 3}} -> {{4, 4}, {1, 
    4}, {5, 2}}, {{1, 2}, {1, 3}} -> {{4, 4}, {1, 4}, {5, 4}}, {{1, 
    2}, {1, 3}} -> {{4, 4}, {2, 4}, {5, 1}}, {{1, 2}, {1, 3}} -> {{4, 
    4}, {2, 4}, {5, 2}}, {{1, 2}, {1, 3}} -> {{4, 4}, {2, 4}, {5, 
    3}}, {{1, 2}, {1, 3}} -> {{4, 4}, {2, 4}, {5, 4}}, {{1, 2}, {1, 
    3}} -> {{4, 4}, {4, 1}, {5, 1}}, {{1, 2}, {1, 3}} -> {{4, 4}, {4, 
    1}, {5, 2}}, {{1, 2}, {1, 3}} -> {{4, 4}, {4, 1}, {5, 4}}, {{1, 
    2}, {1, 3}} -> {{4, 4}, {4, 2}, {5, 1}}, {{1, 2}, {1, 3}} -> {{4, 
    4}, {4, 2}, {5, 2}}, {{1, 2}, {1, 3}} -> {{4, 4}, {4, 2}, {5, 
    3}}, {{1, 2}, {1, 3}} -> {{4, 4}, {4, 2}, {5, 4}}, {{1, 2}, {2, 
    3}} -> {{4, 1}, {1, 2}, {5, 1}}, {{1, 2}, {2, 3}} -> {{4, 1}, {1, 
    2}, {5, 2}}, {{1, 2}, {2, 3}} -> {{4, 1}, {1, 2}, {5, 3}}, {{1, 
    2}, {2, 3}} -> {{4, 1}, {1, 3}, {5, 1}}, {{1, 2}, {2, 3}} -> {{4, 
    1}, {1, 3}, {5, 2}}, {{1, 2}, {2, 3}} -> {{4, 1}, {1, 3}, {5, 
    3}}, {{1, 2}, {2, 3}} -> {{4, 1}, {1, 4}, {5, 4}}, {{1, 2}, {2, 
    3}} -> {{4, 1}, {4, 1}, {5, 1}}, {{1, 2}, {2, 3}} -> {{4, 1}, {4, 
    1}, {5, 2}}, {{1, 2}, {2, 3}} -> {{4, 1}, {4, 1}, {5, 3}}, {{1, 
    2}, {2, 3}} -> {{4, 1}, {4, 1}, {5, 4}}, {{1, 2}, {2, 3}} -> {{4, 
    1}, {4, 2}, {5, 1}}, {{1, 2}, {2, 3}} -> {{4, 1}, {4, 2}, {5, 
    3}}, {{1, 2}, {2, 3}} -> {{4, 1}, {4, 2}, {5, 4}}, {{1, 2}, {2, 
    3}} -> {{4, 1}, {4, 3}, {5, 1}}, {{1, 2}, {2, 3}} -> {{4, 1}, {4, 
    3}, {5, 2}}, {{1, 2}, {2, 3}} -> {{4, 1}, {4, 3}, {5, 4}}, {{1, 
    2}, {2, 3}} -> {{4, 2}, {2, 1}, {5, 1}}, {{1, 2}, {2, 3}} -> {{4, 
    2}, {2, 1}, {5, 2}}, {{1, 2}, {2, 3}} -> {{4, 2}, {2, 1}, {5, 
    3}}, {{1, 2}, {2, 3}} -> {{4, 2}, {2, 3}, {5, 1}}, {{1, 2}, {2, 
    3}} -> {{4, 2}, {2, 3}, {5, 2}}, {{1, 2}, {2, 3}} -> {{4, 2}, {2, 
    3}, {5, 3}}, {{1, 2}, {2, 3}} -> {{4, 2}, {2, 4}, {5, 4}}, {{1, 
    2}, {2, 3}} -> {{4, 2}, {4, 1}, {5, 2}}, {{1, 2}, {2, 3}} -> {{4, 
    2}, {4, 2}, {5, 1}}, {{1, 2}, {2, 3}} -> {{4, 2}, {4, 2}, {5, 
    2}}, {{1, 2}, {2, 3}} -> {{4, 2}, {4, 2}, {5, 3}}, {{1, 2}, {2, 
    3}} -> {{4, 2}, {4, 2}, {5, 4}}, {{1, 2}, {2, 3}} -> {{4, 2}, {4, 
    3}, {5, 1}}, {{1, 2}, {2, 3}} -> {{4, 2}, {4, 3}, {5, 2}}, {{1, 
    2}, {2, 3}} -> {{4, 2}, {4, 3}, {5, 4}}, {{1, 2}, {2, 3}} -> {{4, 
    3}, {3, 1}, {5, 1}}, {{1, 2}, {2, 3}} -> {{4, 3}, {3, 1}, {5, 
    2}}, {{1, 2}, {2, 3}} -> {{4, 3}, {3, 1}, {5, 3}}, {{1, 2}, {2, 
    3}} -> {{4, 3}, {3, 2}, {5, 1}}, {{1, 2}, {2, 3}} -> {{4, 3}, {3, 
    2}, {5, 2}}, {{1, 2}, {2, 3}} -> {{4, 3}, {3, 2}, {5, 3}}, {{1, 
    2}, {2, 3}} -> {{4, 3}, {3, 4}, {5, 4}}, {{1, 2}, {2, 3}} -> {{4, 
    3}, {4, 1}, {5, 3}}, {{1, 2}, {2, 3}} -> {{4, 3}, {4, 2}, {5, 
    3}}, {{1, 2}, {2, 3}} -> {{4, 3}, {4, 3}, {5, 1}}, {{1, 2}, {2, 
    3}} -> {{4, 3}, {4, 3}, {5, 2}}, {{1, 2}, {2, 3}} -> {{4, 3}, {4, 
    3}, {5, 3}}, {{1, 2}, {2, 3}} -> {{4, 3}, {4, 3}, {5, 4}}, {{1, 
    2}, {2, 3}} -> {{4, 4}, {1, 4}, {5, 1}}, {{1, 2}, {2, 3}} -> {{4, 
    4}, {1, 4}, {5, 2}}, {{1, 2}, {2, 3}} -> {{4, 4}, {1, 4}, {5, 
    3}}, {{1, 2}, {2, 3}} -> {{4, 4}, {1, 4}, {5, 4}}, {{1, 2}, {2, 
    3}} -> {{4, 4}, {2, 4}, {5, 1}}, {{1, 2}, {2, 3}} -> {{4, 4}, {2, 
    4}, {5, 2}}, {{1, 2}, {2, 3}} -> {{4, 4}, {2, 4}, {5, 3}}, {{1, 
    2}, {2, 3}} -> {{4, 4}, {2, 4}, {5, 4}}, {{1, 2}, {2, 3}} -> {{4, 
    4}, {3, 4}, {5, 1}}, {{1, 2}, {2, 3}} -> {{4, 4}, {3, 4}, {5, 
    2}}, {{1, 2}, {2, 3}} -> {{4, 4}, {3, 4}, {5, 3}}, {{1, 2}, {2, 
    3}} -> {{4, 4}, {3, 4}, {5, 4}}, {{1, 2}, {2, 3}} -> {{4, 4}, {4, 
    1}, {5, 1}}, {{1, 2}, {2, 3}} -> {{4, 4}, {4, 1}, {5, 2}}, {{1, 
    2}, {2, 3}} -> {{4, 4}, {4, 1}, {5, 3}}, {{1, 2}, {2, 3}} -> {{4, 
    4}, {4, 1}, {5, 4}}, {{1, 2}, {2, 3}} -> {{4, 4}, {4, 2}, {5, 
    1}}, {{1, 2}, {2, 3}} -> {{4, 4}, {4, 2}, {5, 2}}, {{1, 2}, {2, 
    3}} -> {{4, 4}, {4, 2}, {5, 3}}, {{1, 2}, {2, 3}} -> {{4, 4}, {4, 
    2}, {5, 4}}, {{1, 2}, {2, 3}} -> {{4, 4}, {4, 3}, {5, 1}}, {{1, 
    2}, {2, 3}} -> {{4, 4}, {4, 3}, {5, 2}}, {{1, 2}, {2, 3}} -> {{4, 
    4}, {4, 3}, {5, 3}}, {{1, 2}, {2, 3}} -> {{4, 4}, {4, 3}, {5, 
    4}}, {{1, 2}, {1, 3}} -> {{4, 1}, {1, 5}, {2, 3}}, {{1, 2}, {1, 
    3}} -> {{4, 1}, {1, 5}, {2, 5}}, {{1, 2}, {1, 3}} -> {{4, 1}, {1, 
    5}, {5, 2}}, {{1, 2}, {1, 3}} -> {{4, 1}, {4, 5}, {1, 2}}, {{1, 
    2}, {1, 3}} -> {{4, 1}, {4, 5}, {1, 5}}, {{1, 2}, {1, 3}} -> {{4, 
    1}, {4, 5}, {2, 1}}, {{1, 2}, {1, 3}} -> {{4, 1}, {4, 5}, {2, 
    3}}, {{1, 2}, {1, 3}} -> {{4, 1}, {4, 5}, {2, 4}}, {{1, 2}, {1, 
    3}} -> {{4, 2}, {2, 5}, {1, 3}}, {{1, 2}, {1, 3}} -> {{4, 2}, {2, 
    5}, {1, 5}}, {{1, 2}, {1, 3}} -> {{4, 2}, {2, 5}, {3, 1}}, {{1, 
    2}, {1, 3}} -> {{4, 2}, {2, 5}, {3, 5}}, {{1, 2}, {1, 3}} -> {{4, 
    2}, {2, 5}, {5, 1}}, {{1, 2}, {1, 3}} -> {{4, 2}, {2, 5}, {5, 
    3}}, {{1, 2}, {1, 3}} -> {{4, 2}, {4, 5}, {1, 2}}, {{1, 2}, {1, 
    3}} -> {{4, 2}, {4, 5}, {1, 3}}, {{1, 2}, {1, 3}} -> {{4, 2}, {4, 
    5}, {1, 4}}, {{1, 2}, {1, 3}} -> {{4, 2}, {4, 5}, {2, 1}}, {{1, 
    2}, {1, 3}} -> {{4, 2}, {4, 5}, {2, 3}}, {{1, 2}, {1, 3}} -> {{4, 
    2}, {4, 5}, {2, 5}}, {{1, 2}, {1, 3}} -> {{4, 2}, {4, 5}, {3, 
    1}}, {{1, 2}, {1, 3}} -> {{4, 2}, {4, 5}, {3, 2}}, {{1, 2}, {1, 
    3}} -> {{4, 2}, {4, 5}, {3, 4}}, {{1, 2}, {1, 3}} -> {{4, 4}, {4, 
    5}, {1, 4}}, {{1, 2}, {1, 3}} -> {{4, 4}, {4, 5}, {1, 5}}, {{1, 
    2}, {1, 3}} -> {{4, 4}, {4, 5}, {2, 4}}, {{1, 2}, {1, 3}} -> {{4, 
    4}, {4, 5}, {2, 5}}, {{1, 2}, {1, 3}} -> {{4, 4}, {4, 5}, {5, 
    1}}, {{1, 2}, {1, 3}} -> {{4, 4}, {4, 5}, {5, 2}}, {{1, 2}, {2, 
    3}} -> {{4, 1}, {1, 5}, {2, 3}}, {{1, 2}, {2, 3}} -> {{4, 1}, {1, 
    5}, {2, 5}}, {{1, 2}, {2, 3}} -> {{4, 1}, {1, 5}, {3, 2}}, {{1, 
    2}, {2, 3}} -> {{4, 1}, {1, 5}, {3, 5}}, {{1, 2}, {2, 3}} -> {{4, 
    1}, {1, 5}, {5, 2}}, {{1, 2}, {2, 3}} -> {{4, 1}, {1, 5}, {5, 
    3}}, {{1, 2}, {2, 3}} -> {{4, 1}, {4, 5}, {1, 2}}, {{1, 2}, {2, 
    3}} -> {{4, 1}, {4, 5}, {1, 3}}, {{1, 2}, {2, 3}} -> {{4, 1}, {4, 
    5}, {1, 5}}, {{1, 2}, {2, 3}} -> {{4, 1}, {4, 5}, {2, 1}}, {{1, 
    2}, {2, 3}} -> {{4, 1}, {4, 5}, {2, 3}}, {{1, 2}, {2, 3}} -> {{4, 
    1}, {4, 5}, {2, 4}}, {{1, 2}, {2, 3}} -> {{4, 1}, {4, 5}, {3, 
    1}}, {{1, 2}, {2, 3}} -> {{4, 1}, {4, 5}, {3, 2}}, {{1, 2}, {2, 
    3}} -> {{4, 1}, {4, 5}, {3, 4}}, {{1, 2}, {2, 3}} -> {{4, 2}, {2, 
    5}, {1, 3}}, {{1, 2}, {2, 3}} -> {{4, 2}, {2, 5}, {1, 5}}, {{1, 
    2}, {2, 3}} -> {{4, 2}, {2, 5}, {3, 1}}, {{1, 2}, {2, 3}} -> {{4, 
    2}, {2, 5}, {3, 5}}, {{1, 2}, {2, 3}} -> {{4, 2}, {2, 5}, {5, 
    1}}, {{1, 2}, {2, 3}} -> {{4, 2}, {2, 5}, {5, 3}}, {{1, 2}, {2, 
    3}} -> {{4, 2}, {4, 5}, {1, 2}}, {{1, 2}, {2, 3}} -> {{4, 2}, {4, 
    5}, {1, 3}}, {{1, 2}, {2, 3}} -> {{4, 2}, {4, 5}, {1, 4}}, {{1, 
    2}, {2, 3}} -> {{4, 2}, {4, 5}, {2, 1}}, {{1, 2}, {2, 3}} -> {{4, 
    2}, {4, 5}, {2, 3}}, {{1, 2}, {2, 3}} -> {{4, 2}, {4, 5}, {2, 
    5}}, {{1, 2}, {2, 3}} -> {{4, 2}, {4, 5}, {3, 1}}, {{1, 2}, {2, 
    3}} -> {{4, 2}, {4, 5}, {3, 2}}, {{1, 2}, {2, 3}} -> {{4, 2}, {4, 
    5}, {3, 4}}, {{1, 2}, {2, 3}} -> {{4, 3}, {3, 5}, {1, 2}}, {{1, 
    2}, {2, 3}} -> {{4, 3}, {3, 5}, {1, 5}}, {{1, 2}, {2, 3}} -> {{4, 
    3}, {3, 5}, {2, 1}}, {{1, 2}, {2, 3}} -> {{4, 3}, {3, 5}, {2, 
    5}}, {{1, 2}, {2, 3}} -> {{4, 3}, {3, 5}, {5, 1}}, {{1, 2}, {2, 
    3}} -> {{4, 3}, {3, 5}, {5, 2}}, {{1, 2}, {2, 3}} -> {{4, 3}, {4, 
    5}, {1, 2}}, {{1, 2}, {2, 3}} -> {{4, 3}, {4, 5}, {1, 3}}, {{1, 
    2}, {2, 3}} -> {{4, 3}, {4, 5}, {1, 4}}, {{1, 2}, {2, 3}} -> {{4, 
    3}, {4, 5}, {2, 1}}, {{1, 2}, {2, 3}} -> {{4, 3}, {4, 5}, {2, 
    3}}, {{1, 2}, {2, 3}} -> {{4, 3}, {4, 5}, {2, 4}}, {{1, 2}, {2, 
    3}} -> {{4, 3}, {4, 5}, {3, 1}}, {{1, 2}, {2, 3}} -> {{4, 3}, {4, 
    5}, {3, 2}}, {{1, 2}, {2, 3}} -> {{4, 3}, {4, 5}, {3, 5}}, {{1, 
    2}, {2, 3}} -> {{4, 4}, {4, 5}, {1, 4}}, {{1, 2}, {2, 3}} -> {{4, 
    4}, {4, 5}, {1, 5}}, {{1, 2}, {2, 3}} -> {{4, 4}, {4, 5}, {2, 
    4}}, {{1, 2}, {2, 3}} -> {{4, 4}, {4, 5}, {2, 5}}, {{1, 2}, {2, 
    3}} -> {{4, 4}, {4, 5}, {3, 4}}, {{1, 2}, {2, 3}} -> {{4, 4}, {4, 
    5}, {3, 5}}, {{1, 2}, {2, 3}} -> {{4, 4}, {4, 5}, {5, 1}}, {{1, 
    2}, {2, 3}} -> {{4, 4}, {4, 5}, {5, 2}}, {{1, 2}, {2, 3}} -> {{4, 
    4}, {4, 5}, {5, 3}}, {{1, 2}, {1, 3}} -> {{4, 1}, {1, 5}, {2, 
    6}}, {{1, 2}, {1, 3}} -> {{4, 1}, {1, 5}, {5, 6}}, {{1, 2}, {1, 
    3}} -> {{4, 1}, {4, 5}, {1, 6}}, {{1, 2}, {1, 3}} -> {{4, 1}, {4, 
    5}, {2, 6}}, {{1, 2}, {1, 3}} -> {{4, 1}, {4, 5}, {4, 6}}, {{1, 
    2}, {1, 3}} -> {{4, 2}, {2, 5}, {1, 6}}, {{1, 2}, {1, 3}} -> {{4, 
    2}, {2, 5}, {3, 6}}, {{1, 2}, {1, 3}} -> {{4, 2}, {2, 5}, {5, 
    6}}, {{1, 2}, {1, 3}} -> {{4, 2}, {4, 5}, {1, 6}}, {{1, 2}, {1, 
    3}} -> {{4, 2}, {4, 5}, {2, 6}}, {{1, 2}, {1, 3}} -> {{4, 2}, {4, 
    5}, {3, 6}}, {{1, 2}, {1, 3}} -> {{4, 2}, {4, 5}, {4, 6}}, {{1, 
    2}, {2, 3}} -> {{4, 1}, {1, 5}, {2, 6}}, {{1, 2}, {2, 3}} -> {{4, 
    1}, {1, 5}, {3, 6}}, {{1, 2}, {2, 3}} -> {{4, 1}, {1, 5}, {5, 
    6}}, {{1, 2}, {2, 3}} -> {{4, 1}, {4, 5}, {1, 6}}, {{1, 2}, {2, 
    3}} -> {{4, 1}, {4, 5}, {2, 6}}, {{1, 2}, {2, 3}} -> {{4, 1}, {4, 
    5}, {3, 6}}, {{1, 2}, {2, 3}} -> {{4, 1}, {4, 5}, {4, 6}}, {{1, 
    2}, {2, 3}} -> {{4, 2}, {2, 5}, {1, 6}}, {{1, 2}, {2, 3}} -> {{4, 
    2}, {2, 5}, {3, 6}}, {{1, 2}, {2, 3}} -> {{4, 2}, {2, 5}, {5, 
    6}}, {{1, 2}, {2, 3}} -> {{4, 2}, {4, 5}, {1, 6}}, {{1, 2}, {2, 
    3}} -> {{4, 2}, {4, 5}, {2, 6}}, {{1, 2}, {2, 3}} -> {{4, 2}, {4, 
    5}, {3, 6}}, {{1, 2}, {2, 3}} -> {{4, 2}, {4, 5}, {4, 6}}, {{1, 
    2}, {2, 3}} -> {{4, 3}, {3, 5}, {1, 6}}, {{1, 2}, {2, 3}} -> {{4, 
    3}, {3, 5}, {2, 6}}, {{1, 2}, {2, 3}} -> {{4, 3}, {3, 5}, {5, 
    6}}, {{1, 2}, {2, 3}} -> {{4, 3}, {4, 5}, {1, 6}}, {{1, 2}, {2, 
    3}} -> {{4, 3}, {4, 5}, {2, 6}}, {{1, 2}, {2, 3}} -> {{4, 3}, {4, 
    5}, {3, 6}}, {{1, 2}, {2, 3}} -> {{4, 3}, {4, 5}, {4, 6}}, {{1, 
    2}, {1, 3}} -> {{4, 1}, {1, 5}, {6, 1}}, {{1, 2}, {1, 3}} -> {{4, 
    1}, {1, 5}, {6, 2}}, {{1, 2}, {1, 3}} -> {{4, 1}, {1, 5}, {6, 
    5}}, {{1, 2}, {1, 3}} -> {{4, 1}, {4, 5}, {6, 1}}, {{1, 2}, {1, 
    3}} -> {{4, 1}, {4, 5}, {6, 2}}, {{1, 2}, {1, 3}} -> {{4, 1}, {4, 
    5}, {6, 4}}, {{1, 2}, {1, 3}} -> {{4, 2}, {2, 5}, {6, 1}}, {{1, 
    2}, {1, 3}} -> {{4, 2}, {2, 5}, {6, 2}}, {{1, 2}, {1, 3}} -> {{4, 
    2}, {2, 5}, {6, 3}}, {{1, 2}, {1, 3}} -> {{4, 2}, {2, 5}, {6, 
    5}}, {{1, 2}, {1, 3}} -> {{4, 2}, {4, 5}, {6, 1}}, {{1, 2}, {1, 
    3}} -> {{4, 2}, {4, 5}, {6, 2}}, {{1, 2}, {1, 3}} -> {{4, 2}, {4, 
    5}, {6, 3}}, {{1, 2}, {1, 3}} -> {{4, 2}, {4, 5}, {6, 4}}, {{1, 
    2}, {2, 3}} -> {{4, 1}, {1, 5}, {6, 1}}, {{1, 2}, {2, 3}} -> {{4, 
    1}, {1, 5}, {6, 2}}, {{1, 2}, {2, 3}} -> {{4, 1}, {1, 5}, {6, 
    3}}, {{1, 2}, {2, 3}} -> {{4, 1}, {1, 5}, {6, 5}}, {{1, 2}, {2, 
    3}} -> {{4, 1}, {4, 5}, {6, 1}}, {{1, 2}, {2, 3}} -> {{4, 1}, {4, 
    5}, {6, 2}}, {{1, 2}, {2, 3}} -> {{4, 1}, {4, 5}, {6, 3}}, {{1, 
    2}, {2, 3}} -> {{4, 1}, {4, 5}, {6, 4}}, {{1, 2}, {2, 3}} -> {{4, 
    2}, {2, 5}, {6, 1}}, {{1, 2}, {2, 3}} -> {{4, 2}, {2, 5}, {6, 
    2}}, {{1, 2}, {2, 3}} -> {{4, 2}, {2, 5}, {6, 3}}, {{1, 2}, {2, 
    3}} -> {{4, 2}, {2, 5}, {6, 5}}, {{1, 2}, {2, 3}} -> {{4, 2}, {4, 
    5}, {6, 1}}, {{1, 2}, {2, 3}} -> {{4, 2}, {4, 5}, {6, 2}}, {{1, 
    2}, {2, 3}} -> {{4, 2}, {4, 5}, {6, 3}}, {{1, 2}, {2, 3}} -> {{4, 
    2}, {4, 5}, {6, 4}}, {{1, 2}, {2, 3}} -> {{4, 3}, {3, 5}, {6, 
    1}}, {{1, 2}, {2, 3}} -> {{4, 3}, {3, 5}, {6, 2}}, {{1, 2}, {2, 
    3}} -> {{4, 3}, {3, 5}, {6, 3}}, {{1, 2}, {2, 3}} -> {{4, 3}, {3, 
    5}, {6, 5}}, {{1, 2}, {2, 3}} -> {{4, 3}, {4, 5}, {6, 1}}, {{1, 
    2}, {2, 3}} -> {{4, 3}, {4, 5}, {6, 2}}, {{1, 2}, {2, 3}} -> {{4, 
    3}, {4, 5}, {6, 3}}, {{1, 2}, {2, 3}} -> {{4, 3}, {4, 5}, {6, 
    4}}, {{1, 2}, {1, 3}} -> {{4, 1}, {5, 1}, {2, 3}}, {{1, 2}, {1, 
    3}} -> {{4, 2}, {5, 2}, {1, 3}}, {{1, 2}, {1, 3}} -> {{4, 2}, {5, 
    2}, {3, 1}}, {{1, 2}, {1, 3}} -> {{4, 4}, {5, 4}, {1, 5}}, {{1, 
    2}, {1, 3}} -> {{4, 4}, {5, 4}, {2, 5}}, {{1, 2}, {1, 3}} -> {{4, 
    4}, {5, 4}, {5, 1}}, {{1, 2}, {1, 3}} -> {{4, 4}, {5, 4}, {5, 
    2}}, {{1, 2}, {2, 3}} -> {{4, 1}, {5, 1}, {2, 3}}, {{1, 2}, {2, 
    3}} -> {{4, 1}, {5, 1}, {3, 2}}, {{1, 2}, {2, 3}} -> {{4, 2}, {5, 
    2}, {1, 3}}, {{1, 2}, {2, 3}} -> {{4, 2}, {5, 2}, {3, 1}}, {{1, 
    2}, {2, 3}} -> {{4, 3}, {5, 3}, {1, 2}}, {{1, 2}, {2, 3}} -> {{4, 
    3}, {5, 3}, {2, 1}}, {{1, 2}, {2, 3}} -> {{4, 4}, {5, 4}, {1, 
    5}}, {{1, 2}, {2, 3}} -> {{4, 4}, {5, 4}, {2, 5}}, {{1, 2}, {2, 
    3}} -> {{4, 4}, {5, 4}, {3, 5}}, {{1, 2}, {2, 3}} -> {{4, 4}, {5, 
    4}, {5, 1}}, {{1, 2}, {2, 3}} -> {{4, 4}, {5, 4}, {5, 2}}, {{1, 
    2}, {2, 3}} -> {{4, 4}, {5, 4}, {5, 3}}, {{1, 2}, {1, 3}} -> {{4, 
    1}, {5, 1}, {2, 6}}, {{1, 2}, {1, 3}} -> {{4, 2}, {5, 2}, {1, 
    6}}, {{1, 2}, {1, 3}} -> {{4, 2}, {5, 2}, {3, 6}}, {{1, 2}, {2, 
    3}} -> {{4, 1}, {5, 1}, {2, 6}}, {{1, 2}, {2, 3}} -> {{4, 1}, {5, 
    1}, {3, 6}}, {{1, 2}, {2, 3}} -> {{4, 2}, {5, 2}, {1, 6}}, {{1, 
    2}, {2, 3}} -> {{4, 2}, {5, 2}, {3, 6}}, {{1, 2}, {2, 3}} -> {{4, 
    3}, {5, 3}, {1, 6}}, {{1, 2}, {2, 3}} -> {{4, 3}, {5, 3}, {2, 
    6}}, {{1, 2}, {1, 3}} -> {{4, 1}, {5, 1}, {6, 1}}, {{1, 2}, {1, 
    3}} -> {{4, 1}, {5, 1}, {6, 2}}, {{1, 2}, {1, 3}} -> {{4, 1}, {5, 
    2}, {6, 3}}, {{1, 2}, {1, 3}} -> {{4, 2}, {5, 2}, {6, 1}}, {{1, 
    2}, {1, 3}} -> {{4, 2}, {5, 2}, {6, 2}}, {{1, 2}, {1, 3}} -> {{4, 
    2}, {5, 2}, {6, 3}}, {{1, 2}, {2, 3}} -> {{4, 1}, {5, 1}, {6, 
    1}}, {{1, 2}, {2, 3}} -> {{4, 1}, {5, 1}, {6, 2}}, {{1, 2}, {2, 
    3}} -> {{4, 1}, {5, 1}, {6, 3}}, {{1, 2}, {2, 3}} -> {{4, 1}, {5, 
    2}, {6, 3}}, {{1, 2}, {2, 3}} -> {{4, 2}, {5, 2}, {6, 1}}, {{1, 
    2}, {2, 3}} -> {{4, 2}, {5, 2}, {6, 2}}, {{1, 2}, {2, 3}} -> {{4, 
    2}, {5, 2}, {6, 3}}, {{1, 2}, {2, 3}} -> {{4, 3}, {5, 3}, {6, 
    1}}, {{1, 2}, {2, 3}} -> {{4, 3}, {5, 3}, {6, 2}}, {{1, 2}, {2, 
    3}} -> {{4, 3}, {5, 3}, {6, 3}}, {{1, 2}, {1, 3}} -> {{4, 5}, {4, 
    1}, {2, 5}}, {{1, 2}, {1, 3}} -> {{4, 5}, {4, 1}, {5, 1}}, {{1, 
    2}, {1, 3}} -> {{4, 5}, {4, 1}, {5, 2}}, {{1, 2}, {1, 3}} -> {{4, 
    5}, {4, 2}, {1, 5}}, {{1, 2}, {1, 3}} -> {{4, 5}, {4, 2}, {3, 
    5}}, {{1, 2}, {1, 3}} -> {{4, 5}, {4, 2}, {5, 1}}, {{1, 2}, {1, 
    3}} -> {{4, 5}, {4, 2}, {5, 2}}, {{1, 2}, {1, 3}} -> {{4, 5}, {4, 
    2}, {5, 3}}, {{1, 2}, {1, 3}} -> {{4, 5}, {4, 5}, {1, 4}}, {{1, 
    2}, {1, 3}} -> {{4, 5}, {4, 5}, {1, 5}}, {{1, 2}, {1, 3}} -> {{4, 
    5}, {4, 5}, {2, 4}}, {{1, 2}, {1, 3}} -> {{4, 5}, {4, 5}, {2, 
    5}}, {{1, 2}, {1, 3}} -> {{4, 5}, {4, 5}, {4, 1}}, {{1, 2}, {1, 
    3}} -> {{4, 5}, {4, 5}, {4, 2}}, {{1, 2}, {1, 3}} -> {{4, 5}, {4, 
    5}, {5, 1}}, {{1, 2}, {1, 3}} -> {{4, 5}, {4, 5}, {5, 2}}, {{1, 
    2}, {1, 3}} -> {{4, 5}, {5, 1}, {1, 2}}, {{1, 2}, {1, 3}} -> {{4, 
    5}, {5, 1}, {2, 1}}, {{1, 2}, {1, 3}} -> {{4, 5}, {5, 1}, {2, 
    3}}, {{1, 2}, {1, 3}} -> {{4, 5}, {5, 2}, {1, 2}}, {{1, 2}, {1, 
    3}} -> {{4, 5}, {5, 2}, {1, 3}}, {{1, 2}, {1, 3}} -> {{4, 5}, {5, 
    2}, {2, 1}}, {{1, 2}, {1, 3}} -> {{4, 5}, {5, 2}, {2, 3}}, {{1, 
    2}, {1, 3}} -> {{4, 5}, {5, 2}, {3, 1}}, {{1, 2}, {1, 3}} -> {{4, 
    5}, {5, 2}, {3, 2}}, {{1, 2}, {1, 3}} -> {{4, 5}, {5, 4}, {1, 
    4}}, {{1, 2}, {1, 3}} -> {{4, 5}, {5, 4}, {2, 4}}, {{1, 2}, {1, 
    3}} -> {{4, 5}, {5, 4}, {4, 1}}, {{1, 2}, {1, 3}} -> {{4, 5}, {5, 
    4}, {4, 2}}, {{1, 2}, {2, 3}} -> {{4, 5}, {4, 1}, {2, 5}}, {{1, 
    2}, {2, 3}} -> {{4, 5}, {4, 1}, {3, 5}}, {{1, 2}, {2, 3}} -> {{4, 
    5}, {4, 1}, {5, 1}}, {{1, 2}, {2, 3}} -> {{4, 5}, {4, 1}, {5, 
    2}}, {{1, 2}, {2, 3}} -> {{4, 5}, {4, 1}, {5, 3}}, {{1, 2}, {2, 
    3}} -> {{4, 5}, {4, 2}, {1, 5}}, {{1, 2}, {2, 3}} -> {{4, 5}, {4, 
    2}, {3, 5}}, {{1, 2}, {2, 3}} -> {{4, 5}, {4, 2}, {5, 1}}, {{1, 
    2}, {2, 3}} -> {{4, 5}, {4, 2}, {5, 2}}, {{1, 2}, {2, 3}} -> {{4, 
    5}, {4, 2}, {5, 3}}, {{1, 2}, {2, 3}} -> {{4, 5}, {4, 3}, {1, 
    5}}, {{1, 2}, {2, 3}} -> {{4, 5}, {4, 3}, {2, 5}}, {{1, 2}, {2, 
    3}} -> {{4, 5}, {4, 3}, {5, 1}}, {{1, 2}, {2, 3}} -> {{4, 5}, {4, 
    3}, {5, 2}}, {{1, 2}, {2, 3}} -> {{4, 5}, {4, 3}, {5, 3}}, {{1, 
    2}, {2, 3}} -> {{4, 5}, {4, 5}, {1, 4}}, {{1, 2}, {2, 3}} -> {{4, 
    5}, {4, 5}, {1, 5}}, {{1, 2}, {2, 3}} -> {{4, 5}, {4, 5}, {2, 
    4}}, {{1, 2}, {2, 3}} -> {{4, 5}, {4, 5}, {2, 5}}, {{1, 2}, {2, 
    3}} -> {{4, 5}, {4, 5}, {3, 4}}, {{1, 2}, {2, 3}} -> {{4, 5}, {4, 
    5}, {3, 5}}, {{1, 2}, {2, 3}} -> {{4, 5}, {4, 5}, {4, 1}}, {{1, 
    2}, {2, 3}} -> {{4, 5}, {4, 5}, {4, 2}}, {{1, 2}, {2, 3}} -> {{4, 
    5}, {4, 5}, {4, 3}}, {{1, 2}, {2, 3}} -> {{4, 5}, {4, 5}, {5, 
    1}}, {{1, 2}, {2, 3}} -> {{4, 5}, {4, 5}, {5, 2}}, {{1, 2}, {2, 
    3}} -> {{4, 5}, {4, 5}, {5, 3}}, {{1, 2}, {2, 3}} -> {{4, 5}, {5, 
    1}, {1, 2}}, {{1, 2}, {2, 3}} -> {{4, 5}, {5, 1}, {1, 3}}, {{1, 
    2}, {2, 3}} -> {{4, 5}, {5, 1}, {2, 1}}, {{1, 2}, {2, 3}} -> {{4, 
    5}, {5, 1}, {2, 3}}, {{1, 2}, {2, 3}} -> {{4, 5}, {5, 1}, {3, 
    1}}, {{1, 2}, {2, 3}} -> {{4, 5}, {5, 1}, {3, 2}}, {{1, 2}, {2, 
    3}} -> {{4, 5}, {5, 2}, {1, 2}}, {{1, 2}, {2, 3}} -> {{4, 5}, {5, 
    2}, {1, 3}}, {{1, 2}, {2, 3}} -> {{4, 5}, {5, 2}, {2, 1}}, {{1, 
    2}, {2, 3}} -> {{4, 5}, {5, 2}, {2, 3}}, {{1, 2}, {2, 3}} -> {{4, 
    5}, {5, 2}, {3, 1}}, {{1, 2}, {2, 3}} -> {{4, 5}, {5, 2}, {3, 
    2}}, {{1, 2}, {2, 3}} -> {{4, 5}, {5, 3}, {1, 2}}, {{1, 2}, {2, 
    3}} -> {{4, 5}, {5, 3}, {1, 3}}, {{1, 2}, {2, 3}} -> {{4, 5}, {5, 
    3}, {2, 1}}, {{1, 2}, {2, 3}} -> {{4, 5}, {5, 3}, {2, 3}}, {{1, 
    2}, {2, 3}} -> {{4, 5}, {5, 3}, {3, 1}}, {{1, 2}, {2, 3}} -> {{4, 
    5}, {5, 3}, {3, 2}}, {{1, 2}, {2, 3}} -> {{4, 5}, {5, 4}, {1, 
    4}}, {{1, 2}, {2, 3}} -> {{4, 5}, {5, 4}, {2, 4}}, {{1, 2}, {2, 
    3}} -> {{4, 5}, {5, 4}, {3, 4}}, {{1, 2}, {2, 3}} -> {{4, 5}, {5, 
    4}, {4, 1}}, {{1, 2}, {2, 3}} -> {{4, 5}, {5, 4}, {4, 2}}, {{1, 
    2}, {2, 3}} -> {{4, 5}, {5, 4}, {4, 3}}, {{1, 2}, {1, 3}} -> {{4, 
    5}, {4, 1}, {5, 6}}, {{1, 2}, {1, 3}} -> {{4, 5}, {4, 2}, {5, 
    6}}, {{1, 2}, {1, 3}} -> {{4, 5}, {5, 1}, {1, 6}}, {{1, 2}, {1, 
    3}} -> {{4, 5}, {5, 1}, {2, 6}}, {{1, 2}, {1, 3}} -> {{4, 5}, {5, 
    2}, {1, 6}}, {{1, 2}, {1, 3}} -> {{4, 5}, {5, 2}, {2, 6}}, {{1, 
    2}, {1, 3}} -> {{4, 5}, {5, 2}, {3, 6}}, {{1, 2}, {2, 3}} -> {{4, 
    5}, {4, 1}, {5, 6}}, {{1, 2}, {2, 3}} -> {{4, 5}, {4, 2}, {5, 
    6}}, {{1, 2}, {2, 3}} -> {{4, 5}, {4, 3}, {5, 6}}, {{1, 2}, {2, 
    3}} -> {{4, 5}, {5, 1}, {1, 6}}, {{1, 2}, {2, 3}} -> {{4, 5}, {5, 
    1}, {2, 6}}, {{1, 2}, {2, 3}} -> {{4, 5}, {5, 1}, {3, 6}}, {{1, 
    2}, {2, 3}} -> {{4, 5}, {5, 2}, {1, 6}}, {{1, 2}, {2, 3}} -> {{4, 
    5}, {5, 2}, {2, 6}}, {{1, 2}, {2, 3}} -> {{4, 5}, {5, 2}, {3, 
    6}}, {{1, 2}, {2, 3}} -> {{4, 5}, {5, 3}, {1, 6}}, {{1, 2}, {2, 
    3}} -> {{4, 5}, {5, 3}, {2, 6}}, {{1, 2}, {2, 3}} -> {{4, 5}, {5, 
    3}, {3, 6}}, {{1, 2}, {1, 3}} -> {{4, 5}, {4, 1}, {6, 5}}, {{1, 
    2}, {1, 3}} -> {{4, 5}, {4, 2}, {6, 5}}, {{1, 2}, {1, 3}} -> {{4, 
    5}, {5, 1}, {6, 1}}, {{1, 2}, {1, 3}} -> {{4, 5}, {5, 1}, {6, 
    2}}, {{1, 2}, {1, 3}} -> {{4, 5}, {5, 1}, {6, 5}}, {{1, 2}, {1, 
    3}} -> {{4, 5}, {5, 2}, {6, 1}}, {{1, 2}, {1, 3}} -> {{4, 5}, {5, 
    2}, {6, 2}}, {{1, 2}, {1, 3}} -> {{4, 5}, {5, 2}, {6, 3}}, {{1, 
    2}, {1, 3}} -> {{4, 5}, {5, 2}, {6, 5}}, {{1, 2}, {2, 3}} -> {{4, 
    5}, {4, 1}, {6, 5}}, {{1, 2}, {2, 3}} -> {{4, 5}, {4, 2}, {6, 
    5}}, {{1, 2}, {2, 3}} -> {{4, 5}, {4, 3}, {6, 5}}, {{1, 2}, {2, 
    3}} -> {{4, 5}, {5, 1}, {6, 1}}, {{1, 2}, {2, 3}} -> {{4, 5}, {5, 
    1}, {6, 2}}, {{1, 2}, {2, 3}} -> {{4, 5}, {5, 1}, {6, 3}}, {{1, 
    2}, {2, 3}} -> {{4, 5}, {5, 1}, {6, 5}}, {{1, 2}, {2, 3}} -> {{4, 
    5}, {5, 2}, {6, 1}}, {{1, 2}, {2, 3}} -> {{4, 5}, {5, 2}, {6, 
    2}}, {{1, 2}, {2, 3}} -> {{4, 5}, {5, 2}, {6, 3}}, {{1, 2}, {2, 
    3}} -> {{4, 5}, {5, 2}, {6, 5}}, {{1, 2}, {2, 3}} -> {{4, 5}, {5, 
    3}, {6, 1}}, {{1, 2}, {2, 3}} -> {{4, 5}, {5, 3}, {6, 2}}, {{1, 
    2}, {2, 3}} -> {{4, 5}, {5, 3}, {6, 3}}, {{1, 2}, {2, 3}} -> {{4, 
    5}, {5, 3}, {6, 5}}, {{1, 2}, {1, 3}} -> {{4, 5}, {4, 6}, {1, 
    4}}, {{1, 2}, {1, 3}} -> {{4, 5}, {4, 6}, {1, 5}}, {{1, 2}, {1, 
    3}} -> {{4, 5}, {4, 6}, {2, 4}}, {{1, 2}, {1, 3}} -> {{4, 5}, {4, 
    6}, {2, 5}}, {{1, 2}, {1, 3}} -> {{4, 5}, {4, 6}, {5, 1}}, {{1, 
    2}, {1, 3}} -> {{4, 5}, {4, 6}, {5, 2}}, {{1, 2}, {1, 3}} -> {{4, 
    5}, {5, 6}, {1, 6}}, {{1, 2}, {1, 3}} -> {{4, 5}, {5, 6}, {2, 
    6}}, {{1, 2}, {1, 3}} -> {{4, 5}, {5, 6}, {6, 1}}, {{1, 2}, {1, 
    3}} -> {{4, 5}, {5, 6}, {6, 2}}, {{1, 2}, {2, 3}} -> {{4, 5}, {4, 
    6}, {1, 4}}, {{1, 2}, {2, 3}} -> {{4, 5}, {4, 6}, {1, 5}}, {{1, 
    2}, {2, 3}} -> {{4, 5}, {4, 6}, {2, 4}}, {{1, 2}, {2, 3}} -> {{4, 
    5}, {4, 6}, {2, 5}}, {{1, 2}, {2, 3}} -> {{4, 5}, {4, 6}, {3, 
    4}}, {{1, 2}, {2, 3}} -> {{4, 5}, {4, 6}, {3, 5}}, {{1, 2}, {2, 
    3}} -> {{4, 5}, {4, 6}, {5, 1}}, {{1, 2}, {2, 3}} -> {{4, 5}, {4, 
    6}, {5, 2}}, {{1, 2}, {2, 3}} -> {{4, 5}, {4, 6}, {5, 3}}, {{1, 
    2}, {2, 3}} -> {{4, 5}, {5, 6}, {1, 6}}, {{1, 2}, {2, 3}} -> {{4, 
    5}, {5, 6}, {2, 6}}, {{1, 2}, {2, 3}} -> {{4, 5}, {5, 6}, {3, 
    6}}, {{1, 2}, {2, 3}} -> {{4, 5}, {5, 6}, {6, 1}}, {{1, 2}, {2, 
    3}} -> {{4, 5}, {5, 6}, {6, 2}}, {{1, 2}, {2, 3}} -> {{4, 5}, {5, 
    6}, {6, 3}}, {{1, 2}, {3, 2}} -> {{1, 1}, {1, 1}, {1, 1}}, {{1, 
    2}, {3, 2}} -> {{1, 1}, {1, 1}, {1, 2}}, {{1, 2}, {3, 2}} -> {{1, 
    1}, {1, 1}, {1, 3}}, {{1, 2}, {3, 2}} -> {{1, 1}, {1, 1}, {2, 
    1}}, {{1, 2}, {3, 2}} -> {{1, 1}, {1, 1}, {2, 2}}, {{1, 2}, {3, 
    2}} -> {{1, 1}, {1, 1}, {2, 3}}, {{1, 2}, {3, 2}} -> {{1, 1}, {1, 
    1}, {3, 1}}, {{1, 2}, {3, 2}} -> {{1, 1}, {1, 1}, {3, 2}}, {{1, 
    2}, {3, 2}} -> {{1, 1}, {1, 1}, {3, 3}}, {{1, 2}, {3, 2}} -> {{1, 
    1}, {1, 2}, {1, 2}}, {{1, 2}, {3, 2}} -> {{1, 1}, {1, 2}, {1, 
    3}}, {{1, 2}, {3, 2}} -> {{1, 1}, {1, 2}, {2, 1}}, {{1, 2}, {3, 
    2}} -> {{1, 1}, {1, 2}, {2, 2}}, {{1, 2}, {3, 2}} -> {{1, 1}, {1, 
    2}, {2, 3}}, {{1, 2}, {3, 2}} -> {{1, 1}, {1, 2}, {3, 1}}, {{1, 
    2}, {3, 2}} -> {{1, 1}, {1, 2}, {3, 2}}, {{1, 2}, {3, 2}} -> {{1, 
    1}, {1, 2}, {3, 3}}, {{1, 2}, {3, 2}} -> {{1, 1}, {1, 3}, {1, 
    3}}, {{1, 2}, {3, 2}} -> {{1, 1}, {1, 3}, {2, 1}}, {{1, 2}, {3, 
    2}} -> {{1, 1}, {1, 3}, {2, 2}}, {{1, 2}, {3, 2}} -> {{1, 1}, {1, 
    3}, {2, 3}}, {{1, 2}, {3, 2}} -> {{1, 1}, {1, 3}, {3, 1}}, {{1, 
    2}, {3, 2}} -> {{1, 1}, {1, 3}, {3, 2}}, {{1, 2}, {3, 2}} -> {{1, 
    1}, {1, 3}, {3, 3}}, {{1, 2}, {3, 2}} -> {{1, 1}, {2, 1}, {2, 
    1}}, {{1, 2}, {3, 2}} -> {{1, 1}, {2, 1}, {2, 3}}, {{1, 2}, {3, 
    2}} -> {{1, 1}, {2, 1}, {3, 1}}, {{1, 2}, {3, 2}} -> {{1, 1}, {2, 
    1}, {3, 2}}, {{1, 2}, {3, 2}} -> {{1, 1}, {2, 1}, {3, 3}}, {{1, 
    2}, {3, 2}} -> {{1, 1}, {2, 2}, {3, 3}}, {{1, 2}, {3, 2}} -> {{1, 
    1}, {2, 3}, {2, 3}}, {{1, 2}, {3, 2}} -> {{1, 1}, {2, 3}, {3, 
    2}}, {{1, 2}, {3, 2}} -> {{1, 1}, {3, 1}, {2, 2}}, {{1, 2}, {3, 
    2}} -> {{1, 1}, {3, 1}, {2, 3}}, {{1, 2}, {3, 2}} -> {{1, 1}, {3, 
    1}, {3, 1}}, {{1, 2}, {3, 2}} -> {{1, 1}, {3, 1}, {3, 2}}, {{1, 
    2}, {3, 2}} -> {{1, 1}, {3, 2}, {3, 2}}, {{1, 2}, {3, 2}} -> {{1, 
    2}, {1, 2}, {1, 2}}, {{1, 2}, {3, 2}} -> {{1, 2}, {1, 2}, {1, 
    3}}, {{1, 2}, {3, 2}} -> {{1, 2}, {1, 2}, {2, 1}}, {{1, 2}, {3, 
    2}} -> {{1, 2}, {1, 2}, {2, 3}}, {{1, 2}, {3, 2}} -> {{1, 2}, {1, 
    2}, {3, 1}}, {{1, 2}, {3, 2}} -> {{1, 2}, {1, 2}, {3, 2}}, {{1, 
    2}, {3, 2}} -> {{1, 2}, {1, 3}, {2, 3}}, {{1, 2}, {3, 2}} -> {{1, 
    2}, {2, 1}, {1, 3}}, {{1, 2}, {3, 2}} -> {{1, 2}, {2, 1}, {3, 
    1}}, {{1, 2}, {3, 2}} -> {{1, 2}, {2, 3}, {3, 1}}, {{1, 2}, {3, 
    2}} -> {{1, 3}, {1, 2}, {3, 2}}, {{1, 2}, {3, 2}} -> {{1, 3}, {1, 
    3}, {1, 2}}, {{1, 2}, {3, 2}} -> {{1, 3}, {1, 3}, {1, 3}}, {{1, 
    2}, {3, 2}} -> {{1, 3}, {1, 3}, {2, 1}}, {{1, 2}, {3, 2}} -> {{1, 
    3}, {1, 3}, {2, 3}}, {{1, 2}, {3, 2}} -> {{1, 3}, {1, 3}, {3, 
    1}}, {{1, 2}, {3, 2}} -> {{1, 3}, {1, 3}, {3, 2}}, {{1, 2}, {3, 
    2}} -> {{1, 3}, {3, 1}, {1, 2}}, {{1, 2}, {3, 2}} -> {{1, 3}, {3, 
    1}, {2, 1}}, {{1, 2}, {3, 2}} -> {{2, 1}, {1, 2}, {2, 3}}, {{1, 
    2}, {3, 2}} -> {{2, 1}, {1, 2}, {3, 2}}, {{1, 2}, {3, 2}} -> {{2, 
    1}, {2, 1}, {1, 2}}, {{1, 2}, {3, 2}} -> {{2, 1}, {2, 1}, {1, 
    3}}, {{1, 2}, {3, 2}} -> {{2, 1}, {2, 1}, {2, 1}}, {{1, 2}, {3, 
    2}} -> {{2, 1}, {2, 1}, {2, 3}}, {{1, 2}, {3, 2}} -> {{2, 1}, {2, 
    1}, {3, 1}}, {{1, 2}, {3, 2}} -> {{2, 1}, {2, 1}, {3, 2}}, {{1, 
    2}, {3, 2}} -> {{2, 1}, {2, 3}, {1, 3}}, {{1, 2}, {3, 2}} -> {{2, 
    2}, {1, 2}, {1, 2}}, {{1, 2}, {3, 2}} -> {{2, 2}, {1, 2}, {1, 
    3}}, {{1, 2}, {3, 2}} -> {{2, 2}, {1, 2}, {3, 1}}, {{1, 2}, {3, 
    2}} -> {{2, 2}, {1, 2}, {3, 2}}, {{1, 2}, {3, 2}} -> {{2, 2}, {1, 
    2}, {3, 3}}, {{1, 2}, {3, 2}} -> {{2, 2}, {1, 3}, {1, 3}}, {{1, 
    2}, {3, 2}} -> {{2, 2}, {1, 3}, {3, 1}}, {{1, 2}, {3, 2}} -> {{2, 
    2}, {2, 1}, {1, 1}}, {{1, 2}, {3, 2}} -> {{2, 2}, {2, 1}, {1, 
    2}}, {{1, 2}, {3, 2}} -> {{2, 2}, {2, 1}, {1, 3}}, {{1, 2}, {3, 
    2}} -> {{2, 2}, {2, 1}, {2, 1}}, {{1, 2}, {3, 2}} -> {{2, 2}, {2, 
    1}, {2, 3}}, {{1, 2}, {3, 2}} -> {{2, 2}, {2, 1}, {3, 1}}, {{1, 
    2}, {3, 2}} -> {{2, 2}, {2, 1}, {3, 2}}, {{1, 2}, {3, 2}} -> {{2, 
    2}, {2, 1}, {3, 3}}, {{1, 2}, {3, 2}} -> {{2, 2}, {2, 2}, {1, 
    1}}, {{1, 2}, {3, 2}} -> {{2, 2}, {2, 2}, {1, 2}}, {{1, 2}, {3, 
    2}} -> {{2, 2}, {2, 2}, {1, 3}}, {{1, 2}, {3, 2}} -> {{2, 2}, {2, 
    2}, {2, 1}}, {{1, 2}, {3, 2}} -> {{2, 2}, {2, 2}, {2, 2}}, {{1, 
    2}, {3, 2}} -> {{1, 1}, {1, 1}, {1, 4}}, {{1, 2}, {3, 2}} -> {{1, 
    1}, {1, 1}, {2, 4}}, {{1, 2}, {3, 2}} -> {{1, 1}, {1, 1}, {3, 
    4}}, {{1, 2}, {3, 2}} -> {{1, 1}, {1, 2}, {1, 4}}, {{1, 2}, {3, 
    2}} -> {{1, 1}, {1, 2}, {2, 4}}, {{1, 2}, {3, 2}} -> {{1, 1}, {1, 
    2}, {3, 4}}, {{1, 2}, {3, 2}} -> {{1, 1}, {1, 3}, {1, 4}}, {{1, 
    2}, {3, 2}} -> {{1, 1}, {1, 3}, {2, 4}}, {{1, 2}, {3, 2}} -> {{1, 
    1}, {1, 3}, {3, 4}}, {{1, 2}, {3, 2}} -> {{1, 1}, {2, 1}, {2, 
    4}}, {{1, 2}, {3, 2}} -> {{1, 1}, {2, 1}, {3, 4}}, {{1, 2}, {3, 
    2}} -> {{1, 1}, {2, 2}, {3, 4}}, {{1, 2}, {3, 2}} -> {{1, 1}, {2, 
    3}, {2, 4}}, {{1, 2}, {3, 2}} -> {{1, 1}, {2, 3}, {3, 4}}, {{1, 
    2}, {3, 2}} -> {{1, 1}, {3, 1}, {2, 4}}, {{1, 2}, {3, 2}} -> {{1, 
    1}, {3, 1}, {3, 4}}, {{1, 2}, {3, 2}} -> {{1, 1}, {3, 2}, {2, 
    4}}, {{1, 2}, {3, 2}} -> {{1, 1}, {3, 2}, {3, 4}}, {{1, 2}, {3, 
    2}} -> {{1, 1}, {3, 3}, {2, 4}}, {{1, 2}, {3, 2}} -> {{1, 2}, {1, 
    2}, {1, 4}}, {{1, 2}, {3, 2}} -> {{1, 2}, {1, 2}, {2, 4}}, {{1, 
    2}, {3, 2}} -> {{1, 2}, {1, 2}, {3, 4}}, {{1, 2}, {3, 2}} -> {{1, 
    2}, {1, 3}, {1, 4}}, {{1, 2}, {3, 2}} -> {{1, 2}, {1, 3}, {2, 
    4}}, {{1, 2}, {3, 2}} -> {{1, 2}, {2, 1}, {1, 4}}, {{1, 2}, {3, 
    2}} -> {{1, 2}, {2, 1}, {3, 4}}, {{1, 2}, {3, 2}} -> {{1, 2}, {2, 
    3}, {3, 4}}, {{1, 2}, {3, 2}} -> {{1, 3}, {1, 2}, {3, 4}}, {{1, 
    2}, {3, 2}} -> {{1, 3}, {1, 3}, {1, 4}}, {{1, 2}, {3, 2}} -> {{1, 
    3}, {1, 3}, {2, 4}}, {{1, 2}, {3, 2}} -> {{1, 3}, {1, 3}, {3, 
    4}}, {{1, 2}, {3, 2}} -> {{1, 3}, {3, 1}, {1, 4}}, {{1, 2}, {3, 
    2}} -> {{1, 3}, {3, 1}, {2, 4}}, {{1, 2}, {3, 2}} -> {{1, 3}, {3, 
    2}, {2, 4}}, {{1, 2}, {3, 2}} -> {{2, 1}, {1, 2}, {2, 4}}, {{1, 
    2}, {3, 2}} -> {{2, 1}, {1, 3}, {3, 4}}, {{1, 2}, {3, 2}} -> {{2, 
    1}, {2, 1}, {1, 4}}, {{1, 2}, {3, 2}} -> {{2, 1}, {2, 1}, {2, 
    4}}, {{1, 2}, {3, 2}} -> {{2, 1}, {2, 1}, {3, 4}}, {{1, 2}, {3, 
    2}} -> {{2, 1}, {2, 3}, {1, 4}}, {{1, 2}, {3, 2}} -> {{2, 1}, {2, 
    3}, {2, 4}}, {{1, 2}, {3, 2}} -> {{2, 2}, {1, 2}, {1, 4}}, {{1, 
    2}, {3, 2}} -> {{2, 2}, {1, 2}, {3, 4}}, {{1, 2}, {3, 2}} -> {{2, 
    2}, {1, 3}, {1, 4}}, {{1, 2}, {3, 2}} -> {{2, 2}, {1, 3}, {3, 
    4}}, {{1, 2}, {3, 2}} -> {{2, 2}, {2, 1}, {1, 4}}, {{1, 2}, {3, 
    2}} -> {{2, 2}, {2, 1}, {2, 4}}, {{1, 2}, {3, 2}} -> {{2, 2}, {2, 
    1}, {3, 4}}, {{1, 2}, {3, 2}} -> {{2, 2}, {2, 2}, {1, 4}}, {{1, 
    2}, {3, 2}} -> {{2, 2}, {2, 2}, {2, 4}}, {{1, 2}, {3, 2}} -> {{1, 
    1}, {1, 1}, {4, 1}}, {{1, 2}, {3, 2}} -> {{1, 1}, {1, 1}, {4, 
    2}}, {{1, 2}, {3, 2}} -> {{1, 1}, {1, 1}, {4, 3}}, {{1, 2}, {3, 
    2}} -> {{1, 1}, {1, 2}, {4, 1}}, {{1, 2}, {3, 2}} -> {{1, 1}, {1, 
    2}, {4, 2}}, {{1, 2}, {3, 2}} -> {{1, 1}, {1, 2}, {4, 3}}, {{1, 
    2}, {3, 2}} -> {{1, 1}, {1, 3}, {4, 1}}, {{1, 2}, {3, 2}} -> {{1, 
    1}, {1, 3}, {4, 2}}, {{1, 2}, {3, 2}} -> {{1, 1}, {1, 3}, {4, 
    3}}, {{1, 2}, {3, 2}} -> {{1, 1}, {2, 1}, {4, 1}}, {{1, 2}, {3, 
    2}} -> {{1, 1}, {2, 1}, {4, 2}}, {{1, 2}, {3, 2}} -> {{1, 1}, {2, 
    1}, {4, 3}}, {{1, 2}, {3, 2}} -> {{1, 1}, {2, 2}, {4, 3}}, {{1, 
    2}, {3, 2}} -> {{1, 1}, {2, 3}, {4, 3}}, {{1, 2}, {3, 2}} -> {{1, 
    1}, {3, 1}, {4, 1}}, {{1, 2}, {3, 2}} -> {{1, 1}, {3, 1}, {4, 
    2}}, {{1, 2}, {3, 2}} -> {{1, 1}, {3, 1}, {4, 3}}, {{1, 2}, {3, 
    2}} -> {{1, 1}, {3, 2}, {4, 2}}, {{1, 2}, {3, 2}} -> {{1, 1}, {3, 
    3}, {4, 2}}, {{1, 2}, {3, 2}} -> {{1, 2}, {1, 2}, {4, 1}}, {{1, 
    2}, {3, 2}} -> {{1, 2}, {1, 2}, {4, 2}}, {{1, 2}, {3, 2}} -> {{1, 
    2}, {1, 2}, {4, 3}}, {{1, 2}, {3, 2}} -> {{1, 2}, {1, 3}, {4, 
    1}}, {{1, 2}, {3, 2}} -> {{1, 2}, {1, 3}, {4, 2}}, {{1, 2}, {3, 
    2}} -> {{1, 2}, {2, 1}, {4, 1}}, {{1, 2}, {3, 2}} -> {{1, 2}, {2, 
    1}, {4, 3}}, {{1, 2}, {3, 2}} -> {{1, 2}, {2, 3}, {4, 2}}, {{1, 
    2}, {3, 2}} -> {{1, 2}, {2, 3}, {4, 3}}, {{1, 2}, {3, 2}} -> {{1, 
    2}, {3, 2}, {4, 2}}, {{1, 2}, {3, 2}} -> {{1, 3}, {1, 2}, {4, 
    3}}, {{1, 2}, {3, 2}} -> {{1, 3}, {1, 3}, {4, 1}}, {{1, 2}, {3, 
    2}} -> {{1, 3}, {1, 3}, {4, 2}}, {{1, 2}, {3, 2}} -> {{1, 3}, {1, 
    3}, {4, 3}}, {{1, 2}, {3, 2}} -> {{1, 3}, {2, 3}, {4, 3}}, {{1, 
    2}, {3, 2}} -> {{1, 3}, {3, 1}, {4, 1}}, {{1, 2}, {3, 2}} -> {{1, 
    3}, {3, 1}, {4, 2}}, {{1, 2}, {3, 2}} -> {{1, 3}, {3, 2}, {4, 
    2}}, {{1, 2}, {3, 2}} -> {{1, 3}, {3, 2}, {4, 3}}, {{1, 2}, {3, 
    2}} -> {{2, 1}, {1, 2}, {4, 2}}, {{1, 2}, {3, 2}} -> {{2, 1}, {1, 
    3}, {4, 1}}, {{1, 2}, {3, 2}} -> {{2, 1}, {1, 3}, {4, 3}}, {{1, 
    2}, {3, 2}} -> {{2, 1}, {2, 1}, {4, 1}}, {{1, 2}, {3, 2}} -> {{2, 
    1}, {2, 1}, {4, 2}}, {{1, 2}, {3, 2}} -> {{2, 1}, {2, 1}, {4, 
    3}}, {{1, 2}, {3, 2}} -> {{2, 1}, {2, 3}, {4, 1}}, {{1, 2}, {3, 
    2}} -> {{2, 1}, {2, 3}, {4, 2}}, {{1, 2}, {3, 2}} -> {{2, 2}, {1, 
    2}, {4, 1}}, {{1, 2}, {3, 2}} -> {{2, 2}, {1, 2}, {4, 2}}, {{1, 
    2}, {3, 2}} -> {{2, 2}, {1, 2}, {4, 3}}, {{1, 2}, {3, 2}} -> {{2, 
    2}, {1, 3}, {4, 3}}, {{1, 2}, {3, 2}} -> {{2, 2}, {2, 1}, {4, 
    1}}, {{1, 2}, {3, 2}} -> {{2, 2}, {2, 1}, {4, 2}}, {{1, 2}, {3, 
    2}} -> {{2, 2}, {2, 1}, {4, 3}}, {{1, 2}, {3, 2}} -> {{2, 2}, {2, 
    2}, {4, 1}}, {{1, 2}, {3, 2}} -> {{2, 2}, {2, 2}, {4, 2}}, {{1, 
    2}, {3, 2}} -> {{1, 1}, {1, 4}, {1, 4}}, {{1, 2}, {3, 2}} -> {{1, 
    1}, {1, 4}, {2, 1}}, {{1, 2}, {3, 2}} -> {{1, 1}, {1, 4}, {2, 
    2}}, {{1, 2}, {3, 2}} -> {{1, 1}, {1, 4}, {2, 3}}, {{1, 2}, {3, 
    2}} -> {{1, 1}, {1, 4}, {2, 4}}, {{1, 2}, {3, 2}} -> {{1, 1}, {1, 
    4}, {3, 1}}, {{1, 2}, {3, 2}} -> {{1, 1}, {1, 4}, {3, 2}}, {{1, 
    2}, {3, 2}} -> {{1, 1}, {1, 4}, {3, 3}}, {{1, 2}, {3, 2}} -> {{1, 
    1}, {1, 4}, {3, 4}}, {{1, 2}, {3, 2}} -> {{1, 1}, {1, 4}, {4, 
    1}}, {{1, 2}, {3, 2}} -> {{1, 1}, {1, 4}, {4, 2}}, {{1, 2}, {3, 
    2}} -> {{1, 1}, {1, 4}, {4, 3}}, {{1, 2}, {3, 2}} -> {{1, 1}, {1, 
    4}, {4, 4}}, {{1, 2}, {3, 2}} -> {{1, 1}, {2, 4}, {2, 4}}, {{1, 
    2}, {3, 2}} -> {{1, 1}, {2, 4}, {3, 4}}, {{1, 2}, {3, 2}} -> {{1, 
    1}, {2, 4}, {4, 2}}, {{1, 2}, {3, 2}} -> {{1, 1}, {2, 4}, {4, 
    3}}, {{1, 2}, {3, 2}} -> {{1, 1}, {3, 4}, {3, 4}}, {{1, 2}, {3, 
    2}} -> {{1, 1}, {3, 4}, {4, 2}}, {{1, 2}, {3, 2}} -> {{1, 1}, {3, 
    4}, {4, 3}}, {{1, 2}, {3, 2}} -> {{1, 2}, {1, 4}, {2, 3}}, {{1, 
    2}, {3, 2}} -> {{1, 2}, {1, 4}, {2, 4}}, {{1, 2}, {3, 2}} -> {{1, 
    2}, {1, 4}, {3, 1}}, {{1, 2}, {3, 2}} -> {{1, 2}, {1, 4}, {3, 
    2}}, {{1, 2}, {3, 2}} -> {{1, 2}, {2, 4}, {3, 2}}, {{1, 2}, {3, 
    2}} -> {{1, 2}, {2, 4}, {3, 4}}, {{1, 2}, {3, 2}} -> {{1, 2}, {2, 
    4}, {4, 1}}, {{1, 2}, {3, 2}} -> {{1, 2}, {2, 4}, {4, 3}}, {{1, 
    2}, {3, 2}} -> {{1, 3}, {1, 4}, {2, 1}}, {{1, 2}, {3, 2}} -> {{1, 
    3}, {1, 4}, {2, 3}}, {{1, 2}, {3, 2}} -> {{1, 3}, {1, 4}, {3, 
    2}}, {{1, 2}, {3, 2}} -> {{1, 3}, {1, 4}, {3, 4}}, {{1, 2}, {3, 
    2}} -> {{1, 3}, {3, 4}, {2, 3}}, {{1, 2}, {3, 2}} -> {{1, 3}, {3, 
    4}, {2, 4}}, {{1, 2}, {3, 2}} -> {{1, 3}, {3, 4}, {4, 1}}, {{1, 
    2}, {3, 2}} -> {{1, 3}, {3, 4}, {4, 2}}, {{1, 2}, {3, 2}} -> {{2, 
    1}, {1, 4}, {3, 4}}, {{1, 2}, {3, 2}} -> {{2, 1}, {1, 4}, {4, 
    3}}, {{1, 2}, {3, 2}} -> {{2, 1}, {2, 4}, {1, 3}}, {{1, 2}, {3, 
    2}} -> {{2, 1}, {2, 4}, {1, 4}}, {{1, 2}, {3, 2}} -> {{2, 1}, {2, 
    4}, {3, 1}}, {{1, 2}, {3, 2}} -> {{2, 1}, {2, 4}, {3, 2}}, {{1, 
    2}, {3, 2}} -> {{2, 2}, {1, 4}, {1, 4}}, {{1, 2}, {3, 2}} -> {{2, 
    2}, {1, 4}, {3, 4}}, {{1, 2}, {3, 2}} -> {{2, 2}, {1, 4}, {4, 
    1}}, {{1, 2}, {3, 2}} -> {{2, 2}, {1, 4}, {4, 3}}, {{1, 2}, {3, 
    2}} -> {{2, 2}, {2, 4}, {1, 1}}, {{1, 2}, {3, 2}} -> {{2, 2}, {2, 
    4}, {1, 2}}, {{1, 2}, {3, 2}} -> {{2, 2}, {2, 4}, {1, 3}}, {{1, 
    2}, {3, 2}} -> {{2, 2}, {2, 4}, {1, 4}}, {{1, 2}, {3, 2}} -> {{2, 
    2}, {2, 4}, {2, 4}}, {{1, 2}, {3, 2}} -> {{2, 2}, {2, 4}, {4, 
    1}}, {{1, 2}, {3, 2}} -> {{2, 2}, {2, 4}, {4, 2}}, {{1, 2}, {3, 
    2}} -> {{2, 2}, {2, 4}, {4, 4}}, {{1, 2}, {3, 2}} -> {{1, 1}, {1, 
    4}, {1, 5}}, {{1, 2}, {3, 2}} -> {{1, 1}, {1, 4}, {2, 5}}, {{1, 
    2}, {3, 2}} -> {{1, 1}, {1, 4}, {3, 5}}, {{1, 2}, {3, 2}} -> {{1, 
    1}, {1, 4}, {4, 5}}, {{1, 2}, {3, 2}} -> {{1, 1}, {2, 4}, {2, 
    5}}, {{1, 2}, {3, 2}} -> {{1, 1}, {2, 4}, {3, 5}}, {{1, 2}, {3, 
    2}} -> {{1, 1}, {2, 4}, {4, 5}}, {{1, 2}, {3, 2}} -> {{1, 1}, {3, 
    4}, {3, 5}}, {{1, 2}, {3, 2}} -> {{1, 1}, {3, 4}, {4, 5}}, {{1, 
    2}, {3, 2}} -> {{1, 2}, {1, 4}, {1, 5}}, {{1, 2}, {3, 2}} -> {{1, 
    2}, {1, 4}, {2, 5}}, {{1, 2}, {3, 2}} -> {{1, 2}, {1, 4}, {3, 
    5}}, {{1, 2}, {3, 2}} -> {{1, 2}, {2, 4}, {3, 5}}, {{1, 2}, {3, 
    2}} -> {{1, 2}, {2, 4}, {4, 5}}, {{1, 2}, {3, 2}} -> {{1, 3}, {1, 
    4}, {1, 5}}, {{1, 2}, {3, 2}} -> {{1, 3}, {1, 4}, {2, 5}}, {{1, 
    2}, {3, 2}} -> {{1, 3}, {1, 4}, {3, 5}}, {{1, 2}, {3, 2}} -> {{1, 
    3}, {3, 4}, {2, 5}}, {{1, 2}, {3, 2}} -> {{1, 3}, {3, 4}, {4, 
    5}}, {{1, 2}, {3, 2}} -> {{2, 1}, {1, 4}, {3, 5}}, {{1, 2}, {3, 
    2}} -> {{2, 1}, {1, 4}, {4, 5}}, {{1, 2}, {3, 2}} -> {{2, 1}, {2, 
    4}, {1, 5}}, {{1, 2}, {3, 2}} -> {{2, 1}, {2, 4}, {2, 5}}, {{1, 
    2}, {3, 2}} -> {{2, 1}, {2, 4}, {3, 5}}, {{1, 2}, {3, 2}} -> {{2, 
    2}, {1, 4}, {1, 5}}, {{1, 2}, {3, 2}} -> {{2, 2}, {1, 4}, {3, 
    5}}, {{1, 2}, {3, 2}} -> {{2, 2}, {1, 4}, {4, 5}}, {{1, 2}, {3, 
    2}} -> {{2, 2}, {2, 4}, {1, 5}}, {{1, 2}, {3, 2}} -> {{2, 2}, {2, 
    4}, {2, 5}}, {{1, 2}, {3, 2}} -> {{2, 2}, {2, 4}, {4, 5}}, {{1, 
    2}, {3, 2}} -> {{1, 1}, {1, 4}, {5, 1}}, {{1, 2}, {3, 2}} -> {{1, 
    1}, {1, 4}, {5, 2}}, {{1, 2}, {3, 2}} -> {{1, 1}, {1, 4}, {5, 
    3}}, {{1, 2}, {3, 2}} -> {{1, 1}, {1, 4}, {5, 4}}, {{1, 2}, {3, 
    2}} -> {{1, 1}, {2, 4}, {5, 3}}, {{1, 2}, {3, 2}} -> {{1, 1}, {2, 
    4}, {5, 4}}, {{1, 2}, {3, 2}} -> {{1, 1}, {3, 4}, {5, 2}}, {{1, 
    2}, {3, 2}} -> {{1, 1}, {3, 4}, {5, 4}}, {{1, 2}, {3, 2}} -> {{1, 
    2}, {1, 4}, {5, 1}}, {{1, 2}, {3, 2}} -> {{1, 2}, {1, 4}, {5, 
    2}}, {{1, 2}, {3, 2}} -> {{1, 2}, {1, 4}, {5, 3}}, {{1, 2}, {3, 
    2}} -> {{1, 2}, {2, 4}, {5, 2}}, {{1, 2}, {3, 2}} -> {{1, 2}, {2, 
    4}, {5, 3}}, {{1, 2}, {3, 2}} -> {{1, 2}, {2, 4}, {5, 4}}, {{1, 
    2}, {3, 2}} -> {{1, 3}, {1, 4}, {5, 1}}, {{1, 2}, {3, 2}} -> {{1, 
    3}, {1, 4}, {5, 2}}, {{1, 2}, {3, 2}} -> {{1, 3}, {1, 4}, {5, 
    3}}, {{1, 2}, {3, 2}} -> {{1, 3}, {3, 4}, {5, 2}}, {{1, 2}, {3, 
    2}} -> {{1, 3}, {3, 4}, {5, 3}}, {{1, 2}, {3, 2}} -> {{1, 3}, {3, 
    4}, {5, 4}}, {{1, 2}, {3, 2}} -> {{2, 1}, {1, 4}, {5, 1}}, {{1, 
    2}, {3, 2}} -> {{2, 1}, {1, 4}, {5, 3}}, {{1, 2}, {3, 2}} -> {{2, 
    1}, {1, 4}, {5, 4}}, {{1, 2}, {3, 2}} -> {{2, 1}, {2, 4}, {5, 
    1}}, {{1, 2}, {3, 2}} -> {{2, 1}, {2, 4}, {5, 2}}, {{1, 2}, {3, 
    2}} -> {{2, 1}, {2, 4}, {5, 3}}, {{1, 2}, {3, 2}} -> {{2, 2}, {1, 
    4}, {5, 3}}, {{1, 2}, {3, 2}} -> {{2, 2}, {1, 4}, {5, 4}}, {{1, 
    2}, {3, 2}} -> {{2, 2}, {2, 4}, {5, 1}}, {{1, 2}, {3, 2}} -> {{2, 
    2}, {2, 4}, {5, 2}}, {{1, 2}, {3, 2}} -> {{2, 2}, {2, 4}, {5, 
    4}}, {{1, 2}, {3, 2}} -> {{1, 1}, {4, 1}, {2, 2}}, {{1, 2}, {3, 
    2}} -> {{1, 1}, {4, 1}, {2, 3}}, {{1, 2}, {3, 2}} -> {{1, 1}, {4, 
    1}, {2, 4}}, {{1, 2}, {3, 2}} -> {{1, 1}, {4, 1}, {3, 2}}, {{1, 
    2}, {3, 2}} -> {{1, 1}, {4, 1}, {3, 3}}, {{1, 2}, {3, 2}} -> {{1, 
    1}, {4, 1}, {3, 4}}, {{1, 2}, {3, 2}} -> {{1, 1}, {4, 1}, {4, 
    1}}, {{1, 2}, {3, 2}} -> {{1, 1}, {4, 1}, {4, 2}}, {{1, 2}, {3, 
    2}} -> {{1, 1}, {4, 1}, {4, 3}}, {{1, 2}, {3, 2}} -> {{1, 1}, {4, 
    2}, {2, 3}}, {{1, 2}, {3, 2}} -> {{1, 1}, {4, 2}, {4, 2}}, {{1, 
    2}, {3, 2}} -> {{1, 1}, {4, 2}, {4, 3}}, {{1, 2}, {3, 2}} -> {{1, 
    1}, {4, 3}, {3, 2}}, {{1, 2}, {3, 2}} -> {{1, 1}, {4, 3}, {4, 
    3}}, {{1, 2}, {3, 2}} -> {{2, 2}, {4, 1}, {1, 3}}, {{1, 2}, {3, 
    2}} -> {{2, 2}, {4, 1}, {4, 1}}, {{1, 2}, {3, 2}} -> {{2, 2}, {4, 
    1}, {4, 3}}, {{1, 2}, {3, 2}} -> {{2, 2}, {4, 2}, {1, 1}}, {{1, 
    2}, {3, 2}} -> {{2, 2}, {4, 2}, {1, 3}}, {{1, 2}, {3, 2}} -> {{2, 
    2}, {4, 2}, {1, 4}}, {{1, 2}, {3, 2}} -> {{2, 2}, {4, 2}, {4, 
    1}}, {{1, 2}, {3, 2}} -> {{2, 2}, {4, 2}, {4, 2}}, {{1, 2}, {3, 
    2}} -> {{1, 1}, {4, 1}, {2, 5}}, {{1, 2}, {3, 2}} -> {{1, 1}, {4, 
    1}, {3, 5}}, {{1, 2}, {3, 2}} -> {{1, 1}, {4, 1}, {4, 5}}, {{1, 
    2}, {3, 2}} -> {{1, 1}, {4, 2}, {2, 5}}, {{1, 2}, {3, 2}} -> {{1, 
    1}, {4, 2}, {4, 5}}, {{1, 2}, {3, 2}} -> {{1, 1}, {4, 3}, {3, 
    5}}, {{1, 2}, {3, 2}} -> {{1, 1}, {4, 3}, {4, 5}}, {{1, 2}, {3, 
    2}} -> {{1, 2}, {4, 2}, {3, 5}}, {{1, 2}, {3, 2}} -> {{1, 3}, {4, 
    3}, {2, 5}}, {{1, 2}, {3, 2}} -> {{2, 1}, {4, 1}, {3, 5}}, {{1, 
    2}, {3, 2}} -> {{2, 2}, {4, 1}, {1, 5}}, {{1, 2}, {3, 2}} -> {{2, 
    2}, {4, 1}, {4, 5}}, {{1, 2}, {3, 2}} -> {{2, 2}, {4, 2}, {1, 
    5}}, {{1, 2}, {3, 2}} -> {{2, 2}, {4, 2}, {4, 5}}, {{1, 2}, {3, 
    2}} -> {{1, 1}, {4, 1}, {5, 1}}, {{1, 2}, {3, 2}} -> {{1, 1}, {4, 
    1}, {5, 2}}, {{1, 2}, {3, 2}} -> {{1, 1}, {4, 1}, {5, 3}}, {{1, 
    2}, {3, 2}} -> {{1, 1}, {4, 1}, {5, 4}}, {{1, 2}, {3, 2}} -> {{1, 
    1}, {4, 2}, {5, 2}}, {{1, 2}, {3, 2}} -> {{1, 1}, {4, 2}, {5, 
    3}}, {{1, 2}, {3, 2}} -> {{1, 1}, {4, 3}, {5, 3}}, {{1, 2}, {3, 
    2}} -> {{1, 2}, {4, 2}, {5, 2}}, {{1, 2}, {3, 2}} -> {{1, 2}, {4, 
    2}, {5, 3}}, {{1, 2}, {3, 2}} -> {{1, 3}, {4, 3}, {5, 2}}, {{1, 
    2}, {3, 2}} -> {{1, 3}, {4, 3}, {5, 3}}, {{1, 2}, {3, 2}} -> {{2, 
    1}, {4, 1}, {5, 1}}, {{1, 2}, {3, 2}} -> {{2, 1}, {4, 1}, {5, 
    3}}, {{1, 2}, {3, 2}} -> {{2, 2}, {4, 1}, {5, 1}}, {{1, 2}, {3, 
    2}} -> {{2, 2}, {4, 1}, {5, 3}}, {{1, 2}, {3, 2}} -> {{2, 2}, {4, 
    2}, {5, 1}}, {{1, 2}, {3, 2}} -> {{2, 2}, {4, 2}, {5, 2}}, {{1, 
    2}, {3, 2}} -> {{2, 2}, {4, 2}, {5, 4}}, {{1, 2}, {3, 2}} -> {{1, 
    1}, {4, 5}, {5, 2}}, {{1, 2}, {3, 2}} -> {{1, 1}, {4, 5}, {5, 
    3}}, {{1, 2}, {3, 2}} -> {{2, 2}, {4, 5}, {5, 1}}, {{1, 2}, {3, 
    2}} -> {{1, 4}, {1, 2}, {3, 4}}, {{1, 2}, {3, 2}} -> {{1, 4}, {1, 
    2}, {4, 2}}, {{1, 2}, {3, 2}} -> {{1, 4}, {1, 2}, {4, 3}}, {{1, 
    2}, {3, 2}} -> {{1, 4}, {1, 3}, {2, 4}}, {{1, 2}, {3, 2}} -> {{1, 
    4}, {1, 3}, {4, 2}}, {{1, 2}, {3, 2}} -> {{1, 4}, {1, 3}, {4, 
    3}}, {{1, 2}, {3, 2}} -> {{1, 4}, {1, 4}, {1, 2}}, {{1, 2}, {3, 
    2}} -> {{1, 4}, {1, 4}, {1, 3}}, {{1, 2}, {3, 2}} -> {{1, 4}, {1, 
    4}, {1, 4}}, {{1, 2}, {3, 2}} -> {{1, 4}, {1, 4}, {2, 1}}, {{1, 
    2}, {3, 2}} -> {{1, 4}, {1, 4}, {2, 3}}, {{1, 2}, {3, 2}} -> {{1, 
    4}, {1, 4}, {2, 4}}, {{1, 2}, {3, 2}} -> {{1, 4}, {1, 4}, {3, 
    1}}, {{1, 2}, {3, 2}} -> {{1, 4}, {1, 4}, {3, 2}}, {{1, 2}, {3, 
    2}} -> {{1, 4}, {1, 4}, {3, 4}}, {{1, 2}, {3, 2}} -> {{1, 4}, {1, 
    4}, {4, 1}}, {{1, 2}, {3, 2}} -> {{1, 4}, {1, 4}, {4, 2}}, {{1, 
    2}, {3, 2}} -> {{1, 4}, {1, 4}, {4, 3}}, {{1, 2}, {3, 2}} -> {{1, 
    4}, {2, 4}, {3, 4}}, {{1, 2}, {3, 2}} -> {{1, 4}, {4, 1}, {1, 
    2}}, {{1, 2}, {3, 2}} -> {{1, 4}, {4, 1}, {1, 3}}, {{1, 2}, {3, 
    2}} -> {{1, 4}, {4, 1}, {2, 1}}, {{1, 2}, {3, 2}} -> {{1, 4}, {4, 
    1}, {2, 3}}, {{1, 2}, {3, 2}} -> {{1, 4}, {4, 1}, {3, 1}}, {{1, 
    2}, {3, 2}} -> {{1, 4}, {4, 1}, {3, 2}}, {{1, 2}, {3, 2}} -> {{1, 
    4}, {4, 2}, {2, 1}}, {{1, 2}, {3, 2}} -> {{1, 4}, {4, 2}, {2, 
    3}}, {{1, 2}, {3, 2}} -> {{1, 4}, {4, 2}, {3, 2}}, {{1, 2}, {3, 
    2}} -> {{1, 4}, {4, 2}, {3, 4}}, {{1, 2}, {3, 2}} -> {{1, 4}, {4, 
    3}, {2, 3}}, {{1, 2}, {3, 2}} -> {{1, 4}, {4, 3}, {2, 4}}, {{1, 
    2}, {3, 2}} -> {{1, 4}, {4, 3}, {3, 2}}, {{1, 2}, {3, 2}} -> {{2, 
    4}, {2, 1}, {3, 4}}, {{1, 2}, {3, 2}} -> {{2, 4}, {2, 1}, {4, 
    1}}, {{1, 2}, {3, 2}} -> {{2, 4}, {2, 1}, {4, 3}}, {{1, 2}, {3, 
    2}} -> {{2, 4}, {2, 4}, {1, 2}}, {{1, 2}, {3, 2}} -> {{2, 4}, {2, 
    4}, {1, 3}}, {{1, 2}, {3, 2}} -> {{2, 4}, {2, 4}, {1, 4}}, {{1, 
    2}, {3, 2}} -> {{2, 4}, {2, 4}, {2, 1}}, {{1, 2}, {3, 2}} -> {{2, 
    4}, {2, 4}, {2, 4}}, {{1, 2}, {3, 2}} -> {{2, 4}, {2, 4}, {4, 
    1}}, {{1, 2}, {3, 2}} -> {{2, 4}, {2, 4}, {4, 2}}, {{1, 2}, {3, 
    2}} -> {{2, 4}, {4, 1}, {1, 3}}, {{1, 2}, {3, 2}} -> {{2, 4}, {4, 
    1}, {3, 1}}, {{1, 2}, {3, 2}} -> {{2, 4}, {4, 2}, {1, 2}}, {{1, 
    2}, {3, 2}} -> {{2, 4}, {4, 2}, {1, 3}}, {{1, 2}, {3, 2}} -> {{2, 
    4}, {4, 2}, {2, 1}}, {{1, 2}, {3, 2}} -> {{1, 4}, {1, 2}, {4, 
    5}}, {{1, 2}, {3, 2}} -> {{1, 4}, {1, 3}, {4, 5}}, {{1, 2}, {3, 
    2}} -> {{1, 4}, {1, 4}, {1, 5}}, {{1, 2}, {3, 2}} -> {{1, 4}, {1, 
    4}, {2, 5}}, {{1, 2}, {3, 2}} -> {{1, 4}, {1, 4}, {3, 5}}, {{1, 
    2}, {3, 2}} -> {{1, 4}, {1, 4}, {4, 5}}, {{1, 2}, {3, 2}} -> {{1, 
    4}, {2, 4}, {3, 5}}, {{1, 2}, {3, 2}} -> {{1, 4}, {3, 4}, {2, 
    5}}, {{1, 2}, {3, 2}} -> {{1, 4}, {4, 1}, {1, 5}}, {{1, 2}, {3, 
    2}} -> {{1, 4}, {4, 1}, {2, 5}}, {{1, 2}, {3, 2}} -> {{1, 4}, {4, 
    1}, {3, 5}}, {{1, 2}, {3, 2}} -> {{1, 4}, {4, 2}, {2, 5}}, {{1, 
    2}, {3, 2}} -> {{1, 4}, {4, 2}, {3, 5}}, {{1, 2}, {3, 2}} -> {{1, 
    4}, {4, 3}, {2, 5}}, {{1, 2}, {3, 2}} -> {{1, 4}, {4, 3}, {3, 
    5}}, {{1, 2}, {3, 2}} -> {{2, 4}, {2, 1}, {4, 5}}, {{1, 2}, {3, 
    2}} -> {{2, 4}, {2, 4}, {1, 5}}, {{1, 2}, {3, 2}} -> {{2, 4}, {2, 
    4}, {2, 5}}, {{1, 2}, {3, 2}} -> {{2, 4}, {2, 4}, {4, 5}}, {{1, 
    2}, {3, 2}} -> {{2, 4}, {4, 1}, {1, 5}}, {{1, 2}, {3, 2}} -> {{2, 
    4}, {4, 1}, {3, 5}}, {{1, 2}, {3, 2}} -> {{2, 4}, {4, 2}, {1, 
    5}}, {{1, 2}, {3, 2}} -> {{2, 4}, {4, 2}, {2, 5}}, {{1, 2}, {3, 
    2}} -> {{1, 4}, {1, 2}, {5, 4}}, {{1, 2}, {3, 2}} -> {{1, 4}, {1, 
    3}, {5, 4}}, {{1, 2}, {3, 2}} -> {{1, 4}, {1, 4}, {5, 1}}, {{1, 
    2}, {3, 2}} -> {{1, 4}, {1, 4}, {5, 2}}, {{1, 2}, {3, 2}} -> {{1, 
    4}, {1, 4}, {5, 3}}, {{1, 2}, {3, 2}} -> {{1, 4}, {1, 4}, {5, 
    4}}, {{1, 2}, {3, 2}} -> {{1, 4}, {2, 4}, {5, 3}}, {{1, 2}, {3, 
    2}} -> {{1, 4}, {2, 4}, {5, 4}}, {{1, 2}, {3, 2}} -> {{1, 4}, {3, 
    4}, {5, 2}}, {{1, 2}, {3, 2}} -> {{1, 4}, {3, 4}, {5, 4}}, {{1, 
    2}, {3, 2}} -> {{1, 4}, {4, 1}, {5, 1}}, {{1, 2}, {3, 2}} -> {{1, 
    4}, {4, 1}, {5, 2}}, {{1, 2}, {3, 2}} -> {{1, 4}, {4, 1}, {5, 
    3}}, {{1, 2}, {3, 2}} -> {{1, 4}, {4, 2}, {5, 2}}, {{1, 2}, {3, 
    2}} -> {{1, 4}, {4, 2}, {5, 3}}, {{1, 2}, {3, 2}} -> {{1, 4}, {4, 
    2}, {5, 4}}, {{1, 2}, {3, 2}} -> {{1, 4}, {4, 3}, {5, 2}}, {{1, 
    2}, {3, 2}} -> {{1, 4}, {4, 3}, {5, 3}}, {{1, 2}, {3, 2}} -> {{1, 
    4}, {4, 3}, {5, 4}}, {{1, 2}, {3, 2}} -> {{2, 4}, {2, 1}, {5, 
    4}}, {{1, 2}, {3, 2}} -> {{2, 4}, {2, 4}, {5, 1}}, {{1, 2}, {3, 
    2}} -> {{2, 4}, {2, 4}, {5, 2}}, {{1, 2}, {3, 2}} -> {{2, 4}, {2, 
    4}, {5, 4}}, {{1, 2}, {3, 2}} -> {{2, 4}, {4, 1}, {5, 1}}, {{1, 
    2}, {3, 2}} -> {{2, 4}, {4, 1}, {5, 3}}, {{1, 2}, {3, 2}} -> {{2, 
    4}, {4, 1}, {5, 4}}, {{1, 2}, {3, 2}} -> {{2, 4}, {4, 2}, {5, 
    1}}, {{1, 2}, {3, 2}} -> {{2, 4}, {4, 2}, {5, 2}}, {{1, 2}, {3, 
    2}} -> {{1, 4}, {1, 5}, {2, 1}}, {{1, 2}, {3, 2}} -> {{1, 4}, {1, 
    5}, {2, 3}}, {{1, 2}, {3, 2}} -> {{1, 4}, {1, 5}, {2, 4}}, {{1, 
    2}, {3, 2}} -> {{1, 4}, {1, 5}, {3, 1}}, {{1, 2}, {3, 2}} -> {{1, 
    4}, {1, 5}, {3, 2}}, {{1, 2}, {3, 2}} -> {{1, 4}, {1, 5}, {3, 
    4}}, {{1, 2}, {3, 2}} -> {{1, 4}, {1, 5}, {4, 2}}, {{1, 2}, {3, 
    2}} -> {{1, 4}, {1, 5}, {4, 3}}, {{1, 2}, {3, 2}} -> {{1, 4}, {1, 
    5}, {4, 5}}, {{1, 2}, {3, 2}} -> {{1, 4}, {4, 5}, {2, 3}}, {{1, 
    2}, {3, 2}} -> {{1, 4}, {4, 5}, {2, 4}}, {{1, 2}, {3, 2}} -> {{1, 
    4}, {4, 5}, {2, 5}}, {{1, 2}, {3, 2}} -> {{1, 4}, {4, 5}, {3, 
    2}}, {{1, 2}, {3, 2}} -> {{1, 4}, {4, 5}, {3, 4}}, {{1, 2}, {3, 
    2}} -> {{1, 4}, {4, 5}, {3, 5}}, {{1, 2}, {3, 2}} -> {{1, 4}, {4, 
    5}, {5, 1}}, {{1, 2}, {3, 2}} -> {{1, 4}, {4, 5}, {5, 2}}, {{1, 
    2}, {3, 2}} -> {{1, 4}, {4, 5}, {5, 3}}, {{1, 2}, {3, 2}} -> {{2, 
    4}, {2, 5}, {1, 2}}, {{1, 2}, {3, 2}} -> {{2, 4}, {2, 5}, {1, 
    3}}, {{1, 2}, {3, 2}} -> {{2, 4}, {2, 5}, {1, 4}}, {{1, 2}, {3, 
    2}} -> {{2, 4}, {2, 5}, {4, 1}}, {{1, 2}, {3, 2}} -> {{2, 4}, {2, 
    5}, {4, 5}}, {{1, 2}, {3, 2}} -> {{2, 4}, {4, 5}, {1, 3}}, {{1, 
    2}, {3, 2}} -> {{2, 4}, {4, 5}, {1, 5}}, {{1, 2}, {3, 2}} -> {{2, 
    4}, {4, 5}, {5, 1}}, {{1, 2}, {3, 2}} -> {{2, 4}, {4, 5}, {5, 
    2}}, {{1, 2}, {3, 2}} -> {{1, 4}, {1, 5}, {1, 6}}, {{1, 2}, {3, 
    2}} -> {{1, 4}, {1, 5}, {2, 6}}, {{1, 2}, {3, 2}} -> {{1, 4}, {1, 
    5}, {3, 6}}, {{1, 2}, {3, 2}} -> {{1, 4}, {1, 5}, {4, 6}}, {{1, 
    2}, {3, 2}} -> {{1, 4}, {2, 5}, {3, 6}}, {{1, 2}, {3, 2}} -> {{1, 
    4}, {4, 5}, {2, 6}}, {{1, 2}, {3, 2}} -> {{1, 4}, {4, 5}, {3, 
    6}}, {{1, 2}, {3, 2}} -> {{1, 4}, {4, 5}, {5, 6}}, {{1, 2}, {3, 
    2}} -> {{2, 4}, {2, 5}, {1, 6}}, {{1, 2}, {3, 2}} -> {{2, 4}, {2, 
    5}, {2, 6}}, {{1, 2}, {3, 2}} -> {{2, 4}, {2, 5}, {4, 6}}, {{1, 
    2}, {3, 2}} -> {{2, 4}, {4, 5}, {1, 6}}, {{1, 2}, {3, 2}} -> {{2, 
    4}, {4, 5}, {5, 6}}, {{1, 2}, {3, 2}} -> {{1, 4}, {1, 5}, {6, 
    1}}, {{1, 2}, {3, 2}} -> {{1, 4}, {1, 5}, {6, 2}}, {{1, 2}, {3, 
    2}} -> {{1, 4}, {1, 5}, {6, 3}}, {{1, 2}, {3, 2}} -> {{1, 4}, {1, 
    5}, {6, 4}}, {{1, 2}, {3, 2}} -> {{1, 4}, {2, 5}, {6, 3}}, {{1, 
    2}, {3, 2}} -> {{1, 4}, {3, 5}, {6, 2}}, {{1, 2}, {3, 2}} -> {{1, 
    4}, {4, 5}, {6, 2}}, {{1, 2}, {3, 2}} -> {{1, 4}, {4, 5}, {6, 
    3}}, {{1, 2}, {3, 2}} -> {{1, 4}, {4, 5}, {6, 4}}, {{1, 2}, {3, 
    2}} -> {{1, 4}, {4, 5}, {6, 5}}, {{1, 2}, {3, 2}} -> {{2, 4}, {2, 
    5}, {6, 1}}, {{1, 2}, {3, 2}} -> {{2, 4}, {2, 5}, {6, 2}}, {{1, 
    2}, {3, 2}} -> {{2, 4}, {2, 5}, {6, 4}}, {{1, 2}, {3, 2}} -> {{2, 
    4}, {4, 5}, {6, 1}}, {{1, 2}, {3, 2}} -> {{2, 4}, {4, 5}, {6, 
    4}}, {{1, 2}, {3, 2}} -> {{2, 4}, {4, 5}, {6, 5}}, {{1, 2}, {3, 
    2}} -> {{1, 4}, {5, 4}, {2, 3}}, {{1, 2}, {3, 2}} -> {{1, 4}, {5, 
    4}, {3, 2}}, {{1, 2}, {3, 2}} -> {{2, 4}, {5, 4}, {1, 3}}, {{1, 
    2}, {3, 2}} -> {{1, 4}, {5, 4}, {2, 6}}, {{1, 2}, {3, 2}} -> {{1, 
    4}, {5, 4}, {3, 6}}, {{1, 2}, {3, 2}} -> {{2, 4}, {5, 4}, {1, 
    6}}, {{1, 2}, {3, 2}} -> {{1, 4}, {5, 2}, {6, 3}}, {{1, 2}, {3, 
    2}} -> {{1, 4}, {5, 4}, {6, 2}}, {{1, 2}, {3, 2}} -> {{1, 4}, {5, 
    4}, {6, 3}}, {{1, 2}, {3, 2}} -> {{1, 4}, {5, 4}, {6, 4}}, {{1, 
    2}, {3, 2}} -> {{2, 4}, {5, 1}, {6, 3}}, {{1, 2}, {3, 2}} -> {{2, 
    4}, {5, 4}, {6, 1}}, {{1, 2}, {3, 2}} -> {{2, 4}, {5, 4}, {6, 
    4}}, {{1, 2}, {3, 2}} -> {{4, 1}, {1, 2}, {2, 3}}, {{1, 2}, {3, 
    2}} -> {{4, 1}, {1, 2}, {3, 2}}, {{1, 2}, {3, 2}} -> {{4, 1}, {1, 
    3}, {2, 3}}, {{1, 2}, {3, 2}} -> {{4, 1}, {1, 3}, {3, 2}}, {{1, 
    2}, {3, 2}} -> {{4, 1}, {1, 4}, {2, 4}}, {{1, 2}, {3, 2}} -> {{4, 
    1}, {1, 4}, {3, 4}}, {{1, 2}, {3, 2}} -> {{4, 1}, {1, 4}, {4, 
    2}}, {{1, 2}, {3, 2}} -> {{4, 1}, {1, 4}, {4, 3}}, {{1, 2}, {3, 
    2}} -> {{4, 1}, {4, 1}, {1, 2}}, {{1, 2}, {3, 2}} -> {{4, 1}, {4, 
    1}, {1, 3}}, {{1, 2}, {3, 2}} -> {{4, 1}, {4, 1}, {1, 4}}, {{1, 
    2}, {3, 2}} -> {{4, 1}, {4, 1}, {2, 1}}, {{1, 2}, {3, 2}} -> {{4, 
    1}, {4, 1}, {2, 3}}, {{1, 2}, {3, 2}} -> {{4, 1}, {4, 1}, {2, 
    4}}, {{1, 2}, {3, 2}} -> {{4, 1}, {4, 1}, {3, 1}}, {{1, 2}, {3, 
    2}} -> {{4, 1}, {4, 1}, {3, 2}}, {{1, 2}, {3, 2}} -> {{4, 1}, {4, 
    1}, {3, 4}}, {{1, 2}, {3, 2}} -> {{4, 1}, {4, 1}, {4, 1}}, {{1, 
    2}, {3, 2}} -> {{4, 1}, {4, 1}, {4, 2}}, {{1, 2}, {3, 2}} -> {{4, 
    1}, {4, 1}, {4, 3}}, {{1, 2}, {3, 2}} -> {{4, 1}, {4, 2}, {1, 
    2}}, {{1, 2}, {3, 2}} -> {{4, 1}, {4, 2}, {1, 3}}, {{1, 2}, {3, 
    2}} -> {{4, 1}, {4, 2}, {3, 1}}, {{1, 2}, {3, 2}} -> {{4, 1}, {4, 
    2}, {3, 4}}, {{1, 2}, {3, 2}} -> {{4, 1}, {4, 2}, {4, 3}}, {{1, 
    2}, {3, 2}} -> {{4, 1}, {4, 3}, {1, 2}}, {{1, 2}, {3, 2}} -> {{4, 
    1}, {4, 3}, {1, 3}}, {{1, 2}, {3, 2}} -> {{4, 1}, {4, 3}, {2, 
    1}}, {{1, 2}, {3, 2}} -> {{4, 1}, {4, 3}, {2, 4}}, {{1, 2}, {3, 
    2}} -> {{4, 2}, {2, 1}, {1, 3}}, {{1, 2}, {3, 2}} -> {{4, 2}, {2, 
    1}, {3, 1}}, {{1, 2}, {3, 2}} -> {{4, 2}, {2, 4}, {1, 4}}, {{1, 
    2}, {3, 2}} -> {{4, 2}, {2, 4}, {4, 1}}, {{1, 2}, {3, 2}} -> {{4, 
    2}, {4, 1}, {2, 1}}, {{1, 2}, {3, 2}} -> {{4, 2}, {4, 1}, {2, 
    3}}, {{1, 2}, {3, 2}} -> {{4, 2}, {4, 1}, {3, 2}}, {{1, 2}, {3, 
    2}} -> {{4, 2}, {4, 2}, {1, 2}}, {{1, 2}, {3, 2}} -> {{4, 2}, {4, 
    2}, {1, 3}}, {{1, 2}, {3, 2}} -> {{4, 2}, {4, 2}, {1, 4}}, {{1, 
    2}, {3, 2}} -> {{4, 2}, {4, 2}, {2, 1}}, {{1, 2}, {3, 2}} -> {{4, 
    2}, {4, 2}, {2, 4}}, {{1, 2}, {3, 2}} -> {{4, 2}, {4, 2}, {4, 
    1}}, {{1, 2}, {3, 2}} -> {{4, 2}, {4, 2}, {4, 2}}, {{1, 2}, {3, 
    2}} -> {{4, 4}, {1, 4}, {1, 2}}, {{1, 2}, {3, 2}} -> {{4, 4}, {1, 
    4}, {1, 3}}, {{1, 2}, {3, 2}} -> {{4, 4}, {1, 4}, {1, 4}}, {{1, 
    2}, {3, 2}} -> {{4, 4}, {1, 4}, {2, 1}}, {{1, 2}, {3, 2}} -> {{4, 
    4}, {1, 4}, {2, 2}}, {{1, 2}, {3, 2}} -> {{4, 4}, {1, 4}, {2, 
    3}}, {{1, 2}, {3, 2}} -> {{4, 4}, {1, 4}, {2, 4}}, {{1, 2}, {3, 
    2}} -> {{4, 4}, {1, 4}, {3, 1}}, {{1, 2}, {3, 2}} -> {{4, 4}, {1, 
    4}, {3, 2}}, {{1, 2}, {3, 2}} -> {{4, 4}, {1, 4}, {3, 3}}, {{1, 
    2}, {3, 2}} -> {{4, 4}, {1, 4}, {3, 4}}, {{1, 2}, {3, 2}} -> {{4, 
    4}, {2, 4}, {1, 1}}, {{1, 2}, {3, 2}} -> {{4, 4}, {2, 4}, {1, 
    2}}, {{1, 2}, {3, 2}} -> {{4, 4}, {2, 4}, {1, 3}}, {{1, 2}, {3, 
    2}} -> {{4, 4}, {2, 4}, {2, 1}}, {{1, 2}, {3, 2}} -> {{4, 4}, {2, 
    4}, {2, 4}}, {{1, 2}, {3, 2}} -> {{4, 4}, {4, 1}, {1, 1}}, {{1, 
    2}, {3, 2}} -> {{4, 4}, {4, 1}, {1, 2}}, {{1, 2}, {3, 2}} -> {{4, 
    4}, {4, 1}, {1, 3}}, {{1, 2}, {3, 2}} -> {{4, 4}, {4, 1}, {1, 
    4}}, {{1, 2}, {3, 2}} -> {{4, 4}, {4, 1}, {2, 1}}, {{1, 2}, {3, 
    2}} -> {{4, 4}, {4, 1}, {2, 2}}, {{1, 2}, {3, 2}} -> {{4, 4}, {4, 
    1}, {2, 3}}, {{1, 2}, {3, 2}} -> {{4, 4}, {4, 1}, {2, 4}}, {{1, 
    2}, {3, 2}} -> {{4, 4}, {4, 1}, {3, 1}}, {{1, 2}, {3, 2}} -> {{4, 
    4}, {4, 1}, {3, 2}}, {{1, 2}, {3, 2}} -> {{4, 4}, {4, 1}, {3, 
    3}}, {{1, 2}, {3, 2}} -> {{4, 4}, {4, 1}, {3, 4}}, {{1, 2}, {3, 
    2}} -> {{4, 4}, {4, 1}, {4, 1}}, {{1, 2}, {3, 2}} -> {{4, 4}, {4, 
    1}, {4, 2}}, {{1, 2}, {3, 2}} -> {{4, 4}, {4, 1}, {4, 3}}, {{1, 
    2}, {3, 2}} -> {{4, 4}, {4, 2}, {1, 1}}, {{1, 2}, {3, 2}} -> {{4, 
    4}, {4, 2}, {1, 2}}, {{1, 2}, {3, 2}} -> {{4, 4}, {4, 2}, {1, 
    3}}, {{1, 2}, {3, 2}} -> {{4, 4}, {4, 2}, {1, 4}}, {{1, 2}, {3, 
    2}} -> {{4, 4}, {4, 2}, {2, 1}}, {{1, 2}, {3, 2}} -> {{4, 4}, {4, 
    2}, {2, 2}}, {{1, 2}, {3, 2}} -> {{4, 4}, {4, 2}, {2, 4}}, {{1, 
    2}, {3, 2}} -> {{4, 4}, {4, 2}, {4, 2}}, {{1, 2}, {3, 2}} -> {{4, 
    4}, {4, 4}, {1, 4}}, {{1, 2}, {3, 2}} -> {{4, 4}, {4, 4}, {2, 
    4}}, {{1, 2}, {3, 2}} -> {{4, 4}, {4, 4}, {4, 1}}, {{1, 2}, {3, 
    2}} -> {{4, 4}, {4, 4}, {4, 2}}, {{1, 2}, {3, 2}} -> {{4, 1}, {1, 
    2}, {2, 5}}, {{1, 2}, {3, 2}} -> {{4, 1}, {1, 2}, {3, 5}}, {{1, 
    2}, {3, 2}} -> {{4, 1}, {1, 3}, {2, 5}}, {{1, 2}, {3, 2}} -> {{4, 
    1}, {1, 3}, {3, 5}}, {{1, 2}, {3, 2}} -> {{4, 1}, {1, 4}, {4, 
    5}}, {{1, 2}, {3, 2}} -> {{4, 1}, {4, 1}, {1, 5}}, {{1, 2}, {3, 
    2}} -> {{4, 1}, {4, 1}, {2, 5}}, {{1, 2}, {3, 2}} -> {{4, 1}, {4, 
    1}, {3, 5}}, {{1, 2}, {3, 2}} -> {{4, 1}, {4, 1}, {4, 5}}, {{1, 
    2}, {3, 2}} -> {{4, 1}, {4, 2}, {1, 5}}, {{1, 2}, {3, 2}} -> {{4, 
    1}, {4, 2}, {3, 5}}, {{1, 2}, {3, 2}} -> {{4, 1}, {4, 2}, {4, 
    5}}, {{1, 2}, {3, 2}} -> {{4, 1}, {4, 3}, {1, 5}}, {{1, 2}, {3, 
    2}} -> {{4, 1}, {4, 3}, {2, 5}}, {{1, 2}, {3, 2}} -> {{4, 1}, {4, 
    3}, {4, 5}}, {{1, 2}, {3, 2}} -> {{4, 2}, {2, 1}, {1, 5}}, {{1, 
    2}, {3, 2}} -> {{4, 2}, {2, 1}, {3, 5}}, {{1, 2}, {3, 2}} -> {{4, 
    2}, {2, 4}, {4, 5}}, {{1, 2}, {3, 2}} -> {{4, 2}, {4, 1}, {2, 
    5}}, {{1, 2}, {3, 2}} -> {{4, 2}, {4, 2}, {1, 5}}, {{1, 2}, {3, 
    2}} -> {{4, 2}, {4, 2}, {2, 5}}, {{1, 2}, {3, 2}} -> {{4, 2}, {4, 
    2}, {4, 5}}, {{1, 2}, {3, 2}} -> {{4, 4}, {1, 4}, {1, 5}}, {{1, 
    2}, {3, 2}} -> {{4, 4}, {1, 4}, {2, 5}}, {{1, 2}, {3, 2}} -> {{4, 
    4}, {1, 4}, {3, 5}}, {{1, 2}, {3, 2}} -> {{4, 4}, {2, 4}, {1, 
    5}}, {{1, 2}, {3, 2}} -> {{4, 4}, {2, 4}, {2, 5}}, {{1, 2}, {3, 
    2}} -> {{4, 4}, {4, 1}, {1, 5}}, {{1, 2}, {3, 2}} -> {{4, 4}, {4, 
    1}, {2, 5}}, {{1, 2}, {3, 2}} -> {{4, 4}, {4, 1}, {3, 5}}, {{1, 
    2}, {3, 2}} -> {{4, 4}, {4, 1}, {4, 5}}, {{1, 2}, {3, 2}} -> {{4, 
    4}, {4, 2}, {1, 5}}, {{1, 2}, {3, 2}} -> {{4, 4}, {4, 2}, {2, 
    5}}, {{1, 2}, {3, 2}} -> {{4, 4}, {4, 2}, {4, 5}}, {{1, 2}, {3, 
    2}} -> {{4, 1}, {1, 2}, {5, 1}}, {{1, 2}, {3, 2}} -> {{4, 1}, {1, 
    2}, {5, 2}}, {{1, 2}, {3, 2}} -> {{4, 1}, {1, 2}, {5, 3}}, {{1, 
    2}, {3, 2}} -> {{4, 1}, {1, 3}, {5, 1}}, {{1, 2}, {3, 2}} -> {{4, 
    1}, {1, 3}, {5, 2}}, {{1, 2}, {3, 2}} -> {{4, 1}, {1, 3}, {5, 
    3}}, {{1, 2}, {3, 2}} -> {{4, 1}, {1, 4}, {5, 4}}, {{1, 2}, {3, 
    2}} -> {{4, 1}, {4, 1}, {5, 1}}, {{1, 2}, {3, 2}} -> {{4, 1}, {4, 
    1}, {5, 2}}, {{1, 2}, {3, 2}} -> {{4, 1}, {4, 1}, {5, 3}}, {{1, 
    2}, {3, 2}} -> {{4, 1}, {4, 1}, {5, 4}}, {{1, 2}, {3, 2}} -> {{4, 
    1}, {4, 2}, {5, 1}}, {{1, 2}, {3, 2}} -> {{4, 1}, {4, 2}, {5, 
    3}}, {{1, 2}, {3, 2}} -> {{4, 1}, {4, 2}, {5, 4}}, {{1, 2}, {3, 
    2}} -> {{4, 1}, {4, 3}, {5, 1}}, {{1, 2}, {3, 2}} -> {{4, 1}, {4, 
    3}, {5, 2}}, {{1, 2}, {3, 2}} -> {{4, 1}, {4, 3}, {5, 4}}, {{1, 
    2}, {3, 2}} -> {{4, 2}, {2, 1}, {5, 1}}, {{1, 2}, {3, 2}} -> {{4, 
    2}, {2, 1}, {5, 2}}, {{1, 2}, {3, 2}} -> {{4, 2}, {2, 1}, {5, 
    3}}, {{1, 2}, {3, 2}} -> {{4, 2}, {2, 4}, {5, 4}}, {{1, 2}, {3, 
    2}} -> {{4, 2}, {4, 1}, {5, 2}}, {{1, 2}, {3, 2}} -> {{4, 2}, {4, 
    2}, {5, 1}}, {{1, 2}, {3, 2}} -> {{4, 2}, {4, 2}, {5, 2}}, {{1, 
    2}, {3, 2}} -> {{4, 2}, {4, 2}, {5, 4}}, {{1, 2}, {3, 2}} -> {{4, 
    4}, {1, 4}, {5, 1}}, {{1, 2}, {3, 2}} -> {{4, 4}, {1, 4}, {5, 
    2}}, {{1, 2}, {3, 2}} -> {{4, 4}, {1, 4}, {5, 3}}, {{1, 2}, {3, 
    2}} -> {{4, 4}, {1, 4}, {5, 4}}, {{1, 2}, {3, 2}} -> {{4, 4}, {2, 
    4}, {5, 1}}, {{1, 2}, {3, 2}} -> {{4, 4}, {2, 4}, {5, 2}}, {{1, 
    2}, {3, 2}} -> {{4, 4}, {2, 4}, {5, 4}}, {{1, 2}, {3, 2}} -> {{4, 
    4}, {4, 1}, {5, 1}}, {{1, 2}, {3, 2}} -> {{4, 4}, {4, 1}, {5, 
    2}}, {{1, 2}, {3, 2}} -> {{4, 4}, {4, 1}, {5, 3}}, {{1, 2}, {3, 
    2}} -> {{4, 4}, {4, 1}, {5, 4}}, {{1, 2}, {3, 2}} -> {{4, 4}, {4, 
    2}, {5, 1}}, {{1, 2}, {3, 2}} -> {{4, 4}, {4, 2}, {5, 2}}, {{1, 
    2}, {3, 2}} -> {{4, 4}, {4, 2}, {5, 4}}, {{1, 2}, {3, 2}} -> {{4, 
    1}, {1, 5}, {2, 3}}, {{1, 2}, {3, 2}} -> {{4, 1}, {1, 5}, {2, 
    5}}, {{1, 2}, {3, 2}} -> {{4, 1}, {1, 5}, {3, 2}}, {{1, 2}, {3, 
    2}} -> {{4, 1}, {1, 5}, {3, 5}}, {{1, 2}, {3, 2}} -> {{4, 1}, {1, 
    5}, {5, 2}}, {{1, 2}, {3, 2}} -> {{4, 1}, {1, 5}, {5, 3}}, {{1, 
    2}, {3, 2}} -> {{4, 1}, {4, 5}, {1, 2}}, {{1, 2}, {3, 2}} -> {{4, 
    1}, {4, 5}, {1, 3}}, {{1, 2}, {3, 2}} -> {{4, 1}, {4, 5}, {1, 
    5}}, {{1, 2}, {3, 2}} -> {{4, 1}, {4, 5}, {2, 1}}, {{1, 2}, {3, 
    2}} -> {{4, 1}, {4, 5}, {2, 3}}, {{1, 2}, {3, 2}} -> {{4, 1}, {4, 
    5}, {2, 4}}, {{1, 2}, {3, 2}} -> {{4, 1}, {4, 5}, {3, 1}}, {{1, 
    2}, {3, 2}} -> {{4, 1}, {4, 5}, {3, 2}}, {{1, 2}, {3, 2}} -> {{4, 
    1}, {4, 5}, {3, 4}}, {{1, 2}, {3, 2}} -> {{4, 2}, {2, 5}, {1, 
    3}}, {{1, 2}, {3, 2}} -> {{4, 2}, {2, 5}, {1, 5}}, {{1, 2}, {3, 
    2}} -> {{4, 2}, {2, 5}, {5, 1}}, {{1, 2}, {3, 2}} -> {{4, 2}, {4, 
    5}, {1, 2}}, {{1, 2}, {3, 2}} -> {{4, 2}, {4, 5}, {1, 3}}, {{1, 
    2}, {3, 2}} -> {{4, 2}, {4, 5}, {1, 4}}, {{1, 2}, {3, 2}} -> {{4, 
    2}, {4, 5}, {2, 1}}, {{1, 2}, {3, 2}} -> {{4, 2}, {4, 5}, {2, 
    5}}, {{1, 2}, {3, 2}} -> {{4, 4}, {4, 5}, {1, 4}}, {{1, 2}, {3, 
    2}} -> {{4, 4}, {4, 5}, {1, 5}}, {{1, 2}, {3, 2}} -> {{4, 4}, {4, 
    5}, {2, 4}}, {{1, 2}, {3, 2}} -> {{4, 4}, {4, 5}, {2, 5}}, {{1, 
    2}, {3, 2}} -> {{4, 4}, {4, 5}, {5, 1}}, {{1, 2}, {3, 2}} -> {{4, 
    4}, {4, 5}, {5, 2}}, {{1, 2}, {3, 2}} -> {{4, 1}, {1, 5}, {2, 
    6}}, {{1, 2}, {3, 2}} -> {{4, 1}, {1, 5}, {3, 6}}, {{1, 2}, {3, 
    2}} -> {{4, 1}, {1, 5}, {5, 6}}, {{1, 2}, {3, 2}} -> {{4, 1}, {4, 
    5}, {1, 6}}, {{1, 2}, {3, 2}} -> {{4, 1}, {4, 5}, {2, 6}}, {{1, 
    2}, {3, 2}} -> {{4, 1}, {4, 5}, {3, 6}}, {{1, 2}, {3, 2}} -> {{4, 
    1}, {4, 5}, {4, 6}}, {{1, 2}, {3, 2}} -> {{4, 2}, {2, 5}, {1, 
    6}}, {{1, 2}, {3, 2}} -> {{4, 2}, {2, 5}, {5, 6}}, {{1, 2}, {3, 
    2}} -> {{4, 2}, {4, 5}, {1, 6}}, {{1, 2}, {3, 2}} -> {{4, 2}, {4, 
    5}, {2, 6}}, {{1, 2}, {3, 2}} -> {{4, 2}, {4, 5}, {4, 6}}, {{1, 
    2}, {3, 2}} -> {{4, 1}, {1, 5}, {6, 1}}, {{1, 2}, {3, 2}} -> {{4, 
    1}, {1, 5}, {6, 2}}, {{1, 2}, {3, 2}} -> {{4, 1}, {1, 5}, {6, 
    3}}, {{1, 2}, {3, 2}} -> {{4, 1}, {1, 5}, {6, 5}}, {{1, 2}, {3, 
    2}} -> {{4, 1}, {4, 5}, {6, 1}}, {{1, 2}, {3, 2}} -> {{4, 1}, {4, 
    5}, {6, 2}}, {{1, 2}, {3, 2}} -> {{4, 1}, {4, 5}, {6, 3}}, {{1, 
    2}, {3, 2}} -> {{4, 1}, {4, 5}, {6, 4}}, {{1, 2}, {3, 2}} -> {{4, 
    2}, {2, 5}, {6, 1}}, {{1, 2}, {3, 2}} -> {{4, 2}, {2, 5}, {6, 
    2}}, {{1, 2}, {3, 2}} -> {{4, 2}, {2, 5}, {6, 5}}, {{1, 2}, {3, 
    2}} -> {{4, 2}, {4, 5}, {6, 1}}, {{1, 2}, {3, 2}} -> {{4, 2}, {4, 
    5}, {6, 2}}, {{1, 2}, {3, 2}} -> {{4, 2}, {4, 5}, {6, 4}}, {{1, 
    2}, {3, 2}} -> {{4, 1}, {5, 1}, {2, 3}}, {{1, 2}, {3, 2}} -> {{4, 
    1}, {5, 1}, {3, 2}}, {{1, 2}, {3, 2}} -> {{4, 2}, {5, 2}, {1, 
    3}}, {{1, 2}, {3, 2}} -> {{4, 4}, {5, 4}, {1, 5}}, {{1, 2}, {3, 
    2}} -> {{4, 4}, {5, 4}, {2, 5}}, {{1, 2}, {3, 2}} -> {{4, 4}, {5, 
    4}, {5, 1}}, {{1, 2}, {3, 2}} -> {{4, 4}, {5, 4}, {5, 2}}, {{1, 
    2}, {3, 2}} -> {{4, 1}, {5, 1}, {2, 6}}, {{1, 2}, {3, 2}} -> {{4, 
    1}, {5, 1}, {3, 6}}, {{1, 2}, {3, 2}} -> {{4, 2}, {5, 2}, {1, 
    6}}, {{1, 2}, {3, 2}} -> {{4, 1}, {5, 1}, {6, 1}}, {{1, 2}, {3, 
    2}} -> {{4, 1}, {5, 1}, {6, 2}}, {{1, 2}, {3, 2}} -> {{4, 1}, {5, 
    1}, {6, 3}}, {{1, 2}, {3, 2}} -> {{4, 1}, {5, 2}, {6, 3}}, {{1, 
    2}, {3, 2}} -> {{4, 2}, {5, 2}, {6, 1}}, {{1, 2}, {3, 2}} -> {{4, 
    2}, {5, 2}, {6, 2}}, {{1, 2}, {3, 2}} -> {{4, 5}, {4, 1}, {2, 
    5}}, {{1, 2}, {3, 2}} -> {{4, 5}, {4, 1}, {3, 5}}, {{1, 2}, {3, 
    2}} -> {{4, 5}, {4, 1}, {5, 1}}, {{1, 2}, {3, 2}} -> {{4, 5}, {4, 
    1}, {5, 2}}, {{1, 2}, {3, 2}} -> {{4, 5}, {4, 1}, {5, 3}}, {{1, 
    2}, {3, 2}} -> {{4, 5}, {4, 2}, {1, 5}}, {{1, 2}, {3, 2}} -> {{4, 
    5}, {4, 2}, {5, 1}}, {{1, 2}, {3, 2}} -> {{4, 5}, {4, 2}, {5, 
    2}}, {{1, 2}, {3, 2}} -> {{4, 5}, {4, 5}, {1, 4}}, {{1, 2}, {3, 
    2}} -> {{4, 5}, {4, 5}, {1, 5}}, {{1, 2}, {3, 2}} -> {{4, 5}, {4, 
    5}, {2, 4}}, {{1, 2}, {3, 2}} -> {{4, 5}, {4, 5}, {2, 5}}, {{1, 
    2}, {3, 2}} -> {{4, 5}, {4, 5}, {4, 1}}, {{1, 2}, {3, 2}} -> {{4, 
    5}, {4, 5}, {4, 2}}, {{1, 2}, {3, 2}} -> {{4, 5}, {4, 5}, {5, 
    1}}, {{1, 2}, {3, 2}} -> {{4, 5}, {4, 5}, {5, 2}}, {{1, 2}, {3, 
    2}} -> {{4, 5}, {5, 1}, {1, 2}}, {{1, 2}, {3, 2}} -> {{4, 5}, {5, 
    1}, {1, 3}}, {{1, 2}, {3, 2}} -> {{4, 5}, {5, 1}, {2, 1}}, {{1, 
    2}, {3, 2}} -> {{4, 5}, {5, 1}, {2, 3}}, {{1, 2}, {3, 2}} -> {{4, 
    5}, {5, 1}, {3, 1}}, {{1, 2}, {3, 2}} -> {{4, 5}, {5, 1}, {3, 
    2}}, {{1, 2}, {3, 2}} -> {{4, 5}, {5, 2}, {1, 2}}, {{1, 2}, {3, 
    2}} -> {{4, 5}, {5, 2}, {1, 3}}, {{1, 2}, {3, 2}} -> {{4, 5}, {5, 
    2}, {2, 1}}, {{1, 2}, {3, 2}} -> {{4, 5}, {5, 4}, {1, 4}}, {{1, 
    2}, {3, 2}} -> {{4, 5}, {5, 4}, {2, 4}}, {{1, 2}, {3, 2}} -> {{4, 
    5}, {5, 4}, {4, 1}}, {{1, 2}, {3, 2}} -> {{4, 5}, {5, 4}, {4, 
    2}}, {{1, 2}, {3, 2}} -> {{4, 5}, {4, 1}, {5, 6}}, {{1, 2}, {3, 
    2}} -> {{4, 5}, {4, 2}, {5, 6}}, {{1, 2}, {3, 2}} -> {{4, 5}, {5, 
    1}, {1, 6}}, {{1, 2}, {3, 2}} -> {{4, 5}, {5, 1}, {2, 6}}, {{1, 
    2}, {3, 2}} -> {{4, 5}, {5, 1}, {3, 6}}, {{1, 2}, {3, 2}} -> {{4, 
    5}, {5, 2}, {1, 6}}, {{1, 2}, {3, 2}} -> {{4, 5}, {5, 2}, {2, 
    6}}, {{1, 2}, {3, 2}} -> {{4, 5}, {4, 1}, {6, 5}}, {{1, 2}, {3, 
    2}} -> {{4, 5}, {4, 2}, {6, 5}}, {{1, 2}, {3, 2}} -> {{4, 5}, {5, 
    1}, {6, 1}}, {{1, 2}, {3, 2}} -> {{4, 5}, {5, 1}, {6, 2}}, {{1, 
    2}, {3, 2}} -> {{4, 5}, {5, 1}, {6, 3}}, {{1, 2}, {3, 2}} -> {{4, 
    5}, {5, 1}, {6, 5}}, {{1, 2}, {3, 2}} -> {{4, 5}, {5, 2}, {6, 
    1}}, {{1, 2}, {3, 2}} -> {{4, 5}, {5, 2}, {6, 2}}, {{1, 2}, {3, 
    2}} -> {{4, 5}, {5, 2}, {6, 5}}, {{1, 2}, {3, 2}} -> {{4, 5}, {4, 
    6}, {1, 4}}, {{1, 2}, {3, 2}} -> {{4, 5}, {4, 6}, {1, 5}}, {{1, 
    2}, {3, 2}} -> {{4, 5}, {4, 6}, {2, 4}}, {{1, 2}, {3, 2}} -> {{4, 
    5}, {4, 6}, {2, 5}}, {{1, 2}, {3, 2}} -> {{4, 5}, {4, 6}, {5, 
    1}}, {{1, 2}, {3, 2}} -> {{4, 5}, {4, 6}, {5, 2}}, {{1, 2}, {3, 
    2}} -> {{4, 5}, {5, 6}, {1, 6}}, {{1, 2}, {3, 2}} -> {{4, 5}, {5, 
    6}, {2, 6}}, {{1, 2}, {3, 2}} -> {{4, 5}, {5, 6}, {6, 1}}, {{1, 
    2}, {3, 2}} -> {{4, 5}, {5, 6}, {6, 2}}};
gres = {#[[1]], CanonicalGraph[#[[2]]]} & /@ 
   ResourceFunction["ParallelMapMonitored"][
    Function[ru, 
     TimeConstrained[
      With[{gs = 
         ResourceFunction["CausalConnectionGraph"][
          ResourceFunction["WolframModel"][ru, Automatic, #, 
            "LayeredCausalGraph"] &, 5, 10]}, {ru, IndexGraph[gs]}], 
      5]], allrules32];
Text /@ Counts[
  Framed[Graph[Last[#], ImageSize -> {80, 80}, 
      EdgeStyle -> 
       Directive[RGBColor[0.68, 0.3, 0.], Thickness[Large]], 
      VertexStyle -> RGBColor[0.853, 0.65, 0.3], VertexSize -> .15], 
     FrameStyle -> LightGray] & /@ gres]

Nearly 40% of these rules give causal graphs that terminate before 10 steps, corresponding to “universe-scale” spacelike singularities. Of the remainder, 76% produce no event horizons (at least at the steps we’re measuring). Then the next most common behavior is to generate “subuniverses” separated by cosmological event horizons. And then there are black holes. In aggregate these are produced in about 3% of cases. The most common is a single black hole, followed by a black hole combined with a subuniverse, two black holes, etc.

There are also more exotic cases, like the last case shown. The rule here is:

RulePlot
&#10005

RulePlot[ResourceFunction[
   "WolframModel"][{{1, 2}, {3, 2}} -> {{4, 1}, {4, 3}, {1, 2}}]]

And here is the causal graph:

ResourceFunction
&#10005

ResourceFunction[
  "WolframModel"][{{1, 2}, {3, 2}} -> {{4, 1}, {4, 3}, {1, 
    2}}, Automatic, 17, "LayeredCausalGraph"]

This is how the causal connection graph develops at successive steps:

Table
&#10005

Table[Graph[
  ResourceFunction["CausalConnectionGraph"][
   ResourceFunction[
      "WolframModel"][{{1, 2}, {3, 2}} -> {{4, 1}, {4, 3}, {1, 2}}, 
     Automatic, #, "LayeredCausalGraph"] &, t, 20], VertexSize -> .1, 
  ImageSize -> 60], {t, 8}]

It takes a few steps for “black holes to form”. But in the end, we get what we can interpret as a nested set of black holes. The causally equivalent events corresponding to the node at the top have future light cones that eventually cover the universe. But events associated with “lower” nodes yield progressively more localized future light cones:

With
&#10005

With[{gg = 
     Graph[ResourceFunction[
        "WolframModel"][{{1, 2}, {3, 2}} -> {{4, 1}, {4, 3}, {1, 2}}, 
       Automatic, 14, "LayeredCausalGraph"]]}, 
   HighlightGraph[
    gg, {Style[Subgraph[gg, VertexOutComponent[gg, #, 20]], Red, 
      Thick]}, ImageSize -> 200, AspectRatio -> 1/2]] & /@ {12, 13, 
  14, 15}

Here’s what’s going on in the spatial hypergraph:

ResourceFunction
&#10005

ResourceFunction["WolframModelPlot"][#, ImageSize -> Tiny] & /@ 
 ResourceFunction[
   "WolframModel"][{{1, 2}, {3, 2}} -> {{4, 1}, {4, 3}, {1, 2}}, 
  Automatic, 15, "StatesList"]

Once again, it’s at first pretty obscure where the “black holes” are. It’s mildly helpful to see individual events. What seems to be happening is that the “exterior of the universe” is the main loop. But somehow information can get propagated into the “long hair”, but then can’t get out again.

Show
&#10005

Show[#, ImageSize -> {50, 50}] & /@ 
 ResourceFunction[
   "WolframModel"][{{1, 2}, {3, 2}} -> {{4, 1}, {4, 3}, {1, 2}}, 
  Automatic, 12, "EventsStatesPlotsList"]

What is the analog of all this in ordinary continuum general relativity? Presumably it’s some kind of nested black hole phenomenon. Inside the event horizon of a black hole other black holes form. Perhaps all these black holes in some sense eventually merge (as the singularity theorem might seem to suggest), or perhaps there’s some structure with multiple levels of event horizons, as roughly happens in the Kerr solution.

Properties of Black Holes

When there’s a black hole in our models, what can one tell about what’s inside it? Causal edges go into the event horizon, but none come out. However, that does not mean that the structure of the spatial hypergraph doesn’t reflect what’s inside the event horizon. After all, every causal edge that crosses the event horizon originated in an event outside the event horizon. And that event represented some update in the spatial hypergraph. Or, in other words, while causal edges are “lost” into the event horizon, the “memory” of what they did is progressively imprinted in the spatial hypergraph outside the event horizon.

In ordinary general relativity, there are “no-hair” theorems that say that the gravitational effects of a black hole depend only on a few parameters, such as its overall mass and overall angular momentum. In our models, the overall mass is essentially just determined by the number of causal edges that end up crossing the event horizon. (Angular momentum is related to a kind of vorticity in the causal graph.) So the no-hair theorem for mass says that when there is an event horizon, none of the details of these causal edges matter; only their total number. It’s not clear why this would be true, but it seems conceivable that it could be an essentially purely graph theoretic result.

There’s another potential effect, however. Consider the following causal graph:

With
&#10005

With[{gg = 
     Graph[ResourceFunction[
        "WolframModel"][{{1, 2}, {1, 3}} -> {{1, 2}, {2, 4}, {3, 4}}, 
       Automatic, 13, "LayeredCausalGraph"]]}, 
   HighlightGraph[
    gg, {Style[Subgraph[gg, VertexOutComponent[gg, #, 20]], Red, 
      Thick], Style[Subgraph[gg, {8, 11, 13}], Purple, 
      Thickness[.025]]}, ImageSize -> 300]] &@13

The edges highlighted in red correspond in effect to the interior of an event horizon. The edges highlighted in purple form a pair. The one on the left will cross the event horizon, and “fall into the black hole”. The one on the right will escape to affect the rest of the universe.

Later on, we will see how similar phenomena occur in the multiway causal graph, and we will discuss how this relates to quantum phenomena such as Hawking radiation. But for now, here, everything we’re discussing is purely classical. But recall that while the flux of causal edges through spacelike surfaces corresponds to energy, the flux of causal edges through timelike surfaces corresponds to momentum. On average, the net momentum associated with a pair of causal edges should always cancel out. But if one of the edges crosses inside an event horizon, then whatever momentum it carries will just be aggregated into the total momentum of what’s inside the event horizon, effectively leaving the momentum associated with the other edge uncanceled.

What does this mean? It needs a more detailed analysis. But there seems to be some reason to think that these uncanceled causal edges should lead to a net momentum flux away from the black hole—a kind of “black hole wind”. The effect will be small, because it’ll essentially be proportional to the elementary length divided by the black hole radius (or, alternatively, the black hole surface area times the elementary length divided by the black hole volume). But conceivably in some circumstances—notably with small black holes—it could have measurable consequences.

By the way, it’s worth understanding the “physical origin” of this “wind”. Essentially it’s the result of a classical analog of vacuum polarization. Whereas in ordinary general relativity spacetime is a continuum, in our models it consists of discrete components, and this discreteness causes there to be “fluctuations” that are sensitive to the presence of the event horizon.

More Complicated Cases

If one starts looking at causal graphs for our models, there are plenty of complex things one sees, even with very simple underlying rules. Here are a few examples with various forms of overall causal structure:

Labeled
&#10005

Labeled[ResourceFunction["WolframModel"][#, Automatic, 30, 
    "LayeredCausalGraph"], 
   RulePlot[ResourceFunction["WolframModel"][#]]] &[{{1, 2}, {3, 
    2}} -> {{1, 3}, {1, 2}, {4, 3}}]

Labeled
&#10005

Labeled[ResourceFunction["WolframModel"][#, Automatic, 35, 
    "LayeredCausalGraph"], 
   RulePlot[ResourceFunction["WolframModel"][#]]] &[{{1, 1}, {1, 
    2}} -> {{2, 2}, {1, 2}, {1, 2}, {1, 3}}]

Labeled
&#10005

Labeled[ResourceFunction["WolframModel"][#, Automatic, 30, 
    "LayeredCausalGraph"], 
   RulePlot[ResourceFunction["WolframModel"][#]]] &[{{1, 2}, {3, 
    2}} -> {{2, 2}, {4, 1}, {1, 3}}]

Other Exotic Phenomena in Spacetime, etc.?

Event horizons and singularities can be surprising and confusing in the Einstein equations, but the mathematical structure of the equations at least in principle allows them to be described there. But might there be other kinds of exotic phenomena in spacetime that just can’t be described using this mathematical structure? Our models definitely suggest so.

One example we already encountered is disconnection in the spatial hypergraph. Another major class of phenomena involve what amounts to dynamical change of dimension. In the timelike singularities we saw above, parts of the spatial hypergraph effectively degenerate to being zero-dimensional.

But in general, the whole or part of the spatial hypergraph can change its effective dimension. I’ve discussed elsewhere the possibility that the early universe might have had a larger effective dimension than the current universe. But what would happen if there was just a region of higher dimension in our current universe?

It’s not clear how to make a traditional continuum mathematical description of this, though presumably if one tried to describe it in terms of a manifold, it would show up as a region with infinite curvature. But given a finite—but perhaps very large—hypergraph, it’s much more straightforward to see how regions of different (approximate) dimension might exist together. Inevitably, though, there will be lots of intricate issues to unravel in seeing exactly how all the appropriate mathematical limits fit together.

Nevertheless, one can at least get some sense of what “dimension anomalies” might be like. A region of higher effective dimension will—by definition—have a denser pattern of connections than the surrounding parts of the spatial hypergraph. It’s not clear what the boundary of the structure will be like. But conceivably, to be stable, it will have to correspond to an event horizon of some sort.

One thing that’s fairly clear is that a region of higher dimension will tend to involve more causal edges than the surrounding hypergraph, and will therefore behave like a region of higher energy, so that it’ll show up as a tiny region of space in which energy (or mass) is concentrated.

But of course we’re already very familiar with one example of tiny regions of space in which energy (or mass) are concentrated: elementary particles, like electrons. I’ve always assumed that particles in our models are some kind of stable localized structures in the spatial hypergraph. Perhaps their stability has an essentially topological or graph theoretical origin. But perhaps instead it’s more connected to some kind of event-horizon-like phenomenon—that would be visible in the causal graph.

But what’s “inside” such a particle? It could be a collection of elements of the spatial hypergraph that are connected to form some higher (or effectively infinite) dimensional space. It could also simply be that at scales involving fairly few elements in the hypergraph, there are only a discrete set of possible forms for the local region of the hypergraph that support something like an event horizon.

As an example of the kinds of localization one can see in a causal graph, here are the forms of forward light cones one gets starting from different events in a particular causal graph:

With
&#10005

With[{gg = 
     Graph[ResourceFunction[
        "WolframModel"][{{1, 2}, {1, 3}} -> {{2, 4}, {4, 3}, {3, 1}}, 
       Automatic, 25, "LayeredCausalGraph"]]}, 
   HighlightGraph[
    gg, {Style[Subgraph[gg, VertexOutComponent[gg, #, 60]], Red, 
      Thick]}, ImageSize -> 150, AspectRatio -> 1/2]] & /@ 
 Range[50, 60]

It’s not clear what the best signature to use in searching for particles in our models will be. But it seems like an intriguing—and appealing—possibility that in some sense particles like electrons are “generalized black holes”, or in effect that the apparent “perfection” of black holes is also manifest in the “perfection” of the smallest distinct constituents of matter.

(This reminds me of a personal anecdote. Back around 1975, when I was about 15 years old, I attended an evening physics talk in Oxford about black holes and their quantum features. After the talk, I went up to the speaker and asked if perhaps electrons could be black holes. “Absolutely not”, he said, rather dismissively. Well, we’ll see…)

What about other kinds of “anomalies in spacetime”? In our models, the structure of space is maintained by continual activity in the spatial hypergraph. Presumably in most situations such activity will on a large scale reach a certain statistically uniform “equilibrium” state. But it is conceivable that different regions of space could show different overall levels of activity—which would lead to different “vacuum energy densities”, effectively corresponding to different values of the cosmological constant.

It is also conceivable that there could be different domains in space, all with the same overall activity level (and thus the same energy density) but with different configurations of some large-scale (perhaps effectively topological) feature. And in such a case—as in many cosmological models—one can expect things like domain walls.

In ordinary general relativity, the basic topology of space remains fixed over the course of time. In our models, it can dynamically change, with the structure of space potentially being “re-knitted” in different topological configurations. I haven’t explicitly found examples of rules that generate something like a wormhole, but I’m sure they exist.

I mentioned above the possibility of small regions of space having different effective dimensions. It’s also possible that there could be extended structures, such as tubes, with different effective dimensions. And this raises the intriguing possibility of what one might call “space tunnels” in which there is a tube of “higher-dimensional space” connecting two points in the spatial hypergraph.

No doubt there are many possibilities, and many kinds of exotic phenomena that can occur. Some may be visible directly in the large-scale structure of the spatial hypergraph, while others may be more obvious in the causal graph, or the causal connection graph. It is interesting to imagine classifying different possibilities, although it seems almost inevitable that there will ultimately be undecidable aspects to essentially any classification.

Some exotic phenomena may rely on the discrete structure of our models, and not have meaningful continuum limits. But my guess is that there will be plenty of exotic phenomena that can occur even in continuum models of spacetime, but which just haven’t been looked for before.

Cauchy Surfaces, Closed Timelike Curves, etc.

The questions of causal structure that we’re considering here are already quite complicated. But there are even more issues to consider. One of them is the question of whether it is possible to define a definite notion of “progression of time” in spacetime. The causal graph in effect specifies the partial ordering of events in a system. But now we can ask whether there is a valid foliation that respects this partial ordering, in the sense that all events in a given slice are strictly “before” those in subsequent slices. In the continuum limit, this is effectively asking whether the dynamics of our system exhibit strong hyperbolicity.

One case where this will definitely not be seen is when there are closed timelike curves, represented by loops in the causal graph. But there are also plenty of other cases where there is no strict way to make a “thickness-1” foliation in which no event occurring within a given slice has a successor in the same slice, as in:

ResourceFunction
&#10005

ResourceFunction[
  "WolframModel"][{{1, 2}, {2, 3}} -> {{1, 2}, {2, 3}, {3, 4}}, {{1, 
   2}, {2, 3}}, 10, "LayeredCausalGraph"]

When it comes to taking a continuum limit, one should presumably “thicken” the foliations first. But there will inevitably still be cases where no limited amount of thickening will suffice to allow foliations to be created. And such cases one will presumably correspond to failures of Cauchy development in the continuum limit. And it seems likely that this phenomenon can be fairly directly connected to the singularities we have discussed above, but exactly how is not clear.

The Quantum Case

Everything I’ve said so far has involved “purely classical” evolution of the spatial hypergraph, and the causal graph that represents causal relationships within this evolution. But we can also consider multiway evolution and the multiway causal graph which in our models represent quantum behavior. So what happens to various forms of causal disconnection in this case?

The basic answer is that things rapidly become very complicated. Consider the very simple “cosmological horizon” causal graph:

ResourceFunction
&#10005

ResourceFunction[
  "WolframModel"][{{1, 2}, {1, 3}} -> {{2, 2}, {3, 1}, {1, 
    4}}, Automatic, 10, "LayeredCausalGraph"]

RulePlot
&#10005

RulePlot[ResourceFunction[
   "WolframModel"][{{1, 2}, {1, 3}} -> {{2, 2}, {3, 1}, {1, 4}}]]

Here is the corresponding multiway system:

ResourceFunction
&#10005

ResourceFunction["MultiwaySystem"][
 "WolframModel" -> {{{1, 2}, {1, 3}} -> {{2, 2}, {3, 1}, {1, 
      4}}}, {{{0, 0}, {0, 0}}}, 4, "StatesGraphStructure"]

And here is the multiway causal graph:

Graph
&#10005

Graph[ResourceFunction["MultiwaySystem"][
  "WolframModel" -> {{{1, 2}, {1, 3}} -> {{2, 2}, {3, 1}, {1, 
       4}}}, {{{0, 0}, {0, 0}}}, 4, "CausalGraphStructure"], 
 AspectRatio -> 1/2]

And here is its transitive reduction:

TransitiveReductionGraph
&#10005

TransitiveReductionGraph[
 Graph[ResourceFunction["MultiwaySystem"][
   "WolframModel" -> {{{1, 2}, {1, 3}} -> {{2, 2}, {3, 1}, {1, 
        4}}}, {{{0, 0}, {0, 0}}}, 4, "CausalGraphStructure"], 
  AspectRatio -> 1/2]]

This multiway causal graph includes both spacelike causal edges, of the kind shown in the ordinary causal graph, and branchlike causal edges, which represent causal relationships between different branches in the multiway graph. If one looked only at spacelike edges, one would see the spacetime event horizon. But branchlike edges can in effect connect across the event horizon.

Another way to say this is that quantum entanglements can span the event horizon. And if we look at the branchial graph associated with the multiway system above, we see that all states are entangled, even across the event horizon:

ResourceFunction
&#10005

ResourceFunction["MultiwaySystem"][
 "WolframModel" -> {{{1, 2}, {1, 3}} -> {{2, 2}, {3, 1}, {1, 
      4}}}, {{{0, 0}, {0, 0}}}, 4, "BranchialGraphStructure"]

There’s lots to understand here. And it’s all quite complicated. But let’s look at a simpler case:

RulePlot
&#10005

RulePlot[ResourceFunction[
   "WolframModel"][{{1, 1}} -> {{1, 1}, {1, 2}}]]

The ordinary spacetime causal graph in this case is:

Graph
&#10005

Graph[ResourceFunction["WolframModel"][{{1, 1}} -> {{1, 1}, {1, 2}}, 
  Automatic, 6, "LayeredCausalGraph"], ImageSize -> {Automatic, 400}]

The underlying spatial hypergraphs are

Show
&#10005

Show[#, ImageSize -> 50] & /@ 
 ResourceFunction["WolframModel"][{{1, 1}} -> {{1, 1}, {1, 2}}, 
  Automatic, 8, "StatesPlotsList"]

and the multiway graph is just

ResourceFunction
&#10005

ResourceFunction["MultiwaySystem"][
 "WolframModel" -> {{{1, 1}} -> {{1, 1}, {1, 2}}}, {{{0, 0}, {0, 
    0}}}, 5, "StatesGraphStructure"]

but the multiway causal graph is

ResourceFunction
&#10005

ResourceFunction["MultiwaySystem"][
 "WolframModel" -> {{{1, 1}} -> {{1, 1}, {1, 2}}}, {{{0, 0}, {0, 
    0}}}, 7, "CausalGraphStructure"]

although its transitive reduction is just:

TransitiveReductionGraph
&#10005

TransitiveReductionGraph[
 ResourceFunction["MultiwaySystem"][
  "WolframModel" -> {{{1, 1}} -> {{1, 1}, {1, 2}}}, {{{0, 0}, {0, 
     0}}}, 7, "CausalGraphStructure"]]

As another example, consider

RulePlot
&#10005

RulePlot[ResourceFunction[
   "WolframModel"][{{1, 1}} -> {{1, 1}, {1, 1}}]]

whose ordinary causal graph is:

Graph
&#10005

Graph[ResourceFunction["WolframModel"][{{1, 1}} -> {{1, 1}, {1, 1}}, 
  Automatic, 6, "LayeredCausalGraph"], ImageSize -> {Automatic, 400}]

The multiway causal graph is:

ResourceFunction
&#10005

ResourceFunction["MultiwaySystem"][
 "WolframModel" -> {{{1, 1}} -> {{1, 1}, {1, 1}}}, {{{0, 0}, {0, 
    0}}}, 8, "CausalGraphStructure"]

But once again the transitive reduction of this graph is just:

TransitiveReductionGraph
&#10005

TransitiveReductionGraph[
 ResourceFunction["MultiwaySystem"][
  "WolframModel" -> {{{1, 1}} -> {{1, 1}, {1, 1}}}, {{{0, 0}, {0, 
     0}}}, 8, "CausalGraphStructure"]]

As a marginally more realistic example, consider the minimal “black-hole-like” case from above:

RulePlot
&#10005

RulePlot[ResourceFunction[
   "WolframModel"][{{1, 2}, {2, 3}} -> {{4, 1}, {4, 3}, {1, 2}}]]

The ordinary causal graph in this case is:

ResourceFunction
&#10005

ResourceFunction[
  "WolframModel"][{{1, 2}, {2, 3}} -> {{4, 1}, {4, 3}, {1, 
    2}}, Automatic, 10, "LayeredCausalGraph"]

The multiway causal graph in this case is:

Graph
&#10005

Graph[ResourceFunction["MultiwaySystem"][
  "WolframModel" -> {{{1, 2}, {2, 3}} -> {{4, 1}, {4, 3}, {1, 
       2}}}, {{{0, 0}, {0, 0}}}, 6, "CausalGraphStructure"], 
 AspectRatio -> 1/2]

The transitive reduction of this is:

TransitiveReductionGraph
&#10005

TransitiveReductionGraph[%]

Meanwhile, the branchial graph has the structure:

ResourceFunction
&#10005

ResourceFunction["MultiwaySystem"][
 "WolframModel" -> {{{1, 2}, {2, 3}} -> {{4, 1}, {4, 3}, {1, 
      2}}}, {{{0, 0}, {0, 0}}}, 6, "BranchialGraphStructure"]

And once again, even though in the spacetime causal graph there’s a (rather minimal) black-hole-like event horizon, things are considerably more complicated in the multiway (i.e. quantum) case, notably with quantum entanglements in the branchial graph apparently spanning the event horizon.

There is much more to study here. But it’s already clear that there are some complicated relationships between ordinary causal connectivity, and multiway (i.e. quantum) causal connectivity. Just as in ordinary causal graphs there can be event horizons that limit the spatial effects of events, so in multiway causal graphs there can be event horizons that limit the branchial effects of events. Or, said another way, there should be “entanglement event horizons” that limit the causal relationships between quantum states.

One way to view causal effects in spacetime is to say that a given event can affect events in its future light cone. But in the space of quantum states the causal effect of an event is also limited, but now to an entanglement cone rather than a light cone. And just as we looked at causal connection graphs on the basis of light cones, we can do the same thing for entanglement cones.

The result will hopefully be an elucidation of the quantum character of event horizons. But that will have to await another bulletin…

]]>
https://writings.stephenwolfram.com/2020/05/event-horizons-singularities-and-other-exotic-spacetime-phenomena/feed/ 4
<![CDATA[The Wolfram Physics Project: <br />The First Two Weeks</br>]]> https://writings.stephenwolfram.com/2020/04/the-wolfram-physics-project-the-first-two-weeks/ https://writings.stephenwolfram.com/2020/04/the-wolfram-physics-project-the-first-two-weeks/#comments Wed, 29 Apr 2020 17:59:50 +0000 Stephen Wolfram https://writings.internal.stephenwolfram.com/?p=24424 first-two-weeksProject Announcement: Finally We May Have a Path to the Fundamental Theory of Physics… and It’s Beautiful Website: Wolfram Physics Project First, Thank You! We launched the Wolfram Physics Project two weeks ago, on April 14. And, in a word, wow! People might think that interest in fundamental science has waned. But the thousands of [...]]]> first-two-weeks

First, Thank You!

We launched the Wolfram Physics Project two weeks ago, on April 14. And, in a word, wow! People might think that interest in fundamental science has waned. But the thousands of messages we’ve received tell a very different story. People really care! They’re excited. They’re enjoying understanding what we’ve figured out. They’re appreciating the elegance of it. They want to support the project. They want to get involved.

It’s tremendously encouraging—and motivating. I wanted this project to be something for the world—and something lots of people could participate in. And it’s working. Our livestreams—even very technical ones—have been exceptionally popular. We’ve had lots of physicists, mathematicians, computer scientists and others asking questions, making suggestions and offering help. We’ve had lots of students and others who tell us how eager they are to get into doing research on the project. And we’ve had lots of people who just want to tell us they appreciate what we’re doing. So, thank you!

The Wolfram Physics Project: The First Two Weeks

Real-Time Science

Science is usually done behind closed doors. But not this project. This project is an open project where we’re sharing—in as real time as we can—what we’re doing and the tools we’re using. In the last two weeks, we’ve done more than 25 hours of livestreams about the project. We’ve given introductions to the project—both lecture style and Q&A. We’ve done detailed technical sessions. And we’ve started livestreaming our actual working research sessions. And in a couple of those sessions we’ve made the beginnings of some real discoveries—live and in public.

Wolfram Physics Livestream Archives

It’s pretty cool to see thousands of people joining us to experience real-time science. (Our peak so far was nearly 8000 simultaneous viewers, and a fairly technical 2-hour session ended up being watched for a total of more than three-quarters of a million minutes.) And we’re starting to see serious “public collaboration” happening, in real time. People are making technical suggestions, sending us links to relevant papers, even sending us pieces of Wolfram Language code to run—all in real time.

One of the great—and unexpected—things about the project is how well what we’ve discovered seems to dovetail with existing initiatives (like string theory, holographic principles, spin networks, higher categories, twistor theory, etc.) We’re keen to understand more about this, so one of the things we’ll be doing is having livestreamed discussions with experts in these various areas.

The Summer School Approaches

It’s only been two weeks since our project was launched—and there’ve already been some interesting things written about it that have helped sharpen my philosophical understanding. There hasn’t yet been time for serious scientific work to have been completed around the project… but we know people are on this path.

We also know that there are lots of people who want to get to the point where they can make serious contributions to the project. And to help with that, we’ve got an educational program coming up: we’ve added a Fundamental Physics track to our annual Wolfram Summer School.

Wolfram Summer School

Our Summer School—which has been running since 2003—is a 3-week program, focused on every participant doing a unique, original project. For the Fundamental Physics track, we’re going to have a “week 0” (June 22–27) that will be lectures and workshops about the Physics Project, followed by a 3-week project-based program (June 28–July 17).

This year’s Summer School will (for the first time) be online (though synchronous), so it’s going to be easier for students from around the world to attend. Many of the students for the Fundamental Physics track will be graduate students or postdocs, but we also expect to have students who are more junior, as well as professors and professionals. Since announcing the program last week, we’ve already received many good applications… but we’re going to try to expand the program to accommodate everyone who makes sense. (So if you’re thinking of applying, please just apply… though do it as soon as you can!)

I’m very excited about what’s going to be achieved at the Summer School. I never expected our whole project to develop as well—or as quickly—as it has. But at this point I think we’ve developed an approach and a methodology that are going to make possible rapid progress in many directions. And I’m fully expecting that there’ll be projects at the Summer School that lead, for example, to academic papers that rapidly become classics.

This is one of those rare times when there’s a lot of exceptionally juicy low-hanging fruit—and I’m looking forward to helping outstanding students find and pick that scientific fruit at our Summer School.

New Science in the First Two Weeks

It’s not too surprising that much of our time in the first two weeks after launching the project has been spent on “interfacing with the world”—explaining what we’re doing, trying to respond to thousands of messages, and setting up internal and external systems that can make future interactions easier.

But we’ve been very keen to go on working on the science, and some of that has been happening too. We’ve so far done five livestreamed working sessions, three on spin and charge, one on the interplay with distributed computing, and one on combinators and physics. Of course, this is just what we’re directly working on ourselves. We’ve also already helped several people get started on projects that use their expertise—in physics, mathematics or computer science—and it’s wonderful to see the beginning of this kind of “scaling up”.

But let me talk a bit about things I think I’ve learned in the past two weeks. Some of this comes from the working sessions we’ve had; some is in response to questions at our Q&As and some is just the result of my slowly growing understanding—particularly helped by my efforts in explaining the project to people.

What Is Angular Momentum?

OK, so here’s something concrete that came out of our working session last Thursday: I think we understand what angular momentum is. Here’s part of where we figured that out:

Physics working session

We already figured out a few months ago what linear momentum is. If you want to know the amount of linear momentum in a particular direction at a particular place in the hypergraph, you just have to see how much “activity” at that place in the hypergraph is being transferred in that “direction”.

Directions are defined by geodesics that give the shortest path between one point and another. Momentum in a particular direction then corresponds to the extent to which an update at one point leads to updates at nearby points along that direction. (More formally, the statement is that momentum is given by the flux of causal edges through timelike hypersurfaces.)

OK, so how about angular momentum? Well, it took us a total of nearly 6 hours, over three sessions, but here’s what we figured out. (And kudos to Jonathan Gorard for having had a crucial idea.)

So, first, what’s the usual concept of angular momentum in physics? It’s all about turning. It’s all about momentum that doesn’t add up to go in any particular direction but just circulates around. Here’s the picture we used on the livestream:

VectorPlot
&#10005

VectorPlot[{y, -x}, {x, -3, 3}, {y, -3, 3}]

Imagine this is a fluid, like water. The fluid isn’t flowing in a particular direction. Instead, it’s just circulating around, creating a vortex. And this vortex has angular momentum.

But what might the analog of this be in a hypergraph? To figure this out, we have to understand what rotation really is. It took us a little while to untangle this, but in the end it’s very simple. In any number of dimensions, a rotation is something that takes two vectors rooted at a particular point, and transforms one into the other. On the livestream, we used the simple example:

Graphics3D
&#10005

Graphics3D[{Thick, InfinitePlane[{{0, 0, 0}, {1, 0, 0}, {0, 1, 2}}], 
  Arrow[{{0, 0, 0}, {1, 0, 0}}], Arrow[{{0, 0, 0}, {0, 1, 2}}]}]

And in the act of transforming one of these vectors into the other we’re essentially sweeping out a plane. We imagined filling in the plane by making something like a string figure that joins points on the two vectors:

Graphics3D
&#10005

Graphics3D[Table[Line[{{i, 0, 0}, {0, j, 0}}], {i, 10}, {j, 10}]]

But now there’s an easy generalization to the hypergraph. A single geodesic defines a direction. Two geodesics—and the geodesics “strung” between them—define a plane. Here’s what we created to give an illustration of this:

Generalization to the hypergraph

So now we are beginning to have a picture of angular momentum: it is “activity” that “circulates around” in this little “patch of plane” defined by two geodesics from a particular point. We can get considerably more formal than this, talking about flux of causal edges in slices of tubes defined by pairs of geodesics. On the livestream, we started relating this to the tensor Jμν which defines relativistic angular momentum (the two indices of Jμν basically correspond to our two geodesics).

There are details to clean up, and further to go. (Rotating frames in general relativity? Rotating black holes? Black-hole “no hair” theorems? Etc.) But this was our first real “aha” moment in a public working session. And of course there’s an open archive both of the livestream itself, and the notebook created in it.

What about Quantum Angular Momentum and Spin?

One of the reasons I wanted to think about angular momentum was because of quantum mechanics. Unlike ordinary momentum, angular momentum is quantized, even in traditional physics. And, more than that, even supposedly point particles—like electrons—have nonzero quantized spin angular momentum.

We don’t yet know how this works in our models. (Stay tuned for future livestreamed working sessions!) But one point is clear: it has to involve not just the spatial hypergraph and the spacetime causal graph (as in our discussion of angular momentum above), but also the multiway causal graph.

And that means we’re dealing not just with a single rotation, but a whole collection of interwoven ones. I have a suspicion that the quantization is going to come from something essentially topological. If you’re looking at, say, fluid flow near a vortex, then when you go around a small circle adding up the flow at every point, you’ll get zero if the circle doesn’t include the center of the vortex, and some quantized value if it does (the value will be directly proportional to the number of times you wind around the vortex).

Assuming we’ve got a causal-invariant system, one feature of the multiway causal graph is that it must consist of many copies of the same spacetime causal graph—in a sense laid out (albeit with complicated interweaving) in branchial space. And it’s also possible (as Jonathan suggested on the livestream) that somehow when one measures an angular momentum—or a spin—one is effectively picking up just a certain discrete number of “histories”, or a discrete number of identical copies of the spacetime causal graph.

But we’ll see. I won’t be surprised if both ideas somehow dovetail together. But maybe we’ll need some completely different idea. Either way, I suspect there’s going to be somewhat sophisticated math involved. We have a guess that the continuum limit of the multiway causal graph is something like a twistor space. So then we might be dealing with homotopy in twistor space—or, more likely, some generalization of that.

On the livestream, various people asked about spinors. We ordinarily think of a rotation through 360° as bringing everything back to where it started from. But in quantum mechanics that’s not how things work. Instead, for something like an electron, it takes a rotation through 720°. And mathematically, that means we’re dealing with so-called spinors, rather than vectors. We don’t yet know how this could come out in our models (though we have some possible ideas)—but this is something we’re planning to explore soon. (It’s again mathematically complicated, because we’re not intrinsically dealing with integer-dimensional space, so we’ve got to generalize the notion of rotation, rotation groups, etc.)

And as I write this, I have a new idea—of trying to see how relativistic wave equations (like the Klein–Gordon equation for spin-0 particles or the Dirac equation for spin-1/2 particles) might arise from thinking about bundles of geodesics in the multiway causal graph. The suspicion is that there would be a subtle relationship between effective spacetime dimension and symmetries associated with the bundle of geodesics, mirroring the way that in traditional relativistic quantum mechanics one can identify different spins with objects transforming according to different irreducible representations of the symmetry group of spacetime.

CPT Invariance?

Related to the whole story about spinors, there’s a fundamental result in quantum field theory called the spin-statistics theorem that says that particles with half-integer spins (like electrons) are fermions (and so obey the exclusion principle), while particles with integer spins (like photons) are bosons (and so can form condensates). And this in turn is related to what’s called CPT invariance.

And one of the things that came out of a livestream last week is that there’s potentially a very beautiful interpretation of CPT invariance in our models.

What is CPT invariance? C, P and T correspond to three potential transformations applied to physical systems. T is time reversal, i.e. having time run in reverse. P is parity, or space inversion: reversing the sign of all spatial coordinates. And C is charge conjugation: turning particles (like electrons) into antiparticles (like positrons). One might think that the laws of physics would be invariant under any of these transformations. But in fact, each of C, P and T invariance is violated somewhere in particle physics (and this fact was a favorite of mine back when I did particle physics for a living). However, the standard formalism of quantum field theory implies that there is still invariance under the combined CPT transformation—and, so far as one can tell, this is experimentally correct.

OK, so what do C, P and T correspond to in our models? Consider the multiway causal graph. Here’s a toy version of it, that we discussed in a livestream last week:

Graph3D
&#10005

Graph3D[GridGraph[{6, 6, 6}]]

Edges in one direction (say, down) correspond to time. Edges in another direction correspond to space. And edges in the third direction correspond to branchial space (i.e. the space of quantum spaces).

T and P then have simple interpretations: they correspond to reversing time edges and space edges, respectively. C is a little less clear, but we suspect that it just corresponds to reversing branchial edges (and this very correspondence probably tells us something about the nature of antiparticles).

So then CPT is like a wholesale inversion of the multiway causal graph. But what can we say about this? Well, we’ve argued that (with certain assumptions) spacetime slices of the multiway causal graph must obey the Einstein equations. Similarly, we’ve argued that branchtime slices follow the Feynman path integral. But now there’s a generalization of both these things: in effect, a generalization of the Einstein equations that applies to the whole multiway causal graph. It’s mathematically complicated—because it must describe the combined geometry of physical and branchial space. But it looks as if CPT invariance must just correspond to a symmetry of this generalized equation. And to me this is something very beautiful—that I can hardly wait to investigate more.

What’s Going On in Quantum Computing?

One feature of our models is that they potentially make it a lot more concrete what’s going on in quantum computing. And over the past couple of weeks we’ve started to think about what this really means.

There are two basic points. First, the multiway graph provides a very explicit representation of “quantum indeterminacy”. And, second, thinking about branchial space (and quantum observation frames) gives more concreteness to the notion of quantum measurement.

A classical computer like an ordinary Turing machine is effectively just following one deterministic path of evolution. But the qualitative picture of a quantum computer is that instead it’s simultaneously following many paths of evolution, so that in effect it can do many Turing-machine-like computations in parallel.

But at the end, there’s always the issue of finding which path or paths have the answer you want: and in effect you have to arrange your measurement to just pick out these paths.

In ordinary Turing machines, there are problems (like multiplying numbers) that are in the class P, meaning that they can be done a number of steps polynomial in the size of the problem (say, the number of digits in the numbers). There are also problems (like factoring numbers) that are in the class NP, meaning that if you were to “non-deterministically” guess the answer, you could check it in polynomial time.

A core question in theoretical computing science (which I have views on, but won’t discuss here) is whether P=NP, that is, whether all NP problems can actually be done in polynomial time.

One way to imagine doing an NP problem in polynomial time is not to use an ordinary Turing machine, but instead to use a “non-deterministic Turing machine” in which there is a tree of possible paths where one can pick any path to follow. Well, our multiway system representing quantum mechanics essentially gives that whole tree (though causal invariance implies that ultimately the branches always merge).

For the last several years, we’ve been developing a framework for quantum computing in the Wolfram Language (which we’re hoping to release soon). And in this framework we’re essentially describing two things: how quantum information is propagated with time through some series of quantum operations, and how the results of quantum processes are measured. More formally, we have time evolution operators, and we have measurement operators.

Well, here’s the first neat thing we’ve realized: we can immediately reformulate our quantum computing framework directly in terms of multiway systems. The quantum computing framework can in effect just be viewed as an application of our MultiwaySystem function that we put in the Wolfram Function Repository for the Physics Project.

But now that we’re thinking in terms of multiway systems—or the multiway causal graph—we realize that standard quantum operations are effectively associated with timelike causal edges, while measurement operations are associated with branchlike causal edges. And the extent to which one can get answers before decoherence takes over has to do with a competition between these kinds of edges.

This is all very much in progress right now, but in the next few weeks we’re expecting to be able to look at well-known quantum algorithms in this context, and see whether we can analyze them in a way that treats time evolution and measurement on a common footing. (I will say that ever since the work I did with Richard Feynman on quantum computing back in the early 1980s, I have always wanted to really understand the “cost of measurement”, and I’m hoping that we’ll finally be able to do that now.)

Numerical Relativity; Numerical Quantum Field Theory

Although the traditional view in physics is that space and time are continuous, when it comes to doing actual computer simulations they usually in the end have to be discretized. And in general relativity (say for simulating a black hole merger) it’s usually a very subtle business, in which the details of the discretization are hard to keep track of, and hard to keep consistent.

In our models, of course, discretization is not something “imposed after the fact”, but rather something completely intrinsic to the model. So we started wondering whether somehow this could be used in practice to set up simulations.

It’s actually a very analogous idea to something I did rather successfully in the mid-1980s for fluid flow. In fluids, as in general relativity, there’s a traditional continuum description, and the most obvious way of doing simulations is by discretizing this. But what I did instead was to start with an idealized model of discrete molecules—and then to simulate lots of these molecules. My interest was to understand the fundamental origins of things like randomness in fluid turbulence, but variants of the method I invented have now become a standard approach to fluid simulation.

So can one do something similar with general relativity? The actual “hypergraph of the universe” would be on much too tiny a scale for it to be directly useful for simulations. But the point is that even on a much larger scale our models can still approximate general relativity—but unlike “imposed after the fact” discretization, they are guaranteed to have a certain internal consistency.

In usual approaches to “numerical relativity” one of the most difficult things is dealing with progressive “time evolution”, not least because of arbitrariness in what coordinates one should use for “space” and “time”. But in our models there’s a way of avoiding this and directly getting a discrete structure that can be used for simulation: just look at the spacetime causal graph.

There are lots of details, but—just like in the fluid flow case—I expect many of them won’t matter. For example, just like lots of rules for discrete molecules yield the same limiting thermodynamic behavior, I expect lots of rules for the updating events that give the causal graph will yield the same limiting spacetime structure. (Like in standard numerical analysis, though, different rules may have different efficiency and show different pathologies.)

It so happens that Jonathan Gorard’s “day job” has centered around numerical relativity, so he was particularly keen to give this a try. But even though we thought we had just started talking about the idea in the last couple of weeks, Jonathan noticed that actually it was already there on page 1053 of A New Kind of Science—and had been languishing for nearly 20 years!

Still, we immediately started thinking about going further. Beyond general relativity, what about quantum field theory? Things like lattice gauge theory typically involve replacing path integrals by “thermal averages”—or effectively operating in Euclidean rather than Minkowski spacetime. But in our models, we potentially get the actual path integral as a limit of the behavior of geodesics in a multiway graph. Usually it’s been difficult to get a consistent “after the fact” discretization of the path integral; but now it’s something that emerges from our models.

We haven’t tried it yet (and someone should!). But independent of nailing down precisely what’s ultimately underneath quantum field theory it seems like the very structure of our models has a good chance of being very helpful just in dealing in practice with quantum field theory as we already know it.

Surprise: It’s Not Just about Physics

One of the big surprises of the past two weeks has been our increasing realization that the formalism and framework we’re developing really aren’t just relevant to physics; they’re potentially very important elsewhere too.

In a sense this shouldn’t be too surprising. After all, our models were constructed to be as minimal and structureless as possible. They don’t have anything intrinsically about physics in them. So there’s no reason they can’t apply to other things too.

But there’s a critical point here: if a model is simple enough, one can expect that it could somehow be a foundation for many different kinds of things. Long ago I found that with the 1D cellular automata I studied. The 256 “elementary” cellular automata are in a sense the very simplest models of a completely discrete system with a definite arrangement of neighbors. And over the years essentially all of these 256 cellular automata found uses as models for bizarrely different things (pigmentation, catalysis, traffic, vision, etc.).

Well, our models now are in a sense the most minimal that describe systems with rules based on arbitrary relationships (as represented by collections of relations).

And the first big place where it seems the models can be applied is in distributed computing. What is distributed computing? Essentially it’s about having a whole collection of computing elements that are communicating with others to collectively perform a computation.

In the simplest setup, one just assumes that all the computing elements are operating in lockstep—like in a cellular automaton. But what if the computing elements are instead operating asynchronously, sending data to each other when it happens to be ready?

Well, this setup immediately seems a lot more like the situation we have in our models—or in physics—where different updates can happen in any order, subject only to following the causal relationships defined by the causal graph.

But now there start to be interesting analogies between the distributed computing case and physics. And indeed what’s got me excited is that I think there’s going to be a very fruitful interplay between these areas. Ideas in distributed computing are going to be useful for thinking about physics—and vice versa.

I’m guessing that phenomena and results in distributed computing are going to have direct analogs in general relativity and in quantum mechanics. (“A livelock is like a closed timelike curve”, etc.) And that ideas from physics in the context of our models are going to give one new ways to think about distributed computing. (Imagine “programming in a particular reference frame”, etc.)

In applying our models to physics, a central idea is causal invariance. And this has an immediate analog in distributed computing: it’s the idea of eventual consistency, or in other words that it doesn’t matter what order operations are done in; the final result is always the same.

But here’s something from physics: our universe (fortunately!) doesn’t seem like it’s going to halt with a definite “final result”. Instead, it’s just continually evolving, but with causal invariance implying various kinds of local equivalence and consistency. And indeed many modern distributed computing systems are again “just running” without getting to “final results” (think: the internet, or a blockchain).

Well, in our approach to physics the way we handle this is to think in terms of foliations and reference frames—which provide a way to organize and understand what’s going on. And I think it’s going to be possible to think about distributed computing in the same kind of way. We need some kind of “calculus of reference frames” in terms of which we can define good distributed computing primitives.

In physics, reference frames are most familiar in relativity. The most straightforward are inertial frames. But in general relativity there’s been slow but progressive understanding of other kinds of frames. And in our models we’re also led to think about “quantum observation frames”, which are essentially reference frames in the branchial space of quantum states.

Realistically, at least for me, it’s so far quite difficult to wrap one’s head around these various kinds of reference frames. But I think in many ways this is at its root a language design problem. Because if we had a good way to talk about working with reference frames we’d be able to use them in distributed computing and so we’d get familiar with them. And then we’d be able to import our understanding to physics.

One of the most notable features of our models for physics when it comes to distributed computing is the notion of multiway evolution. Usually in distributed computing one’s interested in looking at a few paths, and making sure that, for example, nothing bad can happen as a result of different orders of execution. But in multiway systems we’re not just looking at a few paths; we’re looking at all paths.

And in our models this isn’t just some kind of theoretical concept; it’s the whole basis for quantum mechanics. And given that we’re looking at all paths, we’re led to invent things like quantum observation frames, and branchial space. We can think of the branching of paths in the multiway system as corresponding to elementary pieces of ambiguity. And in a sense the handling of our model—and the features of physics that emerge—is about having ways to deal with “ambiguity in bulk”.

Is there an analog of the Feynman path integral in distributed computing? I expect so—and I wouldn’t be surprised if it’s very useful in giving us a way to organize our thinking and our programs.

In theoretical analyses of distributed computing, one usually ignores physical space—and the speed of light. But with our models, it’s going to be possible to account for such things, alongside branchial connections, which are more like “instantaneous network connections”. And, for example, there’ll be analogs of time dilation associated with motion in both physical space and branchial space. (Maybe such effects are already known in distributed computing; I’m not sure.)

I think the correspondence between distributed computing and physics in the context of our models is going to be incredibly fertile. We already did one livestreamed working session about it (with Taliesin Beynon as a guest); we’ll be doing more.

Distributed computing

In the working session we had, we started off discussing vector clocks in distributed computing, and realized that they’re the analog of geodesic normal coordinates in physics. Then we went on to discuss more of the translation dictionary between distributed computing and physics. We realized that race conditions correspond to branch pairs. The branchial graph defines sibling tasks. Reads and writes are just incoming and outgoing causal edges. We invented the idea of a “causal exclusion graph”, which is a kind of complement of a causal graph, saying not what events can follow a given event, but rather what events can’t follow a given event.

We started discussing applications. Like clustered databases, multiplayer games and trading in markets. We talked about things like Git, where merge conflicts are like violations of causal invariances. We talked a bit about blockchains—but it seemed like there were richer analogs in hashgraphs and things like NKN and IOTA. Consensus somehow seemed to be the analog of “classicality”, but then there’s the question of how much can be achieved in the “quantum regime”.

Although for me the notion of seriously using ideas from physics to think about distributed computing is basically less than two weeks old, I’ve personally been wondering about how to do programming for distributed computing for a very long time. Back in the mid-1980s, for example, when I was helping a company (Thinking Machines Corporation) that was building a 65536-processor computer (the Connection Machine), I thought the most plausible way to do programming on such a system would be through none other than graph rewriting.

But at the time I just couldn’t figure out how to organize such programming so that programmers could understand what was going on. But now—through thinking about physics—I’m pretty sure there’s going to be a way. We’re already used to the idea (at least in the Wolfram Language) that we can write a program functionally, procedurally, declaratively, etc. I think there are going to be ways to write distributed programs “in different reference frames”. It’s probably going to be more structured and more parametrized than these different traditional styles of programming. But basically it’ll be a framework for looking at a given program in different ways, and using different foliations to understand and describe what it’s supposed to do.

I have to mention one more issue that’s been bugging me since 1979. It has to do with recursive evaluation. Imagine we’ve defined a Fibonacci recursion:

f[n_] := f[n - 1] + f[n - 2]
&#10005

f[n_] := f[n - 1] + f[n - 2]

f[1] = f[2] = 1
&#10005

f[1] = f[2] = 1

Now imagine you enter f[10]. How should you evaluate this? At the first step you get f[9]+f[8]. But after that, do you just keep “drilling down” the evaluation of f[9] in a “depth-first way”, until it gets to 1s, or do you for example notice that you get f[8]+f[7]+f[8], and then collect the f[8]s and evaluate them only once?

In my Mathematica-precursor system SMP, I tried to parametrize this behavior, but realistically nobody understood it. So my question now is: given the idea of reference frames, can we invent some kind of notion of “evaluation fronts” that can be described like foliations, and that define the order of recursive evaluation?

An extreme case of this arises in evaluating S, K combinators. Even though S, K combinators are 100 years old this year, they remain extremely hard to systematically wrap one’s head around. And part of the reason has to do with evaluation orders. It’s fine when one manages to get a combinator expression that can successfully be evaluated (through some path) to a fixed point. But what about one that just keeps “evolving” as you try to evaluate it? There doesn’t seem to be any good formalism for handling that. But I think our physics-based approach may finally deliver this.

So, OK, the models that we invented for physics also seem highly relevant for distributed computing. But what about for other things? Already we’ve thought about two other—completely different—potential applications.

The first, that we actually discussed a bit even the week before the Physics Project was launched, has to do with digital contact tracing in the context of the current pandemic. The basic idea—that we discussed in a livestreamed brainstorming session—is that as people move around with their cellphones, Bluetooth or other transactions can say when two phones are nearby. But the graph of what phones were close to what phones can be thought of as being like a causal graph. And now the question of whether different people might have been close enough in space and time for contagion becomes one of reconstructing spatial graphs by making plausible foliations of the causal graph. There are bigger practical problems to solve in digital contact tracing, but assuming these are solved, the issues that can be informed by our models are likely to become important. (By the way, given a network of contacts, the spreading of a contagious disease on it can be thought of as directly analogous to the growth of a geodesic ball in it.)

One last thing that’s still just a vague idea is to apply our models to develop a more abstract approach to biological evolution and natural selection (both for the overall tree of life, and for microorganisms and tumors). Why might there be a connection? The details aren’t yet clear. Perhaps something like the multiway graph (or rule-space multiway graph) can be used to represent the set of all possible sequences of genetic variations. Maybe there’s some way of thinking about the genotype-phenotype correspondence in terms of the correspondence between multiway graphs and causal graphs. Maybe different sequences of “environments” correspond to different foliations, sampling different parts of the possible sequence of genetic variations. Maybe speciation has some correspondence with event horizons. Most likely there’ll need to be some other layer or variation on the models to make them work. But I have a feeling that something is going to be possible.

It’s been possible for a long time to make “aggregated” models of biological evolution, where one’s looking at total numbers of organisms of some particular type (with essentially the direct analog of differential-equation-based aggregated epidemiological models). But at a more individual-organism level one’s typically been reduced to doing simulations, which tend to have messy issues like just how many “almost fittest” organisms should be kept at every “step” of natural selection. It could be that the whole problem is mired in computational irreducibility. But the robust way in which one seems to be able to reason in terms of natural selection suggests to me that—like in physics—there’s some layer of computational reducibility, and one just has to find the right concepts to be able to develop a more general theory on the basis of it. And maybe the models we’ve invented for physics give us the framework to do this.

Some Coming Attractions

We’re at a very exciting point—where there are an incredible amount of “obvious directions” to go. But here are a few that we’re planning on exploring in the next few days, in our livestreamed working sessions.

The Fine Structure of Black Holes

In traditional continuum general relativity it always seems a bit shocking when there’s some kind of discontinuity in the structure of spacetime. In our fundamentally discrete model it’s a bit less shocking, and in fact things like black holes (and other kinds of spacetime singularities) seem to arise very naturally in our models.

But what exactly are black holes like in our models? Do they have the same kind of “no hair” perfection as in general relativity—where only global properties like mass and angular momentum affect how they ultimately look from outside? And how do our black holes generate things like Hawking radiation?

In a livestream last week, we generated a very toy version of a black hole, with a causal graph of the form:

ResourceFunction["MultiwaySystem"]
&#10005

ResourceFunction["MultiwaySystem"][{"A" -> "AB", "XABABX" -> "XXXX", \
"XXXX" -> "XXXXX"}, {"XAAX"}, 8, "CausalGraphStructure"] // \
LayeredGraphPlot

This “black hole” has the feature that causal edges go into it, but none come out. In other words, things can affect the black hole, but the black hole can’t causally affect anything else. It’s the right basic idea, but there’s a lot missing from the toy version, which isn’t surprising, not least because it’s based on a simple string substitution system, and not even a hypergraph.

What we now need to do is to find more realistic examples. Then what we’re expecting is that it’ll actually be fairly obvious that the black hole only has certain properties. The mass will presumably relate to the number of causal edges that go into the black hole. And now that we have an idea what angular momentum is, we should be able to identify how much of that is going in as well. And maybe we’ll be able to see that there’s a limit on the amount of angular momentum a black hole of a given mass can have (as there seems to be in general relativity).

Some features of black holes we should be able to see by looking at ordinary spacetime causal graphs. But to understand Hawking radiation we’re undoubtedly also going to have to look at multiway causal graphs. And we’re hoping that we’ll actually be able to explicitly see the presence of both the causal event horizon and the entanglement event horizon—so that we’ll be able to trace the fate of quantum information in the “life cycle” of the black hole.

All the Spookiness of Quantum Mechanics

Quantum mechanics is notorious for yielding strange phenomena that can be computed within its formalism, but which seem essentially impossible to account for in any other way. Our models, however, finally provide a definite suggestion for what is “underneath” quantum mechanics—and from our models we’ve already been able to derive many of the most prominent phenomena in quantum mechanics.

But there are plenty more phenomena to consider, and we’re planning to look at this in working sessions starting later this week. One notable phenomenon that we’ll be looking at is the violation of Bell’s inequality—which is often said to “prove” that no “deterministic” theory can reproduce the predictions of quantum mechanics. Of course, our theory isn’t “deterministic” in the usual sense. Yes, the whole multiway graph is entirely determined by the underlying rule. But what we observe depends on measurements that sample collections of branches determined by the quantum observation frames we choose.

But we’d still like to see explicitly how Bell’s inequality is violated—and in fact we suspect that in our multiway graph formalism it’ll be much more straightforward to see how this and its various generalizations work. But we’ll see.

In Q&A sessions that we’ve done, and messages that we’ve received, there’ve been many requests to reproduce a classic quantum result: interference in the double-slit experiment. A few months ago, I would have been very pessimistic about being able to do this. I would have thought that first we’d have to understand exactly what particles are, and then we’d only slowly be able to build up something we could consider a realistic “double slit”.

But one of the many surprises has been that quantum phenomena seem much more robust than I expected—and it seems possible to reproduce their essential features without putting all the details in. So maybe we’ll be able, for example, just to look at a multiway system generated by a string substitution system, and already be able to see something like interference fringes in an idealized double-slit experiment. We’ll see.

When we’re talking about quantum mechanics, many important practical phenomena arise from looking at bound states where for example some particle is restricted to a limited region (like an electron in a hydrogen atom), and we’re interested in various time-repeating eigenstates. My first instinct—as in the case of the double-slit experiment—was to think that studying bound states in our models would be very complicated. After all, at some level, bound states are a limiting idealization, and even in quantum field theory (or with quantum mechanics formulated in terms of path integrals) they’re already a complicated concept.

But actually, it seems as if it may be possible to capture the essence of what’s going on in bound states with even very simple toy examples in our models—in which for instance there are just cycles in the multiway graph. But we need to see just how this works, and how far we can get, say in reproducing the features of the harmonic oscillator in quantum mechanics.

In traditional treatments of quantum mechanics, the harmonic oscillator is the kind of thing one starts with. But in our models its properties have to be emergent, and it’ll be interesting to see just how “close to the foundations” or how generic their derivation will be able to be.

People Do Care about Thermodynamics

Understanding the Second Law of thermodynamics was one of the things that first got me interested in fundamental physics, nearly 50 years ago. And I was very pleased that by the 1990s I thought I finally understood how the Second Law works: basically it’s a consequence of computational irreducibility, and the fact that even if the underlying rules for a system are reversible, they can still so “encrypt” information about the initial conditions that no computationally limited observer can expect to recover it.

This phenomenon is ultimately crucial to the derivation of continuum behavior in our models—both for spacetime and for quantum mechanics. (It’s also critical to my old derivation of fluid behavior from idealized discrete underlying molecules.)

The Second Law was big news at the end of the 1800s and into the early 1900s. But I have to say that I thought people had (unfortunately) by now rather lost interest in it, and it had just become one of those things that everyone implicitly assumes is true, even though if pressed they’re not quite sure why. So in the last couple of weeks I’ve been surprised to see so many people asking us whether we’ve managed to understand the Second Law.

Well, the answer is “Yes!”. And in a sense the understanding is at an even more fundamental level than our models: it’s generic to the whole idea of computational models that follow the Principle of Computational Equivalence and exhibit computational irreducibility. Or, put another way, once everything is considered to be computational, including both systems and observers, the Second Law is basically inevitable.

But just where are its limits, and what are the precise mathematical conditions for its validity? And how, for example, does it relate in detail to gravity? (Presumably the reference frames that can be set up are limited by the computational capabilities of observers, which must be compared to the computations being done in the actual evolution of spacetime.) These are things I’ve long wanted to clarify, and I’m hoping we’ll look at these things soon.

What about Peer Review and All That?

There’s a lot in our Physics Project. New ideas. New methods. New conclusions. And it’s not easy to deliver such a thing to the world. We’ve worked hard the last few months to write the best expositions we can, and to make software tools that let anyone reproduce—and extend—everything we’ve done. But the fact remains that to seriously absorb what we just put into the world is going to take significant effort.

It isn’t the way science usually works. Most of the time, progress is slow, with new results trickling out, and consensus about them gradually forming. And in fact—until a few months ago—that’s exactly how I expected things would go with our Physics Project. But—as I explained in my announcement—that’s not how it worked out. Because, to my great surprise, once we started seriously working on the ideas I originally hatched 30 years ago we suddenly discovered that we could make dramatic progress.

And even though we were keen to open the project up, even the things we discovered—together with their background ideas and methods—are a lot to explain, and, for example, fill well over 800 pages.

But how does that fit into the normal, academic way of doing science? It’s not a great fit. When we launched the project two weeks ago, I sent mail to a number of people. A historian of science I’ve known for a long time responded:

Please remember as you go forward that, many protestations to the contrary, most scientists hate originality, which feels strange, uncomfortable, and baffling. They like novelty well within the boundaries of what they’re doing and the approach that they’re taking, but originality is harder for them to grasp. Therefore expect opposition based on incomprehension rather than reasoned disagreement. Hold fast.

My knowledge of history, and my own past experiences, tell me that there’s a lot of truth to this. Although I’m happy to say that in the case of our project it seems like there are actually a very good number of scientists who are enthusiastically making the effort to understand what we’ve done.

Of course, there are people who think “This isn’t the way science usually works; something must be wrong”. And the biggest focus seems to be around “What about peer review?”. Well, that’s an interesting question.

What’s ultimately the point of peer review? Basically it’s that people want external certification that something is correct—before they go to the effort of understanding it themselves, or start building on it. And that’s a reasonable thing to want. But how should it actually work?

When I used to publish academic papers in the 1970s and early 1980s I quickly discovered something disappointing about actual peer review—that closely mirrors what my historian-of-science friend said. If a paper of mine was novel though not particularly original, it sailed right through peer review. But if it was actually original (and those are the papers that have had the most impact in the end) it essentially always ran into trouble with peer review.

I think there’s also always been skullduggery with anonymous peer review—often beyond my simplified “natural selection” model: “If paper cites reviewer, accept; otherwise reject”. But particularly for people outside of science, it’s convenient to at least imagine that there’s some perfect standard of academic validity out there.

I haven’t published an ordinary academic paper since 1986, but I was rather excited two weeks ago to upload my first-ever paper to arXiv. I was surprised it took about a week to get posted, and I was thinking it might have run into some filter that blocks any paper about a fundamental theory of physics—on the “Bayesian” grounds that there’s never been a meaningful paper with such a claim during the time arXiv has been operating. But my friend Paul Ginsparg (founder of arXiv) tells me there’s nothing like that in place; it’s just a question of deciding on categories and handling hundreds of megabytes of data.

OK, but is there a good way to achieve the objectives of peer review for our project? I was hoping I could submit my paper to some academic journal and then leave it to the journal to just “run the peer-review process”. But on its own, it doesn’t seem like it could work. And in particular, it’s hard to imagine that in the normal course of peer reviewing there could be serious traditional peer review on a 450-page document like this that would get done in less than several years.

So over the past week we’ve been thinking about additional, faster things we can do (and, yes, we’ve also been talking to people to get “peer reviews” of possible peer-review processes, and even going to another meta level). Here’s what we’ve come up with. It’s based on the increasingly popular concept of “post-publication peer review”. The idea is to have an open process, where people comment on our papers, and all relevant comments and comments-on-comments, etc. are openly available on the web. We’re trying—albeit imperfectly—to get the best aspects of peer review, and to do it as quickly as possible.

Among other things, what we’re hoping is that people will say what they can “certify” and what they cannot: “I understand this, but don’t have anything to say about that”. We’re fully expecting people will sometimes say “I don’t understand this” or “I don’t think that is correct”. Then it’s up to us to answer, and hopefully before long consensus will be reached. No doubt people will point out errors and limitations (including “you should also refer to so-and-so”)—and we look forward to using this input to make everything as good as possible. (Thanks, by the way, to those who’ve already pointed out typos and other mistakes; much appreciated, and hopefully now all fixed.)

One challenge about open post-publication peer review is who will review the reviewers. Here’s what we’ve set up. First, every reviewer gives information about themselves, and we validate that the person posting is who they say they are. Then we ask the reviewer to fill out certain computable facts about themselves. (Academic affiliation? PhD in physics? Something else? Professor? Published on arXiv? ISI highly cited author? Etc.) Then when people look at the reviews, they can filter by these computable facts, essentially deciding for themselves how they want to “review the reviewers”.

I’m optimistic that this will work well, and will perhaps provide a model for review processes for other things. And as I write this, I can’t help noticing that it’s rather closely related to work we’ve done on validating facts for computable contracts, as well as to the ideas that came up in my testimony last summer for the US Senate about “ranking providers” for automated content selection on the internet.

Submit a Peer Review

Other Things

The Project’s Twitter

There’s a lot going on with the Wolfram Physics Project, and we’re expecting even much more, particularly as an increasing number of other people get involved. I’m hoping I’ll be able to write “progress reports” like this one from time to time, but we’re planning on consistently using the new Twitter feed for the project to give specific, timely updates:

@wolframphysics

Please follow us! And send us updates about what you’re doing in connection with the Wolfram Physics Project, so we can post about it.

Wolfram Physics on Twitter

Can We Explain the Project to Kids?

The way I know I really understand something is when I can explain it absolutely from the ground up. So one of the things I was pleased to do a week or so ago was to try to explain our fundamental theory of physics on a livestream aimed at kids, assuming essentially no prior knowledge.

How does one explain discrete space? I decided to start by talking about pixels on a screen. How about networks? Who’s friends with whom. Dimension? Look at 2×2×2… grid graphs. Etc. I thought I managed to get decently far, talking about general relativity, and even quantum mechanics, all, I hope, without relying on more than extremely everyday knowledge.

And particularly since my livestream seemed to get good reviews from both kids and others, I’m planning in the next week or two to put together a written version of this as a kind of “very elementary” introduction to our project.

Length scales

Project Q&A

Thousands of people have been asking us questions about our project. But fortunately, many of the questions have been the same. And over the last couple of weeks we’ve been progressively expanding the Q&A section of the project website to try to address the most common of the questions:

Wolfram Physics Q&A

Visual Gallery

In addition to being (we hope) very interesting from a scientific point of view, our models also produce interesting visual forms. And we’ve started to assemble a “Visual Gallery” of these forms.

They can be screen backgrounds, or Zoom backgrounds. Or they can be turned into stickers or T-shirt designs (or put on mouse pads, if people other than me still use those).

Wolfram Physics Visual Gallery

We’ll be adding lots more items to the Visual Gallery. But it won’t just be pictures. We’ll also be adding 3D geometry for rendering of graphs and hypergraphs.

In principle, this 3D geometry should let one immediately 3D print “universes”. But so far we’ve had difficulty doing this. It seems as if unless we thicken up the connections to the point where they merge into each other, it’s not possible to get enough structural integrity to successfully make a 3D printout with existing technologies. But there’s undoubtedly a solution to this, and we’re hoping someone will figure it out, say using our Wolfram Language computational geometry capabilities.

VR

It’s pretty difficult (at least for me) to “understand” the structure of the graphs and hypergraphs we’re generating. And ever since I started thinking about network models for physics in the 1990s, I’ve wanted to try to use VR to do this. Well, we’re just starting to have a system that lets one interactively manipulate graphs in 3D in VR. We’ll be posting the code soon, and we hope other people will help add features. But it’s getting closer…

Wolfram Physics in VR

It’s an Exciting Time…

This piece is already quite long, but there’s even much more I could say. It’s very exciting to be seeing all this activity around our Physics Project, after only two weeks.

There’s a lot to do in the project, and with the project. This is a time of great opportunity, where all sorts of discoveries are ripe to be made. And I’m certainly enjoying trying to figure out more with our models—and trying to understand all sorts of things I’ve wondered about for nearly half a century. But for me it’s been particularly wonderful to see so many other people engaging with the project. I personally think physics is great. And I really love the elegance of what’s emerging from our models. But right now what’s most important to me is what a tremendous pleasure it is to share all this with such a broad spectrum of people.

I’m looking forward to seeing what the next few weeks bring. We’re off to a really great start…

]]>
https://writings.stephenwolfram.com/2020/04/the-wolfram-physics-project-the-first-two-weeks/feed/ 1
<![CDATA[Finally We May Have a Path to the Fundamental Theory of Physics… <br />and It’s Beautiful</br>]]> https://writings.stephenwolfram.com/2020/04/finally-we-may-have-a-path-to-the-fundamental-theory-of-physics-and-its-beautiful/ https://writings.stephenwolfram.com/2020/04/finally-we-may-have-a-path-to-the-fundamental-theory-of-physics-and-its-beautiful/#comments Tue, 14 Apr 2020 14:05:47 +0000 Stephen Wolfram https://writings.internal.stephenwolfram.com/?p=22525 physics-announce-thumbnailWebsite: Wolfram Physics Project Technical Intro: A Class of Models with the Potential to Represent Fundamental Physics How We Got Here: The Backstory of the Wolfram Physics Project I Never Expected This It’s unexpected, surprising—and for me incredibly exciting. To be fair, at some level I’ve been working towards this for nearly 50 years. But [...]]]> physics-announce-thumbnail

Visual summary of the Wolfram Physics Project

I Never Expected This

It’s unexpected, surprising—and for me incredibly exciting. To be fair, at some level I’ve been working towards this for nearly 50 years. But it’s just in the last few months that it’s finally come together. And it’s much more wonderful, and beautiful, than I’d ever imagined.

In many ways it’s the ultimate question in natural science: How does our universe work? Is there a fundamental theory? An incredible amount has been figured out about physics over the past few hundred years. But even with everything that’s been done—and it’s very impressive—we still, after all this time, don’t have a truly fundamental theory of physics.

Back when I used do theoretical physics for a living, I must admit I didn’t think much about trying to find a fundamental theory; I was more concerned about what we could figure out based on the theories we had. And somehow I think I imagined that if there was a fundamental theory, it would inevitably be very complicated.

But in the early 1980s, when I started studying the computational universe of simple programs I made what was for me a very surprising and important discovery: that even when the underlying rules for a system are extremely simple, the behavior of the system as a whole can be essentially arbitrarily rich and complex.

And this got me thinking: Could the universe work this way? Could it in fact be that underneath all of this richness and complexity we see in physics there are just simple rules? I soon realized that if that was going to be the case, we’d in effect have to go underneath space and time and basically everything we know. Our rules would have to operate at some lower level, and all of physics would just have to emerge.

By the early 1990s I had a definite idea about how the rules might work, and by the end of the 1990s I had figured out quite a bit about their implications for space, time, gravity and other things in physics—and, basically as an example of what one might be able to do with science based on studying the computational universe, I devoted nearly 100 pages to this in my book A New Kind of Science.

I always wanted to mount a big project to take my ideas further. I tried to start around 2004. But pretty soon I got swept up in building Wolfram|Alpha, and the Wolfram Language and everything around it. From time to time I would see physicist friends of mine, and I’d talk about my physics project. There’d be polite interest, but basically the feeling was that finding a fundamental theory of physics was just too hard, and only kooks would attempt it.

It didn’t help that there was something that bothered me about my ideas. The particular way I’d set up my rules seemed a little too inflexible, too contrived. In my life as a computational language designer I was constantly thinking about abstract systems of rules. And every so often I’d wonder if they might be relevant for physics. But I never got anywhere. Until, suddenly, in the fall of 2018, I had a little idea.

It was in some ways simple and obvious, if very abstract. But what was most important about it to me was that it was so elegant and minimal. Finally I had something that felt right to me as a serious possibility for how physics might work. But wonderful things were happening with the Wolfram Language, and I was busy thinking about all the implications of finally having a full-scale computational language.

But then, at our annual Summer School in 2019, there were two young physicists (Jonathan Gorard and Max Piskunov) who were like, “You just have to pursue this!” Physics had been my great passion when I was young, and in August 2019 I had a big birthday and realized that, yes, after all these years I really should see if I can make something work.

So—along with the two young physicists who’d encouraged me—I began in earnest in October 2019. It helped that—after a lifetime of developing them—we now had great computational tools. And it wasn’t long before we started finding what I might call “very interesting things”. We reproduced, more elegantly, what I had done in the 1990s. And from tiny, structureless rules out were coming space, time, relativity, gravity and hints of quantum mechanics.

We were doing zillions of computer experiments, building intuition. And gradually things were becoming clearer. We started understanding how quantum mechanics works. Then we realized what energy is. We found an outline derivation of my late friend and mentor Richard Feynman’s path integral. We started seeing some deep structural connections between relativity and quantum mechanics. Everything just started falling into place. All those things I’d known about in physics for nearly 50 years—and finally we had a way to see not just what was true, but why.

I hadn’t ever imagined anything like this would happen. I expected that we’d start exploring simple rules and gradually, if we were lucky, we’d get hints here or there about connections to physics. I thought maybe we’d be able to have a possible model for the first seconds of the universe, but we’d spend years trying to see whether it might actually connect to the physics we see today.

In the end, if we’re going to have a complete fundamental theory of physics, we’re going to have to find the specific rule for our universe. And I don’t know how hard that’s going to be. I don’t know if it’s going to take a month, a year, a decade or a century. A few months ago I would also have said that I don’t even know if we’ve got the right framework for finding it.

But I wouldn’t say that anymore. Too much has worked. Too many things have fallen into place. We don’t know if the precise details of how our rules are set up are correct, or how simple or not the final rules may be. But at this point I am certain that the basic framework we have is telling us fundamentally how physics works.

It’s always a test for scientific models to compare how much you put in with how much you get out. And I’ve never seen anything that comes close. What we put in is about as tiny as it could be. But what we’re getting out are huge chunks of the most sophisticated things that are known about physics. And what’s most amazing to me is that at least so far we’ve not run across a single thing where we’ve had to say “oh, to explain that we have to add something to our model”. Sometimes it’s not easy to see how things work, but so far it’s always just been a question of understanding what the model already says, not adding something new.

At the lowest level, the rules we’ve got are about as minimal as anything could be. (Amusingly, their basic structure can be expressed in a fraction of a line of symbolic Wolfram Language code.) And in their raw form, they don’t really engage with all the rich ideas and structure that exist, for example, in mathematics. But as soon as we start looking at the consequences of the rules when they’re applied zillions of times, it becomes clear that they’re very elegantly connected to a lot of wonderful recent mathematics.

There’s something similar with physics, too. The basic structure of our models seems alien and bizarrely different from almost everything that’s been done in physics for at least the past century or so. But as we’ve gotten further in investigating our models something amazing has happened: we’ve found that not just one, but many of the popular theoretical frameworks that have been pursued in physics in the past few decades are actually directly relevant to our models.

I was worried this was going to be one of those “you’ve got to throw out the old” advances in science. It’s not. Yes, the underlying structure of our models is different. Yes, the initial approach and methods are different. And, yes, a bunch of new ideas are needed. But to make everything work we’re going to have to build on a lot of what my physicist friends have been working so hard on for the past few decades.

And then there’ll be the physics experiments. If you’d asked me even a couple of months ago when we’d get anything experimentally testable from our models I would have said it was far away. And that it probably wouldn’t happen until we’d pretty much found the final rule. But it looks like I was wrong. And in fact we’ve already got some good hints of bizarre new things that might be out there to look for.

OK, so what do we need to do now? I’m thrilled to say that I think we’ve found a path to the fundamental theory of physics. We’ve built a paradigm and a framework (and, yes, we’ve built lots of good, practical, computational tools too). But now we need to finish the job. We need to work through a lot of complicated computation, mathematics and physics. And see if we can finally deliver the answer to how our universe fundamentally works.

It’s an exciting moment, and I want to share it. I’m looking forward to being deeply involved. But this isn’t just a project for me or our small team. This is a project for the world. It’s going to be a great achievement when it’s done. And I’d like to see it shared as widely as possible. Yes, a lot of what has to be done requires top-of-the-line physics and math knowledge. But I want to expose everything as broadly as possible, so everyone can be involved in—and I hope inspired by—what I think is going to be a great and historic intellectual adventure.

Today we’re officially launching our Physics Project. From here on, we’ll be livestreaming what we’re doing—sharing whatever we discover in real time with the world. (We’ll also soon be releasing more than 400 hours of video that we’ve already accumulated.) I’m posting all my working materials going back to the 1990s, and we’re releasing all our software tools. We’ll be putting out bulletins about progress, and there’ll be educational programs around the project.

Oh, yes, and we’re putting up a Registry of Notable Universes. It’s already populated with nearly a thousand rules. I don’t think any of the ones in there yet are our own universe—though I’m not completely sure. But sometime—I hope soon—there might just be a rule entered in the Registry that has all the right properties, and that we’ll slowly discover that, yes, this is it—our universe finally decoded.

The Wolfram Physics Project

How It Works

OK, so how does it all work? I’ve written a 448-page technical exposition (yes, I’ve been busy the past few months!). Another member of our team (Jonathan Gorard) has written two 60-page technical papers. And there’s other material available at the project website. But here I’m going to give a fairly non-technical summary of some of the high points.

It all begins with something very simple and very structureless. We can think of it as a collection of abstract relations between abstract elements. Or we can think of it as a hypergraph—or, in simple cases, a graph.

We might have a collection of relations like

{{1, 2}, {2, 3}, {3, 4}, {2, 4}}

that can be represented by a graph like

ResourceFunction
&#10005

ResourceFunction[
  "WolframModelPlot"][{{1, 2}, {2, 3}, {3, 4}, {2, 4}}, 
 VertexLabels -> Automatic]

All we’re specifying here are the relations between elements (like {2,3}). The order in which we state the relations doesn’t matter (although the order within each relation does matter). And when we draw the graph, all that matters is what’s connected to what; the actual layout on the page is just a choice made for visual presentation. It also doesn’t matter what the elements are called. Here I’ve used numbers, but all that matters is that the elements are distinct.

OK, so what do we do with these collections of relations, or graphs? We just apply a simple rule to them, over and over again. Here’s an example of a possible rule:

{{x, y}, {x, z}} {{x, z}, {x, w}, {y, w}, {z, w}}

What this rule says is to pick up two relations—from anywhere in the collection—and see if the elements in them match the pattern {{x,y},{x,z}} (or, in the Wolfram Language, {{x_,y_},{x_,z_}}), where the two x’s can be anything, but both have to be the same, and the y and z can be anything. If there’s a match, then replace these two relations with the four relations on the right. The w that appears there is a new element that’s being created, and the only requirement is that it’s distinct from all other elements.

We can represent the rule as a transformation of graphs:

RulePlot
&#10005

RulePlot[ResourceFunction[
   "WolframModel"][{{x, y}, {x, z}} -> {{x, z}, {x, w}, {y, w}, {z, 
     w}}], VertexLabels -> Automatic, "RulePartsAspectRatio" -> 0.5]

Now let’s apply the rule once to:

{{1, 2}, {2, 3}, {3, 4}, {2, 4}}

The {2,3} and {2,4} relations get matched, and the rule replaces them with four new relations, so the result is:

{{1, 2}, {3, 4}, {2, 4}, {2, 5}, {3, 5}, {4, 5}}

We can represent this result as a graph (which happens to be rendered flipped relative to the graph above):

ResourceFunction
&#10005

ResourceFunction[
   "WolframModel"][{{x, y}, {x, z}} -> {{x, z}, {x, w}, {y, w}, {z, 
     w}}, {{1, 2}, {2, 3}, {3, 4}, {2, 4}}, 1]["FinalStatePlot", 
 VertexLabels -> Automatic]

OK, so what happens if we just keep applying the rule over and over? Here’s the result:

ResourceFunction
&#10005

ResourceFunction[
  "WolframModel"][{{x, y}, {x, z}} -> {{x, z}, {x, w}, {y, w}, {z, 
    w}}, {{1, 2}, {2, 3}, {3, 4}, {2, 4}}, 10, "StatesPlotsList"]

Let’s do it a few more times, and make a bigger picture:

ResourceFunction
&#10005

ResourceFunction[
  "WolframModel"][{{x, y}, {x, z}} -> {{x, z}, {x, w}, {y, w}, {z, 
    w}}, {{1, 2}, {2, 3}, {3, 4}, {2, 4}}, 14, "FinalStatePlot"]

What happened here? We have such a simple rule. Yet applying this rule over and over again produces something that looks really complicated. It’s not what our ordinary intuition tells us should happen. But actually—as I first discovered in the early 1980s—this kind of intrinsic, spontaneous generation of complexity turns out to be completely ubiquitous among simple rules and simple programs. And for example my book A New Kind of Science is about this whole phenomenon and why it’s so important for science and beyond.

But here what’s important about it is that it’s what’s going to make our universe, and everything in it. Let’s review again what we’ve seen. We started off with a simple rule that just tells us how to transform collections of relations. But what we get out is this complicated-looking object that, among other things, seems to have some definite shape.

We didn’t put in anything about this shape. We just gave a simple rule. And using that simple rule a graph was made. And when we visualize that graph, it comes out looking like it has a definite shape.

If we ignore all matter in the universe, our universe is basically a big chunk of space. But what is that space? We’ve had mathematical idealizations and abstractions of it for two thousand years. But what really is it? Is it made of something, and if so, what?

Well, I think it’s very much like the picture above. A whole bunch of what are essentially abstract points, abstractly connected together. Except that in the picture there are 6704 of these points, whereas in our real universe there might be more like 10400 of them, or even many more.

All Possible Rules

We don’t (yet) know an actual rule that represents our universe—and it’s almost certainly not the one we just talked about. So let’s discuss what possible rules there are, and what they typically do.

One feature of the rule we used above is that it’s based on collections of “binary relations”, containing pairs of elements (like {2,3}). But the same setup lets us also consider relations with more elements. For example, here’s a collection of two ternary relations:

{{1, 2, 3}, {3, 4, 5}}

We can’t use an ordinary graph to represent things like this, but we can use a hypergraph—a construct where we generalize edges in graphs that connect pairs of nodes to “hyperedges” that connect any number of nodes:

ResourceFunction
&#10005

ResourceFunction["WolframModelPlot"][{{1, 2, 3}, {3, 4, 5}}, 
 VertexLabels -> Automatic]

(Notice that we’re dealing with directed hypergraphs, where the order in which nodes appear in a hyperedge matters. In the picture, the “membranes” are just indicating which nodes are connected to the same hyperedge.)

We can make rules for hypergraphs too:

{{x, y, z}} {{w, w, y}, {w, x, z}}

RulePlot
&#10005

RulePlot[ResourceFunction[
   "WolframModel"][{{1, 2, 3}} -> {{4, 4, 2}, {4, 1, 3}}]]

And now here’s what happens if we run this rule starting from the simplest possible ternary hypergraph—the ternary self-loop {{0,0,0}}:

ResourceFunction
&#10005

ResourceFunction[
   "WolframModel"][{{1, 2, 3}} -> {{4, 4, 2}, {4, 1, 3}}, {{0, 0, 0}},
   8]["StatesPlotsList", "MaxImageSize" -> 180]

Alright, so what happens if we just start picking simple rules at random? Here are some of the things they do:

urules24
&#10005

urules24 = 
 Import["https://www.wolframcloud.com/obj/wolframphysics/Data/22-24-\
2x0-unioned-summary.wxf"]; SeedRandom[6783]; GraphicsGrid[
 Partition[
  ResourceFunction["WolframModelPlot"][List @@@ EdgeList[#]] & /@ 
   Take[Select[
     ParallelMap[
      UndirectedGraph[
        Rule @@@ 
         ResourceFunction["WolframModel"][#, {{0, 0}, {0, 0}}, 8, 
          "FinalState"], 
        GraphLayout -> "SpringElectricalEmbedding"] &, #Rule & /@ 
       RandomSample[urules24, 150]], 
     EdgeCount[#] > 10 && ConnectedGraphQ[#] &], 60], 10], 
 ImageSize -> Full]

Somehow this looks very zoological (and, yes, these models are definitely relevant for things other than fundamental physics—though probably particularly molecular-scale construction). But basically what we see here is that there are various common forms of behavior, some simple, and some not.

Here are some samples of the kinds of things we see:

GraphicsGrid
&#10005

GraphicsGrid[
 Partition[
  ParallelMap[
   ResourceFunction["WolframModel"][#[[1]], #[[2]], #[[3]], 
     "FinalStatePlot"] &, {{{{1, 2}, {1, 3}} -> {{1, 2}, {1, 4}, {2, 
        4}, {4, 3}}, {{0, 0}, {0, 0}}, 
     12}, {{{1, 2}, {1, 3}} -> {{1, 4}, {1, 4}, {2, 4}, {3, 2}}, {{0, 
       0}, {0, 0}}, 
     10}, {{{1, 2}, {1, 3}} -> {{2, 2}, {2, 4}, {1, 4}, {3, 4}}, {{0, 
       0}, {0, 0}}, 
     10}, {{{1, 2}, {1, 3}} -> {{2, 3}, {2, 4}, {3, 4}, {1, 4}}, {{0, 
       0}, {0, 0}}, 
     10}, {{{1, 2}, {1, 3}} -> {{2, 3}, {2, 4}, {3, 4}, {4, 1}}, {{0, 
       0}, {0, 0}}, 
     12}, {{{1, 2}, {1, 3}} -> {{2, 4}, {2, 1}, {4, 1}, {4, 3}}, {{0, 
       0}, {0, 0}}, 
     9}, {{{1, 2}, {1, 3}} -> {{2, 4}, {2, 4}, {1, 4}, {3, 4}}, {{0, 
       0}, {0, 0}}, 
     10}, {{{1, 2}, {1, 3}} -> {{2, 4}, {2, 4}, {2, 1}, {3, 4}}, {{0, 
       0}, {0, 0}}, 
     10}, {{{1, 2}, {1, 3}} -> {{4, 1}, {1, 4}, {4, 2}, {4, 3}}, {{0, 
       0}, {0, 0}}, 
     12}, {{{1, 2}, {2, 3}} -> {{1, 2}, {2, 1}, {4, 1}, {4, 3}}, {{0, 
       0}, {0, 0}}, 
     10}, {{{1, 2}, {2, 3}} -> {{1, 3}, {1, 4}, {3, 4}, {3, 2}}, {{0, 
       0}, {0, 0}}, 
     10}, {{{1, 2}, {2, 3}} -> {{2, 3}, {2, 4}, {3, 4}, {1, 2}}, {{0, 
       0}, {0, 0}}, 9}}], 4], ImageSize -> Full]

And the big question is: if we were to run rules like these long enough, would they end up making something that reproduces our physical universe? Or, put another way, out in this computational universe of simple rules, can we find our physical universe?

A big question, though, is: How would we know? What we’re seeing here are the results of applying rules a few thousand times; in our actual universe they may have been applied 10500 times so far, or even more. And it’s not easy to bridge that gap. And we have to work it from both sides. First, we have to use the best summary of the operation of our universe that what we’ve learned in physics over the past few centuries has given us. And second, we have to go as far as we can in figuring out what our rules actually do.

And here there’s potentially a fundamental problem: the phenomenon of computational irreducibility. One of the great achievements of the mathematical sciences, starting about three centuries ago, has been delivering equations and formulas that basically tell you how a system will behave without you having to trace each step in what the system does. But many years ago I realized that in the computational universe of possible rules, this very often isn’t possible. Instead, even if you know the exact rule that a system follows, you may still not be able to work out what the system will do except by essentially just tracing every step it takes.

One might imagine that—once we know the rule for some system—then with all our computers and brainpower we’d always be able to “jump ahead” and work out what the system would do. But actually there’s something I call the Principle of Computational Equivalence, which says that almost any time the behavior of a system isn’t obviously simple, it’s computationally as sophisticated as anything. So we won’t be able to “outcompute” it—and to work out what it does will take an irreducible amount of computational work.

Well, for our models of the universe this is potentially a big problem. Because we won’t be able to get even close to running those models for as long as the universe does. And at the outset it’s not clear that we’ll be able to tell enough from what we can do to see if it matches up with physics.

But the big recent surprise for me is that we seem to be lucking out. We do know that whenever there’s computational irreducibility in a system, there are also an infinite number of pockets of computational reducibility. But it’s completely unclear whether in our case those pockets will line up with things we know from physics. And the surprise is that it seems a bunch of them do.

What Is Space?

Let’s look at a particular, simple rule from our infinite collection:

{{x, y, y}, {z, x, u}} {{y, v, y}, {y, z, v}, {u, v, v}}

RulePlot
&#10005

RulePlot[ResourceFunction[
   "WolframModel"][{{1, 2, 2}, {3, 1, 4}} -> {{2, 5, 2}, {2, 3, 
     5}, {4, 5, 5}}]]

Here’s what it does:

ResourceFunction
&#10005

ResourceFunction["WolframModelPlot"][#, ImageSize -> 50] & /@ 
 ResourceFunction[
   "WolframModel"][{{{1, 2, 2}, {3, 1, 4}} -> {{2, 5, 2}, {2, 3, 
      5}, {4, 5, 5}}}, {{0, 0, 0}, {0, 0, 0}}, 20, "StatesList"]

And after a while this is what happens:

Row
&#10005

Row[Append[
  Riffle[ResourceFunction[
       "WolframModel"][{{1, 2, 2}, {3, 1, 4}} -> {{2, 5, 2}, {2, 3, 
         5}, {4, 5, 5}}, {{0, 0, 0}, {0, 0, 0}}, #, 
      "FinalStatePlot"] & /@ {200, 500}, " ... "], " ..."]]

It’s basically making us a very simple “piece of space”. If we keep on going longer and longer it’ll make a finer and finer mesh, to the point where what we have is almost indistinguishable from a piece of a continuous plane.

Here’s a different rule:

{{x, x, y}, {z, u, x}} {{u, u, z}, {v, u, v}, {v, y, x}}

RulePlot
&#10005

RulePlot[ResourceFunction[
   "WolframModel"][{{x, x, y}, {z, u, x}} -> {{u, u, z}, {v, u, 
     v}, {v, y, x}}]]

ResourceFunction
&#10005

ResourceFunction["WolframModelPlot"][#, ImageSize -> 50] & /@ 
 ResourceFunction[
   "WolframModel"][{{1, 1, 2}, {3, 4, 1}} -> {{4, 4, 3}, {5, 4, 
     5}, {5, 2, 1}}, {{0, 0, 0}, {0, 0, 0}}, 20, "StatesList"]

ResourceFunction
&#10005

ResourceFunction[
  "WolframModel"][{{1, 1, 2}, {3, 4, 1}} -> {{4, 4, 3}, {5, 4, 5}, {5,
     2, 1}}, {{0, 0, 0}, {0, 0, 0}}, 2000, "FinalStatePlot"]

It looks it’s “trying to make” something 3D. Here’s another rule:

{{x, y, z}, {u, y, v}} {{w, z, x}, {z, w, u}, {x, y, w}}

RulePlot
&#10005

RulePlot[ResourceFunction[
   "WolframModel"][{{1, 2, 3}, {4, 2, 5}} -> {{6, 3, 1}, {3, 6, 
     4}, {1, 2, 6}}]]

ResourceFunction
&#10005

ResourceFunction["WolframModelPlot"][#, ImageSize -> 50] & /@ 
 ResourceFunction[
   "WolframModel"][{{x, y, z}, {u, y, v}} -> {{w, z, x}, {z, w, 
     u}, {x, y, w}}, {{0, 0, 0}, {0, 0, 0}}, 20, "StatesList"]

ResourceFunction
&#10005

ResourceFunction[
  "WolframModel"][{{1, 2, 3}, {4, 2, 5}} -> {{6, 3, 1}, {3, 6, 4}, {1,
     2, 6}}, {{0, 0, 0}, {0, 0, 0}}, 1000, "FinalStatePlot"]

Isn’t this strange? We have a rule that’s just specifying how to rewrite pieces of an abstract hypergraph, with no notion of geometry, or anything about 3D space. And yet it produces a hypergraph that’s naturally laid out as something that looks like a 3D surface.

Even though the only thing that’s really here is connections between points, we can “guess” where a surface might be, then we can show the result in 3D:

ResourceFunction
&#10005

ResourceFunction["GraphReconstructedSurface"][
 ResourceFunction[
   "WolframModel"][ {{1, 2, 3}, {4, 2, 5}} -> {{6, 3, 1}, {3, 6, 
     4}, {1, 2, 6}}, {{0, 0, 0}, {0, 0, 0}}, 2000, "FinalState"]]

If we keep going, then like the example of the plane, the mesh will get finer and finer, until basically our rule has grown us—point by point, connection by connection—something that’s like a continuous 3D surface of the kind you might study in a calculus class. Of course, in some sense, it’s not “really” that surface: it’s just a hypergraph that represents a bunch of abstract relations—but somehow the pattern of those relations gives it a structure that’s a closer and closer approximation to the surface.

And this is basically how I think space in the universe works. Underneath, it’s a bunch of discrete, abstract relations between abstract points. But at the scale we’re experiencing it, the pattern of relations it has makes it seem like continuous space of the kind we’re used to. It’s a bit like what happens with, say, water. Underneath, it’s a bunch of discrete molecules bouncing around. But to us it seems like a continuous fluid.

Needless to say, people have thought that space might ultimately be discrete ever since antiquity. But in modern physics there was never a way to make it work—and anyway it was much more convenient for it to be continuous, so one could use calculus. But now it’s looking like the idea of space being discrete is actually crucial to getting a fundamental theory of physics.

The Dimensionality of Space

A very fundamental fact about space as we experience it is that it is three-dimensional. So can our rules reproduce that? Two of the rules we just saw produce what we can easily recognize as two-dimensional surfaces—in one case flat, in the other case arranged in a certain shape. Of course, these are very bland examples of (two-dimensional) space: they are effectively just simple grids. And while this is what makes them easy to recognize, it also means that they’re not actually much like our universe, where there’s in a sense much more going on.

So, OK, take a case like:

ResourceFunction
&#10005

ResourceFunction[
  "WolframModel"][{{1, 2, 3}, {4, 3, 5}} -> {{3, 5, 2}, {5, 2, 4}, {2,
     1, 6}}, {{0, 0, 0}, {0, 0, 0}}, 22, "FinalStatePlot"]

If we were to go on long enough, would this make something like space, and, if so, with how many dimensions? To know the answer, we have to have some robust way to measure dimension. But remember, the pictures we’re drawing are just visualizations; the underlying structure is a bunch of discrete relations defining a hypergraph—with no information about coordinates, or geometry, or even topology. And, by the way, to emphasize that point, here is the same graph—with exactly the same connectivity structure—rendered four different ways:

GridGraph
&#10005

GridGraph[{10, 10}, GraphLayout -> #, 
   VertexStyle -> 
    ResourceFunction["WolframPhysicsProjectStyleData"]["SpatialGraph",
      "VertexStyle"], 
   EdgeStyle -> 
    ResourceFunction["WolframPhysicsProjectStyleData"]["SpatialGraph",
      "EdgeLineStyle"] ] & /@ {"SpringElectricalEmbedding", 
  "TutteEmbedding", "RadialEmbedding", "DiscreteSpiralEmbedding"}

But getting back to the question of dimension, recall that the area of a circle is πr2; the volume of a sphere is . In general, the “volume” of the d-dimensional analog of a sphere is a constant multiplied by rd. But now think about our hypergraph. Start at some point in the hypergraph. Then follow r hyperedges in all possible ways. You’ve effectively made the analog of a “spherical ball” in the hypergraph. Here are examples for graphs corresponding to 2D and 3D lattices:

MakeBallPicture
&#10005

MakeBallPicture[g_, rmax_] := 
  Module[{gg = UndirectedGraph[g], cg}, cg = GraphCenter[gg]; 
   Table[HighlightGraph[gg, NeighborhoodGraph[gg, cg, r]], {r, 0, 
     rmax}]];
Graph[#, ImageSize -> 60, 
   VertexStyle -> 
    ResourceFunction["WolframPhysicsProjectStyleData"]["SpatialGraph",
      "VertexStyle"], 
   EdgeStyle -> 
    ResourceFunction["WolframPhysicsProjectStyleData"]["SpatialGraph",
      "EdgeLineStyle"] ] & /@ MakeBallPicture[GridGraph[{11, 11}], 7]

MakeBallPicture
&#10005

MakeBallPicture[g_, rmax_] := 
 Module[{gg = UndirectedGraph[g], cg}, cg = GraphCenter[gg]; 
  Table[HighlightGraph[gg, NeighborhoodGraph[gg, cg, r]], {r, 0, 
    rmax}]]; 
Graph[#, ImageSize -> 80, 
   VertexStyle -> 
    ResourceFunction["WolframPhysicsProjectStyleData"]["SpatialGraph",
      "VertexStyle"], 
   EdgeStyle -> 
    ResourceFunction["WolframPhysicsProjectStyleData"]["SpatialGraph",
      "EdgeLineStyle"] ] & /@ MakeBallPicture[GridGraph[{7, 7, 7}], 5]

And if you now count the number of points reached by going “graph distance r” (i.e. by following r connections in the graph) you’ll find in these two cases that they indeed grow like r2 and r3.

So this gives us a way to measure the effective dimension of our hypergraphs. Just start at a particular point and see how many points you reach by going r steps:

gg = UndirectedGraph
&#10005

gg = UndirectedGraph[
   ResourceFunction["HypergraphToGraph"][
    ResourceFunction[
      "WolframModel"][{{x, y}, {x, z}} -> {{x, z}, {x, w}, {y, 
        w}, {z, w}}, {{1, 2}, {1, 3}}, 11, "FinalState"]]];
With[{cg = GraphCenter[gg]}, 
 Table[HighlightGraph[gg, NeighborhoodGraph[gg, cg, r], 
   ImageSize -> 90], {r, 6}]]

Now to work out effective dimension, we in principle just have to fit the results to rd. It’s a bit complicated, though, because we need to avoid small r (where every detail of the hypergraph is going to matter) and large r (where we’re hitting the edge of the hypergraph)—and we also need to think about how our “space” is refining as the underlying system evolves. But in the end we can generate a series of fits for the effective dimension—and in this case these say that the effective dimension is about 2.7:

HypergraphDimensionEstimateList
&#10005

HypergraphDimensionEstimateList[hg_] := 
  ResourceFunction["LogDifferences"][
   MeanAround /@ 
    Transpose[
     Values[ResourceFunction["HypergraphNeighborhoodVolumes"][hg, All,
        Automatic]]]];
ListLinePlot[
 Select[Length[#] > 3 &][
  HypergraphDimensionEstimateList /@ 
   Drop[ResourceFunction[
      "WolframModel"][{{x, y}, {x, z}} -> {{x, z}, {x, w}, {y, w}, {z,
         w}}, {{1, 2}, {1, 3}}, 16, "StatesList"], 4]], Frame -> True,
  PlotStyle -> {Hue[0.9849884156577183, 0.844661839156126, 0.63801], 
   Hue[0.05, 0.9493847125498949, 0.954757], Hue[
   0.0889039442504032, 0.7504362741954692, 0.873304], Hue[
   0.06, 1., 0.8], Hue[0.12, 1., 0.9], Hue[0.08, 1., 1.], Hue[
   0.98654716551403, 0.6728487861309527, 0.733028], Hue[
   0.04, 0.68, 0.9400000000000001], Hue[
   0.9945149844324427, 0.9892162267509705, 0.823529], Hue[
   0.9908289627180552, 0.4, 0.9]}]

If we do the same thing for

ResourceFunction
&#10005

ResourceFunction[
  "WolframModel"][{{1, 2, 2}, {3, 1, 4}} -> {{2, 5, 2}, {2, 3, 
    5}, {4, 5, 5}}, {{0, 0, 0}, {0, 0, 0}}, 200, "FinalStatePlot"]

it’s limiting to dimension 2, as it should:

CenteredDimensionEstimateList
&#10005

CenteredDimensionEstimateList[g_Graph] := 
  ResourceFunction["LogDifferences"][
   N[First[Values[
      ResourceFunction["GraphNeighborhoodVolumes"][g, 
       GraphCenter[g]]]]]];
Show[ListLinePlot[
  Table[CenteredDimensionEstimateList[
    UndirectedGraph[
     ResourceFunction["HypergraphToGraph"][
      ResourceFunction[
        "WolframModel"][{{1, 2, 2}, {3, 1, 4}} -> {{2, 5, 2}, {2, 3, 
          5}, {4, 5, 5}}, {{0, 0, 0}, {0, 0, 0}}, t, 
       "FinalState"]]]], {t, 500, 2500, 500}], Frame -> True, 
  PlotStyle -> {Hue[0.9849884156577183, 0.844661839156126, 0.63801], 
    Hue[0.05, 0.9493847125498949, 0.954757], Hue[
    0.0889039442504032, 0.7504362741954692, 0.873304], Hue[
    0.06, 1., 0.8], Hue[0.12, 1., 0.9], Hue[0.08, 1., 1.], Hue[
    0.98654716551403, 0.6728487861309527, 0.733028], Hue[
    0.04, 0.68, 0.9400000000000001], Hue[
    0.9945149844324427, 0.9892162267509705, 0.823529], Hue[
    0.9908289627180552, 0.4, 0.9]}], 
 Plot[2, {r, 0, 50}, PlotStyle -> Dotted]]

What does the fractional dimension mean? Well, consider fractals, which our rules can easily make:

{{x, y, z}} {{x, u, w}, {y, v, u}, {z, w, v}}

RulePlot
&#10005

RulePlot[ResourceFunction[
   "WolframModel"][{{1, 2, 3}} -> {{1, 4, 6}, {2, 5, 4}, {3, 6, 5}}]]

ResourceFunction
&#10005

ResourceFunction["WolframModelPlot"][#, "MaxImageSize" -> 100] & /@ 
 ResourceFunction[
   "WolframModel"][{{1, 2, 3}} -> {{1, 4, 6}, {2, 5, 4}, {3, 6, 
     5}}, {{0, 0, 0}}, 6, "StatesList"]

If we measure the dimension here we get 1.58—the usual fractal dimension for a Sierpiński structure:

HypergraphDimensionEstimateList
&#10005

HypergraphDimensionEstimateList[hg_] := 
 ResourceFunction["LogDifferences"][
  MeanAround /@ 
   Transpose[
    Values[ResourceFunction["HypergraphNeighborhoodVolumes"][hg, All, 
      Automatic]]]]; Show[
 ListLinePlot[
  Drop[HypergraphDimensionEstimateList /@ 
    ResourceFunction[
      "WolframModel"][{{1, 2, 3}} -> {{1, 4, 6}, {2, 5, 4}, {3, 6, 
        5}}, {{0, 0, 0}}, 8, "StatesList"], 2], 
  PlotStyle -> {Hue[0.9849884156577183, 0.844661839156126, 0.63801], 
    Hue[0.05, 0.9493847125498949, 0.954757], Hue[
    0.0889039442504032, 0.7504362741954692, 0.873304], Hue[
    0.06, 1., 0.8], Hue[0.12, 1., 0.9], Hue[0.08, 1., 1.], Hue[
    0.98654716551403, 0.6728487861309527, 0.733028], Hue[
    0.04, 0.68, 0.9400000000000001], Hue[
    0.9945149844324427, 0.9892162267509705, 0.823529], Hue[
    0.9908289627180552, 0.4, 0.9]}, Frame -> True, 
  PlotRange -> {0, Automatic}], 
 Plot[Log[2, 3], {r, 0, 150}, PlotStyle -> {Dotted}]]

Our rule above doesn’t create a structure that’s as regular as this. In fact, even though the rule itself is completely deterministic, the structure it makes looks quite random. But what our measurements suggest is that when we keep running the rule it produces something that’s like 2.7-dimensional space.

Of course, 2.7 is not 3, and presumably this particular rule isn’t the one for our particular universe (though it’s not clear what effective dimension it’d have if we ran it 10100 steps). But the process of measuring dimension shows an example of how we can start making “physics-connectable” statements about the behavior of our rules.

By the way, we’ve been talking about “making space” with our models. But actually, we’re not just trying to make space; we’re trying to make everything in the universe. In standard current physics, there’s space—described mathematically as a manifold—and serving as a kind of backdrop, and then there’s everything that’s in space, all the matter and particles and planets and so on.

But in our models there’s in a sense nothing but space—and in a sense everything in the universe must be “made of space”. Or, put another way, it’s the exact same hypergraph that’s giving us the structure of space, and everything that exists in space.

So what this means is that, for example, a particle like an electron or a photon must correspond to some local feature of the hypergraph, a bit like in this toy example:

Graph
&#10005

Graph[EdgeAdd[
  EdgeDelete[
   NeighborhoodGraph[
    IndexGraph@ResourceFunction["HexagonalGridGraph"][{6, 5}], {42, 
     48, 54, 53, 47, 41}, 4], {30 <-> 29, 42 <-> 41}], {30 <-> 41, 
   42 <-> 29}], 
 VertexSize -> {Small, 
   Alternatives @@ {30, 36, 42, 41, 35, 29} -> Large}, 
 EdgeStyle -> {ResourceFunction["WolframPhysicsProjectStyleData"][
    "SpatialGraph", "EdgeLineStyle"], 
   Alternatives @@ {30 \[UndirectedEdge] 24, 24 \[UndirectedEdge] 18, 
      18 \[UndirectedEdge] 17, 17 \[UndirectedEdge] 23, 
      23 \[UndirectedEdge] 29, 29 \[UndirectedEdge] 35, 
      35 \[UndirectedEdge] 34, 34 \[UndirectedEdge] 40, 
      40 \[UndirectedEdge] 46, 46 \[UndirectedEdge] 52, 
      52 \[UndirectedEdge] 58, 58 \[UndirectedEdge] 59, 
      59 \[UndirectedEdge] 65, 65 \[UndirectedEdge] 66, 
      66 \[UndirectedEdge] 60, 60 \[UndirectedEdge] 61, 
      61 \[UndirectedEdge] 55, 55 \[UndirectedEdge] 49, 
      49 \[UndirectedEdge] 54, 49 \[UndirectedEdge] 43, 
      43 \[UndirectedEdge] 37, 37 \[UndirectedEdge] 36, 
      36 \[UndirectedEdge] 30, 30 \[UndirectedEdge] 41, 
      42 \[UndirectedEdge] 29, 36 \[UndirectedEdge] 42, 
      35 \[UndirectedEdge] 41, 41 \[UndirectedEdge] 47, 
      47 \[UndirectedEdge] 53, 53 \[UndirectedEdge] 54, 
      54 \[UndirectedEdge] 48, 48 \[UndirectedEdge] 42} -> 
    Directive[AbsoluteThickness[2.5], Darker[Red, .2]]}, 
 VertexStyle -> 
  ResourceFunction["WolframPhysicsProjectStyleData"]["SpatialGraph", 
   "VertexStyle"]]

To give a sense of scale, though, I have an estimate that says that 10200 times more “activity” in the hypergraph that represents our universe is going into “maintaining the structure of space” than is going into maintaining all the matter we know exists in the universe.

Curvature in Space & Einstein’s Equations

Here are a few structures that simple examples of our rules make:

GraphicsRow
&#10005

GraphicsRow[{ResourceFunction[
    "WolframModel"][{{1, 2, 2}, {1, 3, 4}} -> {{4, 5, 5}, {5, 3, 
      2}, {1, 2, 5}}, {{0, 0, 0}, {0, 0, 0}}, 1000, "FinalStatePlot"],
   ResourceFunction[
    "WolframModel"][{{1, 1, 2}, {1, 3, 4}} -> {{4, 4, 5}, {5, 4, 
      2}, {3, 2, 5}}, {{0, 0, 0}, {0, 0, 0}}, 1000, "FinalStatePlot"],
   ResourceFunction[
    "WolframModel"][{{1, 1, 2}, {3, 4, 1}} -> {{3, 3, 5}, {2, 5, 
      1}, {2, 6, 5}}, {{0, 0, 0}, {0, 0, 0}}, 2000, 
   "FinalStatePlot"]}, ImageSize -> Full]

But while all of these look like surfaces, they’re all obviously different. And one way to characterize them is by their local curvature. Well, it turns out that in our models, curvature is a concept closely related to dimension—and this fact will actually be critical in understanding, for example, how gravity arises.

But for now, let’s talk about how one would measure curvature on a hypergraph. Normally the area of a circle is πr2. But let’s imagine that we’ve drawn a circle on the surface of a sphere, and now we’re measuring the area on the sphere that’s inside the circle:

cappedSphere
&#10005

cappedSphere[angle_] := 
  Module[{u, v}, 
   With[{spherePoint = {Cos[u] Sin[v], Sin[u] Sin[v], Cos[v]}}, 
    Graphics3D[{First@
         ParametricPlot3D[spherePoint, {v, #1, #2}, {u, 0, 2 \[Pi]}, 
          Mesh -> None, ##3] & @@@ {{angle, \[Pi], 
         PlotStyle -> Lighter[Yellow, .5]}, {0, angle, 
         PlotStyle -> Lighter[Red, .3]}}, 
      First@ParametricPlot3D[
        spherePoint /. v -> angle, {u, 0, 2 \[Pi]}, 
        PlotStyle -> Darker@Red]}, Boxed -> False, 
     SphericalRegion -> False, Method -> {"ShrinkWrap" -> True}]]];
Show[GraphicsRow[Riffle[cappedSphere /@ {0.3, Pi/6, .8}, Spacer[30]]],
  ImageSize -> 250]

This area is no longer πr2. Instead it’s π, where a is the radius of the sphere. In other words, as the radius of the circle gets bigger, the effect of being on the sphere is ever more important. (On the surface of the Earth, imagine a circle drawn around the North Pole; once it gets to the equator, it can never get any bigger.)

If we generalize to d dimensions, it turns out the formula for the growth rate of the volume is , where R is a mathematical object known as the Ricci scalar curvature.

So what this all means is that if we look at the growth rates of spherical balls in our hypergraphs, we can expect two contributions: a leading one of order rd that corresponds to effective dimension, and a “correction” of order r2 that represents curvature.

Here’s an example. Instead of giving a flat estimate of dimension (here equal to 2), we have something that dips down, reflecting the positive (“sphere-like”) curvature of the surface:

res = CloudGet
&#10005

res = CloudGet["https://wolfr.am/L1ylk12R"];
GraphicsRow[{ResourceFunction["WolframModelPlot"][
   ResourceFunction[
     "WolframModel"][{{1, 2, 3}, {4, 2, 5}} -> {{6, 3, 1}, {3, 6, 
       4}, {1, 2, 6}}, {{0, 0, 0}, {0, 0, 0}}, 800, "FinalState"]], 
  ListLinePlot[res, Frame -> True, 
   PlotStyle -> {Hue[0.9849884156577183, 0.844661839156126, 0.63801], 
     Hue[0.05, 0.9493847125498949, 0.954757], Hue[
     0.0889039442504032, 0.7504362741954692, 0.873304], Hue[
     0.06, 1., 0.8], Hue[0.12, 1., 0.9], Hue[0.08, 1., 1.], Hue[
     0.98654716551403, 0.6728487861309527, 0.733028], Hue[
     0.04, 0.68, 0.9400000000000001], Hue[
     0.9945149844324427, 0.9892162267509705, 0.823529], Hue[
     0.9908289627180552, 0.4, 0.9]}]}]

What is the significance of curvature? One thing is that it has implications for geodesics. A geodesic is the shortest distance between two points. In ordinary flat space, geodesics are just lines. But when there’s curvature, the geodesics are curved:

hyperboloidGeodesics
&#10005

(*https://www.wolframcloud.com/obj/wolframphysics/TechPaper-Programs/\
Section-04/Geodesics-01.wl*)
CloudGet["https://wolfr.am/L1PH6Rne"];
hyperboloidGeodesics = Table[
Part[
NDSolve[{Sinh[
         2 u[t]] ((2 Derivative[1][u][t]^2 - Derivative[1][v][t]^2)/(
         2 Cosh[2 u[t]])) + Derivative[2][u][t] == 0, ((2 Tanh[
u[t]]) Derivative[1][u][t]) Derivative[1][v][t] + Derivative[2][v][
        t] == 0, u[0] == -0.9, v[0] == v0, u[1] == 0.9, v[1] == v0}, {
     
u[t], 
v[t]}, {t, 0, 1}, MaxSteps -> Infinity], 1], {v0, 
Range[-0.1, 0.1, 0.025]}];
{SphereGeodesics[Range[-.1, .1, .025]], 
 PlaneGeodesics[Range[-.1, .1, .025]], 
 Show[ParametricPlot3D[{Sinh[u], Cosh[u] Sin[v], 
    Cos[v] Cosh[u]}, {u, -1, 1}, {v, -\[Pi]/3, \[Pi]/3}, 
   Mesh -> False, Boxed -> False, Axes -> False, PlotStyle -> color], 
  ParametricPlot3D[{Sinh[u[t]], Cosh[u[t]] Sin[v[t]], 
       Cos[v[t]] Cosh[u[t]]} /. #, {t, 0, 1}, PlotStyle -> Red] & /@ 
   hyperboloidGeodesics, ViewAngle -> 0.3391233203265557`, 
  ViewCenter -> {{0.5`, 0.5`, 0.5`}, {0.5265689095305934`, 
     0.5477310383268459`}}, 
  ViewPoint -> {1.7628482856617167`, 0.21653966523483362`, 
    2.8801868854502355`}, 
  ViewVertical -> {-0.1654573174671554`, 0.1564093539158781`, 
    0.9737350718261054`}]}

In the case of positive curvature, bundles of geodesics converge; for negative curvature they diverge. But, OK, even though geodesics were originally defined for continuous space (actually, as the name suggests, for paths on the surface of the Earth), one can also have them in graphs (and hypergraphs). And it’s the same story: the geodesic is the shortest path between two points in the graph (or hypergraph).

Here are geodesics on the “positive-curvature surface” created by one of our rules:

findShortestPath
&#10005

findShortestPath[edges_, endpoints : {{_, _} ...}] := 
  FindShortestPath[
     Catenate[Partition[#, 2, 1, 1] & /@ edges], #, #2] & @@@ 
   endpoints;
pathEdges[edges_, path_] := 
  Select[Count[Alternatives @@ path]@# >= 2 &]@edges;
plotGeodesic[edges_, endpoints : {{_, _} ...}, o : OptionsPattern[]] := 
  With[{vertexPaths = findShortestPath[edges, endpoints]}, 
   ResourceFunction["WolframModelPlot"][edges, o, 
    GraphHighlight -> Catenate[vertexPaths], 
    EdgeStyle -> <|
      Alternatives @@ Catenate[pathEdges[edges, #] & /@ vertexPaths] -> 
       Directive[AbsoluteThickness[4], Red]|>]];
plotGeodesic[edges_, endpoints : {__ : Except@List}, 
   o : OptionsPattern[]] := plotGeodesic[edges, {endpoints}, o];
plotGeodesic[
 ResourceFunction[
   "WolframModel"][{{1, 2, 3}, {4, 2, 5}} -> {{6, 3, 1}, {3, 6, 
     4}, {1, 2, 6}}, Automatic, 1000, 
  "FinalState"], {{123, 721}, {24, 552}, {55, 671}}, 
 VertexSize -> 0.12]

And here they are for a more complicated structure:

gtest = UndirectedGraph
&#10005

(*https://www.wolframcloud.com/obj/wolframphysics/TechPaper-Programs/\
Section-04/Geodesics-01.wl*)

CloudGet["https://wolfr.am/L1PH6Rne"];(*Geodesics*)

gtest = UndirectedGraph[
   Rule @@@ 
    ResourceFunction[
      "WolframModel"][{{x, y}, {x, z}} -> {{x, z}, {x, w}, {y, w}, {z,
         w}}, {{1, 2}, {1, 3}}, 10, "FinalState"], Sequence[
   VertexStyle -> ResourceFunction["WolframPhysicsProjectStyleData"][
     "SpatialGraph", "VertexStyle"], 
    EdgeStyle -> ResourceFunction["WolframPhysicsProjectStyleData"][
     "SpatialGraph", "EdgeLineStyle"]] ];
Geodesics[gtest, #] & /@ {{{79, 207}}, {{143, 258}}}

Why are geodesics important? One reason is that in Einstein’s general relativity they’re the paths that light (or objects in “free fall”) follows in space. And in that theory gravity is associated with curvature in space. So when something is deflected going around the Sun, that happens because space around the Sun is curved, so the geodesic the object follows is also curved.

General relativity’s description of curvature in space turns out to all be based on the Ricci scalar curvature R that we encountered above (as well as the slightly more sophisticated Ricci tensor). But so if we want to find out if our models are reproducing Einstein’s equations for gravity, we basically have to find out if the Ricci curvatures that arise from our hypergraphs are the same as the theory implies.

There’s quite a bit of mathematical sophistication involved (for example, we have to consider curvature in space+time, not just space), but the bottom line is that, yes, in various limits, and subject to various assumptions, our models do indeed reproduce Einstein’s equations. (At first, we’re just reproducing the vacuum Einstein equations, appropriate when there’s no matter involved; when we discuss matter, we’ll see that we actually get the full Einstein equations.)

It’s a big deal to reproduce Einstein’s equations. Normally in physics, Einstein’s equations are what you start from (or sometimes they arise as a consistency condition for a theory): here they’re what comes out as an emergent feature of the model.

It’s worth saying a little about how the derivation works. It’s actually somewhat analogous to the derivation of the equations of fluid flow from the limit of the underlying dynamics of lots of discrete molecules. But in this case, it’s the structure of space rather than the velocity of a fluid that we’re computing. It involves some of the same kinds of mathematical approximations and assumptions, though. One has to assume, for example, that there’s enough effective randomness generated in the system that statistical averages work. There is also a whole host of subtle mathematical limits to take. Distances have to be large compared to individual hypergraph connections, but small compared to the whole size of the hypergraph, etc.

It’s pretty common for physicists to “hack through” the mathematical niceties. That’s actually happened for nearly a century in the case of deriving fluid equations from molecular dynamics. And we’re definitely guilty of the same thing here. Which in a sense is another way of saying that there’s lots of nice mathematics to do in actually making the derivation rigorous, and understanding exactly when it’ll apply, and so on.

By the way, when it comes to mathematics, even the setup that we have is interesting. Calculus has been built to work in ordinary continuous spaces (manifolds that locally approximate Euclidean space). But what we have here is something different: in the limit of an infinitely large hypergraph, it’s like a continuous space, but ordinary calculus doesn’t work on it (not least because it isn’t necessarily integer-dimensional). So to really talk about it well, we have to invent something that’s kind of a generalization of calculus, that’s for example capable of dealing with curvature in fractional-dimensional space. (Probably the closest current mathematics to this is what’s been coming out of the very active field of geometric group theory.)

It’s worth noting, by the way, that there’s a lot of subtlety in the precise tradeoff between changing the dimension of space, and having curvature in it. And while we think our universe is three-dimensional, it’s quite possible according to our models that there are at least local deviations—and most likely there were actually large deviations in the early universe.

Time

In our models, space is defined by the large-scale structure of the hypergraph that represents our collection of abstract relations. But what then is time?

For the past century or so, it’s been pretty universally assumed in fundamental physics that time is in a sense “just like space”—and that one should for example lump space and time together and talk about the “spacetime continuum”. And certainly the theory of relativity points in this direction. But if there’s been one “wrong turn” in the history of physics in the past century, I think it’s the assumption that space and time are the same kind of thing. And in our models they’re not—even though, as we’ll see, relativity comes out just fine.

So what then is time? In effect it’s much as we experience it: the inexorable process of things happening and leading to other things. But in our models it’s something much more precise: it’s the progressive application of rules, that continually modify the abstract structure that defines the contents of the universe.

The version of time in our models is in a sense very computational. As time progresses we are in effect seeing the results of more and more steps in a computation. And indeed the phenomenon of computational irreducibility implies that there is something definite and irreducible “achieved” by this process. (And, for example, this irreducibility is what I believe is responsible for the “encrypting” of initial conditions that is associated with the law of entropy increase, and the thermodynamic arrow of time.) Needless to say, of course, our modern computational paradigm did not exist a century ago when “spacetime” was introduced, and perhaps if it had, the history of physics might have been very different.

But, OK, so in our models time is just the progressive application of rules. But there is a subtlety in exactly how this works that might at first seem like a detail, but that actually turns out to be huge, and in fact turns out to be the key to both relativity and quantum mechanics.

At the beginning of this piece, I talked about the rule

{{x, y}, {x, z}} {{x, z}, {x, w}, {y, w}, {z, w}}

RulePlot
&#10005

RulePlot[ResourceFunction[
   "WolframModel"][{{x, y}, {x, z}} -> {{x, z}, {x, w}, {y, w}, {z, 
     w}}], VertexLabels -> Automatic, "RulePartsAspectRatio" -> 0.55]

and showed the “first few steps” in applying it

ResourceFunction
&#10005

ResourceFunction["WolframModelPlot"] /@ 
 ResourceFunction[
   "WolframModel"][{{x, y}, {x, z}} -> {{x, z}, {x, w}, {y, w}, {z, 
     w}}, {{1, 2}, {2, 3}, {3, 4}, {2, 4}}, 4, "StatesList"]

But how exactly did the rule get applied? What is “inside” these steps? The rule defines how to take two connections in the hypergraph (which in this case is actually just a graph) and transform them into four new connections, creating a new element in the process. So each “step” that we showed before actually consists of several individual “updating events” (where here newly added connections are highlighted, and ones that are about to be removed are dashed):

With
&#10005

With[{eo = 
   ResourceFunction[
     "WolframModel"][{{x, y}, {x, z}} -> {{x, z}, {x, w}, {y, w}, {z, 
       w}}, {{1, 2}, {2, 3}, {3, 4}, {2, 4}}, 4]}, 
 TakeList[eo["EventsStatesPlotsList", ImageSize -> 130], 
  eo["GenerationEventsCountList", 
   "IncludeBoundaryEvents" -> "Initial"]]]

But now, here is the crucial point: this is not the only sequence of updating events consistent with the rule. The rule just says to find two adjacent connections, and if there are several possible choices, it says nothing about which one. And a crucial idea in our model is in a sense just to do all of them.

We can represent this with a graph that shows all possible paths:

CloudGet
&#10005

CloudGet["https://wolfr.am/LmHho8Tr"]; (*newgraph*)newgraph[
 Graph[ResourceFunction["MultiwaySystem"][
   "WolframModel" -> {{{x, y}, {x, z}} -> {{x, z}, {x, w}, {y, w}, {z,
         w}}}, {{{1, 2}, {2, 3}, {3, 4}, {2, 4}}}, 3, "StatesGraph", 
   VertexSize -> 3, PerformanceGoal -> "Quality"], 
  AspectRatio -> 1/2], {3, 0.7}]

For the very first update, there are two possibilities. Then for each of the results of these, there are four additional possibilities. But at the next update, something important happens: two of the branches merge. In other words, even though we have done a different sequence of updates, the outcome is the same.

Things rapidly get complicated. Here is the graph after one more update, now no longer trying to show a progression down the page:

Graph
&#10005

Graph[ResourceFunction["MultiwaySystem"][
  "WolframModel" -> {{{x, y}, {x, z}} -> {{x, z}, {x, w}, {y, w}, {z, 
       w}}}, {{{1, 2}, {2, 3}, {3, 4}, {2, 4}}}, 4, "StatesGraph", 
  VertexSize -> 3, PerformanceGoal -> "Quality"]]

So how does this relate to time? What it says is that in the basic statement of the model there is not just one path of time; there are many paths, and many “histories”. But the model—and the rule that is used—determines all of them. And we have seen a hint of something else: that even if we might think we are following an “independent” path of history, it may actually merge with another path.

It will take some more discussion to explain how this all works. But for now let me say that what will emerge is that time is about causal relationships between things, and that in fact, even when the paths of history that are followed are different, these causal relationships can end up being the same—and that in effect, to an observer embedded in the system, there is still just a single thread of time.

The Graph of Causal Relationships

In the end it’s wonderfully elegant. But to get to the point where we can understand the elegant bigger picture we need to go through some detailed things. (It isn’t terribly surprising that a fundamental theory of physics—inevitably built on very abstract ideas—is somewhat complicated to explain, but so it goes.)

To keep things tolerably simple, I’m not going to talk directly about rules that operate on hypergraphs. Instead I’m going to talk about rules that operate on strings of characters. (To clarify: these are not the strings of string theory—although in a bizarre twist of “pun-becomes-science” I suspect that the continuum limit of the operations I discuss on character strings is actually related to string theory in the modern physics sense.)

OK, so let’s say we have the rule:

{A BBB, BB A}

This rule says that anywhere we see an A, we can replace it with BBB, and anywhere we see BB we can replace it with A. So now we can generate what we call the multiway system for this rule, and draw a “multiway graph” that shows everything that can happen:

ResourceFunction
&#10005

ResourceFunction["MultiwaySystem"][{"A" -> "BBB", 
  "BB" -> "A"}, {"A"}, 8, "StatesGraph"]

At the first step, the only possibility is to use ABBB to replace the A with BBB. But then there are two possibilities: replace either the first BB or the second BB—and these choices give different results. On the next step, though, all that can be done is to replace the A—in both cases giving BBBB.

So in other words, even though we in a sense had two paths of history that diverged in the multiway system, it took only one step for them to converge again. And if you trace through the picture above you’ll find out that’s what always happens with this rule: every pair of branches that is produced always merges, in this case after just one more step.

This kind of balance between branching and merging is a phenomenon I call “causal invariance”. And while it might seem like a detail here, it actually turns out that it’s at the core of why relativity works, why there’s a meaningful objective reality in quantum mechanics, and a host of other core features of fundamental physics.

But let’s explain why I call the property causal invariance. The picture above just shows what “state” (i.e. what string) leads to what other one. But at the risk of making the picture more complicated (and note that this is incredibly simple compared to the full hypergraph case), we can annotate the multiway graph by including the updating events that lead to each transition between states:

LayeredGraphPlot
&#10005

LayeredGraphPlot[
 ResourceFunction["MultiwaySystem"][{"A" -> "BBB", 
   "BB" -> "A"}, {"A"}, 8, "EvolutionEventsGraph"], AspectRatio -> 1]

But now we can ask the question: what are the causal relationships between these events? In other words, what event needs to happen before some other event can happen? Or, said another way, what events must have happened in order to create the input that’s needed for some other event?

Let us go even further, and annotate the graph above by showing all the causal dependencies between events:

LayeredGraphPlot
&#10005

LayeredGraphPlot[
 ResourceFunction["MultiwaySystem"][{"A" -> "BBB", 
   "BB" -> "A"}, {"A"}, 7, "EvolutionCausalGraph"], AspectRatio -> 1]

The orange lines in effect show which event has to happen before which other event—or what all the causal relationships in the multiway system are. And, yes, it’s complicated. But note that this picture shows the whole multiway system—with all possible paths of history—as well as the whole network of causal relationships within and between these paths.

But here’s the crucial thing about causal invariance: it implies that actually the graph of causal relationships is the same regardless of which path of history is followed. And that’s why I originally called this property “causal invariance”—because it says that with a rule like this, the causal properties are invariant with respect to different choices of the sequence in which updating is done.

And if one traced through the picture above (and went quite a few more steps), one would find that for every path of history, the causal graph representing causal relationships between events would always be:

ResourceFunction
&#10005

ResourceFunction["SubstitutionSystemCausalGraph"][{"A" -> "BBB", 
   "BB" -> "A"}, "A", 10] // LayeredGraphPlot

or, drawn differently,

ResourceFunction
&#10005

ResourceFunction["SubstitutionSystemCausalGraph"][{"A" -> "BBB", 
  "BB" -> "A"}, "A", 12]

The Importance of Causal Invariance

To understand more about causal invariance, it’s useful to look at an even simpler example: the case of the rule BAAB. This rule says that any time there’s a B followed by an A in a string, swap these characters around. In other words, this is a rule that tries to sort a string into alphabetical order, two characters at a time.

Let’s say we start with BBBAAA. Then here’s the multiway graph that shows all the things that can happen according to the rule:

Graph
&#10005

Graph[ResourceFunction["MultiwaySystem"][{"BA" -> "AB"}, "BBBAAA", 12,
    "EvolutionEventsGraph"], AspectRatio -> 1.5] // LayeredGraphPlot

There are lots of different paths that can be followed, depending on which BA in the string the rule is applied to at each step. But the important thing we see is that at the end all the paths merge, and we get a single final result: the sorted string AAABBB. And the fact that we get this single final result is a consequence of the causal invariance of the rule. In a case like this where there’s a final result (as opposed to just evolving forever), causal invariance basically says: it doesn’t matter what order you do all the updates in; the result you’ll get will always be the same.

I’ve introduced causal invariance in the context of trying to find a model of fundamental physics—and I’ve said that it’s going to be critical to both relativity and quantum mechanics. But actually what amounts to causal invariance has been seen before in various different guises in mathematics, mathematical logic and computer science. (Its most common name is “confluence”, though there are some technical differences between this and what I call causal invariance.)

Think about expanding out an algebraic expression, like (x + (1 + x)2)(x + 2)2. You could expand one of the powers first, then multiply things out. Or you could multiply the terms first. It doesn’t matter what order you do the steps in; you’ll always get the same canonical form (which in this case Mathematica tells me is 4 + 16x + 17x2 + 7x3 + x4). And this independence of orders is essentially causal invariance.

Here’s one more example. Imagine you’ve got some recursive definition, say f[n_]:=f[n-1]+f[n-2] (with f[0]=f[1]=1). Now evaluate f[10]. First you get f[9]+f[8]. But what do you do next? Do you evaluate f[9], or f[8]? And then what? In the end, it doesn’t matter; you’ll always get 55. And this is another example of causal invariance.

When one thinks about parallel or asynchronous algorithms, it’s important if one has causal invariance. Because it means one can do things in any order—say, depth-first, breadth-first, or whatever—and one will always get the same answer. And that’s what’s happening in our little sorting algorithm above.

OK, but now let’s come back to causal relationships. Here’s the multiway system for the sorting process annotated with all causal relationships for all paths:

Magnify
&#10005

Magnify[LayeredGraphPlot[
  ResourceFunction["MultiwaySystem"][{"BA" -> "AB"}, "BBBAAA", 12, 
   "EvolutionCausalGraph"], AspectRatio -> 1.5], .6]

And, yes, it’s a mess. But because there’s causal invariance, we know something very important: this is basically just a lot of copies of the same causal graph—a simple grid:

centeredRange
&#10005

centeredRange[n_] := # - Mean@# &@Range@n;
centeredLayer[n_] := {#, n} & /@ centeredRange@n;
diamondLayerSizes[layers_?OddQ] := 
  Join[#, Reverse@Most@#] &@Range[(layers + 1)/2];
diamondCoordinates[layers_?OddQ] := 
  Catenate@MapIndexed[
    Thread@{centeredRange@#, (layers - First@#2)/2} &, 
    diamondLayerSizes[layers]];
diamondGraphLayersCount[graph_] := 2 Sqrt[VertexCount@graph] - 1;
With[{graph = 
   ResourceFunction["SubstitutionSystemCausalGraph"][{"BA" -> "AB"}, 
    "BBBBAAAA", 12]}, 
 Graph[graph, 
  VertexCoordinates -> 
   diamondCoordinates@diamondGraphLayersCount@graph, VertexSize -> .2]]

(By the way—as the picture suggests—the cross-connections between these copies aren’t trivial, and later on we’ll see they’re associated with deep relations between relativity and quantum mechanics, that probably manifest themselves in the physics of black holes. But we’ll get to that later…)

OK, so every different way of applying the sorting rule is supposed to give the same causal graph. So here’s one example of how we might apply the rule starting with a particular initial string:

evo = (SeedRandom
&#10005

evo = (SeedRandom[2424]; 
   ResourceFunction[
     "SubstitutionSystemCausalEvolution"][{"BA" -> "AB"}, 
    "BBAAAABAABBABBBBBAAA", 15, {"Random", 4}]);
ResourceFunction["SubstitutionSystemCausalPlot"][evo, 
 EventLabels -> False, CellLabels -> True, CausalGraph -> False]

But now let’s show the graph of causal connections. And we see it’s just a grid:

evo = (SeedRandom
&#10005

evo = (SeedRandom[2424]; 
   ResourceFunction[
     "SubstitutionSystemCausalEvolution"][{"BA" -> "AB"}, 
    "BBAAAABAABBABBBBBAAA", 15, {"Random", 4}]);
ResourceFunction["SubstitutionSystemCausalPlot"][evo, 
 EventLabels -> False, CellLabels -> False, CausalGraph -> True]

Here are three other possible sequences of updates:

SeedRandom
&#10005

SeedRandom[242444]; GraphicsRow[
 Table[ResourceFunction["SubstitutionSystemCausalPlot"][
   ResourceFunction[
     "SubstitutionSystemCausalEvolution"][{"BA" -> "AB"}, 
    "BBAAAABAABBABBBBBAAA", 15, {"Random", 4}], EventLabels -> False, 
   CellLabels -> False, CausalGraph -> True], 3], ImageSize -> Full]

But now we see causal invariance in action: even though different updates occur at different times, the graph of causal relationships between updating events is always the same. And having seen this—in the context of a very simple example—we’re ready to talk about special relativity.

Deriving Special Relativity

It’s a typical first instinct in thinking about doing science: you imagine doing an experiment on a system, but you—as the “observer”—are outside the system. Of course if you’re thinking about modeling the whole universe and everything in it, this isn’t ultimately a reasonable way to think about things. Because the “observer” is inevitably part of the universe, and so has to be modeled just like everything else.

In our models what this means is that the “mind of the observer”, just like everything else in the universe, has to get updated through a series of updating events. There’s no absolute way for the observer to “know what’s going on in the universe”; all they ever experience is a series of updating events, that may happen to be affected by updating events occurring elsewhere in the universe. Or, said differently, all the observer can ever observe is the network of causal relationships between events—or the causal graph that we’ve been talking about.

So as toy model let’s look at our BAAB rule for strings. We might imagine that the string is laid out in space. But to our observer the only thing they know is the causal graph that represents causal relationships between events. And for the BAAB system here’s one way we can draw that:

CloudGet
&#10005

CloudGet["https://wolfr.am/KVkTxvC5"]; (*regularCausalGraphPlot*)

CloudGet["https://wolfr.am/KVl97Tf4"];(*lorentz*)
\
regularCausalGraphPlot[10, {0, 0}, {0.0, 0.0}, lorentz[0]]

But now let’s think about how observers might “experience” this causal graph. Underneath, an observer is getting updated by some sequence of updating events. But even though that’s “really what’s going on”, to make sense of it, we can imagine our observers setting up internal “mental” models for what they see. And a pretty natural thing for observers like us to do is just to say “one set of things happens all across the universe, then another, and so on”. And we can translate this into saying that we imagine a series of “moments” in time, where things happen “simultaneously” across the universe—at least with some convention for defining what we mean by simultaneously. (And, yes, this part of what we’re doing is basically following what Einstein did when he originally proposed special relativity.)

Here’s a possible way of doing it:

CloudGet
&#10005

CloudGet["https://wolfr.am/KVkTxvC5"]; (*regularCausalGraphPlot*)

CloudGet["https://wolfr.am/KVl97Tf4"];(*lorentz*)
\
regularCausalGraphPlot[10, {1, 0}, {0.0, 0.0}, lorentz[0]]

One can describe this as a “foliation” of the causal graph. We’re dividing the causal graph into leaves or slices. And each slice our observers can consider to be a “successive moment in time”.

It’s important to note that there are some constraints on the foliation we can pick. The causal graph defines what event has to happen before what. And if our observers are going to have a chance of making sense of the world, it had better be the case that their notion of the progress of time aligns with what the causal graph says. So for example this foliation wouldn’t work—because basically it says that the time we assign to events is going to disagree with the order in which the causal graph says they have to happen:

CloudGet
&#10005

CloudGet["https://wolfr.am/KVkTxvC5"]; (*regularCausalGraphPlot*)

CloudGet["https://wolfr.am/KVl97Tf4"];(*lorentz*)
\
regularCausalGraphPlot[6, {.2, 0}, {5, 0.0}, lorentz[0]]

But, so given the foliation above, what actual order of updating events does it imply? It basically just says: as many events as possible happen at the same time (i.e. in the same slice of the foliation), as in this picture:

ResourceFunction["SubstitutionSystemCausalPlot"]
&#10005

(*https://www.wolframcloud.com/obj/wolframphysics/TechPaper-Programs/\
Section-08/BoostedEvolution.wl*)
CloudGet["https://wolfr.am/LbaDFVSn"]; (*boostedEvolution*) \
ResourceFunction["SubstitutionSystemCausalPlot"][
  boostedEvolution[
   ResourceFunction[
     "SubstitutionSystemCausalEvolution"][{"BA" -> "AB"}, 
    StringRepeat["BA", 10], 10], 0], EventLabels -> False, 
  CellLabels -> True, CausalGraph -> False]

OK, now let’s connect this to physics. The foliation we had above is relevant to observers who are somehow “stationary with respect to the universe” (the “cosmological rest frame”). One can imagine that as time progresses, the events a particular observer experiences are ones in a column going vertically down the page:

CloudGet
&#10005

CloudGet["https://wolfr.am/KVkTxvC5"]; (*regularCausalGraphPlot*)

CloudGet["https://wolfr.am/KVl97Tf4"];(*lorentz*)
\
regularCausalGraphPlot[5, {1, 0.01}, {0.0, 0.0}, {1.5, 0}, {Red, 
  Directive[Dotted, Thick, Red]}, lorentz[0]]

But now let’s think about an observer who is uniformly moving in space. They’ll experience a different sequence of events, say:

CloudGet
&#10005

CloudGet["https://wolfr.am/KVkTxvC5"]; (*regularCausalGraphPlot*)

CloudGet["https://wolfr.am/KVl97Tf4"];(*lorentz*)
\
regularCausalGraphPlot[5, {1, 0.01}, {0.0, 0.3}, {0.6, 0}, {Red, 
  Directive[Dotted, Thick, Red]}, lorentz[0]]

And that means that the foliation they’ll naturally construct will be different. From the “outside” we can draw it on the causal graph like this:

CloudGet
&#10005

CloudGet["https://wolfr.am/KVkTxvC5"]; (*regularCausalGraphPlot*)

CloudGet["https://wolfr.am/KVl97Tf4"];(*lorentz*)
\
regularCausalGraphPlot[10, {1, 0.01}, {0.3, 0.3}, {0, 0}, {Red, 
  Directive[Dotted, Thick, Red]}, lorentz[0.]]

But to the observer each slice just represents a successive moment of time. And they don’t have any way to know how the causal graph was drawn. So they’ll construct their own version, where the slices are horizontal:

CloudGet
&#10005

CloudGet["https://wolfr.am/KVkTxvC5"]; (*regularCausalGraphPlot*)

CloudGet["https://wolfr.am/KVl97Tf4"];(*lorentz*)
\
regularCausalGraphPlot[10, {1, 0.01}, {0.3, 0.3}, {0, 0}, {Red, 
  Directive[Dotted, Thick, Red]}, lorentz[0.3]]

But now there’s a purely geometrical fact: to make this rearrangement, while preserving the basic structure (and here, angles) of the causal graph, each moment of time has to sample fewer events in the causal graph, by a factor of where β is the angle that represents the velocity of the observer.

If you know about special relativity, you’ll recognize a lot of this. What we’ve been calling foliations correspond directly to relativity’s “reference frames”. And our foliations that represent motion are the standard inertial reference frames of special relativity.

But here’s the special thing that’s going on here: we can interpret all this discussion of foliations and reference frames in terms of the actual rules and evolution of our underlying system. So here now is the evolution of our string-sorting system in the “boosted reference frame” corresponding to an observer going at a certain speed:

CloudGet
&#10005

(*https://www.wolframcloud.com/obj/wolframphysics/TechPaper-Programs/\
Section-08/BoostedEvolution.wl*)
CloudGet["https://wolfr.am/LbaDFVSn"]; (*boostedEvolution*) \
ResourceFunction["SubstitutionSystemCausalPlot"][
  boostedEvolution[
   ResourceFunction[
     "SubstitutionSystemCausalEvolution"][{"BA" -> "AB"}, 
    StringRepeat["BA", 10], 10], 0.3], EventLabels -> False, 
  CellLabels -> True, CausalGraph -> False]

And here’s the crucial point: because of causal invariance it doesn’t matter that we’re in a different reference frame—the causal graph for the system (and the way it eventually sorts the string) is exactly the same.

In special relativity, the key idea is that the “laws of physics” work the same in all inertial reference frames. But why should that be true? Well, in our systems, there’s an answer: it’s a consequence of causal invariance in the underlying rules. In other words, from the property of causal invariance, we’re able to derive relativity.

Normally in physics one puts in relativity by the way one sets up the mathematical structure of spacetime. But in our models we don’t start from anything like this, and in fact space and time are not even at all the same kind of thing. But what we can now see is that—because of causal invariance—relativity emerges in our models, with all the relationships between space and time that that implies.

So, for example, if we look at the picture of our string-sorting system above, we can see relativistic time dilation. In effect, because of the foliation we picked, time operates slower. Or, said another way, in the effort to sample space faster, our observer experiences slower updating of the system in time.

The speed of light c in our toy system is defined by the maximum rate at which information can propagate, which is determined by the rule, and in the case of this rule is one character per step. And in terms of this, we can then say that our foliation corresponds to a speed 0.3 c. But now we can look at the amount of time dilation, and it’s exactly the amount that relativity says it should be.

By the way, if we imagine trying to make our observer go “faster than light”, we can see that can’t work. Because there’s no way to tip the foliation at more than 45° in our picture, and still maintain the causal relationships implied by the causal graph.

OK, so in our toy model we can derive special relativity. But here’s the thing: this derivation isn’t specific to the toy model; it applies to any rule that has causal invariance. So even though we may be dealing with hypergraphs, not strings, and we may have a rule that shows all kinds of complicated behavior, if it ultimately has causal invariance, then (with various technical caveats, mostly about possible wildness in the causal graph) it will exhibit relativistic invariance, and a physics based on it will follow special relativity.

What Is Energy? What Is Mass?

In our model, everything in the universe—space, matter, whatever—is supposed to be represented by features of our evolving hypergraph. So within that hypergraph, is there a way to identify things that are familiar from current physics, like mass, or energy?

I have to say that although it’s a widespread concept in current physics, I’d never thought of energy as something fundamental. I’d just thought of it as an attribute that things (atoms, photons, whatever) can have. I never really thought of it as something that one could identify abstractly in the very structure of the universe.

So it came as a big surprise when we recently realized that actually in our model, there is something we can point to, and say “that’s energy!”, independent of what it’s the energy of. The technical statement is: energy corresponds to the flux of causal edges through spacelike hypersurfaces. And, by the way, momentum corresponds to the flux of causal edges through timelike hypersurfaces.

OK, so what does this mean? First, what’s a spacelike hypersurface? It’s actually a standard concept in general relativity, for which there’s a direct analogy in our models. Basically it’s what forms a slice in our foliation. Why is it called what it’s called? We can identify two kinds of directions: spacelike and timelike.

A spacelike direction is one that involves just moving in space—and it’s a direction where one can always reverse and go back. A timelike direction is one that involves also progressing through time—where one can’t go back. We can mark spacelike () and timelike () hypersurfaces in the causal graph for our toy model:

CloudGet
&#10005

CloudGet["https://wolfr.am/KVkTxvC5"]; (*regularCausalGraphPlot*)

CloudGet["https://wolfr.am/KVl97Tf4"];(*lorentz*)
\
regularCausalGraphPlot[10, {1, 0.5}, {0., 0.}, {-0.5, 0}, {Red, 
  Directive[Dashed, Red]}, lorentz[0.]]

(They might be called “surfaces”, except that “surfaces” are usually thought of as 2-dimensional, and our 3-space + 1-time dimensional universe, these foliation slices are 3-dimensional: hence the term “hypersurfaces”.)

OK, now let’s look at the picture. The “causal edges” are the causal connections between events, shown in the picture as lines joining the events. So when we talk about a “flux of causal edges through spacelike hypersurfaces”, what we’re talking about is the net number of causal edges that go down through the horizontal slices in the pictures.

In the toy model that’s trivial to see. But here’s a causal graph from a simple hypergraph model, where it’s already considerably more complicated:

Graph
&#10005

Graph[ResourceFunction[
   "WolframModel"][  {{x, y}, {z, y}} -> {{x, z}, {y, z}, {w, 
     z}}, {{0, 0}, {0, 0}}, 15, "LayeredCausalGraph"], 
 AspectRatio -> 1/2]

(Our toy-model causal graph starts from a line of events because we set up a long string as the initial condition; this starts from a single event because it’s starting from a minimal initial condition.)

But when we put a foliation on this causal graph (thereby effectively defining our reference frame) we can start counting how many causal edges go down through successive (“spacelike”) slices:

foliationLines
&#10005

foliationLines[{lineDensityHorizontal_ : 1, 
    lineDensityVertical_ : 1}, {tanHorizontal_ : 0.0, 
    tanVertical_ : 0.0}, offset : {_, _} : {0, 0}, 
   lineStyles : {_, _} : {Red, Red}, 
   transform_ : (# &)] := {If[lineDensityHorizontal != 0, 
    Style[Table[
      Line[transform /@ {{-100 + First@offset, 
          k - 100 tanHorizontal + Last@offset}, {100 + First@offset, 
          k + 100 tanHorizontal + Last@offset}}], {k, -100.5, 100.5, 
       1/lineDensityHorizontal}], First@lineStyles], {}], 
   If[lineDensityVertical != 0, 
    Style[Table[
      Line[transform /@ {{k - 100 tanVertical + First@offset, -100 + 
           Last@offset}, {k + 100 tanVertical + First@offset, 
          100 + Last@offset}}], {k, -100.5, 100.5, 
       1/lineDensityVertical}], Last@lineStyles], {}]};
ResourceFunction[
   "WolframModel"][{{x, y}, {z, y}} -> {{x, z}, {y, z}, {w, z}}, {{0, 
    0}, {0, 0}}, 15]["LayeredCausalGraph", AspectRatio -> 1/2, 
 Epilog -> 
  foliationLines[{0.44, 0}, {0, 
    0}, {0, -0.5}, {Directive[Red, Opacity[0.2]], Red}]]

We can also ask how many causal edges go “sideways”, through timelike hypersurfaces:

foliationLines
&#10005

foliationLines[{lineDensityHorizontal_ : 1, 
    lineDensityVertical_ : 1}, {tanHorizontal_ : 0.0, 
    tanVertical_ : 0.0}, offset : {_, _} : {0, 0}, 
   lineStyles : {_, _} : {Red, Red}, 
   transform_ : (# &)] := {If[lineDensityHorizontal != 0, 
    Style[Table[
      Line[transform /@ {{-100 + First@offset, 
          k - 100 tanHorizontal + Last@offset}, {100 + First@offset, 
          k + 100 tanHorizontal + Last@offset}}], {k, -100.5, 100.5, 
       1/lineDensityHorizontal}], First@lineStyles], {}], 
   If[lineDensityVertical != 0, 
    Style[Table[
      Line[transform /@ {{k - 100 tanVertical + First@offset, -100 + 
           Last@offset}, {k + 100 tanVertical + First@offset, 
          100 + Last@offset}}], {k, -100.5, 100.5, 
       1/lineDensityVertical}], Last@lineStyles], {}]};
ResourceFunction[
   "WolframModel"][{{x, y}, {z, y}} -> {{x, z}, {y, z}, {w, z}}, {{0, 
    0}, {0, 0}}, 15]["LayeredCausalGraph", AspectRatio -> 1/2, 
 Epilog -> 
  foliationLines[{0, 1/3}, {0, 0}, {2.1, 
    0}, {Directive[Red, Opacity[0.5]], 
    Directive[Dotted, Opacity[0.7], Red]}]]

OK, so why do we think these fluxes of edges correspond to energy and momentum? Imagine what happens if we change our foliation, say tipping it to correspond to motion at some velocity, as we did in the previous section. It takes a little bit of math, but what we find out is that our fluxes of causal edges transform with velocity basically just like we saw distance and time transform in the previous section.

In the standard derivation of relativistic mechanics, there’s a consistency argument that energy has to transform with velocity like time does, and momentum like distance. But now we actually have a structural reason for this to be the case. It’s a fundamental consequence of our whole setup, and of causal invariance. In traditional physics, one often says that position is the conjugate variable to momentum, and energy to time. And that’s something that’s burnt into the mathematical structure of the theory. But here it’s not something we’re burning in; it’s something we’re deriving from the underlying structure of our model.

And that means there’s ultimately a lot more we can say about it. For example, we might wonder what the “zero of energy” is. After all, if we look at one of our causal graphs, a lot of the causal edges are really just going into “maintaining the structure of space”. So if in a sense space is uniform, there’s inevitably a uniform “background flux” of causal edges associated with that. And whatever we consider to be “energy” corresponds to the fluctuations of that flux around its background value.

By the way, it’s worth mentioning what a “flux of causal edges” corresponds to. Each causal edge represents a causal connection between events, that is in a sense “carried” by some element in the underlying hypergraph (the “spatial hypergraph”). So a “flux of causal edges” is in effect the communication of activity (i.e. events), either in time (i.e. through spacelike hypersurfaces) or in space (i.e. through timelike hypersurfaces). And at least in some approximation we can then say that energy is associated with activity in the hypergraph that propagates information through time, while momentum is associated with activity that propagates information in space.

There’s a fundamental feature of our causal graphs that we haven’t mentioned yet—that’s related to information propagation. Start at any point (i.e. any event) in a causal graph. Then trace the causal connections from that event. You’ll get some kind of cone (here just in 2D):

CloudGet
&#10005

CloudGet["https://wolfr.am/KVl97Tf4"];(*lorentz*)

foliationLines[{lineDensityHorizontal_ : 1, 
    lineDensityVertical_ : 1}, {tanHorizontal_ : 0.0, 
    tanVertical_ : 0.0}, offset : {_, _} : {0, 0}, 
   lineStyles : {_, _} : {Red, Red}, 
   transform_ : (# &)] := {If[lineDensityHorizontal != 0, 
    Style[Table[
      Line[transform /@ {{-100 + First@offset, 
          k - 100 tanHorizontal + Last@offset}, {100 + First@offset, 
          k + 100 tanHorizontal + Last@offset}}], {k, -100.5, 100.5, 
       1/lineDensityHorizontal}], First@lineStyles], {}], 
   If[lineDensityVertical != 0, 
    Style[Table[
      Line[transform /@ {{k - 100 tanVertical + First@offset, -100 + 
           Last@offset}, {k + 100 tanVertical + First@offset, 
          100 + Last@offset}}], {k, -100.5, 100.5, 
       1/lineDensityVertical}], Last@lineStyles], {}]};
squareCausalGraphPlot[
   layerCount_ : 9, {lineDensityHorizontal_ : 1, 
    lineDensityVertical_ : 1}, {tanHorizontal_ : 0.0, 
    tanVertical_ : 0.0}, offset : {_, _} : {0, 0}, 
   lineStyles : {_, _} : {Red, Red}, transform_ : (# &)] := 
  NeighborhoodGraph[
   DirectedGraph[
    Flatten[Table[{v[{i + 1, j}] -> v[{i, j}], 
       v[{i + 1, j + 1}] -> v[{i, j}]}, {i, layerCount - 1}, {j, 
       1 + Round[-layerCount/2 + i/2], (layerCount + i)/2}]], 
    VertexCoordinates -> 
     Catenate[
      Table[v[{i, j}] -> 
        transform[{2 (#2 - #1/2), #1} & @@ {i, j}], {i, 
        layerCount + 1}, {j, 
        1 + Round[-layerCount/2 + i/2] - 1, (layerCount + i)/2 + 1}]],
     VertexSize -> .33, 
    VertexStyle -> 
     Directive[Directive[Opacity[.7], Hue[0.14, 0.34, 1.]], 
      EdgeForm[Directive[Opacity[0.4], Hue[0.09, 1., 0.91]]]], 
    VertexShapeFunction -> "Rectangle", 
    Epilog -> 
     foliationLines[{lineDensityHorizontal, 
       lineDensityVertical}, {tanHorizontal, tanVertical}, offset, 
      lineStyles, transform]], v[{1, 1}], 9];
With[{graph = 
   squareCausalGraphPlot[
    10, {0, 0}, {0., 0.}, {-0.5, 0}, {Red, Directive[Dotted, Red]}, 
    lorentz[0.]]}, 
 Graph[graph, 
  VertexStyle -> {Directive[
     Directive[Opacity[.7], Hue[0.14, 0.34, 1.]], 
     EdgeForm[Directive[Opacity[0.4], Hue[0.09, 1., 0.91]]]], 
    Alternatives @@ VertexOutComponent[graph, v[{9, 5}]] -> 
     Directive[Directive[Opacity[.6], Hue[0, 0.45, 0.87]], EdgeForm[
Hue[0, 1, 0.48]]]}]]

The cone is more complicated in a more complicated causal graph. But you’ll always have something like it. And what it corresponds to physically is what’s normally called a light cone (or “forward light cone”). Assuming we’ve drawn our causal network so that events are somehow laid out in space across the page, then the light cone will show how information (as transmitted by light) can spread in space with time.

When the causal graph gets complicated, the whole setup with light cones gets complicated, as we’ll discuss for example in connection with black holes later. But for now, we can just say there are cones in our causal graph, and in effect the angle of these cones represents the maximum rate of information propagation in the system, which we can identify with the physical speed of light.

And in fact, not only can we identify light cones in our causal graph: in some sense we can think of our whole causal graph as just being a large number of “elementary light cones” all knitted together. And, as we mentioned, much of the structure that’s built necessarily goes into, in effect, “maintaining the structure of space”.

But let’s look more closely at our light cones. There are causal edges on their boundaries that in effect correspond to propagation at the speed of light—and that, in terms of the underlying hypergraph, correspond to events that “reach out” in the hypergraph, and “entrain” new elements as quickly as possible. But what about causal edges that are “more vertical”? These causal edges are associated with events that in a sense reuse elements in the hypergraph, without involving new ones.

And it looks like these causal edges have an important interpretation: they are associated with mass (or, more specifically, rest mass). OK, so the total flux of causal edges through spacelike hypersurfaces corresponds to energy. And now we’re saying that the flux of causal edges specifically in the timelike direction corresponds to rest mass. We can see what happens if we “tip our reference” frames just a bit, say corresponding to a velocity v  c. Again, there’s a small amount of math, but it’s pretty easy to derive formulas for momentum (p) and energy (E). The speed of light c comes into the formulas because it defines the ratio of “horizontal” (i.e. spacelike) to “vertical” (i.e timelike) distances on the causal graph. And for v small compared to c we get:

So from these formulas we can see that just by thinking about causal graphs (and, yes, with a backdrop of causal invariance, and a whole host of detailed mathematical limit questions that we’re not discussing here), we’ve managed to derive a basic (and famous) fact about the relation between energy and mass:

Sometimes in the standard formalism of physics, this relation by now seems more like a definition than something to derive. But in our model, it’s not just a definition, and in fact we can successfully derive it.

General Relativity & Gravity

Earlier on, we talked about how curvature of space can arise in our models. But at that point we were just talking about “empty space”. Now we can go back and also talk about how curvature interacts with mass and energy in space.

In our earlier discussion, we talked about constructing spherical balls by starting at some point in the hypergraph, and then following all possible sequences of r connections. But now we can do something directly analogous in the causal graph: start at some point, and follow possible sequences of t connections. There’s quite a bit of mathematical trickiness, but essentially this gets us “volumes of light cones”.

If space is effectively d-dimensional, then to a first approximation this volume will grow like . But like in the spatial case, there’s a correction term, this time proportional to the so-called Ricci tensor . (The actual expression is roughly where the are timelike vectors, etc.)

OK, but we also know something else about what is supposed to be inside our light cones: not only are there “background connections” that maintain the structure of space, there are also “additional” causal edges that are associated with energy, momentum and mass. And in the limit of a large causal graph, we can identify the density of these with the so-called energy-momentum tensor . So in the end we have two contributions to the “volumes” of our light cones: one from “pure curvature” and one from energy-momentum.

Again, there’s some math involved. But the main thing is to think about the limit when we’re looking at a very large causal graph. What needs to be true for us to have d-dimensional space, as opposed to something much wilder? This puts a constraint on the growth rates of our light cone volumes, and when one works everything out, it implies that the following equation must hold:

But this is exactly Einstein’s equation for the curvature of space when matter with a certain energy-momentum is present. We’re glossing over lots of details here. But it’s still, in my view, quite spectacular: from the basic structure of our very simple models, we’re able to derive a fundamental result in physics: the equation that for more than a hundred years has passed every test in describing the operation of gravity.

There’s a footnote here. The equation we’ve just given is without a so-called cosmological term. And how that works is bound up with the question of what the zero of energy is, which in our model relates to what features of the evolving hypergraph just have to do with the “maintenance of space”, and what have to do with “things in space” (like matter).

In existing physics, there’s an expectation that even in the “vacuum” there’s actually a formally infinite density of pairs of virtual particles associated with quantum mechanics. Essentially what’s happening is that there are always pairs of particles and antiparticles being created, that annihilate quickly, but that in aggregate contribute a huge effective energy density. We’ll discuss how this relates to quantum mechanics in our models later. But for now let’s just recall that particles (like electrons) in our models basically correspond to locally stable structures in the hypergraph.

But when we think about how “space is maintained” it’s basically through all sorts of seemingly random updating events in the hypergraph. But in existing physics (or, specifically, quantum field theory) we’re basically expected to analyze everything in terms of (virtual) particles. So if we try to do that with all these random updating events, it’s not surprising that we end up saying that there are these infinite collections of things going on. (Yes, this can be made much more precise; I’m just giving an outline here.)

But as soon as we say this, there is an immediate problem: we’re saying that there’s a formally infinite—or at least huge—energy density that must exist everywhere in the universe. But if we then apply Einstein’s equation, we’ll conclude that this must produce enough curvature to basically curl the universe up into a tiny ball.

One way to get out of this is to introduce a so-called cosmological term, that’s just an extra term in the Einstein equations, and then posit that this term is sized so as to exactly cancel (yes, to perhaps one part in 1060 or more) the energy density from virtual particles. It’s certainly not a pretty solution.

But in our models, the situation is quite different. It’s not that we have virtual particles “in space”, that are having an effect on space. It’s that the same stuff that corresponds to the virtual particles is actually “making the space”, and maintaining its structure. Of course, there are lots of details about this—which no doubt depend on the particular underlying rule. But the point is that there’s no longer a huge mystery about why “vacuum energy” doesn’t basically destroy our universe: in effect, it’s because it’s what’s making our universe.

Black Holes, Singularities, etc.

One of the big predictions of general relativity is the existence of black holes. So how do things like that work in our models? Actually, it’s rather straightforward. The defining feature of a black hole is the existence of an event horizon: a boundary that light signals can’t cross, and where in effect causal connection is broken.

In our models, we can explicitly see that happen in the causal graph. Here’s an example:

ResourceFunction
&#10005

ResourceFunction[
   "WolframModel"][{{0, 1}, {0, 2}, {0, 3}} -> {{1, 2}, {3, 2}, {3, 
     4}, {4, 3}, {4, 4}}, {{0, 0}, {0, 0}, {0, 0}}, 20, 
  "CausalGraph"] // LayeredGraphPlot

At the beginning, everything is causally connected. But at some point the causal graph splits—and there’s an event horizon. Events happening on one side can’t influence ones on the other, and so on. And that’s how a region of the universe can “causally break off” to form something like a black hole.

But actually, in our models, the “breaking off” can be even more extreme. Not only can the causal graph split; the spatial hypergraph can actually throw off disconnected pieces—each of which in effect forms a whole “separate universe”:

Framed
&#10005

Framed[ResourceFunction["WolframModelPlot"][#, 
    ImageSize -> {UpTo[100], UpTo[60]}], FrameStyle -> LightGray] & /@ 
 ResourceFunction[
   "WolframModel"][{{1, 2, 3}, {4, 5, 3}} -> {{2, 6, 4}, {6, 1, 
     2}, {4, 2, 1}}, {{0, 0, 0}, {0, 0, 0}}, 20, "StatesList"]

By the way, it’s interesting to look at what happens to the foliations observers make when there’s an event horizon. Causal invariance says that paths in the causal graph that diverge should always eventually merge. But if the paths go into different disconnected pieces of the causal graph, that can’t ever happen. So how does an observer deal with that? Well, basically they have to “freeze time”. They have to have a foliation where successive time slices just pile up, and never enter the disconnected pieces.

It’s just like what happens in general relativity. To an observer far from the black hole, it’ll seem to take an infinite time for anything to fall into the black hole. For now, this is just a phenomenon associated with the structure of space. But later we’ll see that it’s also the direct analog of something completely different: the process of measurement in quantum mechanics.

Coming back to gravity: we can ask questions not only about event horizons, but also about actual singularities in spacetime. In our models, these are places where lots of paths in a causal graph converge to a single point. And in our models, we can immediately study questions like whether there’s always an event horizon associated with any singularity (the “cosmic censorship hypothesis”).

We can ask about other strange phenomena from general relativity. For example, there are closed timelike curves, sometimes viewed as allowing time travel. In our models, closed timelike curves are inconsistent with causal invariance. But we can certainly invent rules that produce them. Here’s an example:

Graph
&#10005

Graph[ResourceFunction["MultiwaySystem"][{"AB" -> "BAB", 
   "BA" -> "A"}, "ABA", 4, "StatesGraph"], 
 GraphLayout -> {"LayeredDigraphEmbedding", "RootVertex" -> "ABA"}]

We start from one “initial” state in this multiway system. But as we go forward we can enter a loop where we repeatedly visit the same state. And this loop also occurs in the causal graph. We think we’re “going forward in time”. But actually we’re just in a loop, repeatedly returning to the same state. And if we tried to make a foliation where we could describe time as always advancing, we just wouldn’t be able to do it.

Cosmology

In our model, the universe can start as a tiny hypergraph—perhaps a single self-loop. But then—as the rule gets applied—it progressively expands. With some particularly simple rules, the total size of the hypergraph has to just uniformly increase; with others it can fluctuate.

But even if the size of the hypergraph is always increasing, that doesn’t mean we’d necessarily notice. It could be that essentially everything we can see just expands too—so in effect the granularity of space is just getting finer and finer. This would be an interesting resolution to the age-old debate about whether the universe is discrete or continuous. Yes, it’s structurally discrete, but the scale of discreteness relative to our scale is always getting smaller and smaller. And if this happens fast enough, we’d never be able to “see the discreteness”—because every time we tried to measure it, the universe would effectively have subdivided before we got the result. (Somehow it’d be like the ultimate calculus epsilon-delta proof: you challenge the universe with an epsilon, and before you can get the result, the universe has made a smaller delta.)

There are some other strange possibilities too. Like that the whole hypergraph for the universe is always expanding, but pieces are continually “breaking off”, effectively forming black holes of different sizes, and allowing the “main component” of the universe to vary in size.

But regardless of how this kind of expansion works in our universe today, it’s clear that if the universe started with a single self-loop, it had to do a lot of expanding, at least early on. And here there’s an interesting possibility that’s relevant for understanding cosmology.

Just because our current universe exhibits three-dimensional space, in our models there’s no reason to think that the early universe necessarily also did. There are very different things that can happen in our models:

ResourceFunction
&#10005

ResourceFunction["WolframModel"][#1, #2, #3, 
   "FinalStatePlot"] & @@@ {{{{1, 2, 3}, {4, 5, 6}, {2, 6}} -> {{7, 
      7, 2}, {6, 2, 8}, {8, 5, 7}, {8, 9, 3}, {1, 6}, {10, 6}, {5, 
      3}, {7, 11}}, {{0, 0, 0}, {0, 0, 0}, {0, 0}}, 
   16}, {{{1, 2, 3}, {1, 4, 5}, {3, 6}} -> {{7, 8, 7}, {7, 5, 6}, {9, 
      5, 5}, {1, 7, 4}, {7, 5}, {5, 10}, {11, 6}, {6, 9}}, {{0, 0, 
     0}, {0, 0, 0}, {0, 0}}, 
   100}, {{{1, 2, 3}, {3, 4}} -> {{5, 5, 5}, {5, 6, 4}, {3, 1}, {1, 
      5}}, {{0, 0, 0}, {0, 0}}, 16}}

In the first example here, different parts of space effectively separate into non-communicating “black hole” tree branches. In the second example, we have something like ordinary—in this case 2-dimensional—space. But in the third example, space is in a sense very connected. If we work out the volume of a spherical ball, it won’t grow like rd; it’ll grow exponentially with r (e.g. like 2r).

If we look at the causal graph, we’ll see that you can effectively “go everywhere in space”, or affect every event, very quickly. It’d be as if the speed of light is infinite. But really it’s because space is effectively infinite dimensional.

In typical cosmology, it’s been quite mysterious how different parts of the early universe managed to “communicate” with each other, for example, to smooth out perturbations. But if the universe starts effectively infinite-dimensional, and only later “relaxes” to being finite-dimensional, that’s no longer a mystery.

So, OK, what might we see in the universe today that would reflect what happened extremely early in its history? The fact that our models deterministically generate behavior that seems for all practical purposes random means that we can expect that most features of the initial conditions or very early stages of the universe will quickly be “encrypted”, and effectively not reconstructable.

But it’s just conceivable that something like a breaking of symmetry associated with the first few hypergraphs might somehow survive. And that suggests the bizarre possibility that—just maybe—something like the angular structure of the cosmic microwave background or the very large-scale distribution of galaxies might reflect the discrete structure of the very early universe. Or, in other words, it’s just conceivable that what amounts to the rule for the universe is, in effect, painted across the whole sky. I think this is extremely unlikely, but it’d certainly be an amazing thing if the universe were “self-documenting” that way.

Elementary Particles—Old and New

We’ve talked several times about particles like electrons. In current physics theories, the various (truly) elementary particles—the quarks, the leptons (electron, muon, neutrinos, etc.), the gauge bosons, the Higgs—are all assumed to intrinsically be point particles, of zero size. In our models, that’s not how it works. The particles are all effectively “little lumps of space” that have various special properties.

My guess is that the precise list of what particles exist will be something that’s specific to a particular underlying rule. In cellular automata, for example, we’re used to seeing complicated sets of possible localized structures arise:

SeedRandom
&#10005

SeedRandom[2525]; ArrayPlot[
 CellularAutomaton[110, RandomInteger[1, 700], 500], 
 ImageSize -> Full, Frame -> None]

In our hypergraphs, the picture will inevitably be somewhat different. The “core feature” of each particle will be some kind of locally stable structure in the hypergraph (a simple analogy might be that it’s a lump of nonplanarity in an otherwise planar graph). But then there’ll be lots of causal edges associated with the particle, defining its particular energy and momentum.

Still, the “core feature” of the particles will presumably define things like their charge, quantum numbers, and perhaps spin—and the fact that these things are observed to occur in discrete units may reflect the fact that it’s a small piece of hypergraph that’s involved in defining them.

It’s not easy to know what the actual scale of discreteness in space might be in our models. But a possible (though potentially unreliable) estimate might be that the “elementary length” is around 10–93 meters. (Note that that’s very small compared to the Planck length ~10–35 meters that arises essentially from dimensional analysis.) And with this elementary length, the radius of the electron might be 10–81 meters. Tiny, but not zero. (Note that current experiments only tell us that the size of the electron is less than about 10–22 meters.)

One feature of our models is that there should be a “quantum of mass”—a discrete amount that all masses, for example of particles, are multiples of. With our estimate for the elementary length, this quantum of mass would be small, perhaps 10–30, or 1036 times smaller than the mass of the electron.

And this raises an intriguing possibility. Perhaps the particles—like electrons—that we currently know about are the “big ones”. (With our estimates, an electron would have hypergraph elements in it.) And maybe there are some much smaller, and much lighter ones. At least relative to the particles we currently know, such particles would have few hypergraph elements in them—so I’m referring to them as “oligons” (after the Greek word ὀλιγος for “few”).

What properties would these oligons have? They’d probably interact very very weakly with other things in the universe. Most likely lots of oligons would have been produced in the very early universe, but with their very weak interactions, they’d soon “drop out of thermal equilibrium”, and be left in large numbers as relics—with energies that become progressively lower as the universe expands around them.

So where might oligons be now? Even though their other interactions would likely be exceptionally weak, they’d still be subject to gravity. And if their energies end up being low enough, they’d basically collect in gravity wells around the universe—which means in and around galaxies.

And that’s interesting—because right now there’s quite a mystery about the amount of mass seen in galaxies. There appears to be a lot of “dark matter” that we can’t see but that has gravitational effects. Well, maybe it’s oligons. Maybe even lots of different kinds of oligons: a whole shadow physics of much lighter particles.

The Inevitability of Quantum Mechanics

“But how will you ever get quantum mechanics?”, physicists would always ask me when I would describe earlier versions of my models. In many ways, quantum mechanics is the pinnacle of existing physics. It’s always had a certain “you-are-not-expected-to-understand-this” air, though, coupled with “just-trust-the-mathematical-formalism”. And, yes, the mathematical formalism has worked well—really well—in letting us calculate things. (And it almost seems more satisfying because the calculations are often so hard; indeed, hard enough that they’re what first made me start using computers to do mathematics 45 years ago.)

Our usual impression of the world is that definite things happen. And before quantum mechanics, classical physics typically captured this in laws—usually equations—that would tell one what specifically a system would do. But in quantum mechanics the formalism involves any particular system doing lots of different things “in parallel”, with us just seeing samples—ultimately with certain probabilities—of these possibilities.

And as soon as one hears of a model in which there are definite rules, one might assume that it could never reproduce quantum mechanics. But, actually, in our models, quantum mechanics is not just possible; it’s absolutely inevitable. And, as we’ll see, in something I consider quite beautiful, the core of what leads to it turns out to be the same as what leads to relativity.

OK, so how does this work? Let’s go back to what we discussed when we first started talking about time. In our models there’s a definite rule for updates to make in our hypergraphs, say:

RulePlot
&#10005

RulePlot[ResourceFunction[
   "WolframModel"][{{x, y}, {x, z}} -> {{y, z}, {y, w}, {z, w}, {x, 
     w}}], VertexLabels -> Automatic, "RulePartsAspectRatio" -> 0.6]

But if we’ve got a hypergraph like this:

ResourceFunction
&#10005

ResourceFunction[
  "WolframModel"][{{x, y}, {x, z}} -> {{y, z}, {y, w}, {z, w}, {x, 
    w}}, {{0, 0}, {0, 0}}, 6, "FinalStatePlot"]

there will usually be many places where this rule can be applied. So which update should we do first? The model doesn’t tell us. But let’s just imagine all the possibilities. The rule tells us what they all are—and we can represent them (as we discussed above) as a multiway system—here illustrated using the simpler case of strings rather than hypergraphs:

ResourceFunction
&#10005

ResourceFunction["MultiwaySystem"][{"A" -> "AB", 
  "B" -> "A"}, {"A"}, 6, "StatesGraph"]

Each node in this graph now represents a complete state of our system (a hypergraph in our actual models). And each node is joined by arrows to the state or states that one gets by applying a single update to it.

If our model had been operating “like classical physics” we would expect it to progress in time from one state to another, say like this:

ResourceFunction
&#10005

ResourceFunction["GenerationalMultiwaySystem"][{"A" -> "AB", 
  "B" -> "A"}, {"A"}, 5, "StatesGraph"]

But the crucial point is that the structure of our models leaves us no choice but to consider multiway systems. The form of the whole multiway system is completely determined by the rules. But—in a way that is already quite reminiscent of the standard formalism of quantum mechanics—the multiway system defines many different possible paths of history.

But now there is a mystery. If there are always all these different possible paths of history, how is it that we ever think that definite things happen in the world? This has been a core mystery of quantum mechanics for a century. It turns out that if one’s just using quantum mechanics to do calculations, the answer basically doesn’t matter. But if one wants to “really understand what’s going on” in quantum mechanics, it’s something that definitely does matter.

And the exciting thing is that in our models, there’s an obvious resolution. And actually it’s based on the exact same phenomenon—causal invariance—that gives us relativity.

Here’s roughly how this works. The key point is to think about what an observer who is themselves part of the multiway system will conclude about the world. Yes, there are different possible paths of history. But—just as in our discussion of relativity—the only aspect of them that an observer will ever be aware of is the causal relationships between the events they involve. But the point is that—even though when looked at from “outside” the paths are different—causal invariance implies that the network of relationships between causal events (which is all that’s relevant when one’s inside the system) will always be exactly the same.

In other words—much as in the case of relativity—even though from outside the system there may seem to be many possible “threads of time”, from inside the system causal invariance implies that there’s in a sense ultimately just one thread of time, or, in effect, one objective reality.

How does this all relate to the detailed standard formalism of quantum mechanics? It’s a little complicated. But let me make at least a few comments here. (There’s some more detail in my technical document; Jonathan Gorard has given even more.)

The states in the multiway system can be thought of as possible states of the quantum system. But how do we characterize how observers experience them? In particular, which states is the observer aware of when? Just like in the relativity case, the observer can in a sense make a choice of how they define time. One possibility might be through a foliation of the multiway system like this:

Graph
&#10005

Graph[ResourceFunction["MultiwaySystem"][{"A" -> "AB", 
   "B" -> "A"}, {"A"}, 6, "StatesGraph"], AspectRatio -> 1/2, 
 Epilog -> {ResourceFunction["WolframPhysicsProjectStyleData"][
    "BranchialGraph", "EdgeStyle"], AbsoluteThickness[1.5], 
   Table[Line[{{-8, i}, {10, i}}], {i, 1/2, 6 + 1/2}]}]

In the formalism of quantum mechanics, one can then say that at each time, the observer experiences a superposition of possible states of the system. But now there’s a critical point. In direct analogy to the case of relativity, there are many different possible choices the observer can make about how to define time—and each of them corresponds to a different foliation of the multiway graph.

Again by analogy to relativity, we can then think of these choices as what we can call different “quantum observation frames”. Causal invariance implies that as long they respect the causal relationships in the graph, these frames can basically be set up in any way we want. In talking about relativity, it was useful to just have “tipped parallel lines” (“inertial frames”) representing observers who are moving uniformly in space.

In talking about quantum mechanics, other frames are useful. In particular, in the standard formalism of quantum mechanics, it’s common to talk about “quantum measurement”: essentially the act of taking a quantum system and determining some definite (essentially classical) outcome from it. Well, in our setup, a quantum measurement basically corresponds to a particular quantum observation frame.

Here’s an example:

With[{graph = Graph[ResourceFunction["MultiwaySystem"]
&#10005

(*https://www.wolframcloud.com/obj/wolframphysics/TechPaper-Programs/\
Section-08/QM-foliations-01.wl*)

CloudGet["https://wolfr.am/LbdPPaXZ"]; Magnify[
  With[{graph = 
     Graph[ResourceFunction["MultiwaySystem"][{"A" -> "AB"}, {"AA"}, 
       7, "StatesGraph"], 
      VertexShapeFunction -> {Alternatives @@ 
          VertexList[
           ResourceFunction[
             "GenerationalMultiwaySystem"][{"A" -> "AB"}, {"AA"}, 5, 
            "StatesGraph"]] -> (Text[
            Framed[Style[stripMetadata[#2] , Hue[0, 1, 0.48]], 
             Background -> 
              Directive[Opacity[.6], Hue[0, 0.45, 0.87]],	
             FrameMargins -> {{2, 2}, {0, 0}}, RoundingRadius -> 0, 
             FrameStyle -> 
              Directive[Opacity[0.5], 
               Hue[0, 0.52, 0.8200000000000001]]], #1, {0, 0}] &)}, 
      VertexCoordinates -> (Thread[
           VertexList[#] -> GraphEmbedding[#, Automatic, 2]] &[
         ResourceFunction["MultiwaySystem"][{"A" -> "AB"}, {"AA"}, 8, 
          "StatesGraph"]])]}, 
   Show[graph, 
    foliationGraphics[graph, #, {0.1, 0.05}, 
       Directive[Hue[0.89, 0.97, 0.71], 
        AbsoluteThickness[1.5]]] & /@ {{{"AA"}}, {{
       "AA", "AAB", "ABA"}}, {{
       "AA", "AAB", "ABA", "AABB", "ABAB", "ABBA"}}, {{
       "AA", "AAB", "ABA", "AABB", "ABAB", "ABBA", "AABBB", "ABABB", 
        "ABBAB", "ABBBA"}}, {{
       "AA", "AAB", "ABA", "AABB", "ABAB", "ABBA", "AABBB", "ABABB", 
        "ABBAB", "ABBBA", "AABBBB", "ABABBB", "ABBABB", "ABBBAB", 
        "ABBBBA"}, {
       "AA", "AAB", "ABA", "AABB", "ABAB", "ABBA", "AABBB", "ABABB", 
        "ABBAB", "ABBBA", "AABBBB", "ABABBB", "ABBABB", "ABBBAB", 
        "ABBBBA", "AABBBBB", "ABABBBB", "ABBBBAB", "ABBBBBA"}, {
       "AA", "AAB", "ABA", "AABB", "ABAB", "ABBA", "AABBB", "ABABB", 
        "ABBAB", "ABBBA", "AABBBB", "ABABBB", "ABBABB", "ABBBAB", 
        "ABBBBA", "AABBBBB", "ABABBBB", "ABBBBAB", "ABBBBBA", 
        "AABBBBBB", "ABABBBBB", "ABBBBBAB", "ABBBBBBA"}, {
       "AA", "AAB", "ABA", "AABB", "ABAB", "ABBA", "AABBB", "ABABB", 
        "ABBAB", "ABBBA", "AABBBB", "ABABBB", "ABBABB", "ABBBAB", 
        "ABBBBA", "AABBBBB", "ABABBBB", "ABBBBAB", "ABBBBBA", 
        "AABBBBBB", "ABABBBBB", "ABBBBBAB", "ABBBBBBA", "AABBBBBBB", 
        "ABABBBBBB", "ABBBBBBAB", "ABBBBBBBA"}}}]], 0.9]

The successive pink lines effectively mark off what the observer is considering to be successive moments in time. So when all the lines bunch up below the state ABBABB what it means is that the observer is effectively choosing to “freeze time” for that state. In other words, the observer is saying “that’s the state I consider the system to be in, and I’m sticking to it”. Or, put another way, even though in the full multiway graph there’s all sorts of other “quantum mechanical” evolution of states going on, the observer has set up their quantum observation frame so that they pick out just a particular, definite, classical-like outcome.

OK, but can they consistently do that? Well, that depends on the actual underlying structure of the multiway graph, which ultimately depends on the actual underlying rule. In the example above, we’ve set up a foliation (i.e. a quantum observation frame) that does the best possible job in this rule at “freezing time” for the ABBABB state. But just how long can this “reality distortion field” be maintained?

The only way to keep the foliation consistent in the multiway graph above is to have it progressively expand over time. In other words, to keep time frozen, more and more quantum states have to be pulled into the “reality distortion field”, and so there’s less and less coherence in the system.

The picture above is for a very trivial rule. Here’s a corresponding picture for a slightly more realistic case:

Show[drawFoliation[
&#10005

(*https://www.wolframcloud.com/obj/wolframphysics/TechPaper-Programs/\
Section-08/QM-foliations-01.wl*)
CloudGet["https://wolfr.am/LbdPPaXZ"];
Show[drawFoliation[
  Graph[ResourceFunction["MultiwaySystem"][{"A" -> "AB", 
     "B" -> "A"}, {"A"}, 6, "StatesGraph"], 
   VertexShapeFunction -> {Alternatives @@ 
       VertexList[
        ResourceFunction["GenerationalMultiwaySystem"][{"A" -> "AB", 
          "B" -> "A"}, {"A"}, 5, "StatesGraph"]] -> (Text[
         Framed[Style[stripMetadata[#2] , Hue[0, 1, 0.48]], 
          Background -> Directive[Opacity[.2], Hue[0, 0.45, 0.87]],	
          FrameMargins -> {{2, 2}, {0, 0}}, RoundingRadius -> 0, 
          FrameStyle -> 
           Directive[Opacity[0.5], 
            Hue[0, 0.52, 0.8200000000000001]]], #1, {0, 
          0}] &)}], {{"A", "AB", "AA", "ABB", "ABA"}, {"A", "AB", 
    "AA", "ABB", "ABA", "AAB", "ABBB"}, {"A", "AB", "AA", "ABB", 
    "ABA", "AAB", "ABBB", "AABB", "ABBBB"}}, {0.1, 0}, 
  Directive[Hue[0.89, 0.97, 0.71], AbsoluteThickness[1.5]]], 
 Graphics[{Directive[Hue[0.89, 0.97, 0.71], AbsoluteThickness[1.5]], 
   AbsoluteThickness[1.6`], 
   Line[{{-3.35, 4.05}, {-1.85, 3.3}, {-0.93, 2.35}, {-0.93, 
      1.32}, {0.23, 1.32}, {0.23, 2.32}, {2.05, 2.32}, {2.05, 
      1.51}, {1.15, 1.41}, {1.15, 0.5}, {2.15, 0.5}, {2.25, 
      1.3}, {4.3, 1.3}, {4.6, 0.5}, {8.6, 0.5}}]}]]

And what we see here is that—even in this still incredibly simplified case—the structure of the multiway system will force the observer to construct a more and more elaborate foliation if they are to successfully freeze time. Measurement in quantum mechanics has always involved a slightly uncomfortable mathematical idealization—and this now gives us a sense of what’s really going on. (The situation is ultimately very similar to the problem of decoding “encrypted” thermodynamic initial conditions that I mentioned above.)

Quantum measurement is really about what an observer perceives. But if you are for example trying to construct a quantum computer, it’s not just a question of having a qubit be perceived as being maintained in a particular state; it actually has to be maintained in that state. And for this to be the case we actually have to freeze time for that qubit. But here’s a very simplified example of how that can happen in a multiway graph:

Show[With[{graph = Graph[ResourceFunction["MultiwaySystem"]
&#10005

(*https://www.wolframcloud.com/obj/wolframphysics/TechPaper-Programs/\
Section-08/QM-foliations-01.wl*)
\
CloudGet["https://wolfr.am/LbdPPaXZ"]; Magnify[
 Show[With[{graph = 
     Graph[ResourceFunction["MultiwaySystem"][{"A" -> "AB", 
        "XABABX" -> "XXXX"}, {"XAAX"}, 6, "StatesGraph"], 
      VertexCoordinates -> 
       Append[(Thread[
            VertexList[#] -> GraphEmbedding[#, Automatic, 2]] &[
          ResourceFunction["MultiwaySystem"][{"A" -> "AB", 
            "XABABX" -> "XXXX"}, {"XAAX"}, 8, "StatesGraph"]]), 
        "XXXX" -> {0, 5.5}]]}, 
   Show[graph, 
    foliationGraphics[graph, #, {0.1, 0.05}, 
       Directive[Hue[0.89, 0.97, 0.71], AbsoluteThickness[1.5]]] & /@ {
Sequence[{{"XAAX"}}, {{"XAAX", "XAABX", "XABAX"}}, {{
        "XAAX", "XAABX", "XABAX", "XAABBX", "XABABX", "XABBAX"}}, {{
        "XAAX", "XAABX", "XABAX", "XAABBX", "XABABX", "XABBAX", 
         "XAABBBX", "XABABBX", "XABBABX", "XABBBAX"}}, {{
        "XAAX", "XAABX", "XABAX", "XAABBX", "XABABX", "XABBAX", 
         "XAABBBX", "XABABBX", "XABBABX", "XABBBAX", "XAABBBBX", 
         "XABABBBX", "XABBABBX", "XABBBABX", "XABBBBAX"}, {
        "XAAX", "XAABX", "XABAX", "XAABBX", "XABABX", "XABBAX", 
         "XAABBBX", "XABABBX", "XABBABX", "XABBBAX", "XAABBBBX", 
         "XABABBBX", "XABBABBX", "XABBBABX", "XABBBBAX", "XAABBBBBX", 
         "XABABBBBX", "XABBBBABX", "XABBBBBAX", "XABBABBBX", 
         "XABBBABBX"}}, {}, {}]}]]], .6]

All this discussion of “freezing time” might seem weird, and not like anything one usually talks about in physics. But actually, there’s a wonderful connection: the freezing of time we’re talking about here can be thought of as happening because we’ve got the analog in the space of quantum states of a black hole in physical space.

The picture above makes it plausible that we’ve got something where things can go in, but if they do, they always get stuck. But there’s more to it. If you’re an observer far from a black hole, then you’ll never actually see anything fall into the black hole in finite time (that’s why black holes are called “frozen stars” in Russian). And the reason for this is precisely because (according to the mathematics) time is frozen at the event horizon of the black hole. In other words, to successfully make a qubit, you effectively have to isolate it in quantum space like things get isolated in physical space by the presence of the event horizon of a black hole.

General Relativity and Quantum Mechanics Are the Same Idea!

General relativity and quantum mechanics are the two great foundational theories of current physics. And in the past it’s often been a struggle to reconcile them. But one of the beautiful outcomes of our project so far has been the realization that at some deep level general relativity and quantum mechanics are actually the same idea. It’s something that (at least so far) is only clear in the context of our models. But the basic point is that both theories are consequences of causal invariance—just applied in different situations.

Recall our discussion of causal graphs in the context of relativity above. We drew foliations and said that if we looked at a particular slice, it would tell us the arrangement of the system in space at what we consider to be a particular time. So now let’s look at multiway graphs. We saw in the previous section that in quantum mechanics we’re interested in foliations of these. But if we look at a particular slice in one of these foliations, what does it represent? The foliation has got a bunch of states in it. And it turns out that we can think of them as being laid out in an abstract kind of space that we’re calling “branchial space”.

To make sense of this space, we have to have a way to say what’s near what. But actually the multiway graph gives us that. Take a look at this multiway graph:

foliationLines
&#10005

foliationLines[{lineDensityHorizontal_ : 1, 
    lineDensityVertical_ : 1}, {tanHorizontal_ : 0.0, 
    tanVertical_ : 0.0}, offset : {_, _} : {0, 0}, 
   lineStyles : {_, _} : {Red, Red}, 
   transform_ : (# &)] := {If[lineDensityHorizontal != 0, 
    Style[Table[
      Line[transform /@ {{-100 + First@offset, 
          k - 100 tanHorizontal + Last@offset}, {100 + First@offset, 
          k + 100 tanHorizontal + Last@offset}}], {k, -100.5, 100.5, 
       1/lineDensityHorizontal}], First@lineStyles], {}], 
   If[lineDensityVertical != 0, 
    Style[Table[
      Line[transform /@ {{k - 100 tanVertical + First@offset, -100 + 
           Last@offset}, {k + 100 tanVertical + First@offset, 
          100 + Last@offset}}], {k, -100.5, 100.5, 
       1/lineDensityVertical}], Last@lineStyles], {}]};
LayeredGraphPlot[
 ResourceFunction["MultiwaySystem"][{"A" -> "AB", "B" -> "A"}, "A", 5,
   "EvolutionGraph"], 
 Epilog -> 
  foliationLines[{1, 0}, {0, 0}, {0, 
    0}, {ResourceFunction["WolframPhysicsProjectStyleData"][
     "BranchialGraph", "EdgeStyle"], 
    ResourceFunction["WolframPhysicsProjectStyleData"][
     "BranchialGraph", "EdgeStyle"]}]]

At each slice in the foliation, let’s draw a graph where we connect two states whenever they’re both part of the same “branch pair”, so that—like AA and ABB here—they both come from the same state on the slice before. Here are the graphs we get by doing this for successive slices:

Table
&#10005

Table[ResourceFunction["MultiwaySystem"][{"A" -> "AB", "B" -> "A"}, 
  "A", t, If[t <= 5, "BranchialGraph", 
   "BranchialGraphStructure"]], {t, 2, 8}]

We call these branchial graphs. And we can think of them as representing the correlation—or entanglement—of quantum states. Two states that are nearby in the graph are highly entangled; those further away, less so. And we can imagine that as our system evolves, we’ll get larger and larger branchial graphs, until eventually, just like for our original hypergraphs, we can think of these graphs as limiting to something like a continuous space.

But what is this space like? For our original hypergraphs, we imagined that we’d get something like ordinary physical space (say close to three-dimensional Euclidean space). But branchial space is something more abstract—and much wilder. And typically it won’t even be finite-dimensional. (It might approximate a projective Hilbert space.) But we can still think of it mathematically as some kind of space.

OK, things are getting fairly complicated here. But let me try to give at least a flavor of how things work. Here’s an example of a wonderful correspondence: curvature in physical space is like the uncertainty principle of quantum mechanics. Why do these have anything to do with each other?

The uncertainty principle says that if you measure, say, the position of something, then its momentum, you’ll get a different answer than if you do it in the opposite order. But now think about what happens when you try to make a rectangle in physical space by going in direction x first, then y, and then you do these in the opposite order. In a flat space, you’ll get to the same place. But in a curved space, you won’t:

parallelTransportOnASphere
&#10005

parallelTransportOnASphere[size_] := 
  Module[{\[Phi], \[Theta]}, 
   With[{spherePoint = {Cos[\[Phi]] Sin[\[Theta]], 
       Sin[\[Phi]] Sin[\[Theta]], Cos[\[Theta]]}}, 
    Graphics3D[{{Lighter[Yellow, .2], Sphere[]}, 
      First@ParametricPlot3D[
        spherePoint /. \[Phi] -> 0, {\[Theta], \[Pi]/2, \[Pi]/2 - 
          size}, PlotStyle -> Darker@Red], 
      Rotate[First@
        ParametricPlot3D[
         spherePoint /. \[Phi] -> 0, {\[Theta], \[Pi]/2, \[Pi]/2 - 
           size}, PlotStyle -> Darker@Red], \[Pi]/2, {-1, 0, 0}], 
      Rotate[First@
        ParametricPlot3D[
         spherePoint /. \[Phi] -> 0, {\[Theta], \[Pi]/2, \[Pi]/2 - 
           size}, PlotStyle -> Darker@Red], size, {0, 0, 1}], 
      Rotate[Rotate[
        First@ParametricPlot3D[
          spherePoint /. \[Phi] -> 0, {\[Theta], \[Pi]/2, \[Pi]/2 - 
            size}, PlotStyle -> Darker@Red], \[Pi]/2, {-1, 0, 0}], 
       size, {0, -1, 0}]}, Boxed -> False, SphericalRegion -> False, 
     Method -> {"ShrinkWrap" -> True}, ViewPoint -> {2, size, size}]]];
parallelTransportOnASphere[0 | 0.] := 
  parallelTransportOnASphere[1.*^-10];
parallelTransportOnASphere[0.7]

And essentially what’s happening in the uncertainty principle is that you’re doing exactly this, but in branchial space, rather than physical space. And it’s because branchial space is wild—and effectively very curved—that you get the uncertainty principle.

Alright, so the next question might be: what’s the analog of the Einstein equations in branchial space? And again, it’s quite wonderful: at least in some sense, the answer is that it’s the path integral—the fundamental mathematical construct of modern quantum mechanics and quantum field theory.

This is again somewhat complicated. But let me try to give a flavor of it. Just as we discussed geodesics as describing paths traversed through physical space in the course of time, so also we can discuss geodesics as describing paths traversed through branchial space in the course of time. In both cases these geodesics are determined by curvature in the corresponding space. In the case of physical space, we argued (roughly) that the presence of excess causal edges—corresponding to energy—would lead to what amounts to curvature in the spatial hypergraph, as described by Einstein’s equations.

OK, so what about branchial space? Just like for the spatial hypergraph, we can think about the causal connections between the updating events that define the branchial graph. And we can once again imagine identifying the flux of causal edges—now not through spacelike hypersurfaces, but through branchlike ones—as corresponding to energy. And—much like in the spatial hypergraph case—an excess of these causal edges will have the effect of producing what amounts to curvature in branchial space (or, more strictly, in branchtime—the analog of spacetime). But this curvature will then affect the geodesics that traverse branchial space.

In general relativity, the presence of mass (or energy) causes curvature in space which causes the paths of geodesics to turn—which is what is normally interpreted as the action of the force of gravity. But now we have an analog in quantum mechanics, in our branchial space. The presence of energy effectively causes curvature in branchial space which causes the paths of geodesics through branchial space to turn.

What does turning correspond to? Basically it’s exactly what the path integral talks about. The path integral (and the usual formalism of quantum mechanics) is set up in terms of complex numbers. But it can just as well be thought of in terms of turning through an angle. And that’s exactly what’s happening with our geodesics in branchial space. In the path integral there’s a quantity called the action—which is a kind of relativistic analog of energy—and when one works things out more carefully, our fluxes of causal edges correspond to the action, but are also exactly what determine the rate of turning of geodesics.

It all fits together beautifully. In physical space we have Einstein’s equations—the core of general relativity. And in branchial space (or, more accurately, multiway space) we have Feynman’s path integral—the core of modern quantum mechanics. And in the context of our models they’re just different facets of the same idea. It’s an amazing unification that I have to say I didn’t see coming; it’s something that just emerged as an inevitable consequence of our simple models of applying rules to collections of relations, or hypergraphs.

Branchial Motion and the Entanglement Horizon

We can think of motion in physical space as like the process of exploring new elements in the spatial hypergraph, and potentially becoming affected by them. But now that we’re talking about branchial space, it’s natural to ask whether there’s something like motion there too. And the answer is that there is. And it’s basically exactly the same kind of thing: but instead of exploring new elements in the spatial hypergraph, we’re exploring new elements in the branchial graph, and potentially becoming affected by them.

There’s a way of talking about it in the standard language of quantum mechanics: as we move in branchial space, we’re effectively getting “entangled” with more and more quantum states.

OK, so let’s take the analogy further. In physical space, there’s a maximum speed of motion—the speed of light, c. So what about in branchial space? Well, in our models we can see that there’s also got to be a maximum speed of motion in branchial space. Or, in other words, there’s a maximum rate at which we can entangle with new quantum states.

In physical space we talk about light cones as being the regions that can be causally affected by some event at a particular location in space. In the same way, we can talk about entanglement cones that define regions in branchial space that can be affected by events at some position in branchial space. And just as there’s a causal graph that effectively knits together elementary light cones, there’s something similar that knits together entanglement cones.

That something similar is the multiway causal graph: a graph that represents causal relationships between all events that can happen anywhere in a multiway system. Here’s an example of a multiway causal graph for just a few steps of a very simple string substitution system—and it’s already pretty complicated:

LayeredGraphPlot
&#10005

LayeredGraphPlot[
 Graph[ResourceFunction["MultiwaySystem"][
   "WolframModel" ->  { {{x, y}, {x, z}} -> {{y, w}, {y, z}, {w, 
        x}}}, {{{0, 0}, {0, 0}}}, 6, "CausalGraphStructure"]]]

But in a sense the multiway causal graph is the most complete description of everything that can affect the experience of observers. Some of the causal relationships it describes represent spacelike connections; some represent branchlike connections. But all of them are there. And so in a sense the multiway causal graph is where relativity and quantum mechanics come together. Slice one way and you’ll see relationships in physical space; slice another way and you’ll see relationships in branchial space, between quantum states.

To help see how this works here’s a very toy version of a multiway causal graph:

Graph3D
&#10005

Graph3D[ResourceFunction["GeneralizedGridGraph"][{4 -> "Directed", 4, 
   4}, EdgeStyle -> {Darker[Blue], Darker[Blue], Purple}]]

Each point is an event that happens in some hypergraph on some branch of a multiway system. And now the graph records the causal relationship of that event to other ones. In this toy example, there are purely timelike relationships—indicated by arrows pointing down—in which basically some element of the hypergraph is affecting its future self. But then there are both spacelike and branchlike relationships, where the event affects elements that are either “spatially” separated in the hypergraph, or “branchially” separated in the multiway system.

But in all this complexity, there’s something wonderful that happens. As soon as the underlying rule has causal invariance, this implies all sorts of regularities in the multiway causal graph. And for example it tells us that all those causal graphs we get by taking different branchtime slices are actually the same when we project them into spacetime—and this is what leads to relativity.

But causal invariance has other consequences too. One of them is that there should be an analog of special relativity that applies not in spacetime but in branchtime. The reference frames of special relativity are now our quantum observation frames. And the analog of speed in physical space is the rate of entangling new quantum states.

So what about a phenomenon like relativistic time dilation? Is there an analog of that for motion in branchial space? Well, actually, yes there is. And it turns out to be what’s sometimes called the quantum Zeno effect: if you repeatedly measure a quantum system fast enough it won’t change. It’s a phenomenon that’s implied by the add-ons to the standard formalism of quantum mechanics that describe measurement. But in our models it just comes directly from the analogy between branchial and physical space.

Doing new measurements is equivalent to getting entangled with new quantum states—or to moving in branchial space. And in direct analogy to what happens in special relativity, as you get closer to moving at the maximum speed you inevitably sample things more slowly in time—and so you get time dilation, which means that your “quantum evolution” slows down.

OK, so there are relativistic phenomena in physical space, and quantum analogs in branchial space. But in our models these are all effectively facets of one thing: the multiway causal graph. So are there situations in which the two kinds of phenomena can mix? Normally there aren’t: relativistic phenomena involve large physical scales; quantum phenomena tend to involve small ones.

But one example of an extreme situation where they can mix is black holes. I’ve mentioned several times that the formation of an event horizon around a black hole is associated with disconnection in the causal graph. But it’s more than that. It’s actually disconnection not only in the spacetime causal graph, but in the full multiway causal graph. And that means that there’s not only an ordinary causal event horizon—in physical space—but also an “entanglement horizon” in branchial space. And just as a piece of the spatial hypergraph can get disconnected when there’s a black hole, so can a piece of the branchial graph.

What does this mean? There are a variety of consequences. One of them is that quantum information can be trapped inside the entanglement horizon even when it hasn’t crossed the causal event horizon—so that in effect the black hole is freezing quantum information “at its surface” (at least its surface in branchial space). It’s a weird phenomenon implied by our models, but what’s perhaps particularly interesting about it is that it’s very much aligned with conclusions about black holes that have emerged in some of the latest work in physics on the so-called holographic principle in quantum field theory and general relativity.

Here’s another related, weird phenomenon. If you pass the causal event horizon of a black hole, it’s an inevitable fact that you’ll eventually get infinitely physically elongated (or “spaghettified”) by tidal forces. Well, something similar happens if you pass the entanglement horizon—except now you’ll get elongated in branchial space rather than physical space. And in our models, this eventually means you won’t be able to make a quantum measurement—so in a sense as an observer you won’t be able to “form a classical thought”, or, in other words, beyond the entanglement horizon you’ll never be able to “come to a definite conclusion” about, for example, whether something fell into the black hole or didn’t.

The speed of light c is a fundamental physical constant that relates distance in physical space to time. In our models, there’s now a new fundamental physical constant: the maximum entanglement speed, that relates distance in branchial space to time. I call this maximum entanglement speed ζ (zeta) (ζ looks a bit like a “tangled c”). I’m not sure what its value is, but a possible estimate is that it corresponds to entangling about 10102 new quantum states per second. And in a sense the fact that this is so big is why we’re normally able to “form classical thoughts”.

Because of the relation between (multiway) causal edges and energy, it’s possible to convert ζ to units of energy per second, and our estimate then implies that ζ is about 105 solar masses per second. It’s a big value, although conceivably not irrelevant to something like a merger of galactic black holes. (And, yes, this would mean that for an intelligence to “quantum grok” our galaxy would take maybe six months.)

Finding the Ultimate Rule

I’m frankly amazed at how much we’ve been able to figure out just from the general structure of our models. But to get a final fundamental theory of physics we’ve still got to find a specific rule. A rule that gives us 3 (or so) dimensions of space, the particular expansion rate of the universe, the particular masses and properties of elementary particles, and so on. But how should we set about finding this rule?

And actually even before that, we need to ask: if we had the right rule, would we even know it? As I mentioned earlier, there’s potentially a big problem here with computational irreducibility. Because whatever the underlying rule is, our actual universe has applied it perhaps times. And if there’s computational irreducibility—as there inevitably will be—then there won’t be a way to fundamentally reduce the amount of computational effort that’s needed to determine the outcome of all these rule applications.

But what we have to hope is that somehow—even though the complete evolution of the universe is computationally irreducible—there are still enough “tunnels of computational reducibility” that we’ll be able to figure out at least what’s needed to be able to compare with what we know in physics, without having to do all that computational work. And I have to say that our recent success in getting conclusions just from the general structure of our models makes me much more optimistic about this possibility.

But, OK, so what rules should we consider? The traditional approach in natural science (at least over the past few centuries) has tended to be: start from what you know about whatever system you’re studying, then try to “reverse engineer” what its rules are. But in our models there’s in a sense too much emergence for this to work. Look at something like this:

ResourceFunction
&#10005

ResourceFunction[
  "WolframModel"][{{1, 2, 2}, {2, 3, 4}} -> {{4, 3, 3}, {4, 1, 
    5}, {2, 4, 5}}, {{0, 0, 0}, {0, 0, 0}}, 500, "FinalStatePlot"]

Given the overall form of this structure, would you ever figure that it could be produced just by the rule:

{{x, y, y}, {y, z, u}} {{u, z, z}, {u, x, v}, {y, u, v}}

RulePlot
&#10005

RulePlot[ResourceFunction[
   "WolframModel"][{{x, y, y}, {y, z, u}} -> {{u, z, z}, {u, x, 
     v}, {y, u, v}}]]

Having myself explored the computational universe of simple programs for some forty years, I have to say that even now it’s amazing how often I’m humbled by the ability of extremely simple rules to give behavior I never expected. And this is particularly common with the very structureless models we’re using here. So in the end the only real way to find out what can happen in these models is just to enumerate possible rules, and then run them and see what they do.

But now there’s a crucial question. If we just start enumerating very simple rules, how far are we going to have to go before we find our universe? Or, put another way, just how simple is the rule for our universe going to end up being?

It could have been that in a sense the rule for the universe would have a special case in it for every element of the universe—every particle, every position in space, etc. But the very fact that we’ve been able to find definite scientific laws—and that systematic physics has even been possible—suggests that the rule at least doesn’t have that level of complexity. But how simple might it be? We don’t know. And I have to say that I don’t think our recent discoveries shed any particular light on this—because they basically say that lots of things in physics are generic, and independent of the specifics of the underlying rule, however simple or complex it may be.

Why This Universe? The Relativity of Rules

But, OK, let’s say we find that our universe can be described by some particular rule. Then the obvious immediate question would be: why that rule, and not another? The history of science—certainly since Copernicus—has shown us over and over again evidence that we’re “not special”. But if the rule we find to describe our universe is simple, wouldn’t that simplicity be a sign of “specialness”?

I have long wondered about this. Could it for example be that the rule is only simple because of the way that we, as entities existing in our particular universe, choose to set up our ways of describing things? And that in some other universe, with some other rule, the entities that exist there would set up their ways of describing things so that the rule for their universe is simple to them, even though it might be very complex to us?

Or could it be that in some fundamental sense it doesn’t matter what the rules for the universe are: that to observers embedded in a universe, operating according to the same rules as that universe, the conclusions about how the universe works will always be the same?

Or could it be that this is a kind of question that’s just outside the realm of science?

To my considerable surprise, the paradigm that’s emerging from our recent discoveries potentially seems to suggest a definite—though at first seemingly bizarre—scientific answer.

In what we’ve discussed so far we’re imagining that there’s a particular, single rule for our universe, that gets applied over and over again, effectively in all possible ways. But what if there wasn’t just one rule that could be used? What if all conceivable rules could be used? What if every updating event could just use any possible rule? (Notice that in a finite universe, there are only ever finitely many rules that can ever apply.)

At first it might not seem as if this setup would ever lead to anything definite. But imagine making a multiway graph of absolutely everything that can happen—including all events for all possible rules. This is a big, complicated object. But far from being structureless, it’s full of all kinds of structure.

And there’s one very important thing about it: it’s basically guaranteed to have causal invariance (basically because if there’s a rule that does something, there’s always another rule somewhere that can undo it).

So now we can make a rule-space multiway causal graph—which will show a rule-space analog of relativity. And what this means is that in the rule-space multiway graph, we can expect to make different foliations, but have them all give consistent results.

It’s a remarkable conceptual unification. We’ve got physical space, branchial space, and now also what we can call rulial space (or just rule space). And the same overall ideas and principles apply to all of them. And just as we defined reference frames in physical space and branchial space, so also we can define reference frames in rulial space.

But what kinds of reference frames might observers set up in rulial space? In a typical case we can think of different reference frames in rulial space as corresponding to different description languages in which an observer can describe their experience of the universe.

In the abstract, it’s a familiar idea that given any particular description language, we can always explicitly program any universal computer to translate it to another description language. But what we’re saying here is that in rulial space it just takes choosing a different reference frame to have our representation of the universe use a different description language.

And roughly the reason this works is that different foliations of rulial space correspond to different choices of sequences of rules in the rule-space multiway graph—which can in effect be set up to “compute” the output that would be obtained with any given description language. That this can work ultimately depends on the fact that sequences of our rules can support universal computation (which the Principle of Computational Equivalence implies they ubiquitously will)—which is in effect why it only takes “choosing a different reference frame in rule space” to “run a different program” and get a different description of the observed behavior of the universe.

It’s a strange but rather appealing picture. The universe is effectively using all possible rules. But as entities embedded in the universe, we’re picking a particular foliation (or sequence of reference frames) to make sense of what’s happening. And that choice of foliation corresponds to a description language which gives us our particular way of describing the universe.

But what is there to say definitely about the universe—independent of the foliation? There’s one immediate thing: that the universe, whatever foliation one uses to describe it, is just a universal computer, and nothing more. And that hypercomputation is never possible in the universe.

But given the structure of our models, there’s more. Just like there’s a maximum speed in physical space (the speed of lightc), and a maximum speed in branchial space (the maximum entanglement speed ζ), so also there must be a maximum speed in rulial space, which we can call ρ—that’s effectively another fundamental constant of nature. (The constancy of ρ is in effect a reflection of the Principle of Computational Equivalence.)

But what does moving in rulial space correspond to? Basically it’s a change of rule. And to say that this can only happen at a finite speed is to say that there’s computational irreducibility: that one rule cannot emulate another infinitely fast. And given this finite “speed of emulation” there are “emulation cones” that are the analog of light cones, and that define how far one can get in rulial space in a certain amount of time.

What are the units of ρ? Essentially they are program length divided by time. But whereas in the theory of computation one typically imagines that program length can be scaled almost arbitrarily by different models of computation, here this is a measure of program length that’s somehow fundamentally anchored to the structure of the rule-space multiway system, and of physics. (By the way, there’ll be an analog of curvature and Einstein’s equations in rulial space too—and it probably corresponds to a geometrization of computational complexity theory and questions like P?=NP.)

There’s more to say about the structure of rulial space. For example, let’s imagine we try to make a foliation in which we freeze time somewhere in rulial space. That’ll correspond to trying to describe the universe using some computationally reducible model—and over time it’ll get more and more difficult to maintain this as emulation cones effectively deliver more and more computational irreducibility.

So what does all this mean for our original goal—of finding a rule to describe our universe? Basically it’s saying that any (computation universal) rule will do—if we’re prepared to craft the appropriate description language. But the point is that we’ve basically already defined at least some elements of our description language: they are the kinds of things our senses detect, our measuring devices measure, and our existing physics describes. So now our challenge is to find a rule that successfully describes our universe within this framework.

For me this is a very satisfactory solution to the mystery of why some particular rule would be picked for our universe. The answer is that there isn’t ultimately ever a particular rule; basically any rule capable of universal computation will do. It’s just that—with some particular mode of description that we choose to use—there will be some definite rule that describes our universe. And in a sense whatever specialness there is to this rule is just a reflection of the specialness of our mode of description. In effect, the only thing special about the universe to us is us ourselves.

And this suggests a definite answer to another longstanding question: could there be other universes? The answer in our setup is basically no. We can’t just “pick another rule and get another universe”. Because in a sense our universe already contains all possible rules, so there can only be one of it. (There could still be other universes that do various levels of hypercomputation.)

But there is something perhaps more bizarre that is possible. While we view our universe—and reality—through our particular type of description language, there are endless other possible description languages which can lead to descriptions of reality that will seem coherent (and even in some appropriate definition “meaningful”) within themselves, but which will seem to us to correspond to utterly incoherent and meaningless aspects of our universe.

I’ve always assumed that any entity that exists in our universe must at least “experience the same physics as us”. But now I realize that this isn’t true. There’s actually an almost infinite diversity of different ways to describe and experience our universe, or in effect an almost infinite diversity of different “planes of existence” for entities in the universe—corresponding to different possible reference frames in rulial space, all ultimately connected by universal computation and rule-space relativity.

The Challenge of Language Design for the Universe

What does it mean to make a model for the universe? If we just want to know what the universe does, well, then we have the universe, and we can just watch what it does. But when we talk about making a model, what we really mean is that we want to have a representation of the universe that somehow connects it to what we humans can understand. Given computational irreducibility, it’s not that we expect a model that will in any fundamental sense “predict in advance” the precise behavior of the universe down to every detail (like that I am writing this sentence now). But we do want to be able to point to the model—whose structure we understand—and then be able to say that this model corresponds to our universe.

In the previous section we said that we wanted to find a rule that we could in a sense connect with the description language that we use for the universe. But what should the description language for the rule itself be? Inevitably there is a great computational distance between the underlying rule and features of the universe that we’re used to describing. So—as I’ve said several times here in different ways—we can’t expect to use the ordinary concepts with which we describe the world (or physics) directly in the construction of the rule.

I’ve spent the better part of my life as a language designer, primarily building what’s now the full-scale computational language that is the Wolfram Language. And I now view the effort to find a fundamental theory of physics as in many ways just another challenge in language design—perhaps even the ultimate such challenge.

In designing a computational language what one is really trying to do is to create a bridge between two domains: the abstract world of what is possible to do computationally, and the “mental” world of what people understand and are interested in doing. There are all sorts of computational processes that one can invent (say running randomly picked cellular automaton rules), but the challenge in language design is to figure out which ones people care about at this point in human history, and then to give people a way to describe these.

Usually in computational language design one is leveraging human natural language—or the more formal languages that have been developed in mathematics and science—to find words or their analogs to refer to particular “lumps of computation”. But at least in the way I have done it, the essence of language design is to try to find the purest primitives that can be expressed this way.

OK, so let’s talk about setting up a model for the universe. Perhaps the single most important idea in my effort to find a fundamental theory of physics is that the theory should be based on the general computational paradigm (and not, for example, specifically on mathematics). So when we talk about having a language in which to describe our model of the universe we can see that it has to bridge three different domains. It has to be a language that humans can understand. It has to be a language that can express computational ideas. And it has to be a language that can actually represent the underlying structure of physics.

So what should this language be like? What kinds of primitives should it contain? The history that has led me to what I describe here is in many ways the history of my attempts to formulate an appropriate language. Is it trivalent graphs? Is it ordered graphs? Is it rules applied to abstract relations?

In many ways, we are inevitably skating at the edge of what humans can understand. Maybe one day we will have built up familiar ways of talking about the concepts that are involved. But for now, we don’t have these. And in a sense what has made this project feasible now is that we’ve come so far in developing ways to express computational ideas—and that through the Wolfram Language in particular those forms of expression have become familiar, at the very least to me.

And it’s certainly satisfying to see that the basic structure of the models we’re using can be expressed very cleanly and succinctly in the Wolfram Language. In fact, in what perhaps can be viewed as some sort of endorsement of the structure of the Wolfram Language, the models are in a sense just a quintessential example of transformation rules for symbolic expressions, which is exactly what the Wolfram Language is based on. But even though the structure is well represented in the Wolfram Language, the “use case” of “running the universe” is different from what the Wolfram Language is normally set up to do.

In the effort to serve what people normally want, the Wolfram Language is primarily about taking input, evaluating it by doing computation, and then generating output. But that’s not what the universe does. The universe in a sense had input at the very beginning, but now it’s just running an evaluation—and with all our different ideas of foliations and so on, we are sampling certain aspects of that ongoing evaluation.

It’s computation, but it’s computation sampled in a different way than we’ve been used to doing it. To a language designer like me, this is something interesting in its own right, with its own scientific and technological spinoffs. And perhaps it will take more ideas before we can finish the job of finding a way to represent a rule for fundamental physics.

But I’m optimistic that we actually already have pretty much all the ideas we need. And we also have a crucial piece of methodology that helps us: our ability to do explorations through computer experiments. If we based everything on the traditional methodology of mathematics, we would in effect only be able to explore what we somehow already understood. But in running computer experiments we are in effect sampling the raw computational universe of possibilities, without being limited by our existing understanding.

Of course, as with physical experiments, it matters how we define and think about our experiments, and in effect what description language we use. But what certainly helps me, at least, is that I’ve now been doing computer experiments for more than forty years, and over that time I’ve been able to slowly refine the art and science of how best to do them.

In a way it’s very much like how we learn from our experience in the physical world. From seeing the results of many experiments, we gradually build up intuition, which in turn lets us start creating a conceptual framework, which then informs the design of our language for describing things. One always has to keep doing experiments, though. In a sense computational irreducibility implies that there will always be surprises, and that’s certainly what I constantly find in practice, not least in this project.

Will we be able to bring together physics, computation and human understanding to deliver what we can reasonably consider to be a final, fundamental theory of physics? It is difficult to know how hard this will be. But I am extremely optimistic that we are finally on the right track, and may even have effectively already solved the fascinating problem of language design that this entails.

Let’s Go Find the Fundamental Theory!

OK, so given all this, what’s it going to take to find the fundamental theory of physics? The most important thing—about which I’m extremely excited—is that I think we’re finally on the right track. Of course, perhaps not surprisingly, it’s still technically difficult. Part of that difficulty comes directly from computational irreducibility and from the difficulty of working out the consequences of underlying rules. But part of the difficulty also comes from the very success and sophistication of existing physics.

In the end our goal must be to build a bridge that connects our models to existing knowledge about physics. And there is difficult work to do on both sides. Trying to frame the consequences of our models in terms that align with existing physics, and trying to frame the (usually mathematical) structures of existing physics in terms that align with our models.

For me, one of the most satisfying aspects of our discoveries over the past couple of months has been the extent to which they end up resonating with a huge range of existing—sometimes so far seemingly “just mathematical”—directions that have been taken in physics in recent years. It almost seems like everyone has been right all along, and it just takes adding a new substrate to see how it all fits together. There are hints of string theory, holographic principles, causal set theory, loop quantum gravity, twistor theory, and much more. And not only that, there are also modern mathematical ideas—geometric group theory, higher-order category theory, non-commutative geometry, geometric complexity theory, etc.—that seem so well aligned that one might almost think they must have been built to inform the analysis of our models.

I have to say I didn’t expect this. The ideas and methods on which our models are based are very different from what’s ever been seriously pursued in physics, or really even in mathematics. But somehow—and I think it’s a good sign all around—what’s emerged is something that aligns wonderfully with lots of recent work in physics and mathematics. The foundations and motivating ideas are different, but the methods (and sometimes even the results) often look to be quite immediately applicable.

There’s something else I didn’t expect, but that’s very important. In studying things (like cellular automata) out in the computational universe of simple programs, I have normally found that computational irreducibility—and phenomena like undecidability—are everywhere. Try using sophisticated methods from mathematics; they will almost always fail. It is as if one hits the wall of irreducibility almost immediately, so there is almost nothing for our sophisticated methods, which ultimately rely on reducibility, to do.

But perhaps because they are so minimal and so structureless our models for fundamental physics don’t seem to work this way. Yes, there is computational irreducibility, and it’s surely important, both in principle and in practice. But the surprising thing is that there’s a remarkable depth of richness before one hits irreducibility. And indeed that’s where many of our recent discoveries come from. And it’s also where existing methods from physics and mathematics have the potential to make great contributions. But what’s important is that it’s realistic that they can; there’s a lot one can understand before one hits computational irreducibility. (Which is, by the way, presumably why we are fundamentally able to form a coherent view of physical reality at all.)

So how is the effort to try to find a fundamental theory of physics going to work in practice? We plan to have a centralized effort that will push forward with the project using essentially the same R&D methods that we’ve developed at Wolfram Research over the past three decades, and that have successfully brought us so much technology—not to mention what exists of this project so far. But we plan to do everything in a completely open way. We’ve already posted the full suite of software tools that we’ve developed, along with nearly a thousand archived working notebooks going back to the 1990s, and soon more than 400 hours of videos of recent working sessions.

We want to make it as easy for people to get involved as possible, whether directly in our centralized effort, or in separate efforts of their own. We’ll be livestreaming what we do, and soliciting as much interaction as possible. We’ll be running a variety of educational programs. And we also plan to have (livestreamed) working sessions with other individuals and groups, as well as providing channels for the computational publishing of results and intermediate findings.

I have to say that for me, working on this project both now and in past years has been tremendously exciting, satisfying, and really just fun. And I’m hoping many other people will be able to share in this as the project goes forward. I think we’ve finally got a path to finding the fundamental theory of physics. Now let’s go follow that path. Let’s have a blast. And let’s try to make this the time in human history when we finally figure out how this universe of ours works!

]]>
https://writings.stephenwolfram.com/2020/04/finally-we-may-have-a-path-to-the-fundamental-theory-of-physics-and-its-beautiful/feed/ 228
<![CDATA[How We Got Here: The Backstory of the Wolfram Physics Project]]> https://writings.stephenwolfram.com/2020/04/how-we-got-here-the-backstory-of-the-wolfram-physics-project/ https://writings.stephenwolfram.com/2020/04/how-we-got-here-the-backstory-of-the-wolfram-physics-project/#comments Tue, 14 Apr 2020 14:05:27 +0000 Stephen Wolfram https://writings.internal.stephenwolfram.com/?p=22669 physics-history-thumbnail“Someday…” I’ve been saying it for decades: “Someday I’m going to mount a serious effort to find the fundamental theory of physics.” Well, I’m thrilled that today “someday” has come, and we’re launching the Wolfram Physics Project. And getting ready to launch this project over the past few months might be the single most intellectually [...]]]> physics-history-thumbnail

The Wolfram Physics Project

“Someday…”

I’ve been saying it for decades: “Someday I’m going to mount a serious effort to find the fundamental theory of physics.” Well, I’m thrilled that today “someday” has come, and we’re launching the Wolfram Physics Project. And getting ready to launch this project over the past few months might be the single most intellectually exciting time I’ve ever had. So many things I’d wondered about for so long getting solved. So many exciting moments of “Surely it can’t be that simple?” And the dawning realization, “Oh my gosh, it’s actually going to work!”

Physics was my first great intellectual passion. And I got started young, publishing my first paper when I was 15. I was lucky enough to be involved in physics in one of its golden ages, in the late 1970s. Not that I was trying to find a fundamental theory of physics back then. Like essentially all physicists, I spent my time on the hard work of figuring out the consequences of the theories we already had.

But doing that got me progressively more involved with computers. And then I realized: computation is its own paradigm. There’s a whole way of thinking about the world using the idea of computation. And it’s very powerful, and fundamental. Maybe even more fundamental than physics can ever be. And so it was that I left physics, and began to explore the computational universe: in a sense the universe of all possible universes.

This essay is also in:
SoundCloud »

That was forty years ago, and much has happened since then. My science led me to develop technology. The technology led me to more science. I did big science projects. I did big technology projects. And between the science and the technology, I felt like I was gradually building a tower that let me see and do more and more.

I never forgot physics, though. And as I studied the computational universe I couldn’t help wondering whether maybe somewhere, out in this abstract computational world, might be our physical universe, just waiting to be discovered. Thirty years ago I had my first idea about how this might work. And over the decade that followed I figured out quite a bit—found some encouraging signs—and eventually started to tell the world about it.

I kept on thinking about really pushing it further. I’d talk about it when I could, sometimes in very public venues. But I was off doing other, very satisfying things. It so happened that technology I’d built became very widely used by physicists. But to most of the physics community I was basically an ex-physicist, who sometimes said strange and alien things about fundamental physics.

Meanwhile, two decades went by. I always hoped that one day I’d get to do my physics project. But I didn’t know when, and my hopes were dimming. But then, a bit more than a year ago, I had a little idea that solved a nagging problem I’d had with my approach. And when I talked about it with two young physicists at our annual Summer School they were so enthusiastic. And I realized, “Yes, there are people who really want to see this problem solved.” And after everything I’ve built and thought about, I have a responsibility to see if it can be done. Oh, and by the way, I really want to do it! It just seems like such a fun and fascinating thing. So why not just do it?

We got started in earnest late last fall. I started doing lots of new computer experiments. New ideas started flowing. And it was incredible. We started to figure out so much. My plan had been that we’d mostly just describe as clearly as possible what I basically already knew, then launch it as a project for other people to get involved. But it was just too easy and too fun to figure things out. We had a new paradigm and things just started tumbling out. In all my years of doing science and technology, I’ve never seen anything like it. It’s been wonderful.

But the plan was always to share the fun, and now we’re ready to do that. We’re publishing everything we’ve done so far (including all the tools, archives, even working-session videos), and we’re looking forward to seeing if this is the time in history when we finally get to figure out the fundamental theory for our universe. Oh, and I finally get to bring to closure something I’ve wanted to do for more than half my life, and that in some ways I’ve spent half a century preparing for.

Why Wasn’t This Already Figured Out?

People have thought about what we’d now call the fundamental theory of physics throughout recorded history. From creation myths, to philosophy, to science, it’s been a long story. And most of the time, it’s actually seemed as if the answer was not far away, at least to the standards of explanation of the day. But it never quite got solved.

And if—as I believe—our project is finally on the right track, we kind of now know why. We just didn’t have the modern paradigm of computation before, and so we didn’t have the right way of thinking about things. Looking back, though, there were an awful lot of good ideas, that were very much in the right direction. And particularly in recent times, there was an awful lot of mathematical methodology developed that’s very relevant and on target.

What does it matter what the fundamental theory of physics is? It’d certainly be an impressive achievement for science to figure it out. And my guess is that knowing it is eventually going to have some far-reaching long-term consequences for our general ways of thinking about things. Conceivably the theory will have near-term applications too. But in terms of what’s done year after year in developing technology, doing science or even understanding theological questions, knowing the fundamental theory of physics isn’t directly relevant; it’s more like an ultimate “background question”. And that’s realistically pretty much how it’s been treated throughout most of history.

Back in ancient Greek times, almost every serious Greek philosopher seems to have had a theory. The details were different. But there was a theme. That somehow everything in the universe consists of the same thing or things repeated over and over again. Maybe it was all water. Maybe it was four elements. Maybe Platonic solids. Maybe atoms. Maybe the world is assembled like sentences from a grammar. To us today these seem quite vague and almost allegorical. But there was an important idea: that everything we see in the world might actually be the result of something simple and formalizable underneath.

As the centuries went by, the idea of “natural laws” sharpened, sometimes with an almost computational feel. “God can only run the world by natural laws”, or “The universe is the thoughts of God actualized”. The 1600s brought the whole idea of describing the world using what amount to mathematical models. But while this had a huge effect on what could be studied and computed in physics, it didn’t immediately change the thinking that much about what the universe might ultimately be made of. It was still just tiny corpuscles (AKA atoms), though now presumed to be bound by gravitational forces.

But what did begin to change was the whole idea that there should be any kind of “explicit explanation” for the universe that one could reason about: maybe there were just equations that were true about the universe, and that was all that could be said, a bit like Euclid’s axioms for geometry. But around the same time, systematic experimental science began to rise—and there implicitly emerged the picture (charmingly resonant with modern debates about machine learning) that physics should consist of finding equations that would represent theories that could fit experimental data.

In the 1800s, as mathematical physics reached the point where it could deal with partial differential equations, and the notion of fields became popular, there started to be ideas about the universe being “all fields”. First there was the ether (along with the rather good idea that atoms might be knotted vortices in the ether). Later people wondered if the electromagnetic field could underlie everything. When the electron was discovered people wondered if perhaps everything was in fact made of electrons. And so on. But a key theme was that to figure out things about the universe, you should either just do experiments, or you should take known equations and compute: you weren’t expected to be able to reason about the universe.

That made special relativity in 1905 quite a shock: because, once again, one was figuring out physics by abstract reasoning. But somehow that just reinforced the “trust the mathematics” idea, and for example—in what I consider to be one of the most important wrong turns in the history of physics—there emerged the idea of a mathematical notion of “spacetime”, in which (despite our strong intuitive sense to the contrary) space and time are treated as “the same kind of thing”.

The introduction of general relativity in 1915—in addition to giving us the theory of gravity—brought with it the notion that “high-end” modern mathematics (in this case tensors and differential geometry) could inform physics. And that was an important piece of methodological input when quantum mechanics, and soon quantum field theory, were developed in the 1920s. Yes, it was difficult to “understand” the theory. But really the mathematics was the intellectual meat of what was going on, and should guide it. And that was what let one calculate things anyway. “Interpretation” was more philosophy than physics.

The question of what space “is” had been discussed by philosophers since antiquity. Euclid had implicitly made a pretty definitive statement with his very first common notion “a point is that which has no part”: i.e. there is no discreteness to points, or, in other words, space is continuous. And by the time calculus arose in the late 1600s, it was pretty much taken for granted that space was continuous, and position was a continuous variable.

At different times, Descartes, Riemann and Einstein all had their doubts. But the force of the mathematical methodology provided by calculus was just too great. Still, in the 1930s there started to be problems with infinities in quantum calculations—and with quantization all the rage it started almost being assumed that space must be quantized too. But with the calculus-based thinking of the time nobody managed to make that work. (Graph theory was presumably too immature—and basically unknown—for the idea of space as a graph to arise.) Then in the 1940s the mathematical problems with infinities were avoided (by the idea of renormalization), and—with some important exceptions—the notion that space might be discrete basically disappeared from physics.

Meanwhile, mathematical methods based on calculus were doing great in advancing physics. Quantum electrodynamics (QED) and general relativity were both particularly successful, and it started to seem as if figuring out everything in physics was just a question of doing the math well enough.

But then there were the particles. The muon. The pion. The hyperons. For a while it had seemed that electrons, photons, protons and neutrons were what everything was made of. But by the 1950s particle accelerators were starting to discover many tens of new “elementary” particles. What were all these things?

Oh, and they were all tied up with the strong nuclear force that held nuclei together. And despite all its success in QED, quantum field theory and its “just-work-everything-out-step-by-step” mathematics just didn’t seem to apply. So a different approach developed: S-matrix theory. It was mathematically elaborate (functions of many complex variables), in some ways elegant, but in a sense very formal. Instead of saying “this is how things are built up from something underneath” it basically just said “Here are some mathematical constraints. Whatever solutions they have are what will happen. Don’t ask why.”

And when it came to the particles, there were two approaches. One—roughly allied with quantum field theory—said that inside all these particles was something more fundamental, a new kind of particle called a quark. The other approach—allied with S-matrix theory—imagined something more “democratic” with different particles all just related by some kind of consistency condition.

Through the 1960s these two approaches duked it out. S-matrix theory was definitely ahead—notably spawning Regge theory and what later became string theory. There were quantum-field-theory ideas like what became QCD, but they didn’t look promising. But by the early 1970s it began to be clear that quarks were something real, and in 1973 the phenomenon of asymptotic freedom was discovered, and quantum field theory was saved.

In 1974 came the surprise discovery of a new kind of quark, and physics entered a golden age of rapid progress, essentially powered by quantum field theory. (And, yes, I was involved in that, and it was a lot of fun.) Soon the Standard Model emerged, and everything seemed to be fitting together, and it seemed once again that it was just a matter of calculating, and everything could be figured out.

There were still mysteries: for example, why these particular particles, with these particular masses? But there was a methodology, and there was a sense that somehow this would all work out. An important piece of the story was the use of the theory of Lie groups (a piece of “high-end math” that made its way into physics in the 1950s). Which group was the one for the universe? The Standard Model involved three groups: SU(3), SU(2) and U(1). But could these all be combined into a single, bigger group, perhaps SU(5) or SO(10)—a single “grand unified” model? Around 1980 it all looked very promising.

But there was one key prediction: the proton should be unstable, decaying, albeit very slowly. But then the experiments started coming in: no proton decay. What was particle physics to do? There were new theories, with new particles. B