Eine knorrige Situation

35

Berechnen Sie anhand der Dowker-Notation eines Knotens und seiner Kreuzungszeichen sein Klammerpolynom.

Obwohl es mehr technische Definitionen gibt, ist es für diese Herausforderung ausreichend, sich einen Knoten als etwas vorzustellen, das physikalisch hergestellt wird, indem die beiden Enden einer Schnur aneinander befestigt werden. Da Knoten in drei Dimensionen existieren, verwenden wir beim Zeichnen auf Papier Knotendiagramme - zweidimensionale Projektionen, bei denen die Kreuzungen genau aus zwei Linien bestehen, einer darüber und einer darunter.

Bildbeschreibung hier eingeben

Hier sind (b) und (c) verschiedene Diagramme desselben Knotens.

Wie stellen wir ein Knotendiagramm auf Papier dar? Die meisten von uns sind nicht Rembrandt, daher verlassen wir uns auf die Dowker-Notation , die wie folgt funktioniert:

Wählen Sie einen beliebigen Startpunkt auf dem Knoten. Bewegen Sie sich in eine beliebige Richtung entlang des Knotens und nummerieren Sie die Kreuzungen, auf die Sie stoßen, beginnend mit 1 mit der folgenden Änderung: Wenn es sich um eine gerade Zahl handelt und Sie gerade über die Kreuzung fahren, negieren Sie diese gerade Zahl. Wählen Sie abschließend die geraden Zahlen aus, die 1, 3, 5 usw. entsprechen.

Lassen Sie uns ein Beispiel versuchen:

Bildbeschreibung hier eingeben

Bei diesem Knoten haben wir "1" als Ausgangspunkt gewählt und sind weiter nach rechts oben gegangen. Jedes Mal, wenn wir über oder unter ein anderes Stück des Seils gehen, weisen wir dem Kreuzungspunkt die nächste natürliche Nummer zu. Wir negieren die geraden Zahlen, die Strängen entsprechen, die über eine Kreuzung gehen, zum Beispiel [3,-12]im Diagramm. Dieses Diagramm würde also durch dargestellt [[1,6],[2,5],[3,-12],[-4,9],[7,8],[-10,11]]. Das Auflisten der Freunde von 1, 3, 5, 7 usw. gibt uns[6,-12,2,8,-4,-10] .

Hier sind einige Dinge zu beachten. Erstens ist die Dowker-Notation für einen bestimmten Knoten nicht eindeutig, da wir einen beliebigen Startpunkt und eine beliebige Richtung wählen können. Anhand der Notation kann man jedoch die Struktur des Knotens vollständig bestimmen (technisch bis hin zur Reflexion seiner Hauptknotenkomponenten). Während nicht alle Dowker-Notationen mögliche Knoten bilden können, können Sie in diesem Problem davon ausgehen, dass die Eingabe einen tatsächlichen Knoten darstellt.

Um die Mehrdeutigkeit zwischen den Reflexionen eines Knotens zu vermeiden und die Lösung der Herausforderung zu vereinfachen, erhalten Sie auch eine Liste von Kreuzungszeichen als Eingabe.

Bildbeschreibung hier eingeben

Bei einer positiven Kreuzung geht die untere Linie aus Sicht der oberen Linie nach links. Bei einer negativen Kreuzung geht es nach rechts. Beachten Sie, dass die Umkehr der Richtung des Knotens geht um (dh sowohl die Umkehrung über Leitung und unter Leitung) ändert nicht die Kreuzung Zeichen. In unserem Beispiel sind die Kreuzungszeichen [-1,-1,-1,1,-1,1]. Sie werden in derselben Reihenfolge wie die Dowker-Notation angegeben, dh für Kreuzungen mit den Nummern 1, 3, 5, 7 usw.

EIN

DD

Bildbeschreibung hier eingeben

  1. Eine einzige Schleife ohne Kreuzungen hat Polynom 1.

  2. DDD(-EIN2-EIN-2)

  3. DBildbeschreibung hier eingeben

Bildbeschreibung hier eingeben

Im obigen Bild kann die umrissene Kreuzung im ersten Diagramm, die von der Form ist Bildbeschreibung hier eingeben, Bildbeschreibung hier eingebenwie in der zweiten Figur (auch als positive Glättung bezeichnet ) oder Bildbeschreibung hier eingebenwie in der dritten Figur ( negative Glättung bezeichnet ) umgewandelt werden.

EINEIN-1

Bildbeschreibung hier eingeben

Noch verwirrt? Lassen Sie uns ein Beispiel machen und versuchen, das Klammerpolynom von Bildbeschreibung hier eingeben(Anmerkung: Dies sind zwei Knoten, die miteinander verknüpft sind. Diese Art von Diagramm ist in dieser Herausforderung keine potenzielle Eingabe, da es sich bei den Eingaben nur um Einzelknoten handelt Zwischenergebnis im Algorithmus.)

