Documentation

Complexitylib.Classes.PCP.Internal.DegreeReduction

Degree reduction #

The first half of Dinur's preprocessing: an arbitrary constraint graph, whose vertices may have wildly different degrees, is replaced by a regular one over the same alphabet.

The vertices of the new graph are the half-edges of the old one — an edge together with one of its endpoints — so there are exactly 2 · numEdges of them, however lopsided the original degrees were. Each half-edge has

So the result is (1 + E.degree)-regular by construction, with no padding, and its size is a constant multiple of the original's — which is what the amplification bookkeeping needs.

The cloud rotation, without dependent types #

A cloud's expander lives on Fin (cloud size), and cloud sizes differ, so the naive rotation map forces a transport along owner p' = owner p that is not type-correct to rewrite. The fix is cloudRotAux, which takes the cloud's enumeration l as a parameter: within it the length is fixed, and involutivity is an ordinary argument about a Nodup list. At the top level the only rewriting needed is cloudList (owner p') = cloudList (owner p), an equation between plain lists with no dependent type in sight.

Main definitions #

Main results #

Half-edges and clouds #

@[reducible, inline]

A half-edge: an edge together with one of its two endpoints (false is the tail, true the head). These are the vertices of the reduced graph.

Equations
Instances For

    The vertex a half-edge is attached to.

    Equations
    Instances For

      The other half of the same edge.

      Equations
      Instances For

        The half-edges attached to v.

        Equations
        Instances For
          @[simp]
          theorem Complexity.ConstraintGraph.mem_cloud {α : Type} (G : ConstraintGraph α) {v : Fin G.numVerts} {p : G.HalfEdge} :
          p G.cloud v G.owner p = v

          The number naming a half-edge. The head of an edge is numbered before its tail, which is the order Fintype enumerates Bool in.

          Equations
          Instances For

            The half-edges of a cloud, listed without repetition, in order of their numbers — the order an algorithm can find them in.

            Equations
            Instances For

              The cloud rotation #

              noncomputable def Complexity.ConstraintGraph.cloudRotAux {α : Type} (G : ConstraintGraph α) (E : ExpanderFamily) (l : List G.HalfEdge) (p : G.HalfEdge) (j : Fin E.degree) :

              The cloud-link rotation, with the cloud's enumeration passed in explicitly so that no dependent rewriting is ever needed.

              Equations
              Instances For
                theorem Complexity.ConstraintGraph.cloudRotAux_involutive {α : Type} (G : ConstraintGraph α) (E : ExpanderFamily) {l : List G.HalfEdge} (hnd : l.Nodup) {p : G.HalfEdge} (hp : p l) (j : Fin E.degree) :
                G.cloudRotAux E l (G.cloudRotAux E l p j).1 (G.cloudRotAux E l p j).2 = (p, j)

                Inside one cloud, the rotation is an involution: this is the family's own involutivity, transported through the enumeration.

                noncomputable def Complexity.ConstraintGraph.cloudRot {α : Type} (G : ConstraintGraph α) (E : ExpanderFamily) (p : G.HalfEdge) (j : Fin E.degree) :

                The cloud-link rotation at a half-edge, using its own cloud.

                Equations
                Instances For
                  theorem Complexity.ConstraintGraph.cloudRotAux_mem {α : Type} (G : ConstraintGraph α) (E : ExpanderFamily) {l : List G.HalfEdge} {p : G.HalfEdge} (hp : p l) (j : Fin E.degree) :
                  (G.cloudRotAux E l p j).1 l

                  A cloud-link lands inside the enumeration it started from.

                  theorem Complexity.ConstraintGraph.owner_cloudRot {α : Type} (G : ConstraintGraph α) (E : ExpanderFamily) (p : G.HalfEdge) (j : Fin E.degree) :
                  G.owner (G.cloudRot E p j).1 = G.owner p

                  A cloud-link stays inside the cloud.

                  theorem Complexity.ConstraintGraph.cloudRot_getElem {α : Type} (G : ConstraintGraph α) (E : ExpanderFamily) (v : Fin G.numVerts) (i : Fin (G.cloudList v).length) (j : Fin E.degree) :
                  (G.cloudRot E (G.cloudList v)[i] j).1 = (G.cloudList v)[(E.rot (G.cloudList v).length (i, j)).1]

                  The cloud is a copy of the expander. Reading the cloud through its enumeration, a cloud-link is exactly the family's rotation map. This is what lets the expander estimates of Disagreement be applied to a cloud.

                  theorem Complexity.ConstraintGraph.cloudRot_involutive {α : Type} (G : ConstraintGraph α) (E : ExpanderFamily) (p : G.HalfEdge) (j : Fin E.degree) :
                  G.cloudRot E (G.cloudRot E p j).1 (G.cloudRot E p j).2 = (p, j)

                  The reduced graph #

                  The reduced graph: every half-edge has one edge-link to the other half of its edge, and E.degree cloud-links to the half-edges sharing its endpoint.

                  Equations
                  • One or more equations did not get rendered due to their size.
                  Instances For
                    @[simp]

                    The reduced graph is (1 + E.degree)-regular.

                    The reduced constraint system #

                    The reduced constraint system: an edge-link carries the original constraint of its edge, oriented so that the tail's label comes first, and a cloud-link demands that the two half-edges agree.

                    Equations
                    • One or more equations did not get rendered due to their size.
                    Instances For
                      @[instance_reducible]

                      The reduced system's vertices are the half-edges, numbered by their edge and their side.

                      Equations
                      • One or more equations did not get rendered due to their size.

                      Completeness: labelling every half-edge by its endpoint's label carries a satisfying assignment of G to one of the reduced system.