@@ -8,12 +8,15 @@ import algebra.star.basic
8
8
import group_theory.subgroup.basic
9
9
10
10
/-!
11
- # Self-adjoint and skew-adjoint elements of a star additive group
11
+ # Self-adjoint, skew-adjoint and normal elements of a star additive group
12
12
13
13
This file defines `self_adjoint R` (resp. `skew_adjoint R`), where `R` is a star additive group,
14
14
as the additive subgroup containing the elements that satisfy `star x = x` (resp. `star x = -x`).
15
15
This includes, for instance, (skew-)Hermitian operators on Hilbert spaces.
16
16
17
+ We also define `is_star_normal R`, a `Prop` that states that an element `x` satisfies
18
+ `star x * x = x * star x`.
19
+
17
20
## Implementation notes
18
21
19
22
* When `R` is a `star_module R₂ R`, then `self_adjoint R` has a natural
@@ -54,6 +57,16 @@ def skew_adjoint [add_comm_group R] [star_add_monoid R] : add_subgroup R :=
54
57
55
58
variables {R}
56
59
60
+ /-- An element of a star monoid is normal if it commutes with its adjoint. -/
61
+ class is_star_normal [has_mul R] [has_star R] (x : R) : Prop :=
62
+ (star_comm_self : commute (star x) x)
63
+
64
+ export is_star_normal (star_comm_self)
65
+
66
+ lemma star_comm_self' [has_mul R] [has_star R] (x : R) [is_star_normal x] :
67
+ (star x) * x = x * star x :=
68
+ is_star_normal.star_comm_self
69
+
57
70
namespace self_adjoint
58
71
59
72
section add_group
@@ -91,6 +104,12 @@ by simp only [mem_iff, star_mul, star_star, mem_iff.mp hx, mul_assoc]
91
104
lemma conjugate' {x : R} (hx : x ∈ self_adjoint R) (z : R) : star z * x * z ∈ self_adjoint R :=
92
105
by simp only [mem_iff, star_mul, star_star, mem_iff.mp hx, mul_assoc]
93
106
107
+ lemma is_star_normal_of_mem {x : R} (hx : x ∈ self_adjoint R) : is_star_normal x :=
108
+ ⟨by { simp only [mem_iff] at hx, simp only [hx] }⟩
109
+
110
+ instance (x : self_adjoint R) : is_star_normal (x : R) :=
111
+ is_star_normal_of_mem (set_like.coe_mem _)
112
+
94
113
instance : has_pow (self_adjoint R) ℕ :=
95
114
⟨λ x n, ⟨(x : R) ^ n, by simp only [mem_iff, star_pow, star_coe_eq]⟩⟩
96
115
@@ -212,6 +231,12 @@ by simp only [mem_iff, star_mul, star_star, mem_iff.mp hx, neg_mul, mul_neg, mul
212
231
lemma conjugate' {x : R} (hx : x ∈ skew_adjoint R) (z : R) : star z * x * z ∈ skew_adjoint R :=
213
232
by simp only [mem_iff, star_mul, star_star, mem_iff.mp hx, neg_mul, mul_neg, mul_assoc]
214
233
234
+ lemma is_star_normal_of_mem {x : R} (hx : x ∈ skew_adjoint R) : is_star_normal x :=
235
+ ⟨by { simp only [mem_iff] at hx, simp only [hx, commute.neg_left] }⟩
236
+
237
+ instance (x : skew_adjoint R) : is_star_normal (x : R) :=
238
+ is_star_normal_of_mem (set_like.coe_mem _)
239
+
215
240
end ring
216
241
217
242
section has_scalar
@@ -237,3 +262,23 @@ function.injective.module R (skew_adjoint A).subtype subtype.coe_injective coe_s
237
262
end has_scalar
238
263
239
264
end skew_adjoint
265
+
266
+ instance is_star_normal_zero [semiring R] [star_ring R] : is_star_normal (0 : R) :=
267
+ ⟨by simp only [star_comm_self, star_zero]⟩
268
+
269
+ instance is_star_normal_one [monoid R] [star_semigroup R] : is_star_normal (1 : R) :=
270
+ ⟨by simp only [star_comm_self, star_one]⟩
271
+
272
+ instance is_star_normal_star_self [monoid R] [star_semigroup R] {x : R} [is_star_normal x] :
273
+ is_star_normal (star x) :=
274
+ ⟨show star (star x) * (star x) = (star x) * star (star x), by rw [star_star, star_comm_self']⟩
275
+
276
+ @[priority 100 ] -- see Note [lower instance priority]
277
+ instance has_trivial_star.is_star_normal [monoid R] [star_semigroup R]
278
+ [has_trivial_star R] {x : R} : is_star_normal x :=
279
+ ⟨by rw [star_trivial]⟩
280
+
281
+ @[priority 100 ] -- see Note [lower instance priority]
282
+ instance comm_monoid.is_star_normal [comm_monoid R] [star_semigroup R] {x : R} :
283
+ is_star_normal x :=
284
+ ⟨mul_comm _ _⟩
0 commit comments