Documentation

Complexitylib.Classes.PCP.Internal.WalkPath

Trajectories of walks, and self-loops #

Walk gives the endpoint of a walk, which is all the spectral estimates need. Dinur's powering step also needs the walk's whole trajectory: the constraint attached to a length-t walk talks about the graph constraints on each intermediate edge, and about what the two endpoints of the walk claim the intermediate vertices are labelled.

This module adds the trajectory walkAt, indexed by and constant once the walk is exhausted, and identifies its final position with walkEnd. The bridge runs through walkEnd_snoc: extending a walk by one label at the end takes one more step from its endpoint, whereas walkEnd recurses on the first label.

It also introduces Loops, a choice of self-loop at each vertex. Dinur's construction needs these to pad a short walk out to a fixed length without moving: a vertex within distance k ≤ h of v is the endpoint of a length-h walk from v that follows k real steps and then stays put.

Main definitions #

Main results #

Extending a walk at its end #

theorem Complexity.RegGraph.walkEnd_snoc (G : RegGraph) (t : ) (v : G.V) (s : Fin tG.D) (i : G.D) :
G.walkEnd (t + 1) v (Fin.snoc s i) = G.nbr (G.walkEnd t v s) i

The trajectory #

def Complexity.RegGraph.walkAt (G : RegGraph) (t : ) (v : G.V) (s : Fin tG.D) :
G.V

The position of the walk (v, s) after k steps. Once the label tuple is exhausted the walk stays where it is, so this is defined for every k : ℕ.

Equations
Instances For
    @[simp]
    theorem Complexity.RegGraph.walkAt_zero (G : RegGraph) (t : ) (v : G.V) (s : Fin tG.D) :
    G.walkAt t v s 0 = v
    theorem Complexity.RegGraph.walkAt_succ_of_lt (G : RegGraph) {t : } (v : G.V) (s : Fin tG.D) {k : } (h : k < t) :
    G.walkAt t v s (k + 1) = G.nbr (G.walkAt t v s k) (s k, h)
    theorem Complexity.RegGraph.walkAt_succ_of_ge (G : RegGraph) {t : } (v : G.V) (s : Fin tG.D) {k : } (h : t k) :
    G.walkAt t v s (k + 1) = G.walkAt t v s k
    theorem Complexity.RegGraph.walkAt_of_le (G : RegGraph) {t : } (v : G.V) (s : Fin tG.D) {k : } :
    t kG.walkAt t v s k = G.walkAt t v s t

    Past its length the trajectory is constant.

    theorem Complexity.RegGraph.walkAt_eq_walkEnd_prefix (G : RegGraph) {t : } (v : G.V) (s : Fin tG.D) (k : ) (hk : k t) :
    G.walkAt t v s k = G.walkEnd k v fun (j : Fin k) => s (Fin.castLE hk j)

    The trajectory after k ≤ t steps is the endpoint of the length-k prefix of the walk.

    theorem Complexity.RegGraph.walkAt_self_eq_walkEnd (G : RegGraph) {t : } (v : G.V) (s : Fin tG.D) :
    G.walkAt t v s t = G.walkEnd t v s

    The trajectory ends where walkEnd says it does.

    Self-loops #

    A choice of self-loop at every vertex: an edge label that fixes the dart, hence does not move. Dinur's construction needs these to pad short walks out to a fixed length.

    • loop : G.VG.D

      The self-loop label at each vertex.

    • rot_loop (v : G.V) : G.rot (v, self.loop v) = (v, self.loop v)

      The chosen dart is fixed by reversal, so it is a self-loop.

    Instances For
      @[simp]
      theorem Complexity.RegGraph.Loops.nbr_loop {G : RegGraph} (L : G.Loops) (v : G.V) :
      G.nbr v (L.loop v) = v

      Following a loop label does not move.

      def Complexity.RegGraph.Loops.padWalk {G : RegGraph} (L : G.Loops) {t : } (v : G.V) (s : Fin tG.D) (k h : ) :
      Fin hG.D

      The length-h label tuple that follows s for k steps and then stays put, taking self-loops. This is how a vertex within distance k ≤ h of v is named by a walk of length exactly h out of v.

      Equations
      Instances For
        theorem Complexity.RegGraph.Loops.padWalk_of_lt {G : RegGraph} (L : G.Loops) {t : } (v : G.V) (s : Fin tG.D) {k h : } (j : Fin h) (hj : j < min k t) :
        L.padWalk v s k h j = s j,
        theorem Complexity.RegGraph.Loops.padWalk_of_ge {G : RegGraph} (L : G.Loops) {t : } (v : G.V) (s : Fin tG.D) {k h : } (j : Fin h) (hj : ¬j < min k t) :
        L.padWalk v s k h j = L.loop (G.walkAt t v s k)
        theorem Complexity.RegGraph.Loops.walkAt_padWalk_of_le {G : RegGraph} (L : G.Loops) {t : } (v : G.V) (s : Fin tG.D) {k h : } (hkh : k h) (hkt : k t) (m : ) :
        m kG.walkAt h v (L.padWalk v s k h) m = G.walkAt t v s m

        Below k the padded walk follows the original.

        theorem Complexity.RegGraph.Loops.walkAt_padWalk_of_ge {G : RegGraph} (L : G.Loops) {t : } (v : G.V) (s : Fin tG.D) {k h : } (hkh : k h) (hkt : k t) (m : ) :
        k mm hG.walkAt h v (L.padWalk v s k h) m = G.walkAt t v s k

        At and past k the padded walk stays at the k-th vertex.

        theorem Complexity.RegGraph.Loops.walkEnd_padWalk {G : RegGraph} (L : G.Loops) {t : } (v : G.V) (s : Fin tG.D) {k h : } (hkh : k h) (hkt : k t) :
        G.walkEnd h v (L.padWalk v s k h) = G.walkAt t v s k

        The naming property. A padded walk of length h ends exactly at the k-th vertex of the original walk.