Documentation

Complexitylib.Classes.PCP.Internal.FamilyFin

An expander of every size, numbered #

TowerFin gives an expander at the tower's own sizes; a constraint graph asks for one on exactly its own vertex count, and Dinur's degree reduction asks for one on every vertex degree. This module closes the gap — fold the first large enough member onto n vertices, then pad the degree with self-loops — keeping every naming explicit, so that the rotation map stays a formula in numbers.

Nothing is numbered by an arbitrary bijection: a slot and a dart are packed with finProdFinEquiv, and the padding with finSumFinEquiv. That is what lets famRotVal compute the family's rotation map on raw numerals, which is what an algorithm has to be handed.

Main definitions #

Main results #

The member folded onto n vertices #

noncomputable def Complexity.FinBase.fitLevel (F : FinBase) (hd : 1 < F.deg) (n : ) :

The tower level used for n vertices: the first one at least twice as big.

Equations
Instances For
    theorem Complexity.FinBase.fitLevel_le (F : FinBase) (hd : 1 < F.deg) (n : ) :
    F.fitLevel hd n 2 * n

    A fit's level is at most twice the size asked for, so the polynomial an algorithm needs to bound the search is linear.

    noncomputable def Complexity.FinBase.fitN (F : FinBase) (hd : 1 < F.deg) (n : ) :

    Its size.

    Equations
    Instances For

      The degree of every tower member.

      Equations
      Instances For
        theorem Complexity.FinBase.two_mul_le_fitN (F : FinBase) (hd : 1 < F.deg) (n : ) :
        2 * n F.fitN hd n

        The width bound: the overshoot of the tower is at most 2 deg ^ 4.

        Equations
        Instances For

          The family's degree.

          Equations
          Instances For
            theorem Complexity.FinBase.fitN_le (F : FinBase) (hd : 1 < F.deg) {n : } (hn : 0 < n) :
            F.fitN hd n 2 * F.deg ^ 4 * n
            noncomputable def Complexity.FinBase.wid (F : FinBase) (hd : 1 < F.deg) (n : ) :

            The width of the fold.

            Equations
            Instances For
              theorem Complexity.FinBase.three_le_wid (F : FinBase) (hd : 1 < F.deg) {n : } (hn : 0 < n) :
              3 F.wid hd n
              theorem Complexity.FinBase.wid_pos (F : FinBase) (hd : 1 < F.deg) {n : } (hn : 0 < n) :
              0 < F.wid hd n
              theorem Complexity.FinBase.wid_le (F : FinBase) (hd : 1 < F.deg) {n : } (hn : 0 < n) :
              F.wid hd n F.widthBnd
              theorem Complexity.FinBase.fitN_le_wid_mul (F : FinBase) (hd : 1 < F.deg) {n : } (hn : 0 < n) :
              F.fitN hd n F.wid hd n * n
              theorem Complexity.FinBase.wid_sub_one_mul_le (F : FinBase) (hd : 1 < F.deg) (n : ) :
              (F.wid hd n - 1) * n F.fitN hd n
              theorem Complexity.FinBase.wid_mul_fitD_le (F : FinBase) (hd : 1 < F.deg) {n : } (hn : 0 < n) :
              F.wid hd n * F.fitD F.famDeg
              noncomputable def Complexity.FinBase.fitGraph (F : FinBase) (hd : 1 < F.deg) (n : ) :

              The tower member used for n, on its own numbers.

              Equations
              Instances For
                @[simp]
                theorem Complexity.FinBase.order_fitGraph (F : FinBase) (hd : 1 < F.deg) (n : ) :
                (F.fitGraph hd n).order = F.fitN hd n
                @[simp]
                theorem Complexity.FinBase.deg_fitGraph (F : FinBase) (hd : 1 < F.deg) (n : ) :
                (F.fitGraph hd n).deg = F.fitD
                theorem Complexity.FinBase.spectral_fitGraph (F : FinBase) (hd : 1 < F.deg) (n : ) :
                (F.fitGraph hd n).SpectralBound (2 / 5)
                noncomputable def Complexity.FinBase.fitRot (F : FinBase) (hd : 1 < F.deg) (n : ) :
                Fin (F.fitN hd n) × Fin F.fitDFin (F.fitN hd n) × Fin F.fitD

                Its rotation map, at the numeric type it lives on.

                Equations
                Instances For
                  theorem Complexity.FinBase.base_fitRot (F : FinBase) (hd : 1 < F.deg) (n : ) :
                  RegGraph.base (F.fitRot hd n) = F.fitGraph hd n

                  The fold, and the padding #

                  noncomputable def Complexity.FinBase.mergedG (F : FinBase) (hd : 1 < F.deg) {n : } (hn : 0 < n) :

                  The tower member folded onto exactly n vertices.

                  Equations
                  Instances For
                    @[simp]
                    theorem Complexity.FinBase.order_mergedG (F : FinBase) (hd : 1 < F.deg) {n : } (hn : 0 < n) :
                    (F.mergedG hd hn).order = n
                    @[simp]
                    theorem Complexity.FinBase.deg_mergedG (F : FinBase) (hd : 1 < F.deg) {n : } (hn : 0 < n) :
                    (F.mergedG hd hn).deg = F.wid hd n * F.fitD
                    theorem Complexity.FinBase.spectral_mergedG (F : FinBase) (hd : 1 < F.deg) {n : } (hn : 0 < n) :
                    (F.mergedG hd hn).SpectralBound (4 / 5)
                    noncomputable def Complexity.FinBase.paddedG (F : FinBase) (hd : 1 < F.deg) {n : } (hn : 0 < n) :

                    The fold padded up to the family's uniform degree.

                    Equations
                    Instances For
                      @[simp]
                      theorem Complexity.FinBase.order_paddedG (F : FinBase) (hd : 1 < F.deg) {n : } (hn : 0 < n) :
                      (F.paddedG hd hn).order = n
                      @[simp]
                      theorem Complexity.FinBase.deg_paddedG (F : FinBase) (hd : 1 < F.deg) {n : } (hn : 0 < n) :
                      (F.paddedG hd hn).deg = F.famDeg
                      noncomputable def Complexity.FinBase.famLam (F : FinBase) :

                      The uniform contraction factor of the family.

                      Equations
                      Instances For
                        theorem Complexity.FinBase.spectral_paddedG (F : FinBase) (hd : 1 < F.deg) {n : } (hn : 0 < n) :

                        Numbering the darts #

                        theorem Complexity.FinBase.wid_mul_fitD_add (F : FinBase) (hd : 1 < F.deg) {n : } (hn : 0 < n) :
                        F.wid hd n * F.fitD + (F.famDeg - F.wid hd n * F.fitD) = F.famDeg
                        noncomputable def Complexity.FinBase.famDartName (F : FinBase) (hd : 1 < F.deg) {n : } (hn : 0 < n) :
                        (F.paddedG hd hn).D Fin F.famDeg

                        The darts of the padded fold, numbered: a slot and a dart of the member are packed together, and the padding loops follow them.

                        Equations
                        Instances For
                          noncomputable def Complexity.FinBase.famGraph (F : FinBase) (hd : 1 < F.deg) {n : } (hn : 0 < n) :

                          The member of the family on n vertices, for n positive.

                          Equations
                          Instances For
                            theorem Complexity.FinBase.famGraph_V (F : FinBase) (hd : 1 < F.deg) {n : } (hn : 0 < n) :
                            (F.famGraph hd hn).V = Fin n
                            theorem Complexity.FinBase.famGraph_D (F : FinBase) (hd : 1 < F.deg) {n : } (hn : 0 < n) :
                            (F.famGraph hd hn).D = Fin F.famDeg
                            theorem Complexity.FinBase.spectral_famGraph (F : FinBase) (hd : 1 < F.deg) {n : } (hn : 0 < n) :
                            noncomputable def Complexity.FinBase.famRot (F : FinBase) (hd : 1 < F.deg) (n : ) :
                            Fin n × Fin F.famDegFin n × Fin F.famDeg

                            The family's rotation map.

                            Equations
                            Instances For
                              theorem Complexity.FinBase.famRot_eq (F : FinBase) (hd : 1 < F.deg) {n : } (hn : 0 < n) :
                              F.famRot hd n = (F.famGraph hd hn).rot
                              theorem Complexity.FinBase.spectral_famRot (F : FinBase) (hd : 1 < F.deg) (n : ) :

                              The rotation map, in numbers #

                              theorem Complexity.FinBase.val_famDartName_inl (F : FinBase) (hd : 1 < F.deg) {n : } (hn : 0 < n) (s : Fin (F.wid hd n)) (c : Fin F.fitD) :
                              ((F.famDartName hd hn) (Sum.inl (s, c))) = c + F.fitD * s
                              theorem Complexity.FinBase.val_famDartName_inr (F : FinBase) (hd : 1 < F.deg) {n : } (hn : 0 < n) (j : Fin (F.famDeg - F.wid hd n * F.fitD)) :
                              ((F.famDartName hd hn) (Sum.inr j)) = F.wid hd n * F.fitD + j
                              theorem Complexity.FinBase.famDartName_symm_of_lt (F : FinBase) (hd : 1 < F.deg) {n : } (hn : 0 < n) (i : Fin F.famDeg) (h : i < F.wid hd n * F.fitD) :
                              (F.famDartName hd hn).symm i = Sum.inl (i / F.fitD, , i % F.fitD, )
                              theorem Complexity.FinBase.famDartName_symm_of_ge (F : FinBase) (hd : 1 < F.deg) {n : } (hn : 0 < n) (i : Fin F.famDeg) (h : F.wid hd n * F.fitD i) :
                              (F.famDartName hd hn).symm i = Sum.inr i - F.wid hd n * F.fitD,
                              noncomputable def Complexity.FinBase.famRotVal (F : FinBase) (hd : 1 < F.deg) (n : ) (p : × ) :

                              The family's rotation map, on raw numbers. A dart below wid * fitD splits into a slot and a dart of the tower member; the vertex it lifts to is v + slot * n, and the vertex it lands on is read modulo n, with the slot it landed in becoming part of the new dart. Every other dart is a self-loop.

                              Equations
                              • One or more equations did not get rendered due to their size.
                              Instances For
                                theorem Complexity.FinBase.famRotVal_eq (F : FinBase) (hd : 1 < F.deg) {n : } (hn : 0 < n) (v : Fin n) (i : Fin F.famDeg) :
                                F.famRotVal hd n (v, i) = ((F.famRot hd n (v, i)).1, (F.famRot hd n (v, i)).2)

                                The numbers compute the family's rotation map.

                                noncomputable def Complexity.FinBase.toFamily (F : FinBase) (hd : 1 < F.deg) :

                                The expander family the numbered tower generates: one member at every size, of a constant degree, all contracting by the same factor, and with every naming explicit.

                                Equations
                                • F.toFamily hd = { degree := F.famDeg, degree_pos := , rot := F.famRot hd, rot_involutive := , lam := F.famLam, lam_nonneg := , lam_lt_one := , spectral := }
                                Instances For

                                  The family the algorithm uses #

                                  noncomputable def Complexity.algBase :

                                  A numbered base of degree above one, chosen once.

                                  Equations
                                  Instances For

                                    The explicit expander family: the tower over that base. Unlike randExpander it comes with rotation tables an algorithm can read.

                                    Equations
                                    Instances For