Documentation

TauCeti.KnotTheory.PDCode.ClaspInsertion

Algebraic clasp insertion in PD-codes #

The code-level tangle replacement underlying the second Reidemeister move creates two crossings at which the same strand is over. On a PD-code with n crossings, TauCeti.PDCode.insertClasp D p q b hqp hqe performs this algebraic clasp insertion on two distinct arcs: the arc P ending at the half-edge p and the arc Q ending at the half-edge q. Both arcs are cut open and routed through the two new crossings. These are the last two, (Fin.last n).castSucc (the first crossing, reached from p and q) and Fin.last (n + 1) (the second crossing, reached from the other ends of the two arcs).

With the slots of a crossing in counterclockwise order, the strand along P occupies slots 0 and 2 of the first crossing and slots 1 and 3 of the second, and the strand along Q occupies slots 1 and 3 of the first crossing and slots 0 and 2 of the second. The arcs are: p to slot 0 and q to slot 1 of the first crossing; slot 3 of the second crossing to the other end of P and slot 2 to the other end of Q; and the two short arcs of the clasp, from slot 2 of the first crossing to slot 1 of the second (along P) and from slot 3 of the first crossing to slot 0 of the second (along Q). The Boolean b is the over-pair indicator of the first crossing, and the second crossing gets !b, so that the same strand is over at both: with b = false it is the strand along P.

Of the four ways to smooth the two new crossings, one smooths them back into the two original arcs. The other three all reconnect the cut ends instead, p to q and the other end of P to the other end of Q, and one of these three also cuts off the circle through the two short arcs of the clasp. The first state and the circle-cutting one carry weight 1 in the Kauffman bracket, and the other two weights a ^ 2 and a⁻¹ ^ 2; since a ^ 2 + a⁻¹ ^ 2 + δ = 0 for the loop value δ = -(a ^ 2 + a⁻¹ ^ 2), the reconnected terms cancel, so the clasp insertion leaves the Kauffman bracket invariant. The insertion also keeps the number of components.

On its own the insertion is an algebraic operation on the code: nothing forces the two arcs to border a common region of the diagram. An arc borders a face of TauCeti.PDCode.face on each side, the face at each of its two ends: P borders the faces at p and at D.edgePair.val p. Going round the clasp counterclockwise, its four outer ends are met in the order p, q, D.edgePair.val q, D.edgePair.val p, so it can be drawn inside a face bordered by both arcs when the face at the far end D.edgePair.val p of P is the face at q, that is, when P and Q border a common face on the side of D.edgePair.val p and of q respectively. Every common face of the two arcs is of this form for a suitable choice of the ends passed as p and q; for instance, passing D.edgePair.val q instead of q uses the other side of Q. Under this face condition the insertion is the second Reidemeister move: the clasp cuts that face in two and adds the bigon between its two crossings, so the code gets two more faces (TauCeti.PDCode.faceCount_insertClasp_of_face_eq), its underlying graph keeps its connected components, and it is planar exactly when D is (TauCeti.PDCode.isPlanar_insertClasp_iff). The face condition cannot be dropped: if the two arcs lie in one connected component but the face at D.edgePair.val p is not the face at q, the clasp joins two faces into one, which its bigon only makes up for, and the new code is never planar (TauCeti.PDCode.not_isPlanar_insertClasp_of_face_ne). The insertion applies only to codes with a crossing; an insertion involving a crossing-free circle is not treated here.

Main definitions #

Main results #

References #

The arcs of a clasp, on the old half-edges and the slots of two new crossings #

A clasp's arcs are built as an involution of (α ⊕ Fin 4) ⊕ Fin 4: α holds the old half-edges, the middle Fin 4 the slots of the first new crossing, and the last Fin 4 those of the second. With e the old arcs, the arcs from p to e p and from q to e q are cut and routed through the slots. These helpers serve only the proofs in this file.

Following the new crossings #

