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 2K)) :

    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 2K)) :
      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} ( : 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} ( : Irreducible ϖ) (f : ι) (i : ι) :
          (b.twist 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} ( : 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} ( : Irreducible ϖ) (f : ι) (i : ι) :
            (b.ntwist 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 2K)) {ϖ : R} ( : Irreducible ϖ) (n m : ) :
            Basis (Fin 2) K (Fin 2K)

            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 2K)) {ϖ : R} ( : Irreducible ϖ) (n m : ) :
              (b.twist₂ 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 2K)) {ϖ : R} ( : Irreducible ϖ) (n m : ) :
              (b.twist₂ 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 2K)) {ϖ : R} ( : Irreducible ϖ) (n m : ) :
              Basis (Fin 2) K (Fin 2K)

              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 2K)) {ϖ : R} ( : Irreducible ϖ) (n m : ) :
                (b.ntwist₂ 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 2K)) {ϖ : R} ( : Irreducible ϖ) (n m : ) :
                (b.ntwist₂ 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} ( : Irreducible ϖ) (f g : ι) :
                (b.twist f).toSubmodule (b.twist 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} ( : Irreducible ϖ) (f g : ι) :
                (b.twist f).toSubmodule = (b.twist 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} ( : Irreducible ϖ) (f g : ι) :
                (b.twist f).toSubmodule < (b.twist 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 2K)) {ϖ : R} ( : Irreducible ϖ) (n₁ m₁ n₂ m₂ : ) :
                (b.twist₂ n₁ m₁).toSubmodule (b.twist₂ 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 2K)) {ϖ : R} ( : Irreducible ϖ) (n₁ m₁ n₂ m₂ : ) :
                (b.twist₂ n₁ m₁).toSubmodule = (b.twist₂ 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 2K)) {ϖ : R} ( : Irreducible ϖ) (n₁ m₁ n₂ m₂ : ) :
                (b.ntwist₂ n₁ m₁).toSubmodule (b.ntwist₂ 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 2K)

                  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 2K)) :
                      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 2K)) (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
                          @[implicit_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 2K)) :
                          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} ( : Irreducible ϖ) (f : ι) :
                          g b.twist f = (g b).twist 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
                            @[implicit_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} ( : Irreducible ϖ) (f : ι) :
                            ϖ (b.twist f).toSubmodule = (b.twist (f + 1)).toSubmodule
                            theorem Module.Basis.smul_ntwist₂ {K : Type u_1} [Field K] {R : Subring K} (b : Basis (Fin 2) K (Fin 2K)) {ϖ : R} ( : Irreducible ϖ) (n m : ) :
                            ϖ (b.ntwist₂ n m).toSubmodule = (b.ntwist₂ (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} ( : Irreducible ϖ) (f : ι) (k : ) :
                            ϖ ^ k (b.twist f).toSubmodule = (b.twist (f + k)).toSubmodule
                            theorem Module.Basis.smul_pow_twist₂ {K : Type u_1} [Field K] {R : Subring K} (b : Basis (Fin 2) K (Fin 2K)) {ϖ : R} ( : Irreducible ϖ) (n m k : ) :
                            ϖ ^ k (b.twist₂ n m).toSubmodule = (b.twist₂ (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} ( : Irreducible ϖ) :
                            b.twist 0 = b
                            theorem Module.Basis.ntwist₂_zero_zero {K : Type u_1} [Field K] {R : Subring K} (b : Basis (Fin 2) K (Fin 2K)) {ϖ : R} ( : Irreducible ϖ) :
                            b.ntwist₂ 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 2K)) {ϖ : R} ( : Irreducible ϖ) {n₁ m₁ n₂ m₂ : } (hn : n₂ n₁) (hm : m₂ m₁) :
                            (b.ntwist₂ n₁ m₁).toSubmodule (b.ntwist₂ n₂ m₂).toSubmodule
                            theorem Module.Basis.ntwist₂_toSubmodule_le {K : Type u_1} [Field K] {R : Subring K} (b : Basis (Fin 2) K (Fin 2K)) {ϖ : R} ( : Irreducible ϖ) (n m : ) :
                            theorem Module.Basis.ntwist₂_ntwist₂ {K : Type u_1} [Field K] {R : Subring K} (b : Basis (Fin 2) K (Fin 2K)) {ϖ : R} ( : Irreducible ϖ) (n₁ m₁ n₂ m₂ : ) :
                            (b.ntwist₂ n₁ m₁).ntwist₂ n₂ m₂ = b.ntwist₂ (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 {K : Type u_1} [Field K] (b : Basis (Fin 2) K (Fin 2K)) :
                              Basis (Fin 2) K (Fin 2K)

                              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 2K)) :
                                b.swap 0 = b 1
                                @[simp]
                                theorem Module.Basis.swap_apply₁ {K : Type u_1} [Field K] (b : Basis (Fin 2) K (Fin 2K)) :
                                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 2K)) :
                                noncomputable def Module.Basis.swapMatrix {K : Type u_1} [Field K] (b : Basis (Fin 2) K (Fin 2K)) :
                                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 2K)) {ϖ : R} ( : 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 2K)) {ϖ : R} ( : Irreducible ϖ) (y : b.toSubmodule) {n m : } (hy : y (b.ntwist₂ 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 2K)) [IsLattice L] (M : Submodule (↥R) (Fin 2K)) (h₁ : M L) (h₂ : IsLocalRing.maximalIdeal R L M) :