Documentation

Mathlib.LinearAlgebra.Matrix.Block

Block matrices and their determinant #

This file defines a predicate Matrix.BlockTriangular saying a matrix is block triangular, and proves the value of the determinant for various matrices built out of blocks.

Main definitions #

Main results #

Tags #

matrix, diagonal, det, block triangular

def Matrix.BlockTriangular {α : Type u_1} {m : Type u_2} {R : Type v} [LT α] [Zero R] (M : Matrix m m R) (b : mα) :

Let b map rows and columns of a square matrix M to blocks indexed by αs. Then BlockTriangular M n b says the matrix is block triangular.

Equations
Instances For
    @[reducible, inline]
    abbrev Matrix.IsUpperTriangular {m : Type u_2} {R : Type v} [Zero R] [LT m] (M : Matrix m m R) :

    M is upper triangular: entries below the diagonal vanish.

    Equations
    Instances For
      @[reducible, inline]
      abbrev Matrix.IsLowerTriangular {m : Type u_2} {R : Type v} [Zero R] [LT m] (M : Matrix m m R) :

      M is lower triangular: entries above the diagonal vanish.

      Equations
      Instances For
        def Matrix.IsIndecomposable {m : Type u_2} {R : Type v} [Zero R] (M : Matrix m m R) :

        A matrix is indecomposable if it cannot be reindexed to block-triangular form.

        Equations
        • One or more equations did not get rendered due to their size.
        Instances For
          @[simp]
          theorem Matrix.BlockTriangular.submatrix {α : Type u_1} {m : Type u_2} {n : Type u_3} {R : Type v} {M : Matrix m m R} {b : mα} [LT α] [Zero R] {f : nm} (h : M.BlockTriangular b) :
          theorem Matrix.blockTriangular_reindex_iff {α : Type u_1} {m : Type u_2} {n : Type u_3} {R : Type v} {M : Matrix m m R} [LT α] [Zero R] {b : nα} {e : m n} :
          theorem Matrix.BlockTriangular.transpose {α : Type u_1} {m : Type u_2} {R : Type v} {M : Matrix m m R} {b : mα} [LT α] [Zero R] :
          @[simp]
          theorem Matrix.blockTriangular_transpose_iff {α : Type u_1} {m : Type u_2} {R : Type v} {M : Matrix m m R} [LT α] [Zero R] {b : mαᵒᵈ} :
          @[simp]
          theorem Matrix.blockTriangular_zero {α : Type u_1} {m : Type u_2} {R : Type v} {b : mα} [LT α] [Zero R] :
          @[instance_reducible]
          instance Matrix.decidableBlockTriangular {α : Type u_1} {m : Type u_2} {R : Type v} {M : Matrix m m R} {b : mα} [LT α] [Zero R] [DecidableEq R] [Fintype m] [DecidableLT α] :
          Equations
          theorem Matrix.BlockTriangular.neg {α : Type u_1} {m : Type u_2} {R : Type v} {b : mα} [LT α] [NegZeroClass R] {M : Matrix m m R} (hM : M.BlockTriangular b) :
          theorem Matrix.BlockTriangular.add {α : Type u_1} {m : Type u_2} {R : Type v} {M N : Matrix m m R} {b : mα} [LT α] [AddZeroClass R] (hM : M.BlockTriangular b) (hN : N.BlockTriangular b) :
          theorem Matrix.BlockTriangular.sub {α : Type u_1} {m : Type u_2} {R : Type v} {M N : Matrix m m R} {b : mα} [LT α] [SubNegZeroMonoid R] (hM : M.BlockTriangular b) (hN : N.BlockTriangular b) :
          theorem Matrix.BlockTriangular.add_iff_right {α : Type u_1} {m : Type u_2} {R : Type v} {M N : Matrix m m R} {b : mα} [LT α] [AddGroup R] (hM : M.BlockTriangular b) :
          theorem Matrix.BlockTriangular.add_iff_left {α : Type u_1} {m : Type u_2} {R : Type v} {M N : Matrix m m R} {b : mα} [LT α] [AddGroup R] (hN : N.BlockTriangular b) :
          theorem Matrix.BlockTriangular.sub_iff_right {α : Type u_1} {m : Type u_2} {R : Type v} {M N : Matrix m m R} {b : mα} [LT α] [AddGroup R] (hM : M.BlockTriangular b) :
          theorem Matrix.BlockTriangular.sub_iff_left {α : Type u_1} {m : Type u_2} {R : Type v} {M N : Matrix m m R} {b : mα} [LT α] [AddGroup R] (hN : N.BlockTriangular b) :
          theorem Matrix.BlockTriangular.map {α : Type u_1} {m : Type u_2} {R : Type v} {M : Matrix m m R} {b : mα} [LT α] {S : Type u_6} {F : Type u_7} [FunLike F R S] [Zero R] [Zero S] [ZeroHomClass F R S] (f : F) (h : M.BlockTriangular b) :
          (M.map f).BlockTriangular b
          theorem Matrix.BlockTriangular.comp {α : Type u_1} {m : Type u_2} {n : Type u_3} {R : Type v} {b : mα} [LT α] [Zero R] {M : Matrix m m (Matrix n n R)} (h : M.BlockTriangular b) :
          ((Matrix.comp m m n n R) M).BlockTriangular fun (i : m × n) => b i.1
          theorem Matrix.blockTriangular_diagonal {α : Type u_1} {m : Type u_2} {R : Type v} {b : mα} [Preorder α] [Zero R] [DecidableEq m] (d : mR) :
          theorem Matrix.blockTriangular_blockDiagonal' {α : Type u_1} {m' : αType u_4} {R : Type v} [Preorder α] [Zero R] [DecidableEq α] (d : (i : α) → Matrix (m' i) (m' i) R) :
          theorem Matrix.blockTriangular_blockDiagonal {α : Type u_1} {m : Type u_2} {R : Type v} [Preorder α] [Zero R] [DecidableEq α] (d : αMatrix m m R) :
          theorem Matrix.blockTriangular_one {α : Type u_1} {m : Type u_2} {R : Type v} {b : mα} [Preorder α] [Zero R] [DecidableEq m] [One R] :
          theorem Matrix.blockTriangular_single {α : Type u_1} {m : Type u_2} {R : Type v} {b : mα} [Preorder α] [Zero R] [DecidableEq m] {i j : m} (hij : b i b j) (c : R) :
          theorem Matrix.blockTriangular_single' {α : Type u_1} {m : Type u_2} {R : Type v} {b : mα} [Preorder α] [Zero R] [DecidableEq m] {i j : m} (hij : b j b i) (c : R) :
          theorem Matrix.blockTriangular_transvection {α : Type u_1} {m : Type u_2} {R : Type v} {b : mα} [Preorder α] [CommRing R] [DecidableEq m] {i j : m} (hij : b i b j) (c : R) :
          theorem Matrix.blockTriangular_transvection' {α : Type u_1} {m : Type u_2} {R : Type v} {b : mα} [Preorder α] [CommRing R] [DecidableEq m] {i j : m} (hij : b j b i) (c : R) :
          theorem Matrix.BlockTriangular.mul {α : Type u_1} {m : Type u_2} {R : Type v} {b : mα} [LinearOrder α] [Fintype m] [NonUnitalNonAssocSemiring R] {M N : Matrix m m R} (hM : M.BlockTriangular b) (hN : N.BlockTriangular b) :
          def Matrix.blockTriangularSubsemiring {α : Type u_1} {m : Type u_2} (R : Type v) (b : mα) [LinearOrder α] [DecidableEq m] [Fintype m] [Semiring R] :

          BlockTriangular matrices form a subsemiring.

          Equations
          Instances For
            @[simp]
            theorem Matrix.coe_blockTriangularSubsemiring {α : Type u_1} {m : Type u_2} (R : Type v) (b : mα) [LinearOrder α] [DecidableEq m] [Fintype m] [Semiring R] :
            @[simp]
            theorem Matrix.mem_blockTriangularSubsemiring {α : Type u_1} {m : Type u_2} {R : Type v} {b : mα} [LinearOrder α] [DecidableEq m] [Fintype m] [Semiring R] {M : Matrix m m R} :
            theorem Matrix.BlockTriangular.pow {α : Type u_1} {m : Type u_2} {R : Type v} {M : Matrix m m R} {b : mα} [LinearOrder α] [DecidableEq m] [Fintype m] [Semiring R] (hM : M.BlockTriangular b) (n : ) :
            theorem Matrix.blockTriangular_algebraMap {α : Type u_1} {m : Type u_2} {R : Type v} {A : Type u_5} {b : mα} [LinearOrder α] [CommSemiring R] [Semiring A] [Algebra R A] [DecidableEq m] [Fintype m] (r : R) :
            def Matrix.blockTriangularSubalgebra {α : Type u_1} {m : Type u_2} (R : Type v) (A : Type u_5) (b : mα) [LinearOrder α] [CommSemiring R] [Semiring A] [Algebra R A] [DecidableEq m] [Fintype m] :
            Subalgebra R (Matrix m m A)

            BlockTriangular matrices form a subalgebra.

            Equations
            Instances For
              @[simp]
              theorem Matrix.mem_blockTriangularSubalgebra {α : Type u_1} {m : Type u_2} {R : Type v} {A : Type u_5} {b : mα} [LinearOrder α] [CommSemiring R] [Semiring A] [Algebra R A] [DecidableEq m] [Fintype m] {M : Matrix m m A} :
              theorem Matrix.isIndecomposable_iff_blockTriangular_const {α : Type u_1} {m : Type u_2} {R : Type v} [LinearOrder α] [Nontrivial α] [Finite m] [Zero R] (M : Matrix m m R) :
              M.IsIndecomposable ∀ (b : mα), M.BlockTriangular b∃ (a : α), b = Function.const m a
              theorem Matrix.upper_two_blockTriangular {α : Type u_1} {m : Type u_2} {n : Type u_3} {R : Type v} [Zero R] [Preorder α] (A : Matrix m m R) (B : Matrix m n R) (D : Matrix n n R) {a b : α} (hab : a < b) :
              (fromBlocks A B 0 D).BlockTriangular (Sum.elim (fun (x : m) => a) fun (x : n) => b)

              Determinant #

              theorem Matrix.equiv_block_det {m : Type u_2} {R : Type v} [CommRing R] [DecidableEq m] [Fintype m] (M : Matrix m m R) {p q : mProp} [DecidablePred p] [DecidablePred q] (e : ∀ (x : m), q x p x) :
              theorem Matrix.det_toSquareBlock_id {m : Type u_2} {R : Type v} [CommRing R] [DecidableEq m] [Fintype m] (M : Matrix m m R) (i : m) :
              (M.toSquareBlock id i).det = M i i
              theorem Matrix.det_toBlock {m : Type u_2} {R : Type v} [CommRing R] [DecidableEq m] [Fintype m] (M : Matrix m m R) (p : mProp) [DecidablePred p] :
              M.det = (fromBlocks (M.toBlock p p) (M.toBlock p fun (j : m) => ¬p j) (M.toBlock (fun (j : m) => ¬p j) p) (M.toBlock (fun (j : m) => ¬p j) fun (j : m) => ¬p j)).det
              theorem Matrix.twoBlockTriangular_det {m : Type u_2} {R : Type v} [CommRing R] [DecidableEq m] [Fintype m] (M : Matrix m m R) (p : mProp) [DecidablePred p] (h : ∀ (i : m), ¬p i∀ (j : m), p jM i j = 0) :
              M.det = (M.toSquareBlockProp p).det * (M.toSquareBlockProp fun (i : m) => ¬p i).det
              theorem Matrix.twoBlockTriangular_det' {m : Type u_2} {R : Type v} [CommRing R] [DecidableEq m] [Fintype m] (M : Matrix m m R) (p : mProp) [DecidablePred p] (h : ∀ (i : m), p i∀ (j : m), ¬p jM i j = 0) :
              M.det = (M.toSquareBlockProp p).det * (M.toSquareBlockProp fun (i : m) => ¬p i).det
              theorem Matrix.BlockTriangular.det {α : Type u_1} {m : Type u_2} {R : Type v} {M : Matrix m m R} {b : mα} [CommRing R] [DecidableEq m] [Fintype m] [DecidableEq α] [LinearOrder α] (hM : M.BlockTriangular b) :
              theorem Matrix.BlockTriangular.det_fintype {α : Type u_1} {m : Type u_2} {R : Type v} {M : Matrix m m R} {b : mα} [CommRing R] [DecidableEq m] [Fintype m] [DecidableEq α] [Fintype α] [LinearOrder α] (h : M.BlockTriangular b) :
              M.det = k : α, (M.toSquareBlock b k).det
              theorem Matrix.det_of_isUpperTriangular {m : Type u_2} {R : Type v} {M : Matrix m m R} [CommRing R] [DecidableEq m] [Fintype m] [LinearOrder m] (h : M.IsUpperTriangular) :
              M.det = i : m, M i i
              @[deprecated Matrix.det_of_isUpperTriangular (since := "2026-07-30")]
              theorem Matrix.det_of_upperTriangular {m : Type u_2} {R : Type v} {M : Matrix m m R} [CommRing R] [DecidableEq m] [Fintype m] [LinearOrder m] (h : M.IsUpperTriangular) :
              M.det = i : m, M i i

              Alias of Matrix.det_of_isUpperTriangular.

              theorem Matrix.det_of_isLowerTriangular {m : Type u_2} {R : Type v} [CommRing R] [DecidableEq m] [Fintype m] [LinearOrder m] (M : Matrix m m R) (h : M.IsLowerTriangular) :
              M.det = i : m, M i i
              @[deprecated Matrix.det_of_isLowerTriangular (since := "2026-07-30")]
              theorem Matrix.det_of_lowerTriangular {m : Type u_2} {R : Type v} [CommRing R] [DecidableEq m] [Fintype m] [LinearOrder m] (M : Matrix m m R) (h : M.IsLowerTriangular) :
              M.det = i : m, M i i

              Alias of Matrix.det_of_isLowerTriangular.

              theorem Matrix.matrixOfPolynomials_blockTriangular {R : Type u_6} [Semiring R] {n : } (p : Fin nPolynomial R) (h_deg : ∀ (i : Fin n), (p i).natDegree i) :
              (of fun (i j : Fin n) => (p j).coeff i).BlockTriangular id
              theorem Matrix.det_matrixOfPolynomials {R : Type v} [CommRing R] {n : } (p : Fin nPolynomial R) (h_deg : ∀ (i : Fin n), (p i).natDegree = i) (h_monic : ∀ (i : Fin n), (p i).Monic) :
              (of fun (i j : Fin n) => (p j).coeff i).det = 1

              Invertible #

              theorem Matrix.BlockTriangular.toBlock_inverse_mul_toBlock_eq_one {α : Type u_1} {m : Type u_2} {R : Type v} {M : Matrix m m R} {b : mα} [CommRing R] [DecidableEq m] [Fintype m] [LinearOrder α] [Invertible M] (hM : M.BlockTriangular b) (k : α) :
              ((M⁻¹.toBlock (fun (i : m) => b i < k) fun (i : m) => b i < k) * M.toBlock (fun (i : m) => b i < k) fun (i : m) => b i < k) = 1
              theorem Matrix.BlockTriangular.inv_toBlock {α : Type u_1} {m : Type u_2} {R : Type v} {M : Matrix m m R} {b : mα} [CommRing R] [DecidableEq m] [Fintype m] [LinearOrder α] [Invertible M] (hM : M.BlockTriangular b) (k : α) :
              (M.toBlock (fun (i : m) => b i < k) fun (i : m) => b i < k)⁻¹ = M⁻¹.toBlock (fun (i : m) => b i < k) fun (i : m) => b i < k

              The inverse of an upper-left subblock of a block-triangular matrix M is the upper-left subblock of M⁻¹.

              @[instance_reducible]
              def Matrix.BlockTriangular.invertibleToBlock {α : Type u_1} {m : Type u_2} {R : Type v} {M : Matrix m m R} {b : mα} [CommRing R] [DecidableEq m] [Fintype m] [LinearOrder α] [Invertible M] (hM : M.BlockTriangular b) (k : α) :
              Invertible (M.toBlock (fun (i : m) => b i < k) fun (i : m) => b i < k)

              An upper-left subblock of an invertible block-triangular matrix is invertible.

              Equations
              Instances For
                theorem Matrix.toBlock_inverse_eq_zero {α : Type u_1} {m : Type u_2} {R : Type v} {M : Matrix m m R} {b : mα} [CommRing R] [DecidableEq m] [Fintype m] [LinearOrder α] [Invertible M] (hM : M.BlockTriangular b) (k : α) :
                (M⁻¹.toBlock (fun (i : m) => k b i) fun (i : m) => b i < k) = 0

                A lower-left subblock of the inverse of a block-triangular matrix is zero. This is a first step towards BlockTriangular.inv_toBlock below.

                theorem Matrix.blockTriangular_inv_of_blockTriangular {α : Type u_1} {m : Type u_2} {R : Type v} {M : Matrix m m R} {b : mα} [CommRing R] [DecidableEq m] [Fintype m] [LinearOrder α] [Invertible M] (hM : M.BlockTriangular b) :

                The inverse of a block-triangular matrix is block-triangular.