Documentation

LeanPool.CCDN.ArithmeticHeights.Matrix

The height of a matrix #

The height of a matrix here is the sup-norm height of the tuple of its entries. Row-space heights instead use the tuple of maximal minors and belong to Layer 3. Bombieri–Vaaler's H(A) is the absolute Arakelov height of those minors, using Euclidean norms at infinity. This file uses Matrix.mulHeight for the sup-norm entry height.

The content of the file is four bounds.

The Leibniz expansion carries the signs of the permutations, so the tuple sum bound is used here through Height.mulHeight_sum_sign_comp_le', a version whose summands may be multiplied by ±1. That version is deduced from the unsigned one by doubling the alphabet with a Bool, whose two letters 1 and -1 have height 1.

Main definitions #

Main results #

Implementation notes #

Matrix m n K is definitionally m → n → K, and Height.mulHeight takes a tuple, so Matrix.mulHeight is the height of fun q : m × n ↦ A q.1 q.2. Every statement about re-indexing is then a statement about Prod.map, and transpose is Equiv.prodComm.

The finiteness hypotheses are Finite wherever the height alone is involved and Fintype only where a matrix product or a determinant is formed.

Height.mulHeight_sum_sign_comp_le' belongs next to the unsigned tuple sum bound of Layer 2.4; it is here because the determinant is the only consumer so far.

References #

E. Bombieri and W. Gubler, Heights in Diophantine Geometry, Cambridge University Press (2006), 2.9.8 (p. 75) for the entry-tuple height H(A), and Definition 2.8.1 with 2.8.2–2.8.3 (pp. 66–67) for the local Euclidean factors and absolute Arakelov normalization. Definition 2.8.11 instead concerns the Grassmannian row-space height, treated separately in ArithmeticHeights.RowSpace.

This is Layer 2.5 of the ArithmeticHeights roadmap.

theorem Height.mulHeight_sum_sign_comp_le' {K : Type u_1} [Field K] [AdmissibleAbsValues K] {α : Type u_2} {ι : Type u_3} {κ : Type u_4} [Finite ι] [Finite κ] {n : ℕ} (hn : 0 < n) {s : ι → Finset α} (hs : ∀ (i : ι), (s i).card ≤ n) {ε : α → ι → K} (hε : ∀ (a : α) (i : ι), ε a i = 1 ∨ ε a i = -1) (f : α → ι → κ) (w : κ → K) :
(mulHeight fun (i : ι) => ∑ a ∈ s i, ε a i * w (f a i)) ≤ ↑n ^ totalWeight K * mulHeight w

The signed tuple sum bound. Height.mulHeight_sum_comp_le' with each summand allowed a sign: if in each coordinate i at most n entries of one tuple w, each possibly negated, are summed, the height of the tuple of sums is at most n ^ totalWeight K times mulHeight w.

Signs cost nothing, because v (-x) = v x at every absolute value. Formally this is the unsigned bound for the doubled alphabet κ × Bool, whose height is mulHeight w by the Segre relation and Height.mulHeight_boolSign. The Leibniz expansion of a determinant is the intended consumer.

noncomputable def Matrix.mulHeight {K : Type u_1} [Field K] [Height.AdmissibleAbsValues K] {m : Type u_2} {n : Type u_3} (A : Matrix m n K) :

The height of a matrix is the sup-norm height of the tuple of its entries, corresponding to the entry-tuple construction in Bombieri–Gubler 2.9.8. Bombieri–Vaaler's H(A) instead uses the absolute Arakelov height of the maximal minors.

