@@ -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`. -/
157157lemma 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]
381375end
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⁻¹ :=
384431begin
385432 by_cases h : is_unit A.det,
0 commit comments