@@ -64,8 +64,13 @@ theorem IsHermitian.ext_iff {A : Matrix n n α} : A.IsHermitian ↔ ∀ i j, sta
6464
6565@[simp]
6666theorem IsHermitian.map {A : Matrix n n α} (h : A.IsHermitian) (f : α → β)
67- (hf : Function.Semiconj f star star) : (A.map f).IsHermitian :=
68- (conjTranspose_map f hf).symm.trans <| h.eq.symm ▸ rfl
67+ (hf : Function.Semiconj f star star) : (A.map f).IsHermitian := by
68+ rw [IsHermitian, ← conjTranspose_map f hf, h.eq]
69+
70+ @[simp]
71+ theorem isHermitian_map_iff {A : Matrix n n α} {f : α → β} (hf : Function.Semiconj f star star)
72+ (hinj : f.Injective) : (A.map f).IsHermitian ↔ A.IsHermitian := by
73+ rw [IsHermitian, IsHermitian, ← conjTranspose_map f hf, map_injective hinj |>.eq_iff]
6974
7075@ [simp, nontriviality]
7176theorem IsHermitian.of_subsingleton {A : Matrix n n α} [Subsingleton α] : A.IsHermitian :=
@@ -76,7 +81,7 @@ theorem IsHermitian.transpose {A : Matrix n n α} (h : A.IsHermitian) : Aᵀ.IsH
7681 exact congr_arg Matrix.transpose h
7782
7883@[simp]
79- theorem isHermitian_transpose_iff ( A : Matrix n n α) : Aᵀ.IsHermitian ↔ A.IsHermitian :=
84+ theorem isHermitian_transpose_iff { A : Matrix n n α} : Aᵀ.IsHermitian ↔ A.IsHermitian :=
8085 ⟨by intro h; rw [← transpose_transpose A]; exact IsHermitian.transpose h, IsHermitian.transpose⟩
8186
8287theorem IsHermitian.conjTranspose {A : Matrix n n α} (h : A.IsHermitian) : Aᴴ.IsHermitian :=
@@ -91,14 +96,42 @@ theorem isHermitian_submatrix_equiv {A : Matrix n n α} (e : m ≃ n) :
9196 (A.submatrix e e).IsHermitian ↔ A.IsHermitian :=
9297 ⟨fun h => by simpa using h.submatrix e.symm, fun h => h.submatrix _⟩
9398
99+ theorem IsHermitian.reindex {A : Matrix n n α} (h : A.IsHermitian) (f : n ≃ m) :
100+ (A.reindex f f).IsHermitian := by
101+ rw [reindex_apply]
102+ apply submatrix h
103+
104+ theorem isHermitian_reindex_iff {A : Matrix n n α} (f : n ≃ m) :
105+ (A.reindex f f).IsHermitian ↔ A.IsHermitian := by
106+ refine ⟨fun h ↦ ?_, (·.reindex f)⟩
107+ simpa using h.reindex f.symm
108+
109+ theorem conjTranspose_comp {I J K L : Type *} (M : Matrix I J (Matrix K L α)) :
110+ (comp I J K L α M)ᴴ = comp J I L K α (Mᵀ.map (·ᴴ)) :=
111+ rfl
112+
113+ /-- When the inner matrices are square we can use the induced star operation -/
114+ theorem conjTranspose_comp' {I J K : Type *} (M : Matrix I J (Matrix K K α)) :
115+ (comp I J K K α M)ᴴ = comp J I K K α Mᴴ :=
116+ rfl
117+
118+ theorem isHermitian_comp_iff {A : Matrix m m (Matrix n n α)} :
119+ (A.comp m m n n α).IsHermitian ↔ A.IsHermitian := by
120+ rw [IsHermitian, IsHermitian, conjTranspose_comp', comp .. |>.injective.eq_iff]
121+
122+ theorem isHermitian_comp_iff_forall {A : Matrix m m (Matrix n n α)} :
123+ (A.comp m m n n α).IsHermitian ↔ ∀ i j i' j', star (A j i j' i') = A i j i' j' := by
124+ simp [IsHermitian.ext_iff]
125+ grind
126+
94127end Star
95128
96129section InvolutiveStar
97130
98131variable [InvolutiveStar α]
99132
100133@[simp]
101- theorem isHermitian_conjTranspose_iff ( A : Matrix n n α) : Aᴴ.IsHermitian ↔ A.IsHermitian :=
134+ theorem isHermitian_conjTranspose_iff { A : Matrix n n α} : Aᴴ.IsHermitian ↔ A.IsHermitian :=
102135 IsSelfAdjoint.star_iff
103136
104137/-- A block matrix `A.from_blocks B C D` is Hermitian,
@@ -174,13 +207,52 @@ variable [AddGroup α] [StarAddMonoid α]
174207theorem IsHermitian.neg {A : Matrix n n α} (h : A.IsHermitian) : (-A).IsHermitian :=
175208 IsSelfAdjoint.neg h
176209
210+ @[simp]
211+ theorem isHermitian_neg_iff {A : Matrix n n α} : (-A).IsHermitian ↔ A.IsHermitian := by
212+ refine ⟨fun h ↦ ?_, (·.neg)⟩
213+ rw [← neg_neg A]
214+ exact h.neg
215+
177216@[simp]
178217theorem IsHermitian.sub {A B : Matrix n n α} (hA : A.IsHermitian) (hB : B.IsHermitian) :
179218 (A - B).IsHermitian :=
180219 IsSelfAdjoint.sub hA hB
181220
182221end AddGroup
183222
223+ section StarModule
224+
225+ variable {R : Type *} [Star R] [Star α] [SMul R α] [StarModule R α]
226+
227+ theorem IsHermitian.smul {A : Matrix n n α} (h : A.IsHermitian) {k : R} (hk : IsSelfAdjoint k) :
228+ (k • A).IsHermitian := by
229+ rw [IsHermitian, conjTranspose_smul, hk.star_eq, h.eq]
230+
231+ end StarModule
232+
233+ section MulAction_StarModule
234+
235+ variable {R : Type *} [Monoid R] [Star R] [Star α] [MulAction R α] [StarModule R α]
236+
237+ theorem IsHermitian.of_smul {A : Matrix n n α} {k : R} [Invertible k] (h : (k • A).IsHermitian)
238+ (hk : IsSelfAdjoint k) : A.IsHermitian := by
239+ rw [IsHermitian, conjTranspose_smul, hk.star_eq] at h
240+ simpa using congr(⅟k • $h)
241+
242+ /-- Assumes `IsSelfAdjoint ⅟k` instead of `IsSelfAdjoint k`.
243+ These are equivalent given `StarMul R` -/
244+ theorem IsHermitian.of_smul' {A : Matrix n n α} {k : R} [Invertible k] (h : (k • A).IsHermitian)
245+ (hk : IsSelfAdjoint ⅟k) : A.IsHermitian := by
246+ rw [← invOf_smul_smul k A]
247+ exact h.smul hk
248+
249+ @[simp]
250+ theorem isHermitian_smul_iff {A : Matrix n n α} {k : R} [Invertible k] (hk : IsSelfAdjoint k) :
251+ (k • A).IsHermitian ↔ A.IsHermitian :=
252+ ⟨(·.of_smul hk), (·.smul hk)⟩
253+
254+ end MulAction_StarModule
255+
184256section NonUnitalSemiring
185257
186258variable [NonUnitalSemiring α] [StarRing α]
@@ -213,16 +285,22 @@ lemma IsHermitian.commute_iff [Fintype n] {A B : Matrix n n α}
213285
214286end NonUnitalSemiring
215287
216- section Semiring
288+ section NonAssocSemiring
217289
218- variable [Semiring α] [StarRing α]
290+ variable [NonAssocSemiring α] [StarRing α]
219291
220292/-- Note this is more general for matrices than `isSelfAdjoint_one` as it does not
221293require `Fintype n`, which is necessary for `Monoid (Matrix n n R)`. -/
222294@[simp]
223295theorem isHermitian_one [DecidableEq n] : (1 : Matrix n n α).IsHermitian :=
224296 conjTranspose_one
225297
298+ end NonAssocSemiring
299+
300+ section Semiring
301+
302+ variable [Semiring α] [StarRing α]
303+
226304@[simp]
227305theorem isHermitian_natCast [DecidableEq n] (d : ℕ) : (d : Matrix n n α).IsHermitian :=
228306 conjTranspose_natCast _
0 commit comments