Wir wenden zuerst Regel 3 an

Bildbeschreibung hier eingeben

Wir wenden wieder Regel 3 für beide neuen Knoten an

Bildbeschreibung hier eingeben

Wir setzen diese 4 neuen Knoten in die erste Gleichung ein.

Bildbeschreibung hier eingeben

Wenn Sie die Regeln 1 und 2 auf diese 4 anwenden, teilen Sie uns dies mit

Bildbeschreibung hier eingeben

Also, das sagen Sie uns

Bildbeschreibung hier eingeben

Herzlichen Glückwunsch zum Abschluss Ihrer Einführung in die Knotentheorie!

Eingang

Zwei Listen:

  • Dowker-Notation, z [6,-12,2,8,-4,-10]. Die Nummerierung der Kreuzungen muss bei 1 beginnen. Die entsprechenden ungeraden Zahlen [1,3,5,7,...]sind implizit und müssen nicht als Eingabe angegeben werden.

  • Zeichen ( 1/ -1oder wenn Sie 0/ 1oder false/ trueoder '+'/ bevorzugen '-') für die Kreuzungen, die der Dowker-Notation entsprechen, z[-1,-1,-1,1,-1,1] .

Anstelle eines Listenpaares könnten Sie auch eine Liste von Paaren haben, z [[6,-1],[-12,-1],...

Ausgabe

EIN-2+5+EIN-EIN3[[1,-2],[5,0],[1,1],[-1,3]]

-kkkN[0,1,0,5,1,0,-1]EIN0

Regeln

Dies ist ein Herausforderung. Keine der Standardlücken kann verwendet werden, und Bibliotheken mit Werkzeugen zur Berechnung von Dowker-Notationen oder Bracket-Polynomen können nicht verwendet werden. (Eine Sprache, die diese Bibliotheken enthält, kann weiterhin verwendet werden, nur nicht die Bibliotheken / Pakete).

Tests

// 4-tuples of [dowker_notation, crossing_signs, expected_result, description]
[
 [[],[],[[1,0]],"unknot"],
 [[2],[1],[[-1,3]],"unknot with a half-twist (positive crossing)"],
 [[2],[-1],[[-1,-3]],"unknot with a half-twist (negative crossing)"],
 [[2,4],[1,1],[[1,6]],"unknot with two half-twists (positive crossings)"],
 [[4,6,2],[1,1,1],[[1,-7],[-1,-3],[-1,5]],"right-handed trefoil knot, 3_1"],
 [[4,6,2,8],[-1,1,-1,1],[[1,-8],[-1,-4],[1,0],[-1,4],[1,8]],"figure-eight knot, 4_1"],
 [[6,8,10,2,4],[-1,-1,-1,-1,-1],[[-1,-7],[-1,1],[1,5],[-1,9],[1,13]],"pentafoil knot, 5_1"],
 [[6,8,10,4,2],[-1,-1,-1,-1,-1],[[-1,-11],[1,-7],[-2,-3],[1,1],[-1,5],[1,9]],"three-twist knot, 5_2"],
 [[4,8,10,2,12,6],[1,1,-1,1,-1,-1],[[-1,-12],[2,-8],[-2,-4],[3,0],[-2,4],[2,8],[-1,12]],"6_3"],
 [[4,6,2,10,12,8],[-1,-1,-1,-1,-1,-1],[[1,-10],[2,-2],[-2,2],[1,6],[-2,10],[1,14]],"granny knot (sum of two identical trefoils)"],
 [[4,6,2,-10,-12,-8],[1,1,1,1,1,1],[[1,-14],[-2,-10],[1,-6],[-2,-2],[2,2],[1,10]],"square knot (sum of two mirrored trefoils)"],
 [[6,-12,2,8,-4,-10],[-1,-1,-1,1,-1,1],[[1,-2],[1,6],[-1,10]],"example knot"]
]

Externe Ressourcen

Nicht notwendig für die Herausforderung, aber wenn Sie interessiert sind:


Sandkastenpfosten: 1 , 2

Vielen Dank an @ChasBrown und @ H.Pwiz, dass sie einen Fehler in meiner Definition der Dowker-Notation entdeckt haben

Don Tausend
quelle
Kommentare sind nicht für eine längere Diskussion gedacht. Diese Unterhaltung wurde in den Chat verschoben .
Mego
1
@ngn: Viel besser! Ich vermutete, dass das gemeint war, aber es ist ein bisschen wie ein Zungenbrecher, um es richtig auszudrücken. :)
Chas Brown

