Documentation

MerLeanBpqc.Definitions.Def_21_LPSExpanderGraphs

Definition 21: LPS Expander Graphs #

Main Results #

Group definitions #

@[reducible, inline]
abbrev LPS.PGL2 (q : ) :

The projective general linear group PGL(2, q) = GL(2, 𝔽_q) / center(GL(2, 𝔽_q)). Defined as the quotient of GL(2, ZMod q) by its center.

Equations
Instances For
    @[reducible, inline]
    abbrev LPS.PSL2 (q : ) :

    The projective special linear group PSL(2, q) = SL(2, 𝔽_q) / center(SL(2, 𝔽_q)).

    Equations
    Instances For

      The set S̃_p and the normalized subset S_p #

      The set S̃_p = {(a,b,c,d) ∈ ℤ⁴ | a² + b² + c² + d² = p} of integer 4-tuples whose sum of squares equals p.

      Equations
      Instances For
        Equations

        Predicate for the first nonzero element being positive (for p ≡ 3 mod 4 case).

        Equations
        Instances For
          def LPS.SpPred (p : ) (t : × × × ) :

          The normalized subset predicate for S_p. When p ≡ 1 (mod 4): a is positive and odd. When p ≡ 3 (mod 4): a is even and the first nonzero element is positive.

          Equations
          Instances For
            def LPS.Sp (p : ) [Fact (Nat.Prime p)] (hoddp : p % 2 = 1) :

            The normalized subset S_p ⊆ S̃_p. Defined as the set of integer 4-tuples (a,b,c,d) with a² + b² + c² + d² = p satisfying the normalization condition. Each coordinate is bounded by √p ≤ p, so we filter from [-p, p]⁴.

            Equations
            Instances For
              theorem LPS.Sp_subset_SpTilde (p : ) [Fact (Nat.Prime p)] (hoddp : p % 2 = 1) (t : × × × ) :
              t Sp p hoddpt SpTilde p

              Every element of S_p lies in S̃_p.

              axiom LPS.Sp_card (p : ) [Fact (Nat.Prime p)] (hoddp : p % 2 = 1) :
              (Sp p hoddp).card = p + 1

              This follows from Jacobi's four-square theorem: r₄(p) = 8(p+1) for odd prime p, and the normalization conditions select exactly (p+1) representatives. Jacobi's four-square theorem is not available in Mathlib.

              Witness lemmas for set non-emptiness #

              Witness: SpTilde p is non-empty for any prime p ≥ 2. For p = 3, the tuple (1, 1, 1, 0) satisfies 1² + 1² + 1² + 0² = 3.

              theorem LPS.SpTilde_nonempty (p : ) [Fact (Nat.Prime p)] (hoddp : p % 2 = 1) :

              For any odd prime p, SpTilde p is non-empty (follows from Sp being non-empty and Sp_subset_SpTilde).

              theorem LPS.Sp_nonempty (p : ) [Fact (Nat.Prime p)] (hoddp : p % 2 = 1) :
              (Sp p hoddp).Nonempty

              Sp p is non-empty for any odd prime p, since |S_p| = p + 1 ≥ 4 > 0.

              Satisfiability witnesses for Sp #

              theorem LPS.Sp_satisfiable :
              ∃ (p : ) (_ : Fact (Nat.Prime p)), p % 2 = 1

              Witness: Sp premises are satisfiable (p = 3 works).

              The matrix M(a,b,c,d) and the LPS generating set #

              theorem LPS.exists_sum_sq_eq_neg_one (q : ) [Fact (Nat.Prime q)] (hoddq : q % 2 = 1) :
              ∃ (x : ZMod q) (y : ZMod q), x ^ 2 + y ^ 2 + 1 = 0

              The existence of x, y ∈ 𝔽_q with x² + y² + 1 = 0. For an odd prime q, by ZMod.sq_add_sq there exist a, b with a² + b² = -1, i.e. a² + b² + 1 = 0.

              def LPS.lpsMatrixVal (q : ) (x y : ZMod q) (t : × × × ) :
              Matrix (Fin 2) (Fin 2) (ZMod q)

              The LPS matrix M(a,b,c,d) as a 2×2 matrix over ZMod q.

              Equations
              • LPS.lpsMatrixVal q x y t = !![t.1 + t.2.1 * x + t.2.2.2 * y, -t.2.1 * y + t.2.2.1 + t.2.2.2 * x; -t.2.1 * y - t.2.2.1 + t.2.2.2 * x, t.1 - t.2.1 * x - t.2.2.2 * y]
              Instances For
                theorem LPS.lpsMatrixVal_det (q : ) (x y : ZMod q) (hxy : x ^ 2 + y ^ 2 + 1 = 0) (t : × × × ) :
                (lpsMatrixVal q x y t).det = t.1 ^ 2 + t.2.1 ^ 2 + t.2.2.1 ^ 2 + t.2.2.2 ^ 2

                The determinant of M(a,b,c,d) equals ι(a² + b² + c² + d²).

                theorem LPS.lpsMatrixVal_det_ne_zero (q : ) [Fact (Nat.Prime q)] (p : ) [Fact (Nat.Prime p)] (hpq : p q) (x y : ZMod q) (hxy : x ^ 2 + y ^ 2 + 1 = 0) (t : × × × ) (ht : t SpTilde p) :
                (lpsMatrixVal q x y t).det 0

                For (a,b,c,d) ∈ S̃_p with p ≠ q (both prime), M(a,b,c,d) is invertible.

                def LPS.projPGL (q : ) :
                GL (Fin 2) (ZMod q) →* PGL2 q

                The canonical projection from GL(2, ZMod q) to PGL(2, q).

                Equations
                Instances For

                  The canonical projection from SL(2, ZMod q) to PSL(2, q).

                  Equations
                  Instances For
                    def LPS.matToGL (q : ) [Fact (Nat.Prime q)] (M : Matrix (Fin 2) (Fin 2) (ZMod q)) (hdet : M.det 0) :
                    GL (Fin 2) (ZMod q)

                    Lift a matrix with nonzero determinant to GL(2, ZMod q).

                    Equations
                    Instances For
                      def LPS.tupleToGLElement (q : ) [Fact (Nat.Prime q)] (p : ) [Fact (Nat.Prime p)] (hpq : p q) (x y : ZMod q) (hxy : x ^ 2 + y ^ 2 + 1 = 0) (t : × × × ) (ht : t SpTilde p) :
                      GL (Fin 2) (ZMod q)

                      Map a tuple to PGL(2,q) via the LPS matrix, given membership in SpTilde.

                      Equations
                      Instances For

                        Helper lemmas for generating set properties #

                        theorem LPS.Nat.Prime.not_perfect_square (p : ) (hp : Nat.Prime p) (a : ) :
                        a ^ 2 p

                        A prime is not a perfect square.

                        theorem LPS.int_eq_zero_of_zmod_eq_zero_of_sq_le {q p : } [Fact (Nat.Prime q)] (hq_gt : q > 2 * p) (n : ) (hn_zmod : n = 0) (hn_sq : n ^ 2 p) :
                        n = 0

                        If (n : ZMod q) = 0 and n² ≤ p and q > 2√p, then n = 0.

                        theorem LPS.sq_le_of_sum_four_sq_eq {a b c d : } {p : } (h : a ^ 2 + b ^ 2 + c ^ 2 + d ^ 2 = p) :
                        b ^ 2 p c ^ 2 p d ^ 2 p

                        From a² + b² + c² + d² = p, each squared term is at most p.

                        @[simp]
                        theorem LPS.matToGL_val (q : ) [Fact (Nat.Prime q)] (M : Matrix (Fin 2) (Fin 2) (ZMod q)) (hdet : M.det 0) :
                        (matToGL q M hdet) = M

                        The underlying matrix of matToGL is the input matrix.

                        @[simp]
                        theorem LPS.tupleToGLElement_val (q : ) [Fact (Nat.Prime q)] (p : ) [Fact (Nat.Prime p)] (hpq : p q) (x y : ZMod q) (hxy : x ^ 2 + y ^ 2 + 1 = 0) (t : × × × ) (ht : t SpTilde p) :
                        (tupleToGLElement q p hpq x y hxy t ht) = lpsMatrixVal q x y t

                        The underlying matrix of tupleToGLElement is lpsMatrixVal.

                        theorem LPS.lpsMatrix_not_in_center (q : ) [Fact (Nat.Prime q)] (p : ) [Fact (Nat.Prime p)] (hpq : p q) (hoddq : q % 2 = 1) (hq_gt : q > 2 * p) (x y : ZMod q) (hxy : x ^ 2 + y ^ 2 + 1 = 0) (t : × × × ) (ht : t SpTilde p) :
                        tupleToGLElement q p hpq x y hxy t htSubgroup.center (GL (Fin 2) (ZMod q))

                        If M(a,b,c,d) is in the center of GL(2, ZMod q), derive a contradiction.

                        The conjugate tuple (a, -b, -c, -d).

                        Equations
                        Instances For
                          theorem LPS.negConj_mem_SpTilde {p : } {t : × × × } (ht : t SpTilde p) :

                          The conjugate tuple is in SpTilde whenever the original is.

                          theorem LPS.lpsMatrixVal_negConj (q : ) (x y : ZMod q) (t : × × × ) :

                          The LPS matrix of the conjugate tuple is the adjugate of the original.

                          theorem LPS.lpsMatrixVal_negConj_zero_fst (q : ) (x y : ZMod q) (t : × × × ) (ha : t.1 = 0) :

                          When a = 0, M(0,-b,-c,-d) = -M(0,b,c,d).

                          theorem LPS.negConj_mem_Sp_of_fst_pos {p : } [Fact (Nat.Prime p)] (hoddp : p % 2 = 1) (t : × × × ) (ht : t Sp p hoddp) (ha_pos : t.1 > 0) :
                          negConj t Sp p hoddp

                          Negating b, c, d preserves the Sp predicate when a > 0 (both p ≡ 1 and p ≡ 3 cases).

                          theorem LPS.projPGL_negConj_eq_inv (q : ) [Fact (Nat.Prime q)] (p : ) [Fact (Nat.Prime p)] (hpq : p q) (x y : ZMod q) (hxy : x ^ 2 + y ^ 2 + 1 = 0) (t : × × × ) (ht : t SpTilde p) :
                          (projPGL q) (tupleToGLElement q p hpq x y hxy (negConj t) ) = ((projPGL q) (tupleToGLElement q p hpq x y hxy t ht))⁻¹

                          The PGL image of tupleToGLElement(negConj t) equals the inverse of tupleToGLElement(t). This follows from adj(M(t)) * M(t) = det(M(t)) • I, and negConj gives the adjugate.

                          theorem LPS.projPGL_negConj_eq_self_of_fst_zero (q : ) [Fact (Nat.Prime q)] (p : ) [Fact (Nat.Prime p)] (hpq : p q) (x y : ZMod q) (hxy : x ^ 2 + y ^ 2 + 1 = 0) (t : × × × ) (ht : t SpTilde p) (ha : t.1 = 0) :
                          (projPGL q) (tupleToGLElement q p hpq x y hxy (negConj t) ) = (projPGL q) (tupleToGLElement q p hpq x y hxy t ht)

                          In the a=0 case, M(negConj t) = -M(t), so their PGL images coincide.

                          theorem LPS.Sp_fst_nonneg {p : } [Fact (Nat.Prime p)] (hoddp : p % 2 = 1) (t : × × × ) (ht : t Sp p hoddp) :
                          t.1 0

                          For t ∈ Sp, either a > 0 (and negConj t ∈ Sp) or a = 0 (and s⁻¹ = s).

                          def LPS.lpsGenSetPGL (q : ) [Fact (Nat.Prime q)] (p : ) [Fact (Nat.Prime p)] (hpq : p q) (hoddp : p % 2 = 1) (hoddq : q % 2 = 1) (hq_gt : q > 2 * p) (x y : ZMod q) (hxy : x ^ 2 + y ^ 2 + 1 = 0) :

                          The LPS generating set in PGL(2, q), as a SymmGenSet.

                          Equations
                          • One or more equations did not get rendered due to their size.
                          Instances For
                            noncomputable def LPS.matToSL (q : ) [Fact (Nat.Prime q)] (M : Matrix (Fin 2) (Fin 2) (ZMod q)) (r : ZMod q) (hr_ne : r 0) (hr_sq : r ^ 2 = M.det) :

                            Scale a matrix by the inverse of a square root of its determinant to get an SL element.

                            Equations
                            Instances For
                              noncomputable def LPS.legendreSqrt (q : ) [Fact (Nat.Prime q)] (p : ) [Fact (Nat.Prime p)] (hpq : p q) (hleg : legendreSym q p = 1) :

                              Get a square root of (p : ZMod q) from the Legendre symbol condition.

                              Equations
                              Instances For
                                theorem LPS.legendreSqrt_sq (q : ) [Fact (Nat.Prime q)] (p : ) [Fact (Nat.Prime p)] (hpq : p q) (hleg : legendreSym q p = 1) :
                                legendreSqrt q p hpq hleg ^ 2 = p
                                theorem LPS.legendreSqrt_ne_zero (q : ) [Fact (Nat.Prime q)] (p : ) [Fact (Nat.Prime p)] (hpq : p q) (hleg : legendreSym q p = 1) :
                                legendreSqrt q p hpq hleg 0
                                noncomputable def LPS.tupleToSLElement (q : ) [Fact (Nat.Prime q)] (p : ) [Fact (Nat.Prime p)] (hpq : p q) (hleg : legendreSym q p = 1) (x y : ZMod q) (hxy : x ^ 2 + y ^ 2 + 1 = 0) (t : × × × ) (ht : t SpTilde p) :

                                Construct an SL element from the LPS matrix using the Legendre symbol square root.

                                Equations
                                Instances For
                                  theorem LPS.tupleToSL_negConj_mul_self_eq_one (q : ) [Fact (Nat.Prime q)] (p : ) [Fact (Nat.Prime p)] (hpq : p q) (hleg : legendreSym q p = 1) (x y : ZMod q) (hxy : x ^ 2 + y ^ 2 + 1 = 0) (t : × × × ) (ht : t SpTilde p) :
                                  tupleToSLElement q p hpq hleg x y hxy (negConj t) * tupleToSLElement q p hpq hleg x y hxy t ht = 1

                                  tupleToSLElement(negConj t) * tupleToSLElement(t) = 1 in SL.

                                  theorem LPS.projPSL_negConj_eq_self_of_fst_zero (q : ) [Fact (Nat.Prime q)] (p : ) [Fact (Nat.Prime p)] (hpq : p q) (hoddq : q % 2 = 1) (hleg : legendreSym q p = 1) (x y : ZMod q) (hxy : x ^ 2 + y ^ 2 + 1 = 0) (t : × × × ) (ht : t SpTilde p) (ha : t.1 = 0) :
                                  (projPSL q) (tupleToSLElement q p hpq hleg x y hxy (negConj t) ) = (projPSL q) (tupleToSLElement q p hpq hleg x y hxy t ht)

                                  In PSL, projPSL(negConj t) = projPSL(t) when a = 0 (since M(negConj t) = -M(t)).

                                  def LPS.lpsGenSetPSL (q : ) [Fact (Nat.Prime q)] (p : ) [Fact (Nat.Prime p)] (hpq : p q) (hoddp : p % 2 = 1) (hoddq : q % 2 = 1) (hq_gt : q > 2 * p) (hleg : legendreSym q p = 1) (x y : ZMod q) (hxy : x ^ 2 + y ^ 2 + 1 = 0) :

                                  The LPS generating set in PSL(2, q).

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

                                    Satisfiability witnesses for generating set axioms #

                                    theorem LPS.lpsGenSetPGL_satisfiable :
                                    ∃ (q : ) (p : ) (_ : Fact (Nat.Prime q)) (_ : Fact (Nat.Prime p)), p q p % 2 = 1 q % 2 = 1

                                    Witness: lpsGenSetPGL is satisfiable.

                                    theorem LPS.lpsGenSetPSL_satisfiable :
                                    ∃ (q : ) (p : ) (_ : Fact (Nat.Prime q)) (_ : Fact (Nat.Prime p)), p q p % 2 = 1 q % 2 = 1

                                    Witness: lpsGenSetPSL is satisfiable.

                                    axiom LPS.lpsGenSetPGL_card (q : ) [Fact (Nat.Prime q)] (p : ) [Fact (Nat.Prime p)] (hpq : p q) (hoddp : p % 2 = 1) (hoddq : q % 2 = 1) (hq_gt : q > 2 * p) (x y : ZMod q) (hxy : x ^ 2 + y ^ 2 + 1 = 0) :
                                    (lpsGenSetPGL q p hpq hoddp hoddq hq_gt x y hxy).carrier.card = p + 1

                                    The map from Sp to PGL(2,q) is injective (distinct tuples in Sp give distinct projective classes), and |Sp| = p+1 by Jacobi's four-square theorem. The injectivity requires that q > 2√p ensures no two distinct tuples can differ by a scalar multiple mod q. This deep number-theoretic result is not provable from Mathlib.

                                    theorem LPS.lpsGenSetPGL_card_satisfiable :
                                    ∃ (q : ) (p : ) (_ : Fact (Nat.Prime q)) (_ : Fact (Nat.Prime p)), p q p % 2 = 1 q % 2 = 1

                                    Witness: lpsGenSetPGL_card is satisfiable.

                                    axiom LPS.lpsGenSetPSL_card (q : ) [Fact (Nat.Prime q)] (p : ) [Fact (Nat.Prime p)] (hpq : p q) (hoddp : p % 2 = 1) (hoddq : q % 2 = 1) (hq_gt : q > 2 * p) (hleg : legendreSym q p = 1) (x y : ZMod q) (hxy : x ^ 2 + y ^ 2 + 1 = 0) :
                                    (lpsGenSetPSL q p hpq hoddp hoddq hq_gt hleg x y hxy).carrier.card = p + 1

                                    Same as lpsGenSetPGL_card but for the PSL case. The injectivity of the map from Sp to PSL(2,q) via the scaled matrices requires the same deep number-theoretic arguments about quaternion arithmetic modulo q.

                                    theorem LPS.lpsGenSetPSL_card_satisfiable :
                                    ∃ (q : ) (p : ) (_ : Fact (Nat.Prime q)) (_ : Fact (Nat.Prime p)), p q p % 2 = 1 q % 2 = 1

                                    Witness: lpsGenSetPSL_card is satisfiable.

                                    Generation property #

                                    The original statement asserts that S_{p,q} is a generating set of G, i.e., the subgroup generated by S_{p,q} equals all of G. This follows from the strong approximation theorem for quaternion algebras (Lubotzky–Phillips–Sarnak), which is far beyond current Mathlib infrastructure.

                                    axiom LPS.lpsGenSetPGL_generates (q : ) [Fact (Nat.Prime q)] (p : ) [Fact (Nat.Prime p)] (hpq : p q) (hoddp : p % 2 = 1) (hoddq : q % 2 = 1) (hq_gt : q > 2 * p) (x y : ZMod q) (hxy : x ^ 2 + y ^ 2 + 1 = 0) :
                                    Subgroup.closure (lpsGenSetPGL q p hpq hoddp hoddq hq_gt x y hxy).carrier =

                                    S_{p,q} generates all of PGL(2,q): the subgroup closure of the carrier equals the whole group. This is a deep result following from the strong approximation theorem for quaternion algebras (Lubotzky–Phillips–Sarnak).

                                    theorem LPS.lpsGenSetPGL_generates_satisfiable :
                                    ∃ (q : ) (p : ) (_ : Fact (Nat.Prime q)) (_ : Fact (Nat.Prime p)), p q p % 2 = 1 q % 2 = 1

                                    Witness: lpsGenSetPGL_generates premises are satisfiable.

                                    axiom LPS.lpsGenSetPSL_generates (q : ) [Fact (Nat.Prime q)] (p : ) [Fact (Nat.Prime p)] (hpq : p q) (hoddp : p % 2 = 1) (hoddq : q % 2 = 1) (hq_gt : q > 2 * p) (hleg : legendreSym q p = 1) (x y : ZMod q) (hxy : x ^ 2 + y ^ 2 + 1 = 0) :
                                    Subgroup.closure (lpsGenSetPSL q p hpq hoddp hoddq hq_gt hleg x y hxy).carrier =

                                    S_{p,q} generates all of PSL(2,q): the subgroup closure of the carrier equals the whole group. This is a deep result following from the strong approximation theorem for quaternion algebras (Lubotzky–Phillips–Sarnak).

                                    theorem LPS.lpsGenSetPSL_generates_satisfiable :
                                    ∃ (q : ) (p : ) (_ : Fact (Nat.Prime q)) (_ : Fact (Nat.Prime p)), p q p % 2 = 1 q % 2 = 1

                                    Witness: lpsGenSetPSL_generates premises are satisfiable.

                                    The LPS Cayley graphs #

                                    def LPS.lpsGraphPGL (q : ) [Fact (Nat.Prime q)] (p : ) [Fact (Nat.Prime p)] (hpq : p q) (hoddp : p % 2 = 1) (hoddq : q % 2 = 1) (hq_gt : q > 2 * p) (x y : ZMod q) (hxy : x ^ 2 + y ^ 2 + 1 = 0) :

                                    The LPS graph on PGL(2,q): the Cayley graph Cay(PGL(2,q), S_{p,q}). When (p/q) = -1 (Legendre symbol ≠ 1), the group is PGL(2,q).

                                    Equations
                                    Instances For
                                      def LPS.lpsGraphPSL (q : ) [Fact (Nat.Prime q)] (p : ) [Fact (Nat.Prime p)] (hpq : p q) (hoddp : p % 2 = 1) (hoddq : q % 2 = 1) (hq_gt : q > 2 * p) (hleg : legendreSym q p = 1) (x y : ZMod q) (hxy : x ^ 2 + y ^ 2 + 1 = 0) :

                                      The LPS graph on PSL(2,q): the Cayley graph Cay(PSL(2,q), S_{p,q}). When (p/q) = 1 (Legendre symbol = 1), the group is PSL(2,q).

                                      Equations
                                      Instances For

                                        DecidableRel instances #

                                        instance LPS.lpsGraphPGL_decidableAdj (q : ) [Fact (Nat.Prime q)] (p : ) [Fact (Nat.Prime p)] (hpq : p q) (hoddp : p % 2 = 1) (hoddq : q % 2 = 1) (hq_gt : q > 2 * p) (x y : ZMod q) (hxy : x ^ 2 + y ^ 2 + 1 = 0) :
                                        DecidableRel (lpsGraphPGL q p hpq hoddp hoddq hq_gt x y hxy).Adj
                                        Equations
                                        instance LPS.lpsGraphPSL_decidableAdj (q : ) [Fact (Nat.Prime q)] (p : ) [Fact (Nat.Prime p)] (hpq : p q) (hoddp : p % 2 = 1) (hoddq : q % 2 = 1) (hq_gt : q > 2 * p) (hleg : legendreSym q p = 1) (x y : ZMod q) (hxy : x ^ 2 + y ^ 2 + 1 = 0) :
                                        DecidableRel (lpsGraphPSL q p hpq hoddp hoddq hq_gt hleg x y hxy).Adj
                                        Equations

                                        Regularity #

                                        theorem LPS.lpsGraphPGL_isRegularOfDegree (q : ) [Fact (Nat.Prime q)] (p : ) [Fact (Nat.Prime p)] (hpq : p q) (hoddp : p % 2 = 1) (hoddq : q % 2 = 1) (hq_gt : q > 2 * p) (x y : ZMod q) (hxy : x ^ 2 + y ^ 2 + 1 = 0) :
                                        (lpsGraphPGL q p hpq hoddp hoddq hq_gt x y hxy).IsRegularOfDegree (p + 1)

                                        The LPS graph on PGL is (p+1)-regular.

                                        theorem LPS.lpsGraphPSL_isRegularOfDegree (q : ) [Fact (Nat.Prime q)] (p : ) [Fact (Nat.Prime p)] (hpq : p q) (hoddp : p % 2 = 1) (hoddq : q % 2 = 1) (hq_gt : q > 2 * p) (hleg : legendreSym q p = 1) (x y : ZMod q) (hxy : x ^ 2 + y ^ 2 + 1 = 0) :
                                        (lpsGraphPSL q p hpq hoddp hoddq hq_gt hleg x y hxy).IsRegularOfDegree (p + 1)

                                        The LPS graph on PSL is (p+1)-regular.

                                        Independence of the choice of (x, y) #

                                        axiom LPS.lpsGraphPGL_independent_of_xy (q : ) [Fact (Nat.Prime q)] (p : ) [Fact (Nat.Prime p)] (hpq : p q) (hoddp : p % 2 = 1) (hoddq : q % 2 = 1) (hq_gt : q > 2 * p) (x₁ y₁ : ZMod q) (hxy₁ : x₁ ^ 2 + y₁ ^ 2 + 1 = 0) (x₂ y₂ : ZMod q) (hxy₂ : x₂ ^ 2 + y₂ ^ 2 + 1 = 0) :
                                        Nonempty (lpsGraphPGL q p hpq hoddp hoddq hq_gt x₁ y₁ hxy₁ ≃g lpsGraphPGL q p hpq hoddp hoddq hq_gt x₂ y₂ hxy₂)

                                        For any two pairs (x₁,y₁), (x₂,y₂) with xᵢ²+yᵢ²+1=0, there exists g ∈ GL(2,𝔽_q) conjugating one quaternion embedding to the other, inducing a graph isomorphism via h ↦ ghg⁻¹. The proof requires constructing an explicit element of the orthogonal group of the norm form x²+y²+1 over 𝔽_q, which requires algebraic infrastructure not available in Mathlib.

                                        theorem LPS.lpsGraphPGL_independent_of_xy_satisfiable :
                                        ∃ (q : ) (p : ) (_ : Fact (Nat.Prime q)) (_ : Fact (Nat.Prime p)), p q p % 2 = 1 q % 2 = 1

                                        Witness: lpsGraphPGL_independent_of_xy is satisfiable.

                                        axiom LPS.lpsGraphPSL_independent_of_xy (q : ) [Fact (Nat.Prime q)] (p : ) [Fact (Nat.Prime p)] (hpq : p q) (hoddp : p % 2 = 1) (hoddq : q % 2 = 1) (hq_gt : q > 2 * p) (hleg : legendreSym q p = 1) (x₁ y₁ : ZMod q) (hxy₁ : x₁ ^ 2 + y₁ ^ 2 + 1 = 0) (x₂ y₂ : ZMod q) (hxy₂ : x₂ ^ 2 + y₂ ^ 2 + 1 = 0) :
                                        Nonempty (lpsGraphPSL q p hpq hoddp hoddq hq_gt hleg x₁ y₁ hxy₁ ≃g lpsGraphPSL q p hpq hoddp hoddq hq_gt hleg x₂ y₂ hxy₂)

                                        Same as lpsGraphPGL_independent_of_xy but for the PSL case. The conjugation by g ∈ GL(2,𝔽_q) preserves SL(2,𝔽_q) up to scaling, hence descends to PSL(2,q). Requires the same orthogonal group infrastructure.

                                        theorem LPS.lpsGraphPSL_independent_of_xy_satisfiable :
                                        ∃ (q : ) (p : ) (_ : Fact (Nat.Prime q)) (_ : Fact (Nat.Prime p)), p q p % 2 = 1 q % 2 = 1

                                        Witness: lpsGraphPSL_independent_of_xy is satisfiable.