Each way of reconnecting the eight new slots, after the arcs of the clasp, is an old traversal with the new slots spliced in. Written as a product of transpositions, each splice removes one orbit, which is how the orbits are counted below.

def TauCeti.PDCode.insertClasp {n : ℕ} (D : PDCode n) (p q : Fin (4 * n)) (b : Bool) (hqp : q ≠ p) (hqe : q ≠ ↑D.edgePair p) :
PDCode (n + 2)

Algebraic clasp insertion: route the arc of D ending at the half-edge p and the distinct arc ending at q through a two-crossing clasp. This operation carries no claim that the two arcs border a common face. When the face at the far end D.edgePair.val p of the first arc is the face at q, that is, D.face (D.edgePair.val p) = D.face q, it is the second Reidemeister move (TauCeti.PDCode.isPlanar_insertClasp_iff); passing D.edgePair.val q instead of q uses the other side of the second arc. The two new crossings are (Fin.last n).castSucc, whose slots 0 and 1 are joined to p and q, and Fin.last (n + 1), whose slots 3 and 2 are joined to the other ends D.edgePair.val p and D.edgePair.val q of the two arcs. Slot 2 of the first new crossing is joined to slot 1 of the second along the first strand, and slot 3 to slot 0 along the second. The over-pair indicators of the two new crossings are b and !b: with b = false the strand through p is over at both, with b = true the strand through q.

Equations
  • One or more equations did not get rendered due to their size.