Antworten:

10

K (NGN / k) , 196 193 Bytes

{!N::2*n:#x;{+/d,'x,'d:&:'-2!(|/n)-n:#:'x}(+/1-2*s){j::+,/y;,/(&0|2*x;(-1+#?{x[j]&:x@|j;x}/!N){-(d,x)+x,d:&4}/,1;&0|-2*x)}'(N!{(x,'|1+x;x+/:!2)}'((2*!n),'-1+x|-x)@'0 1=/:x>0)@'/:+~(y<0)=s:!n#2}

Probieren Sie es online!

ngn
quelle
12

Brain-Flak , 1316 Bytes

(({})<({()<(({}<>))><>}){(({})[()()]<{([{}]({})<>({}<>))}{}(([({}<>)]<<>({}<>)<>((({})<<>{({}<>)<>}<>>))>)){({}<>)<>}<>{}(({}<{}(({}<{({}<>)<>}>))>))<>{({}<>)<>}>)}<>>){(({}){}()<({}<>)>)<>{}(({}){}<>)<>}<>{}{}(()){(<({}<({}<>)>)>)<>((){[()](<(({})<>){({}[({})]<>({}<>))}{}({}<>({}<{}<>{({}<>)<>}>)[()])<>({}({})[()])(([()]{()(<({}[({})]())>)}{})<{(<{}{}>)}{}><>{()((<({}()[({}<>)])<>>))}{}<{}{}>)((){[()]<({}()<({}<({}<<>({()<({}<>)<>>}<>){({}[()]<(({})<({()<({}<>)<>>})<>>)<>{({}[()]<<>({}<>)>)}{}>)}<>>)<>>)>)((){[()](<{}(({})<<>(({})<(<<>({}<<>({}<(()()){({}[()]<([{}]()<>)<>({}<<>{({}({})<>[({}<>)])}{}{}>){({}<>)<>}<>>)}{}>{})>)>)<>{}{({}<>)<>}<>([({}<>)]<((()))>)(())<>({}<>)<>{}({}[()]){<>({}<<>(()()){({}[()]<({}<<>{({}<>)<>}>){({}[({})]<>({}<>))}{}(({})<<>({}<>)<>([{}])>)>)}{}{}>)<>({}<(({})())>[()]<>)}{}({}<<>{}([{}]()<{({}<>)<>}>){({}({})<>[({}<>)])}{}{}>){({}<>)<>}<>{}{}{}>{})>)>)}{}){(<{}(({})<<>(({}{})<<>(<({}<>)>)<>{}{({}<>)<>}<>>(({}){}){})>)>)}>}{}){(<{}([{}]<({}<<>([{}]()<>)<>({}<<>{({}({})<>[({}<>)])}{}{}>){({}<>)<>}<>>({})({}){})>)>)}{}>)}{}){{}(([{}]){}<>{}{}<<>({}<>{}){([{}]({}()()<{}({}<>)(())<>>))}{}{}{}>{})(())<>{{}({}<>)(())<>}(<>)<>}{}}{}{}<>{}{}({}<{{}({}<>)(())<>}<>{{}{((<(())>))}{}}{}{{}({}<>)(())<>}>)<>{{}({}<(<()>)<>([]){{}({}<>)(())<>([])}{}>)<>{{}({}<>)<>}{}{}({}<>)<>}<>

Probieren Sie es online!

Ich bereue nichts. Die Eingabe ist eine abgeflachte Liste von Paaren.

# Part 1: extract edges
(({})<

({()<(({}<>))><>}){

(({})[()()]<

{([{}]({})<>({}<>))}{}(([({}<>)]<<>({}<>)<>((({})<<>{({}<>)<>}<>>))>)){({}<>)<>}

<>{}(({}<{}(({}<{({}<>)<>}>))>))<>{({}<>)<>}

>)}

<>>){(({}){}()<({}<>)>)<>{}(({}){}<>)<>}<>

{}{}(())

# Part 2: Compute bracket polynomial
{

  # Move degree/sign to other stack
  (<({}<({}<>)>)>)<>

  # If current shape has crossings:
  ((){[()](<

    # Consider first currently listed edge in set
    # Find the other edge leaving same crossing
    (({})<>){({}[({})]<>({}<>))}{}

    # Move to top of other stack
    # Also check for twist
    ({}<>({}<{}<>{({}<>)<>}>)[()])

    # Check for twist in current edge
    <>({}({})[()])

    (

      # Remove current edge if twist
      ([()]{()(<({}[({})]())>)}{})<{(<{}{}>)}{}>

      # Remove matching edge if twist
      <>{()((<({}()[({}<>)])<>>))}{}<{}{}>

    # Push 1 minus number of twists from current vertex.
    )

    # If number of twists is not 1:
    ((){[()]<

      # While testing whether number of twists is 2:
      ({}()<

        # Keep sign/degree on third stack:
        ({}<({}<

          # Duplicate current configuration
          <>({()<({}<>)<>>}<>){({}[()]<(({})<({()<({}<>)<>>})<>>)<>{({}[()]<<>({}<>)>)}{}>)}

        # Push sign and degree on separate stacks
        <>>)<>>)

      # If number of twists is not 2: (i.e., no twists)
      >)((){[()](<{}

        # Make first copy of sign/degree
        (({})<<>(({})<

          # Make second copy of sign/degree
          (<<>({}<<>({}<

            # Do twice:
            (()()){({}[()]<

              # Prepare search for vertex leading into crossing on other side
              ([{}]()<>)

              # While keeping destination on third stack:
              <>({}<

                # Search for matching edge
                <>{({}({})<>[({}<>)])}{}

              # Replace old destination
              {}>)

              # Move back to original stack
              {({}<>)<>}<>

            >)}{}

          # Add orientation to degree
          >{})>)>)

          # Move duplicate to left stack
          <>{}{({}<>)<>}<>

          # Create "fake" edges from current crossing as termination conditions
          ([({}<>)]<((()))>)(())<>

          # Create representation of "top" new edge
          ({}<>)<>{}({}[()])

          # While didn't reach initial crossing again:
          {

            # Keep destination of new edge on third stack
            <>({}<<>

              # Do twice:
              (()()){({}[()]<

                # Search for crossing
                ({}<<>{({}<>)<>}>){({}[({})]<>({}<>))}{}

                # Reverse orientation of crossing
                (({})<<>({}<>)<>([{}])>)

              >)}{}

              # Remove extraneous search term
              {}

            # Push new destination for edge
            >)

            # Set up next edge
            <>({}<(({})())>[()]<>)

          }

          # Get destination of last edge to link up
          {}({}<

            # Find edge headed toward original crossing
            <>{}([{}]()<{({}<>)<>}>){({}({})<>[({}<>)])}

          # Replace destination
          {}{}>)

          # Move everything to left stack
          {({}<>)<>}

          # Clean up temporary data
          <>{}{}{}

        # Push new sign/degree of negatively smoothed knot
        >{})>)

      # Else (two twists)
      # i.e., crossing is the twist in unknot with one half-twist
      >)}{}){(<{}

        # Copy sign and degree+orientation
        (({})<<>(({}{})<

          # Move sign to left stack
          <>(<({}<>)>)

          # Move copy of configuration to left stack
          <>{}{({}<>)<>}

        # Add an additional 4*orientation to degree
        <>>(({}){}){})>)

      >)}

    # Else (one twist)
    >}{}){(<

      # Invert sign and get degree
      {}([{}]<({}<

        # Search term for other edge leading to this crossing
        <>([{}]()<>)

        # With destination on third stack:
        <>({}<

          # Find matching edge
          <>{({}({})<>[({}<>)])}{}

        # Replace destination
        {}>)

        # Move stuff back to left stack
        {({}<>)<>}<>

      # Add 3*orientation to degree
      >({})({}){})>)

    >)}{}

  # Else (no crossings)
  >)}{}){{}

    # If this came from the 2-twist case, undo splitting.
    # If this came from an initial empty input, use implicit zeros to not join anything
    # New sign = sign - 2 * next entry sign
    (([{}]){}<>{}{}<

      # New degree = average of both degrees
      <>({}<>{})

      # Find coefficient corresponding to degree
      {([{}]({}()()<{}({}<>)(())<>>))}{}{}

    # Add sign to coefficient
    {}>{})

    # Move rest of polynomial back to right stack
    (())<>{{}({}<>)(())<>}

    # Set up next configuration
    (<>)<>

  }{}

}{}{}<>{}

# Step 3: Put polynomial in correct form

# Keeping constant term:
{}({}<

  # Move to other stack to get access to terms of highest absolute degree
  {{}({}<>)(())<>}<>

  # Remove outer zeros
  {{}{((<(())>))}{}}

  # Move back to right stack to get access to lower order terms
  {}{{}({}<>)(())<>}

>)<>

# While terms remain:
{

  # Move term with positive coefficient
  {}({}<(<()>)<>([]){{}({}<>)(())<>([])}{}>)<>{{}({}<>)<>}{}

  # Move term with negative coefficient
  {}({}<>)<>

}<>
Nitrodon
quelle
Whoaaaaaa. Fantastisch!!!! +1
Don Thousand
Ich habe das Gefühl, ich muss noch ein Kopfgeld austeilen
Don Thousand