Equations
Instances For
    noncomputable def Matrix.logHeight {K : Type u_1} [Field K] [Height.AdmissibleAbsValues K] {m : Type u_2} {n : Type u_3} (A : Matrix m n K) :

    The logarithmic height of a matrix. As everywhere in this development, the logarithmic height is defined as the logarithm of the multiplicative one and never independently.

    Equations
    Instances For
      theorem Matrix.logHeight_eq {K : Type u_1} [Field K] [Height.AdmissibleAbsValues K] {m : Type u_2} {n : Type u_3} (A : Matrix m n K) :
      A.logHeight = Height.logHeight fun (q : m × n) => A q.1 q.2
      noncomputable def Matrix.mulHeightAff {K : Type u_1} [Field K] [Height.AdmissibleAbsValues K] {m : Type u_2} {n : Type u_3} (A : Matrix m n K) :

      The affine height of a matrix: the height of the tuple of its entries with a coordinate 1 appended, Height.mulHeightAff of the entries. Unlike Matrix.mulHeight it is not invariant under scaling, which is exactly what a bound on the determinant needs.

      Equations
      Instances For
        noncomputable def Matrix.logHeightAff {K : Type u_1} [Field K] [Height.AdmissibleAbsValues K] {m : Type u_2} {n : Type u_3} (A : Matrix m n K) :

        The logarithmic affine height of a matrix.

        Equations
        Instances For
          @[simp]
          theorem Matrix.mulHeight_zero {K : Type u_1} [Field K] [Height.AdmissibleAbsValues K] {m : Type u_2} {n : Type u_3} :
          @[simp]
          theorem Matrix.logHeight_zero {K : Type u_1} [Field K] [Height.AdmissibleAbsValues K] {m : Type u_2} {n : Type u_3} :
          theorem Matrix.mulHeight_neg {K : Type u_1} [Field K] [Height.AdmissibleAbsValues K] {m : Type u_2} {n : Type u_3} (A : Matrix m n K) :
          theorem Matrix.logHeight_neg {K : Type u_1} [Field K] [Height.AdmissibleAbsValues K] {m : Type u_2} {n : Type u_3} (A : Matrix m n K) :
          theorem Matrix.mulHeight_transpose {K : Type u_1} [Field K] [Height.AdmissibleAbsValues K] {m : Type u_2} {n : Type u_3} (A : Matrix m n K) :

          The height of a matrix is invariant under transpose: transposing re-indexes the entries by Equiv.prodComm.

          theorem Matrix.logHeight_transpose {K : Type u_1} [Field K] [Height.AdmissibleAbsValues K] {m : Type u_2} {n : Type u_3} (A : Matrix m n K) :
          theorem Matrix.mulHeight_submatrix_equiv {K : Type u_1} [Field K] [Height.AdmissibleAbsValues K] {m : Type u_2} {n : Type u_3} {m' : Type u_5} {n' : Type u_6} (A : Matrix m n K) (e : m' ≃ m) (e' : n' ≃ n) :
          (A.submatrix ⇑e ⇑e').mulHeight = A.mulHeight

          Re-indexing rows and columns by equivalences leaves the height unchanged; taking e and e' to be permutations, the height is invariant under row and column permutations.

          theorem Matrix.logHeight_submatrix_equiv {K : Type u_1} [Field K] [Height.AdmissibleAbsValues K] {m : Type u_2} {n : Type u_3} {m' : Type u_5} {n' : Type u_6} (A : Matrix m n K) (e : m' ≃ m) (e' : n' ≃ n) :
          (A.submatrix ⇑e ⇑e').logHeight = A.logHeight
          theorem Matrix.one_le_mulHeight {K : Type u_1} [Field K] [Height.AdmissibleAbsValues K] {m : Type u_2} {n : Type u_3} [Finite m] [Finite n] (A : Matrix m n K) :
          theorem Matrix.mulHeight_pos {K : Type u_1} [Field K] [Height.AdmissibleAbsValues K] {m : Type u_2} {n : Type u_3} [Finite m] [Finite n] (A : Matrix m n K) :
          theorem Matrix.mulHeight_ne_zero {K : Type u_1} [Field K] [Height.AdmissibleAbsValues K] {m : Type u_2} {n : Type u_3} [Finite m] [Finite n] (A : Matrix m n K) :
          theorem Matrix.logHeight_nonneg {K : Type u_1} [Field K] [Height.AdmissibleAbsValues K] {m : Type u_2} {n : Type u_3} [Finite m] [Finite n] (A : Matrix m n K) :
          theorem Matrix.one_le_mulHeightAff {K : Type u_1} [Field K] [Height.AdmissibleAbsValues K] {m : Type u_2} {n : Type u_3} [Finite m] [Finite n] (A : Matrix m n K) :
          theorem Matrix.mulHeightAff_pos {K : Type u_1} [Field K] [Height.AdmissibleAbsValues K] {m : Type u_2} {n : Type u_3} [Finite m] [Finite n] (A : Matrix m n K) :
          theorem Matrix.mulHeightAff_ne_zero {K : Type u_1} [Field K] [Height.AdmissibleAbsValues K] {m : Type u_2} {n : Type u_3} [Finite m] [Finite n] (A : Matrix m n K) :
          theorem Matrix.logHeightAff_nonneg {K : Type u_1} [Field K] [Height.AdmissibleAbsValues K] {m : Type u_2} {n : Type u_3} [Finite m] [Finite n] (A : Matrix m n K) :
          theorem Matrix.mulHeight_le_mulHeightAff {K : Type u_1} [Field K] [Height.AdmissibleAbsValues K] {m : Type u_2} {n : Type u_3} [Finite m] [Finite n] (A : Matrix m n K) :
          theorem Matrix.logHeight_le_logHeightAff {K : Type u_1} [Field K] [Height.AdmissibleAbsValues K] {m : Type u_2} {n : Type u_3} [Finite m] [Finite n] (A : Matrix m n K) :
          theorem Matrix.mulHeightAff_col_le {K : Type u_1} [Field K] [Height.AdmissibleAbsValues K] {m : Type u_2} {n : Type u_3} [Finite m] [Finite n] (A : Matrix m n K) (j : n) :
          (Height.mulHeightAff fun (i : m) => A i j) ≤ A.mulHeightAff

          The affine height of a column of A is at most the affine height of A: a column is a sub-tuple of the entries, and the appended coordinate 1 is common to both.

          theorem Matrix.mulHeight_submatrix_le {K : Type u_1} [Field K] [Height.AdmissibleAbsValues K] {m : Type u_2} {n : Type u_3} {m' : Type u_5} {n' : Type u_6} [Finite m] [Finite n] [Finite m'] [Finite n'] (A : Matrix m n K) (f : m' → m) (g : n' → n) :
          theorem Matrix.logHeight_submatrix_le {K : Type u_1} [Field K] [Height.AdmissibleAbsValues K] {m : Type u_2} {n : Type u_3} {m' : Type u_5} {n' : Type u_6} [Finite m] [Finite n] [Finite m'] [Finite n'] (A : Matrix m n K) (f : m' → m) (g : n' → n) :
          theorem Matrix.mulHeight_smul {K : Type u_1} [Field K] [Height.AdmissibleAbsValues K] {m : Type u_2} {n : Type u_3} [Finite m] [Finite n] (A : Matrix m n K) {c : K} (hc : c ≠ 0) :
          theorem Matrix.logHeight_smul {K : Type u_1} [Field K] [Height.AdmissibleAbsValues K] {m : Type u_2} {n : Type u_3} [Finite m] [Finite n] (A : Matrix m n K) {c : K} (hc : c ≠ 0) :
          theorem Matrix.mulHeight_mul_le {K : Type u_1} [Field K] [Height.AdmissibleAbsValues K] {m : Type u_2} {n : Type u_3} {p : Type u_4} [Finite m] [Fintype n] [Finite p] [Nonempty n] (A : Matrix m n K) (B : Matrix n p K) :

          The product bound. An entry of A * B is a sum of Fintype.card n entries of the multiplication table of the entries of A and of B, so the tuple sum bound of Layer 2.4 applies with #s = Fintype.card n, and the Segre relation evaluates the height of that table as mulHeight A * mulHeight B.

          n must be nonempty: for n empty A * B = 0 has the junk height 1 against a right-hand side of 0. The constant is sharp, and its exponent totalWeight K is needed as soon as K has degree > 1; both are the examples at the end of this file. In the Arakelov normalization the constant disappears entirely, Matrix.arakelovMulHeight_mul_le.

          theorem Matrix.logHeight_mul_le {K : Type u_1} [Field K] [Height.AdmissibleAbsValues K] {m : Type u_2} {n : Type u_3} {p : Type u_4} [Finite m] [Fintype n] [Finite p] [Nonempty n] (A : Matrix m n K) (B : Matrix n p K) :

          The logarithmic form of Matrix.mulHeight_mul_le.

          theorem Matrix.mulHeight_mulVec_le {K : Type u_1} [Field K] [Height.AdmissibleAbsValues K] {m : Type u_2} {n : Type u_3} [Finite m] [Fintype n] [Nonempty n] (A : Matrix m n K) (x : n → K) :

          The action on tuples, Mathlib's Height.mulHeight_linearMap_apply_le read through the definition of Matrix.mulHeight. Nothing is reproved here.

          theorem Matrix.logHeight_mulVec_le {K : Type u_1} [Field K] [Height.AdmissibleAbsValues K] {m : Type u_2} {n : Type u_3} [Finite m] [Fintype n] [Nonempty n] (A : Matrix m n K) (x : n → K) :

          The logarithmic form of Matrix.mulHeight_mulVec_le.

          theorem Matrix.mulHeight₁_det_le {K : Type u_1} [Field K] [Height.AdmissibleAbsValues K] {n : Type u_3} [Fintype n] [DecidableEq n] (A : Matrix n n K) :

          The height of a determinant, from the Leibniz expansion. The determinant is a sum of (Fintype.card n)! products, one entry from each column, so the signed tuple sum bound applies to the multiplication table of the affine columns and the Segre relation of Height.mulHeight_fun_prod_eq evaluates its height as the product of the affine column heights.

          The right-hand side cannot be made scaling-invariant: see Matrix.exists_not_mulHeight₁_det_le.

          theorem Matrix.logHeight₁_det_le {K : Type u_1} [Field K] [Height.AdmissibleAbsValues K] {n : Type u_3} [Fintype n] [DecidableEq n] (A : Matrix n n K) :

          The logarithmic form of Matrix.mulHeight₁_det_le.

          Matrix.mulHeight₁_det_le with the affine height of the whole matrix in place of the affine heights of its columns. This is the form the roadmap states, except that the height on the right is the affine one.

          The determinant is not bounded by the projective height of the matrix. For a 1 × 1 matrix the index type is a subsingleton, so mulHeight A = 1 whatever the entry is, while the determinant is that entry. This is the same scaling obstruction as in Layer 2.4: A ↦ c • A fixes mulHeight A and multiplies A.det by c ^ n. The affine height of Matrix.mulHeight₁_det_le is what the statement needs.

          Matrices in the Arakelov normalization #

          At an infinite place the local factor of the Arakelov height is the Frobenius norm of the matrix, and Cauchy–Schwarz entry by entry makes it submultiplicative; at a finite place the sup norm is submultiplicative by the ultrametric inequality. So the constant Fintype.card n ^ totalWeight K of Matrix.mulHeight_mul_le disappears.

          noncomputable def Matrix.arakelovMulHeight {K : Type u_1} [Field K] [NumberField K] {m : Type u_2} {n : Type u_3} [Fintype m] [Fintype n] (A : Matrix m n K) :

          The Arakelov height of a matrix: the Arakelov height of the tuple of its entries, so the Frobenius norm at each infinite place and the sup norm at each finite one.

          Equations
          Instances For
            noncomputable def Matrix.arakelovLogHeight {K : Type u_1} [Field K] [NumberField K] {m : Type u_2} {n : Type u_3} [Fintype m] [Fintype n] (A : Matrix m n K) :

            The logarithmic Arakelov height of a matrix.

            Equations
            Instances For
              @[simp]
              theorem Matrix.arakelovMulHeight_zero {K : Type u_1} [Field K] [NumberField K] {m : Type u_2} {n : Type u_3} [Fintype m] [Fintype n] :
              theorem Matrix.one_le_arakelovMulHeight {K : Type u_1} [Field K] [NumberField K] {m : Type u_2} {n : Type u_3} [Fintype m] [Fintype n] (A : Matrix m n K) :
              theorem Matrix.arakelovMulHeight_pos {K : Type u_1} [Field K] [NumberField K] {m : Type u_2} {n : Type u_3} [Fintype m] [Fintype n] (A : Matrix m n K) :
              theorem Matrix.arakelovMulHeight_ne_zero {K : Type u_1} [Field K] [NumberField K] {m : Type u_2} {n : Type u_3} [Fintype m] [Fintype n] (A : Matrix m n K) :
              theorem Matrix.arakelovLogHeight_nonneg {K : Type u_1} [Field K] [NumberField K] {m : Type u_2} {n : Type u_3} [Fintype m] [Fintype n] (A : Matrix m n K) :
              theorem Matrix.mulHeight_le_arakelovMulHeight {K : Type u_1} [Field K] [NumberField K] {m : Type u_2} {n : Type u_3} [Fintype m] [Fintype n] (A : Matrix m n K) :
              theorem Matrix.arakelovMulHeight_mul_le {K : Type u_1} [Field K] [NumberField K] {m : Type u_2} {n : Type u_3} {p : Type u_4} [Fintype m] [Fintype n] [Fintype p] (A : Matrix m n K) (B : Matrix n p K) :

              The Arakelov product bound, with constant 1. Against Fintype.card n ^ totalWeight K for the sup-norm height of Matrix.mulHeight_mul_le, and with no hypothesis on the index types at all — for n empty, A * B = 0 has the junk height 1, which is at most the right-hand side. This is the matrix form of NumberField.arakelovMulHeight_linearMap_apply_le.

              theorem Matrix.arakelovLogHeight_mul_le {K : Type u_1} [Field K] [NumberField K] {m : Type u_2} {n : Type u_3} {p : Type u_4} [Fintype m] [Fintype n] [Fintype p] (A : Matrix m n K) (B : Matrix n p K) :

              The logarithmic form of Matrix.arakelovMulHeight_mul_le: in the Arakelov normalization a matrix product costs nothing beyond the two heights.

              The action on tuples in the Arakelov normalization, from NumberField.arakelovMulHeight_linearMap_apply_le.

              Examples #

              The tests that fix the constants of the product bound: that Fintype.card n ^ totalWeight K is attained, that its exponent is needed as soon as K has degree > 1 — the rejection test the roadmap states over ℚ(i), here for every number field at once — that [Nonempty n] cannot be dropped, and that the Arakelov constant 1 is attained.