Self-adjoint elements of a star additive group #
This file defines self_adjoint R
, where R
is a star additive monoid, as the additive subgroup
containing the elements that satisfy star x = x
. This includes, for instance, Hermitian
operators on Hilbert spaces.
Implementation notes #
- When
R
is astar_module R₂ R
, thenself_adjoint R
has a naturalmodule (self_adjoint R₂) (self_adjoint R)
structure. However, doing this literally would be undesirable since in the main case of interest (R₂ = ℂ
) we wantmodule ℝ (self_adjoint R)
and notmodule (self_adjoint ℂ) (self_adjoint R)
. We solve this issue by adding the typeclass[has_trivial_star R₃]
, of whichℝ
is an instance (registered indata/real/basic
), and then add a[module R₃ (self_adjoint R)]
instance whenever we have[module R₃ R] [has_trivial_star R₃]
. (Another approach would have been to define[star_invariant_scalars R₃ R]
to express the fact thatstar (x • v) = x • star v
, but this typeclass would have the disadvantage of taking two type arguments.)
TODO #
- Define
λ z x, z * x * star z
(i.e. conjugation byz
) as a monoid action ofR
onR
(similar to the existingconj_act
for groups), and then state the fact thatself_adjoint R
is invariant under it.
The self-adjoint elements of a star additive group, as an additive subgroup.
theorem
self_adjoint.mem_iff
{R : Type u_1}
[add_group R]
[star_add_monoid R]
{x : R} :
x ∈ self_adjoint R ↔ star x = x
@[simp, norm_cast]
theorem
self_adjoint.star_coe_eq
{R : Type u_1}
[add_group R]
[star_add_monoid R]
{x : ↥(self_adjoint R)} :
@[protected, instance]
Equations
- self_adjoint.inhabited = {default := 0}
@[protected, instance]
Equations
- self_adjoint.add_comm_group = {add := add_group.add (self_adjoint R).to_add_group, add_assoc := _, zero := add_group.zero (self_adjoint R).to_add_group, zero_add := _, add_zero := _, nsmul := add_group.nsmul (self_adjoint R).to_add_group, nsmul_zero' := _, nsmul_succ' := _, neg := add_group.neg (self_adjoint R).to_add_group, sub := add_group.sub (self_adjoint R).to_add_group, sub_eq_add_neg := _, zsmul := add_group.zsmul (self_adjoint R).to_add_group, zsmul_zero' := _, zsmul_succ' := _, zsmul_neg' := _, add_left_neg := _, add_comm := _}
@[protected, instance]
Equations
- self_adjoint.has_one = {one := ⟨1, _⟩}
@[protected, instance]
theorem
self_adjoint.bit0_mem
{R : Type u_1}
[ring R]
[star_ring R]
{x : R}
(hx : x ∈ self_adjoint R) :
bit0 x ∈ self_adjoint R
theorem
self_adjoint.bit1_mem
{R : Type u_1}
[ring R]
[star_ring R]
{x : R}
(hx : x ∈ self_adjoint R) :
bit1 x ∈ self_adjoint R
theorem
self_adjoint.conjugate
{R : Type u_1}
[ring R]
[star_ring R]
{x : R}
(hx : x ∈ self_adjoint R)
(z : R) :
(z * x) * star z ∈ self_adjoint R
theorem
self_adjoint.conjugate'
{R : Type u_1}
[ring R]
[star_ring R]
{x : R}
(hx : x ∈ self_adjoint R)
(z : R) :
((star z) * x) * z ∈ self_adjoint R
@[protected, instance]
Equations
- self_adjoint.has_mul = {mul := λ (x y : ↥(self_adjoint R)), ⟨(↑x) * ↑y, _⟩}
@[protected, instance]
Equations
- self_adjoint.comm_ring = {add := add_comm_group.add self_adjoint.add_comm_group, add_assoc := _, zero := add_comm_group.zero self_adjoint.add_comm_group, zero_add := _, add_zero := _, nsmul := add_comm_group.nsmul self_adjoint.add_comm_group, nsmul_zero' := _, nsmul_succ' := _, neg := add_comm_group.neg self_adjoint.add_comm_group, sub := add_comm_group.sub self_adjoint.add_comm_group, sub_eq_add_neg := _, zsmul := add_comm_group.zsmul self_adjoint.add_comm_group, zsmul_zero' := _, zsmul_succ' := _, zsmul_neg' := _, add_left_neg := _, add_comm := _, mul := has_mul.mul self_adjoint.has_mul, mul_assoc := _, one := 1, one_mul := _, mul_one := _, npow := ring.npow._default 1 has_mul.mul self_adjoint.comm_ring._proof_15 self_adjoint.comm_ring._proof_16, npow_zero' := _, npow_succ' := _, left_distrib := _, right_distrib := _, mul_comm := _}
@[protected, instance]
Equations
- self_adjoint.field = {add := comm_ring.add self_adjoint.comm_ring, add_assoc := _, zero := comm_ring.zero self_adjoint.comm_ring, zero_add := _, add_zero := _, nsmul := comm_ring.nsmul self_adjoint.comm_ring, nsmul_zero' := _, nsmul_succ' := _, neg := comm_ring.neg self_adjoint.comm_ring, sub := comm_ring.sub self_adjoint.comm_ring, sub_eq_add_neg := _, zsmul := comm_ring.zsmul self_adjoint.comm_ring, zsmul_zero' := _, zsmul_succ' := _, zsmul_neg' := _, add_left_neg := _, add_comm := _, mul := comm_ring.mul self_adjoint.comm_ring, mul_assoc := _, one := comm_ring.one self_adjoint.comm_ring, one_mul := _, mul_one := _, npow := comm_ring.npow self_adjoint.comm_ring, npow_zero' := _, npow_succ' := _, left_distrib := _, right_distrib := _, mul_comm := _, inv := λ (x : ↥(self_adjoint R)), ⟨(x.val)⁻¹, _⟩, div := div_inv_monoid.div._default comm_ring.mul self_adjoint.field._proof_21 comm_ring.one self_adjoint.field._proof_22 self_adjoint.field._proof_23 comm_ring.npow self_adjoint.field._proof_24 self_adjoint.field._proof_25 (λ (x : ↥(self_adjoint R)), ⟨(x.val)⁻¹, _⟩), div_eq_mul_inv := _, zpow := div_inv_monoid.zpow._default comm_ring.mul self_adjoint.field._proof_27 comm_ring.one self_adjoint.field._proof_28 self_adjoint.field._proof_29 comm_ring.npow self_adjoint.field._proof_30 self_adjoint.field._proof_31 (λ (x : ↥(self_adjoint R)), ⟨(x.val)⁻¹, _⟩), zpow_zero' := _, zpow_succ' := _, zpow_neg' := _, exists_pair_ne := _, mul_inv_cancel := _, inv_zero := _}
@[protected, instance]
def
self_adjoint.has_scalar
{R : Type u_1}
{A : Type u_2}
[semiring R]
[has_star R]
[has_trivial_star R]
[add_comm_group A]
[star_add_monoid A]
[module R A]
[star_module R A] :
has_scalar R ↥(self_adjoint A)
Equations
- self_adjoint.has_scalar = {smul := λ (r : R) (x : ↥(self_adjoint A)), ⟨r • ↑x, _⟩}
@[simp, norm_cast]
theorem
self_adjoint.coe_smul
{R : Type u_1}
{A : Type u_2}
[semiring R]
[has_star R]
[has_trivial_star R]
[add_comm_group A]
[star_add_monoid A]
[module R A]
[star_module R A]
(r : R)
(x : ↥(self_adjoint A)) :
@[protected, instance]
def
self_adjoint.mul_action
{R : Type u_1}
{A : Type u_2}
[semiring R]
[has_star R]
[has_trivial_star R]
[add_comm_group A]
[star_add_monoid A]
[module R A]
[star_module R A] :
mul_action R ↥(self_adjoint A)
Equations
- self_adjoint.mul_action = {to_has_scalar := self_adjoint.has_scalar _inst_7, one_smul := _, mul_smul := _}
@[protected, instance]
def
self_adjoint.distrib_mul_action
{R : Type u_1}
{A : Type u_2}
[semiring R]
[has_star R]
[has_trivial_star R]
[add_comm_group A]
[star_add_monoid A]
[module R A]
[star_module R A] :
Equations
- self_adjoint.distrib_mul_action = {to_mul_action := self_adjoint.mul_action _inst_7, smul_add := _, smul_zero := _}
@[protected, instance]
def
self_adjoint.module
{R : Type u_1}
{A : Type u_2}
[semiring R]
[has_star R]
[has_trivial_star R]
[add_comm_group A]
[star_add_monoid A]
[module R A]
[star_module R A] :
module R ↥(self_adjoint A)
Equations
- self_adjoint.module = {to_distrib_mul_action := self_adjoint.distrib_mul_action _inst_7, add_smul := _, zero_smul := _}