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

Commit 40524f1

Browse files
committed
feat(algebra/star/self_adjoint): define normal elements of a star monoid (#11991)
In this PR, we define the normal elements of a star monoid, i.e. those elements `x` that commute with `star x`. This is defined as the prop type class `is_star_normal`. This was formalized as part of the semilinear maps paper. Co-authored-by: Frédéric Dupuis <31101893+dupuisf@users.noreply.github.com>
1 parent 544f45b commit 40524f1

File tree

1 file changed

+46
-1
lines changed

1 file changed

+46
-1
lines changed

src/algebra/star/self_adjoint.lean

Lines changed: 46 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,12 +8,15 @@ import algebra.star.basic
88
import group_theory.subgroup.basic
99

1010
/-!
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
1212
1313
This file defines `self_adjoint R` (resp. `skew_adjoint R`), where `R` is a star additive group,
1414
as the additive subgroup containing the elements that satisfy `star x = x` (resp. `star x = -x`).
1515
This includes, for instance, (skew-)Hermitian operators on Hilbert spaces.
1616
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+
1720
## Implementation notes
1821
1922
* 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 :=
5457

5558
variables {R}
5659

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+
5770
namespace self_adjoint
5871

5972
section add_group
@@ -91,6 +104,12 @@ by simp only [mem_iff, star_mul, star_star, mem_iff.mp hx, mul_assoc]
91104
lemma conjugate' {x : R} (hx : x ∈ self_adjoint R) (z : R) : star z * x * z ∈ self_adjoint R :=
92105
by simp only [mem_iff, star_mul, star_star, mem_iff.mp hx, mul_assoc]
93106

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+
94113
instance : has_pow (self_adjoint R) ℕ :=
95114
⟨λ x n, ⟨(x : R) ^ n, by simp only [mem_iff, star_pow, star_coe_eq]⟩⟩
96115

@@ -212,6 +231,12 @@ by simp only [mem_iff, star_mul, star_star, mem_iff.mp hx, neg_mul, mul_neg, mul
212231
lemma conjugate' {x : R} (hx : x ∈ skew_adjoint R) (z : R) : star z * x * z ∈ skew_adjoint R :=
213232
by simp only [mem_iff, star_mul, star_star, mem_iff.mp hx, neg_mul, mul_neg, mul_assoc]
214233

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+
215240
end ring
216241

217242
section has_scalar
@@ -237,3 +262,23 @@ function.injective.module R (skew_adjoint A).subtype subtype.coe_injective coe_s
237262
end has_scalar
238263

239264
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

Comments
 (0)