Documentation

LeanPool.BruhatTits.Lattice.Construction

Basic constructions and operations on lattices #

In this file we provide the infrastructure for going back and forth between K-bases of Fin 2 → K and R-lattices. Also we provide operations on bases, such as twisting by units of K and permutations of the basis.

The main definition is Basis.toLattice which, given a basis b of Fin 2 → K constructs the lattice spanned by the entries of b. The API is built around this definition in the following sense: Every operation on lattices comes with API lemmas showing the interaction with Basis.toLattice, reducing it to an operation on bases. In a general situation, try to use the induction principle of equality (i.e. the subst tactic) to replace arbitrary lattices with b.toLattice for a suitable basis.

Most constructions work for an arbitrary subring R of a field K.

Main definitions #

noncomputable def Module.Basis.toSubmodule {K : Type u_1} [Field K] {R : Subring K} {ι : Type u_2} (b : Basis ι K (ι → K)) :
Submodule (↥R) (ι → K)

From a ι-indexed basis b of ι → K, we obtain an R submodule of ι → K generated by the entries of b.

Equations
Instances For
    theorem Module.Basis.self_mem_toSubmodule {K : Type u_1} [Field K] {R : Subring K} {ι : Type u_2} (b : Basis ι K (ι → K)) (i : ι) :
    theorem Module.Basis.toSubmodule_isLattice {K : Type u_1} [Field K] {R : Subring K} {ι : Type u_2} [Finite ι] (b : Basis ι K (ι → K)) :
    noncomputable def Module.Basis.toLattice {K : Type u_1} [Field K] {R : Subring K} (b : Basis (Fin 2) K (Fin 2 → K)) :

    Given a K-basis of K^2, this is the R-lattice generated by the entries of b.

    This is the normal form of a lattice in our API and for every operation on lattices suitable simp lemmas should be provided for lattices given by Basis.toLattice.

    If possible, in proofs use the induction principle of equality (i.e. the subst tactic) to replace all occurring lattices by invocations of Basis.toLattice.

    Equations
    Instances For
      @[simp]
      theorem Module.Basis.toLattice_module {K : Type u_1} [Field K] {R : Subring K} (b : Basis (Fin 2) K (Fin 2 → K)) :
      noncomputable def Module.Basis.twist' {K : Type u_1} [Field K] {ι : Type u_2} [Fintype ι] (b : Basis ι K (ι → K)) (f : ι → Kˣ) :
      Basis ι K (ι → K)

      If b is a K-basis of ι → K and f : ι → Kˣ a family of invertible elements of K, this is the basis of ι → K obtained by multiplying i-th entry of b by f i.

      Equations
      Instances For
        @[simp]
        theorem Module.Basis.twist'_apply {K : Type u_1} [Field K] {ι : Type u_2} [Fintype ι] (b : Basis ι K (ι → K)) (f : ι → Kˣ) (i : ι) :
        (b.twist' f) i = f i • b i
        noncomputable def Module.Basis.twist {K : Type u_1} [Field K] {R : Subring K} {ι : Type u_2} [Fintype ι] (b : Basis ι K (ι → K)) {ϖ : ↥R} (hϖ : Irreducible ϖ) (f : ι → ℤ) :
        Basis ι K (ι → K)

        Given integer exponents f and a uniformizer ϖ, we may twist a basis b by b i ↦ ϖ.val ^ f i • b i.

        Equations
        Instances For
          @[simp]
          theorem Module.Basis.twist_apply {K : Type u_1} [Field K] {R : Subring K} {ι : Type u_2} [Fintype ι] (b : Basis ι K (ι → K)) {ϖ : ↥R} (hϖ : Irreducible ϖ) (f : ι → ℤ) (i : ι) :
          (b.twist hϖ f) i = ↑ϖ ^ f i • b i
          noncomputable def Module.Basis.ntwist {K : Type u_1} [Field K] {R : Subring K} {ι : Type u_2} [Fintype ι] (b : Basis ι K (ι → K)) {ϖ : ↥R} (hϖ : Irreducible ϖ) (f : ι → ℕ) :
          Basis ι K (ι → K)

          twist but for natural exponents.

          Equations
          Instances For
            @[simp]
            theorem Module.Basis.ntwist_apply {K : Type u_1} [Field K] {R : Subring K} {ι : Type u_2} [Fintype ι] (b : Basis ι K (ι → K)) {ϖ : ↥R} (hϖ : Irreducible ϖ) (f : ι → ℕ) (i : ι) :
            (b.ntwist hϖ f) i = ϖ ^ f i • b i
            noncomputable def Module.Basis.twist₂ {K : Type u_1} [Field K] {R : Subring K} (b : Basis (Fin 2) K (Fin 2 → K)) {ϖ : ↥R} (hϖ : Irreducible ϖ) (n m : ℤ) :
            Basis (Fin 2) K (Fin 2 → K)

            twist specialized to dimension two.

            Equations
            Instances For
              @[simp]
              theorem Module.Basis.twist₂_apply₀ {K : Type u_1} [Field K] {R : Subring K} (b : Basis (Fin 2) K (Fin 2 → K)) {ϖ : ↥R} (hϖ : Irreducible ϖ) (n m : ℤ) :
              (b.twist₂ hϖ n m) 0 = ↑ϖ ^ n • b 0
              @[simp]
              theorem Module.Basis.twist₂_apply₁ {K : Type u_1} [Field K] {R : Subring K} (b : Basis (Fin 2) K (Fin 2 → K)) {ϖ : ↥R} (hϖ : Irreducible ϖ) (n m : ℤ) :
              (b.twist₂ hϖ n m) 1 = ↑ϖ ^ m • b 1
              noncomputable def Module.Basis.ntwist₂ {K : Type u_1} [Field K] {R : Subring K} (b : Basis (Fin 2) K (Fin 2 → K)) {ϖ : ↥R} (hϖ : Irreducible ϖ) (n m : ℕ) :
              Basis (Fin 2) K (Fin 2 → K)

              twist₂ for natural exponents.

              Equations
              Instances For
                @[simp]
                theorem Module.Basis.ntwist₂_apply₀ {K : Type u_1} [Field K] {R : Subring K} (b : Basis (Fin 2) K (Fin 2 → K)) {ϖ : ↥R} (hϖ : Irreducible ϖ) (n m : ℕ) :
                (b.ntwist₂ hϖ n m) 0 = ϖ ^ n • b 0
                @[simp]
                theorem Module.Basis.ntwist₂_apply₁ {K : Type u_1} [Field K] {R : Subring K} (b : Basis (Fin 2) K (Fin 2 → K)) {ϖ : ↥R} (hϖ : Irreducible ϖ) (n m : ℕ) :
                (b.ntwist₂ hϖ n m) 1 = ϖ ^ m • b 1
                theorem Module.Basis.twist_le_twist_iff {K : Type u_1} [Field K] {R : Subring K} {ι : Type u_2} [Fintype ι] (b : Basis ι K (ι → K)) {ϖ : ↥R} (hϖ : Irreducible ϖ) (f g : ι → ℤ) :
                (b.twist hϖ f).toSubmodule ≤ (b.twist hϖ g).toSubmodule ↔ g ≤ f
                theorem Module.Basis.twist_eq_twist_iff {K : Type u_1} [Field K] {R : Subring K} {ι : Type u_2} [Fintype ι] (b : Basis ι K (ι → K)) {ϖ : ↥R} (hϖ : Irreducible ϖ) (f g : ι → ℤ) :
                (b.twist hϖ f).toSubmodule = (b.twist hϖ g).toSubmodule ↔ g = f
                theorem Module.Basis.twist_lt_twist_iff {K : Type u_1} [Field K] {R : Subring K} {ι : Type u_2} [Fintype ι] (b : Basis ι K (ι → K)) {ϖ : ↥R} (hϖ : Irreducible ϖ) (f g : ι → ℤ) :
                (b.twist hϖ f).toSubmodule < (b.twist hϖ g).toSubmodule ↔ g ≤ f ∧ ∃ (i : ι), g i < f i
                theorem Module.Basis.twist₂_le_twist₂_iff {K : Type u_1} [Field K] {R : Subring K} (b : Basis (Fin 2) K (Fin 2 → K)) {ϖ : ↥R} (hϖ : Irreducible ϖ) (n₁ m₁ n₂ m₂ : ℤ) :
                (b.twist₂ hϖ n₁ m₁).toSubmodule ≤ (b.twist₂ hϖ n₂ m₂).toSubmodule ↔ n₂ ≤ n₁ ∧ m₂ ≤ m₁
                theorem Module.Basis.twist₂_eq_twist₂_iff {K : Type u_1} [Field K] {R : Subring K} (b : Basis (Fin 2) K (Fin 2 → K)) {ϖ : ↥R} (hϖ : Irreducible ϖ) (n₁ m₁ n₂ m₂ : ℤ) :
                (b.twist₂ hϖ n₁ m₁).toSubmodule = (b.twist₂ hϖ n₂ m₂).toSubmodule ↔ n₂ = n₁ ∧ m₂ = m₁
                theorem Module.Basis.ntwist₂_le_ntwist₂_iff {K : Type u_1} [Field K] {R : Subring K} (b : Basis (Fin 2) K (Fin 2 → K)) {ϖ : ↥R} (hϖ : Irreducible ϖ) (n₁ m₁ n₂ m₂ : ℕ) :
                (b.ntwist₂ hϖ n₁ m₁).toSubmodule ≤ (b.ntwist₂ hϖ n₂ m₂).toSubmodule ↔ n₂ ≤ n₁ ∧ m₂ ≤ m₁
                noncomputable def Module.Basis.fromSubmoduleOfIsLattice {K : Type u_1} [Field K] {R : Subring K} {ι : Type u_2} [IsFractionRing (↥R) K] [Fintype ι] {M : Submodule (↥R) (ι → K)} [IsLattice M] (b : Basis ι ↥R ↥M) :
                Basis ι K (ι → K)

                If M is a lattice, every R-basis of M is also a K-basis of ι → K.

                Equations
                Instances For
                  @[simp]
                  theorem Module.Basis.fromSubmoduleOfIsLattice_apply {K : Type u_1} [Field K] {R : Subring K} {ι : Type u_2} [IsFractionRing (↥R) K] [Fintype ι] {M : Submodule (↥R) (ι → K)} [IsLattice M] (b : Basis ι ↥R ↥M) (i : ι) :
                  noncomputable def Module.Basis.fromLattice {K : Type u_1} [Field K] {R : Subring K} [IsFractionRing (↥R) K] {M : BruhatTits.Lattice R} (b : Basis (Fin 2) ↥R ↥M.M) :
                  Basis (Fin 2) K (Fin 2 → K)

                  If M is an R-lattice, every R-basis of M is also a K-basis of Fin 2 → K.

                  Equations
                  Instances For
                    @[simp]
                    theorem Module.Basis.fromLattice_apply {K : Type u_1} [Field K] {R : Subring K} [IsFractionRing (↥R) K] {M : BruhatTits.Lattice R} (b : Basis (Fin 2) ↥R ↥M.M) (i : Fin 2) :
                    b.fromLattice i = ↑(b i)
                    @[simp]
                    theorem Module.Basis.toSubmodule_fromLattice {K : Type u_1} [Field K] {R : Subring K} {ι : Type u_2} [IsFractionRing (↥R) K] [Fintype ι] {M : Submodule (↥R) (ι → K)} [IsLattice M] (b : Basis ι ↥R ↥M) :
                    @[simp]
                    theorem Module.Basis.toLattice_fromLattice {K : Type u_1} [Field K] {R : Subring K} [IsFractionRing (↥R) K] {M : BruhatTits.Lattice R} (b : Basis (Fin 2) ↥R ↥M.M) :
                    noncomputable def Module.Basis.restrict {K : Type u_1} [Field K] {R : Subring K} {ι : Type u_2} [IsFractionRing (↥R) K] [Fintype ι] (b : Basis ι K (ι → K)) :
                    Basis ι ↥R ↥b.toSubmodule

                    If b is a K-basis of ι → K, it is naturally an R-basis of the R-submodule generated by the entries of b.

                    Equations
                    Instances For
                      @[simp]
                      theorem Module.Basis.restrict_apply {K : Type u_1} [Field K] {R : Subring K} {ι : Type u_2} [IsFractionRing (↥R) K] [Fintype ι] (b : Basis ι K (ι → K)) (i : ι) :
                      ↑(b.restrict i) = b i
                      noncomputable def Module.Basis.restrictToLattice {K : Type u_1} [Field K] {R : Subring K} [IsFractionRing (↥R) K] (b : Basis (Fin 2) K (Fin 2 → K)) :
                      Basis (Fin 2) ↥R ↥b.toLattice.M

                      If b is a K-basis of Fin 2 → K, it is naturally an R-basis of the R-lattice generated by the entries of b.

                      Equations
                      Instances For
                        theorem Module.Basis.restrictToLattice_apply {K : Type u_1} [Field K] {R : Subring K} [IsFractionRing (↥R) K] (b : Basis (Fin 2) K (Fin 2 → K)) (i : Fin 2) :
                        ↑(b.restrictToLattice i) = b i
                        noncomputable def Module.Basis.smulGL {K : Type u_1} [Field K] {ι : Type u_2} [DecidableEq ι] [Fintype ι] (g : GL ι K) (b : Basis ι K (ι → K)) :
                        Basis ι K (ι → K)

                        Scalar multiplication by GL ι K on ι-indexed bases of ι → K.

                        Equations
                        Instances For
                          @[instance_reducible]
                          noncomputable instance Module.Basis.instSMulGeneralLinearGroupForallLeanPool {K : Type u_1} [Field K] {ι : Type u_2} [DecidableEq ι] [Fintype ι] :
                          SMul (GL ι K) (Basis ι K (ι → K))
                          Equations
                          theorem Module.Basis.smulGL_def {K : Type u_1} [Field K] {ι : Type u_2} [DecidableEq ι] [Fintype ι] (g : GL ι K) (b : Basis ι K (ι → K)) :
                          @[simp]
                          theorem Module.Basis.smulGL_apply {K : Type u_1} [Field K] {ι : Type u_2} [DecidableEq ι] [Fintype ι] (g : GL ι K) (b : Basis ι K (ι → K)) (i : ι) :
                          (g • b) i = (↑g).mulVec (b i)
                          theorem Module.Basis.smulGL_toSubmodule {K : Type u_1} [Field K] {R : Subring K} {ι : Type u_2} [DecidableEq ι] [Fintype ι] (g : GL ι K) (b : Basis ι K (ι → K)) :
                          theorem Module.Basis.smulGL_toLattice {K : Type u_1} [Field K] {R : Subring K} (g : GL (Fin 2) K) (b : Basis (Fin 2) K (Fin 2 → K)) :
                          theorem Module.Basis.smulGL_twist {K : Type u_1} [Field K] {R : Subring K} {ι : Type u_2} [DecidableEq ι] [Fintype ι] (g : GL ι K) (b : Basis ι K (ι → K)) {ϖ : ↥R} (hϖ : Irreducible ϖ) (f : ι → ℤ) :
                          g • b.twist hϖ f = (g • b).twist hϖ f
                          theorem Module.Basis.smulGL_toGeneralLinearGroup {K : Type u_1} [Field K] {ι : Type u_2} [DecidableEq ι] [Fintype ι] (g : GL ι K) (b : Basis ι K (ι → K)) :
                          noncomputable def Module.Basis.smul' {K : Type u_1} [Field K] {ι : Type u_2} [Fintype ι] (a : Kˣ) (b : Basis ι K (ι → K)) :
                          Basis ι K (ι → K)

                          Scalar multiplication of units of K on bases of ι → K by twisting.

                          Equations
                          Instances For
                            @[instance_reducible]
                            noncomputable instance Module.Basis.instSMulUnitsForallLeanPool {K : Type u_1} [Field K] {ι : Type u_2} [Fintype ι] :
                            SMul Kˣ (Basis ι K (ι → K))
                            Equations
                            theorem Module.Basis.smul'_def {K : Type u_1} [Field K] {ι : Type u_2} [Fintype ι] (a : Kˣ) (b : Basis ι K (ι → K)) :
                            a • b = b.twist' fun (x : ι) => a
                            @[simp]
                            theorem Module.Basis.smul'_apply {K : Type u_1} [Field K] {ι : Type u_2} [Fintype ι] (a : Kˣ) (b : Basis ι K (ι → K)) (i : ι) :
                            (a • b) i = a • b i
                            theorem Module.Basis.smul_toSubmodule {K : Type u_1} [Field K] {R : Subring K} {ι : Type u_2} [Fintype ι] (a : Kˣ) (b : Basis ι K (ι → K)) :
                            theorem Module.Basis.smul_twist {K : Type u_1} [Field K] {R : Subring K} {ι : Type u_2} [Fintype ι] (b : Basis ι K (ι → K)) {ϖ : ↥R} (hϖ : Irreducible ϖ) (f : ι → ℤ) :
                            ϖ • (b.twist hϖ f).toSubmodule = (b.twist hϖ (f + 1)).toSubmodule
                            theorem Module.Basis.smul_ntwist₂ {K : Type u_1} [Field K] {R : Subring K} (b : Basis (Fin 2) K (Fin 2 → K)) {ϖ : ↥R} (hϖ : Irreducible ϖ) (n m : ℕ) :
                            ϖ • (b.ntwist₂ hϖ n m).toSubmodule = (b.ntwist₂ hϖ (n + 1) (m + 1)).toSubmodule
                            theorem Module.Basis.smul_pow_twist {K : Type u_1} [Field K] {R : Subring K} {ι : Type u_2} [Fintype ι] (b : Basis ι K (ι → K)) {ϖ : ↥R} (hϖ : Irreducible ϖ) (f : ι → ℤ) (k : ℤ) :
                            ↑ϖ ^ k • (b.twist hϖ f).toSubmodule = (b.twist hϖ (f + ↑k)).toSubmodule
                            theorem Module.Basis.smul_pow_twist₂ {K : Type u_1} [Field K] {R : Subring K} (b : Basis (Fin 2) K (Fin 2 → K)) {ϖ : ↥R} (hϖ : Irreducible ϖ) (n m k : ℤ) :
                            ↑ϖ ^ k • (b.twist₂ hϖ n m).toSubmodule = (b.twist₂ hϖ (n + k) (m + k)).toSubmodule
                            theorem Module.Basis.twist_zero {K : Type u_1} [Field K] {R : Subring K} {ι : Type u_2} [Fintype ι] (b : Basis ι K (ι → K)) {ϖ : ↥R} (hϖ : Irreducible ϖ) :
                            b.twist hϖ 0 = b
                            theorem Module.Basis.ntwist₂_zero_zero {K : Type u_1} [Field K] {R : Subring K} (b : Basis (Fin 2) K (Fin 2 → K)) {ϖ : ↥R} (hϖ : Irreducible ϖ) :
                            b.ntwist₂ hϖ 0 0 = b
                            theorem Module.Basis.ntwist₂_toSubmodule_le_ntwist₂_toSubmodule {K : Type u_1} [Field K] {R : Subring K} (b : Basis (Fin 2) K (Fin 2 → K)) {ϖ : ↥R} (hϖ : Irreducible ϖ) {n₁ m₁ n₂ m₂ : ℕ} (hn : n₂ ≤ n₁) (hm : m₂ ≤ m₁) :
                            (b.ntwist₂ hϖ n₁ m₁).toSubmodule ≤ (b.ntwist₂ hϖ n₂ m₂).toSubmodule
                            theorem Module.Basis.ntwist₂_toSubmodule_le {K : Type u_1} [Field K] {R : Subring K} (b : Basis (Fin 2) K (Fin 2 → K)) {ϖ : ↥R} (hϖ : Irreducible ϖ) (n m : ℕ) :
                            theorem Module.Basis.ntwist₂_ntwist₂ {K : Type u_1} [Field K] {R : Subring K} (b : Basis (Fin 2) K (Fin 2 → K)) {ϖ : ↥R} (hϖ : Irreducible ϖ) (n₁ m₁ n₂ m₂ : ℕ) :
                            (b.ntwist₂ hϖ n₁ m₁).ntwist₂ hϖ n₂ m₂ = b.ntwist₂ hϖ (n₁ + n₂) (m₁ + m₂)
                            noncomputable def Module.Basis.permMatrix {K : Type u_1} [Field K] {ι : Type u_2} [Fintype ι] [DecidableEq ι] (b : Basis ι K (ι → K)) (e : ι ≃ ι) :
                            GL ι K

                            Given a basis b of ι → K and a permutation of the basis vectors, this is the matrix representing the K-automorphisms induced by the permutation.

                            Equations
                            Instances For
                              theorem Module.Basis.permMatrix_smul_toSubmodule {K : Type u_1} [Field K] {R : Subring K} {ι : Type u_2} [Fintype ι] [DecidableEq ι] (b : Basis ι K (ι → K)) (e : ι ≃ ι) :
                              noncomputable def Module.Basis.swap₂ :
                              Fin 2 ≃ Fin 2

                              The permutation exchanging the two indices of a rank-two basis.

                              Equations
                              • One or more equations did not get rendered due to their size.
                              Instances For
                                noncomputable def Module.Basis.swap {K : Type u_1} [Field K] (b : Basis (Fin 2) K (Fin 2 → K)) :
                                Basis (Fin 2) K (Fin 2 → K)

                                Swap the entries of a basis of Fin 2 → K.

                                Equations
                                Instances For
                                  @[simp]
                                  theorem Module.Basis.swap_apply₀ {K : Type u_1} [Field K] (b : Basis (Fin 2) K (Fin 2 → K)) :
                                  b.swap 0 = b 1
                                  @[simp]
                                  theorem Module.Basis.swap_apply₁ {K : Type u_1} [Field K] (b : Basis (Fin 2) K (Fin 2 → K)) :
                                  b.swap 1 = b 0
                                  theorem Module.Basis.swap_toSubmodule {K : Type u_1} [Field K] {R : Subring K} (b : Basis (Fin 2) K (Fin 2 → K)) :
                                  noncomputable def Module.Basis.swapMatrix {K : Type u_1} [Field K] (b : Basis (Fin 2) K (Fin 2 → K)) :
                                  GL (Fin 2) K

                                  The swap matrix associated to a basis b: the invertible matrix acting on Fin 2 → K by swapping the entries of b.

                                  Equations
                                  Instances For
                                    theorem Module.Basis.swapMatrix_smul_ntwist₂ {K : Type u_1} [Field K] {R : Subring K} (b : Basis (Fin 2) K (Fin 2 → K)) {ϖ : ↥R} (hϖ : Irreducible ϖ) (n m : ℕ) :
                                    theorem Module.Basis.is_linear_comb_of_mem_ntwist {K : Type u_1} [Field K] {R : Subring K} [IsFractionRing (↥R) K] (b : Basis (Fin 2) K (Fin 2 → K)) {ϖ : ↥R} (hϖ : Irreducible ϖ) (y : ↥b.toSubmodule) {n m : ℕ} (hy : ↑y ∈ (b.ntwist₂ hϖ n m).toSubmodule) :
                                    ∃ (α : ↥R) (β : ↥R), y = α • ϖ ^ n • b.restrict 0 + β • ϖ ^ m • b.restrict 1
                                    noncomputable def Lattice.standard {K : Type u_1} [Field K] (R : Subring K) :

                                    The standard R-lattice R ⊕ R.

                                    Equations
                                    Instances For
                                      theorem Lattice.standard_M {K : Type u_1} [Field K] {R : Subring K} :
                                      theorem IsLattice.of_le_of_isLattice_right {K : Type u_1} [Field K] {R : Subring K} [IsDiscreteValuationRing ↥R] (L : Submodule (↥R) (Fin 2 → K)) [IsLattice L] (M : Submodule (↥R) (Fin 2 → K)) (h₁ : M ≤ L) (h₂ : IsLocalRing.maximalIdeal ↥R • L ≤ M) :