Zulip Chat Archive

Stream: new members

Topic: two ways to define inverse of a diagonal matrix


Z. X. Wang (Aug 06 2025 at 06:49):

import Mathlib

open Matrix

abbrev Matrix.diagPart {n α : Type*} [DecidableEq n] (X : Matrix n n α) [Zero α] :=
  Matrix.diagonal (fun i => X i i)

-- def D⁻¹ by entries
noncomputable def invdiagPart
  (A : Matrix (Fin n) (Fin n) )
  :
  Matrix (Fin n) (Fin n) 
  :=
  fun i j  if i = j then 1 / (A i j) else 0

example
  (A : Matrix (Fin n) (Fin n) )
  (hdiag :  i, A i i > 0)
  :
  (diagPart A)⁻¹ = invdiagPart A
  := sorry

how can i prove that they are equal? And here is my atempt:

import Mathlib

open Matrix

abbrev Matrix.diagPart {n α : Type*} [DecidableEq n] (X : Matrix n n α) [Zero α] :=
  Matrix.diagonal (fun i => X i i)

-- def D⁻¹ by entries
noncomputable def invdiagPart
  (A : Matrix (Fin n) (Fin n) )
  :
  Matrix (Fin n) (Fin n) 
  :=
  fun i j  if i = j then 1 / (A i j) else 0

example
  (A : Matrix (Fin n) (Fin n) )
  (hdiag :  i, A i i > 0)
  :
  (diagPart A)⁻¹ = invdiagPart A
  := by
  refine ext ?_
  intro i j
  unfold diagPart invdiagPart diagonal
  simp only [one_div]
  by_cases h1 : i = j
  . split_ifs
    rw [inv_def]
    simp only [Ring.inverse_eq_inv', smul_apply, smul_eq_mul]
    refine (IsUnit.inv_mul_eq_iff_eq_mul ?_).mpr ?_
    . have h2 : (diagPart A).det  0 := by
        unfold diagPart
        simp only [det_diagonal, ne_eq]
        by_contra a
        have h3 :  i, A i i > 0 := by
          exact Finset.prod_pos fun i a  hdiag i
        have h4 :  i, A i i  0 := by
          exact Ne.symm (ne_of_lt h3)
        contradiction
      exact Ne.isUnit h2
    .
      sorry
  . split_ifs
    sorry

Kevin Buzzard (Aug 21 2025 at 21:54):

You seem to have stumbled upon a hole in the library (the sorry in the below code):

import Mathlib

set_option autoImplicit true

open Matrix

abbrev Matrix.diagPart {n α : Type*} [DecidableEq n] (X : Matrix n n α) [Zero α] :=
  Matrix.diagonal (fun i => X i i)

-- def D⁻¹ by entries
noncomputable def invdiagPart
  (A : Matrix (Fin n) (Fin n) )
  :
  Matrix (Fin n) (Fin n) 
  :=
  fun i j  if i = j then 1 / (A i j) else 0

lemma Matrix.diagonal_inv {n α : Type*} [DecidableEq n] [Fintype n] [Field α]
    {x : n  α} (hx :  i, x i  0) : (diagonal x)⁻¹ = diagonal (fun i  (x i)⁻¹) :=
  sorry

example
  (A : Matrix (Fin n) (Fin n) )
  (hdiag :  i, A i i > 0)
  :
  (diagPart A)⁻¹ = invdiagPart A
  := by
ext i j
unfold diagPart invdiagPart
rw [Matrix.diagonal_inv]
· simp [diagonal_apply]
  grind
· grind

Eric Wieser (Aug 21 2025 at 21:56):

docs#Matrix.inv_diagonal exists

Eric Wieser (Aug 21 2025 at 21:57):

Note that invdiagPart is ill-typed, as you forgot the Matrix.of


Last updated: Dec 20 2025 at 21:32 UTC