Skip to content
This repository was archived by the owner on Jul 24, 2024. It is now read-only.

Commit f6c030f

Browse files
committed
feat(linear_algebra/matrix/nonsingular_inverse): inverse of a diagonal matrix is diagonal (#13827)
The main results are `is_unit (diagonal v) ↔ is_unit v` and `(diagonal v)⁻¹ = diagonal (ring.inverse v)`. This also generalizes `invertible.map` to `monoid_hom_class`.
1 parent e4d3d33 commit f6c030f

4 files changed

Lines changed: 62 additions & 17 deletions

File tree

src/algebra/invertible.lean

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -260,12 +260,10 @@ def invertible_inv {a : α} [invertible a] : invertible (a⁻¹) :=
260260

261261
end group_with_zero
262262

263-
/--
264-
Monoid homs preserve invertibility.
265-
-/
266-
def invertible.map {R : Type*} {S : Type*} [monoid R] [monoid S] (f : R →* S)
267-
(r : R) [invertible r] :
263+
/-- Monoid homs preserve invertibility. -/
264+
def invertible.map {R : Type*} {S : Type*} {F : Type*} [mul_one_class R] [mul_one_class S]
265+
[monoid_hom_class F R S] (f : F) (r : R) [invertible r] :
268266
invertible (f r) :=
269267
{ inv_of := f (⅟r),
270-
inv_of_mul_self := by rw [← f.map_mul, inv_of_mul_self, f.map_one],
271-
mul_inv_of_self := by rw [← f.map_mul, mul_inv_of_self, f.map_one] }
268+
inv_of_mul_self := by rw [←map_mul, inv_of_mul_self, map_one],
269+
mul_inv_of_self := by rw [←map_mul, mul_inv_of_self, map_one] }

src/data/mv_polynomial/invertible.lean

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ open mv_polynomial
1919
noncomputable instance mv_polynomial.invertible_C
2020
(σ : Type*) {R : Type*} [comm_semiring R] (r : R) [invertible r] :
2121
invertible (C r : mv_polynomial σ R) :=
22-
invertible.map (C.to_monoid_hom : R →* mv_polynomial σ R) _
22+
invertible.map (C : R →+* mv_polynomial σ R) _
2323

2424
/-- A natural number that is invertible when coerced to a commutative semiring `R`
2525
is also invertible when coerced to any polynomial ring with rational coefficients.

src/linear_algebra/matrix/nonsingular_inverse.lean

Lines changed: 54 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -155,13 +155,7 @@ def unit_of_det_invertible [invertible A.det] : (matrix n n α)ˣ :=
155155

156156
/-- When lowered to a prop, `matrix.invertible_equiv_det_invertible` forms an `iff`. -/
157157
lemma is_unit_iff_is_unit_det : is_unit A ↔ is_unit A.det :=
158-
begin
159-
split; rintros ⟨x, hx⟩; refine @is_unit_of_invertible _ _ _ (id _),
160-
{ haveI : invertible A := hx.rec x.invertible,
161-
apply det_invertible_of_invertible, },
162-
{ haveI : invertible A.det := hx.rec x.invertible,
163-
apply invertible_of_det_invertible, },
164-
end
158+
by simp only [← nonempty_invertible_iff_is_unit, (invertible_equiv_det_invertible A).nonempty_congr]
165159

166160
/-! #### Variants of the statements above with `is_unit`-/
167161

@@ -380,6 +374,59 @@ begin
380374
rw [smul_mul, mul_adjugate, units.smul_def, smul_smul, h.coe_inv_mul, one_smul]
381375
end
382376