Instances For
    @[simp]
    theorem TauCeti.PDCode.insertClasp_crossing_castSucc_castSucc {n : ℕ} (D : PDCode n) (p q : Fin (4 * n)) (b : Bool) (hqp : q ≠ p) (hqe : q ≠ ↑D.edgePair p) (i : Fin n) (slot : Fin 4) :

    The old crossings keep their half-edges.

    @[simp]
    theorem TauCeti.PDCode.insertClasp_crossing_castSucc_last {n : ℕ} (D : PDCode n) (p q : Fin (4 * n)) (b : Bool) (hqp : q ≠ p) (hqe : q ≠ ↑D.edgePair p) (slot : Fin 4) :

    The slots of the first new crossing are four of the new half-edges.

    @[simp]
    theorem TauCeti.PDCode.insertClasp_crossing_last {n : ℕ} (D : PDCode n) (p q : Fin (4 * n)) (b : Bool) (hqp : q ≠ p) (hqe : q ≠ ↑D.edgePair p) (slot : Fin 4) :
    (D.insertClasp p q b hqp hqe).halfEdge ((halfEdgeSuccEquiv (n + 1)) (Sum.inr slot)) = (halfEdgeSuccEquiv (n + 1)) (Sum.inr slot)

    The slots of the second new crossing are the last four half-edges.

    @[simp]
    theorem TauCeti.PDCode.insertClasp_overPair_castSucc_castSucc {n : ℕ} (D : PDCode n) (p q : Fin (4 * n)) (b : Bool) (hqp : q ≠ p) (hqe : q ≠ ↑D.edgePair p) (i : Fin n) :

    The old crossings keep their over-strands.

    @[simp]
    theorem TauCeti.PDCode.insertClasp_overPair_castSucc_last {n : ℕ} (D : PDCode n) (p q : Fin (4 * n)) (b : Bool) (hqp : q ≠ p) (hqe : q ≠ ↑D.edgePair p) :
    (D.insertClasp p q b hqp hqe).overPair (Fin.last n).castSucc = b

    The over-pair indicator of the first new crossing is b.

    @[simp]
    theorem TauCeti.PDCode.insertClasp_overPair_last {n : ℕ} (D : PDCode n) (p q : Fin (4 * n)) (b : Bool) (hqp : q ≠ p) (hqe : q ≠ ↑D.edgePair p) :
    (D.insertClasp p q b hqp hqe).overPair (Fin.last (n + 1)) = !b

    The over-pair indicator of the second new crossing is !b, so the same strand is over at both new crossings.

    @[simp]
    theorem TauCeti.PDCode.insertClasp_crossinglessComponentCount {n : ℕ} (D : PDCode n) (p q : Fin (4 * n)) (b : Bool) (hqp : q ≠ p) (hqe : q ≠ ↑D.edgePair p) :

    The insertion keeps the crossing-free circles.

    @[simp]
    theorem TauCeti.PDCode.insertClasp_edgePair_inl_inr_zero {n : ℕ} (D : PDCode n) (p q : Fin (4 * n)) (b : Bool) (hqp : q ≠ p) (hqe : q ≠ ↑D.edgePair p) :

    Slot 0 of the first new crossing is joined to the half-edge p.

    @[simp]
    theorem TauCeti.PDCode.insertClasp_edgePair_inl_inr_one {n : ℕ} (D : PDCode n) (p q : Fin (4 * n)) (b : Bool) (hqp : q ≠ p) (hqe : q ≠ ↑D.edgePair p) :

    Slot 1 of the first new crossing is joined to the half-edge q.

    @[simp]
    theorem TauCeti.PDCode.insertClasp_edgePair_inl_inr_two {n : ℕ} (D : PDCode n) (p q : Fin (4 * n)) (b : Bool) (hqp : q ≠ p) (hqe : q ≠ ↑D.edgePair p) :
    ↑(D.insertClasp p q b hqp hqe).edgePair ((halfEdgeSuccEquiv (n + 1)) (Sum.inl ((halfEdgeSuccEquiv n) (Sum.inr 2)))) = (halfEdgeSuccEquiv (n + 1)) (Sum.inr 1)

    Slot 2 of the first new crossing is joined to slot 1 of the second, along the strand through p.

    @[simp]
    theorem TauCeti.PDCode.insertClasp_edgePair_inl_inr_three {n : ℕ} (D : PDCode n) (p q : Fin (4 * n)) (b : Bool) (hqp : q ≠ p) (hqe : q ≠ ↑D.edgePair p) :
    ↑(D.insertClasp p q b hqp hqe).edgePair ((halfEdgeSuccEquiv (n + 1)) (Sum.inl ((halfEdgeSuccEquiv n) (Sum.inr 3)))) = (halfEdgeSuccEquiv (n + 1)) (Sum.inr 0)

    Slot 3 of the first new crossing is joined to slot 0 of the second, along the strand through q.

    @[simp]
    theorem TauCeti.PDCode.insertClasp_edgePair_inr_zero {n : ℕ} (D : PDCode n) (p q : Fin (4 * n)) (b : Bool) (hqp : q ≠ p) (hqe : q ≠ ↑D.edgePair p) :
    ↑(D.insertClasp p q b hqp hqe).edgePair ((halfEdgeSuccEquiv (n + 1)) (Sum.inr 0)) = (halfEdgeSuccEquiv (n + 1)) (Sum.inl ((halfEdgeSuccEquiv n) (Sum.inr 3)))

    Slot 0 of the second new crossing is joined to slot 3 of the first.

    @[simp]
    theorem TauCeti.PDCode.insertClasp_edgePair_inr_one {n : ℕ} (D : PDCode n) (p q : Fin (4 * n)) (b : Bool) (hqp : q ≠ p) (hqe : q ≠ ↑D.edgePair p) :
    ↑(D.insertClasp p q b hqp hqe).edgePair ((halfEdgeSuccEquiv (n + 1)) (Sum.inr 1)) = (halfEdgeSuccEquiv (n + 1)) (Sum.inl ((halfEdgeSuccEquiv n) (Sum.inr 2)))

    Slot 1 of the second new crossing is joined to slot 2 of the first.

    @[simp]
    theorem TauCeti.PDCode.insertClasp_edgePair_inr_two {n : ℕ} (D : PDCode n) (p q : Fin (4 * n)) (b : Bool) (hqp : q ≠ p) (hqe : q ≠ ↑D.edgePair p) :
    ↑(D.insertClasp p q b hqp hqe).edgePair ((halfEdgeSuccEquiv (n + 1)) (Sum.inr 2)) = (halfEdgeSuccEquiv (n + 1)) (Sum.inl ((halfEdgeSuccEquiv n) (Sum.inl (↑D.edgePair q))))

    Slot 2 of the second new crossing is joined to the other end of the arc at q.

    @[simp]
    theorem TauCeti.PDCode.insertClasp_edgePair_inr_three {n : ℕ} (D : PDCode n) (p q : Fin (4 * n)) (b : Bool) (hqp : q ≠ p) (hqe : q ≠ ↑D.edgePair p) :
    ↑(D.insertClasp p q b hqp hqe).edgePair ((halfEdgeSuccEquiv (n + 1)) (Sum.inr 3)) = (halfEdgeSuccEquiv (n + 1)) (Sum.inl ((halfEdgeSuccEquiv n) (Sum.inl (↑D.edgePair p))))

    Slot 3 of the second new crossing is joined to the other end of the arc at p.

    @[simp]
    theorem TauCeti.PDCode.insertClasp_edgePair_inl_inl_self {n : ℕ} (D : PDCode n) (p q : Fin (4 * n)) (b : Bool) (hqp : q ≠ p) (hqe : q ≠ ↑D.edgePair p) :

    The half-edge p is joined to slot 0 of the first new crossing.

    @[simp]
    theorem TauCeti.PDCode.insertClasp_edgePair_inl_inl_right {n : ℕ} (D : PDCode n) (p q : Fin (4 * n)) (b : Bool) (hqp : q ≠ p) (hqe : q ≠ ↑D.edgePair p) :

    The half-edge q is joined to slot 1 of the first new crossing.

    @[simp]
    theorem TauCeti.PDCode.insertClasp_edgePair_inl_inl_apply_self {n : ℕ} (D : PDCode n) (p q : Fin (4 * n)) (b : Bool) (hqp : q ≠ p) (hqe : q ≠ ↑D.edgePair p) :
    ↑(D.insertClasp p q b hqp hqe).edgePair ((halfEdgeSuccEquiv (n + 1)) (Sum.inl ((halfEdgeSuccEquiv n) (Sum.inl (↑D.edgePair p))))) = (halfEdgeSuccEquiv (n + 1)) (Sum.inr 3)

    The other end of the arc at p is joined to slot 3 of the second new crossing.

    @[simp]
    theorem TauCeti.PDCode.insertClasp_edgePair_inl_inl_apply_right {n : ℕ} (D : PDCode n) (p q : Fin (4 * n)) (b : Bool) (hqp : q ≠ p) (hqe : q ≠ ↑D.edgePair p) :
    ↑(D.insertClasp p q b hqp hqe).edgePair ((halfEdgeSuccEquiv (n + 1)) (Sum.inl ((halfEdgeSuccEquiv n) (Sum.inl (↑D.edgePair q))))) = (halfEdgeSuccEquiv (n + 1)) (Sum.inr 2)

    The other end of the arc at q is joined to slot 2 of the second new crossing.

    @[simp]
    theorem TauCeti.PDCode.insertClasp_edgePair_inl_inl_of_ne {n : ℕ} (D : PDCode n) (p q : Fin (4 * n)) (b : Bool) (hqp : q ≠ p) (hqe : q ≠ ↑D.edgePair p) {x : Fin (4 * n)} (hxp : x ≠ p) (hxe : x ≠ ↑D.edgePair p) (hxq : x ≠ q) (hxe' : x ≠ ↑D.edgePair q) :

    Every half-edge off the two cut arcs keeps its old partner.

    @[simp]
    theorem TauCeti.PDCode.mirror_insertClasp {n : ℕ} (D : PDCode n) (p q : Fin (4 * n)) (b : Bool) (hqp : q ≠ p) (hqe : q ≠ ↑D.edgePair p) :
    (D.insertClasp p q b hqp hqe).mirror = D.mirror.insertClasp p q (!b) hqp ⋯

    Mirroring the new code inserts the clasp with the other strand over into the mirror code.

    @[simp]
    theorem TauCeti.PDCode.crossingComponentCount_insertClasp {n : ℕ} (D : PDCode n) (p q : Fin (4 * n)) (b : Bool) (hqp : q ≠ p) (hqe : q ≠ ↑D.edgePair p) :

    Algebraic clasp insertion keeps the number of components.

    @[simp]
    theorem TauCeti.PDCode.kauffmanBracket_insertClasp {n : ℕ} (D : PDCode n) (p q : Fin (4 * n)) (b : Bool) (hqp : q ≠ p) (hqe : q ≠ ↑D.edgePair p) {R : Type u_1} [CommRing R] (a : Rˣ) :

    The Kauffman bracket is invariant under algebraic clasp insertion.

    Faces after clasp insertion #

    theorem TauCeti.PDCode.faceCount_insertClasp_of_face_eq {n : ℕ} (D : PDCode n) (p q : Fin (4 * n)) (b : Bool) (hqp : q ≠ p) (hqe : q ≠ ↑D.edgePair p) (hface : D.face (↑D.edgePair p) = D.face q) :
    (D.insertClasp p q b hqp hqe).faceCount = D.faceCount + 2

    Clasp insertion inside a face adds two faces. When the face at the far end D.edgePair.val p of the arc ending at p is the face at q, the clasp can be drawn inside that face: it cuts the face in two and adds the bigon between its two crossings.

    theorem TauCeti.PDCode.faceCount_insertClasp_of_face_ne {n : ℕ} (D : PDCode n) (p q : Fin (4 * n)) (b : Bool) (hqp : q ≠ p) (hqe : q ≠ ↑D.edgePair p) (hface : D.face (↑D.edgePair p) ≠ D.face q) :
    (D.insertClasp p q b hqp hqe).faceCount = D.faceCount

    When the face at the far end D.edgePair.val p of the arc ending at p is not the face at q, inserting the clasp joins two faces into one, which the bigon between the two new crossings makes up for: the number of faces is unchanged.

    Connected components after clasp insertion #

    Clasp insertion keeps the connected components of the underlying graph when the two cut arcs already lie in one component.

    theorem TauCeti.PDCode.isPlanar_insertClasp_iff {n : ℕ} (D : PDCode n) (p q : Fin (4 * n)) (b : Bool) (hqp : q ≠ p) (hqe : q ≠ ↑D.edgePair p) (hface : D.face (↑D.edgePair p) = D.face q) :
    (D.insertClasp p q b hqp hqe).IsPlanar ↔ D.IsPlanar

    Clasp insertion inside a face keeps planarity. When the face at the far end D.edgePair.val p of the arc ending at p is the face at q, the clasp insertion is the second Reidemeister move drawn inside that face, and the new code is planar exactly when D is.

    theorem TauCeti.PDCode.not_isPlanar_insertClasp_of_face_ne {n : ℕ} (D : PDCode n) (p q : Fin (4 * n)) (b : Bool) (hqp : q ≠ p) (hqe : q ≠ ↑D.edgePair p) (hface : D.face (↑D.edgePair p) ≠ D.face q) (hpq : q ∈ MulAction.orbit (↥D.toPermutationTriple.monodromyGroup) p) :
    ¬(D.insertClasp p q b hqp hqe).IsPlanar

    The face condition is necessary. When the two cut arcs lie in one connected component of the underlying graph but the face at the far end D.edgePair.val p of the arc ending at p is not the face at q, the clasp cannot be drawn in the plane: the new code is never planar.