377+
/-- `diagonal v` is invertible if `v` is -/
378+
def diagonal_invertible {α} [non_assoc_semiring α] (v : n → α) [invertible v] :
379+
invertible (diagonal v) :=
380+
invertible.map (diagonal_ring_hom n α) v
381+
382+
lemma inv_of_diagonal_eq {α} [semiring α] (v : n → α) [invertible v] [invertible (diagonal v)] :
383+
⅟(diagonal v) = diagonal (⅟v) :=
384+
by { letI := diagonal_invertible v, convert (rfl : ⅟(diagonal v) = _) }
385+
386+
/-- `v` is invertible if `diagonal v` is -/
387+
def invertible_of_diagonal_invertible (v : n → α) [invertible (diagonal v)] : invertible v :=
388+
{ inv_of := diag (⅟(diagonal v)),
389+
inv_of_mul_self := funext $ λ i, begin
390+
letI : invertible (diagonal v).det := det_invertible_of_invertible _,
391+
rw [inv_of_eq, diag_smul, adjugate_diagonal, diag_diagonal],
392+
dsimp,
393+
rw [mul_assoc, prod_erase_mul _ _ (finset.mem_univ _), ←det_diagonal],
394+
exact mul_inv_of_self _,
395+
end,
396+
mul_inv_of_self := funext $ λ i, begin
397+
letI : invertible (diagonal v).det := det_invertible_of_invertible _,
398+
rw [inv_of_eq, diag_smul, adjugate_diagonal, diag_diagonal],
399+
dsimp,
400+
rw [mul_left_comm, mul_prod_erase _ _ (finset.mem_univ _), ←det_diagonal],
401+
exact mul_inv_of_self _,
402+
end }
403+
404+
/-- Together `matrix.diagonal_invertible` and `matrix.invertible_of_diagonal_invertible` form an
405+
equivalence, although both sides of the equiv are subsingleton anyway. -/
406+
@[simps]
407+
def diagonal_invertible_equiv_invertible (v : n → α) : invertible (diagonal v) ≃ invertible v :=
408+
{ to_fun := @invertible_of_diagonal_invertible _ _ _ _ _ _,
409+
inv_fun := @diagonal_invertible _ _ _ _ _ _,
410+
left_inv := λ _, subsingleton.elim _ _,
411+
right_inv := λ _, subsingleton.elim _ _ }
412+
413+
/-- When lowered to a prop, `matrix.diagonal_invertible_equiv_invertible` forms an `iff`. -/
414+
@[simp] lemma is_unit_diagonal {v : n → α} : is_unit (diagonal v) ↔ is_unit v :=
415+
by simp only [← nonempty_invertible_iff_is_unit,
416+
(diagonal_invertible_equiv_invertible v).nonempty_congr]
417+
418+
lemma inv_diagonal (v : n → α) : (diagonal v)⁻¹ = diagonal (ring.inverse v) :=
419+
begin
420+
rw nonsing_inv_eq_ring_inverse,
421+
by_cases h : is_unit v,
422+
{ have := is_unit_diagonal.mpr h,
423+
casesI this.nonempty_invertible,
424+
casesI h.nonempty_invertible,
425+
rw [ring.inverse_invertible, ring.inverse_invertible, inv_of_diagonal_eq], },
426+
{ have := is_unit_diagonal.not.mpr h,
427+
rw [ring.inverse_non_unit _ h, pi.zero_def, diagonal_zero, ring.inverse_non_unit _ this] }
428+
end
429+
383430
@[simp] lemma inv_inv_inv (A : matrix n n α) : A⁻¹⁻¹⁻¹ = A⁻¹ :=
384431
begin
385432
by_cases h : is_unit A.det,

src/ring_theory/algebra_tower.lean

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -44,8 +44,8 @@ variables (R S A B)
4444
If an element `r : R` is invertible in `S`, then it is invertible in `A`. -/
4545
def invertible.algebra_tower (r : R) [invertible (algebra_map R S r)] :
4646
invertible (algebra_map R A r) :=
47-
invertible.copy (invertible.map (algebra_map S A : S →* A) (algebra_map R S r)) (algebra_map R A r)
48-
(by rw [ring_hom.coe_monoid_hom, is_scalar_tower.algebra_map_apply R S A])
47+
invertible.copy (invertible.map (algebra_map S A) (algebra_map R S r)) (algebra_map R A r)
48+
(is_scalar_tower.algebra_map_apply R S A r)
4949

5050
/-- A natural number that is invertible when coerced to `R` is also invertible
5151
when coerced to any `R`-algebra. -/

0 commit comments

Comments
 (0)