forked from leanprover-community/mathlib4
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathConjSqrt.lean
More file actions
97 lines (72 loc) · 3.23 KB
/
Copy pathConjSqrt.lean
File metadata and controls
97 lines (72 loc) · 3.23 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
/-
Copyright (c) 2026 Frédéric Dupuis. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Authors: Frédéric Dupuis
-/
module
public import Mathlib.Analysis.SpecialFunctions.ContinuousFunctionalCalculus.Rpow.Basic
/-!
# Conjugating by the square root of a positive element in a C⋆-algebra
This file defines `conjSqrt c a` as `sqrt c * a * sqrt c`, and develops API for this operation.
## Main declarations
* `conjSqrt c`: the map `fun a => sqrt c * a * sqrt c`, bundled as a continuous linear map,
-/
namespace CFC
open Ring
public section ConjSqrt
variable {A : Type*} [PartialOrder A] [Ring A] [StarRing A] [TopologicalSpace A]
[StarOrderedRing A] [Algebra ℝ A] [ContinuousFunctionalCalculus ℝ A IsSelfAdjoint]
[NonnegSpectrumClass ℝ A] [SeparatelyContinuousMul A]
/-- Conjugation by the square root of an element, i.e. `sqrt c * a * sqrt c`. -/
@[expose]
noncomputable def conjSqrt (c : A) : A →L[ℝ] A where
toLinearMap := .mulLeftRight ℝ (sqrt c, sqrt c)
@[simp] lemma toLinearMap_conjSqrt (c : A) :
(conjSqrt c).toLinearMap = .mulLeftRight ℝ (sqrt c, sqrt c) := rfl
lemma conjSqrt_apply {c a : A} : conjSqrt c a = sqrt c * a * sqrt c := rfl
lemma conjSqrt_of_not_nonneg {c a : A} (hc : ¬0 ≤ c) : conjSqrt c a = 0 := by
simp [conjSqrt_apply, sqrt_of_not_nonneg hc]
lemma conjSqrt_monotone {c : A} : Monotone (conjSqrt c) := by
intro a b hab
by_cases hc : 0 ≤ c
· exact IsSelfAdjoint.conjugate_le_conjugate hab (by cfc_tac)
· simp [conjSqrt_of_not_nonneg hc]
@[gcongr]
lemma conjSqrt_le_conjSqrt {c a b : A} (h : a ≤ b) : conjSqrt c a ≤ conjSqrt c b :=
conjSqrt_monotone h
variable [IsSemitopologicalRing A] [T2Space A]
set_option linter.overlappingInstances false
@[grind =]
lemma isStrictlyPositive_conjSqrt_iff (c a : A) (hc : IsStrictlyPositive c := by cfc_tac) :
IsStrictlyPositive (conjSqrt c a) ↔ IsStrictlyPositive a := by
have hc' : IsSelfAdjoint (sqrt c) := by cfc_tac
rw [conjSqrt_apply]
by_cases ha : IsSelfAdjoint a <;> grind
@[grind _=_]
lemma ringInverse_conjSqrt (c a : A) (hc : IsStrictlyPositive c := by cfc_tac) :
(conjSqrt c a)⁻¹ʳ = conjSqrt c⁻¹ʳ a⁻¹ʳ := by
by_cases ha : IsUnit a
· grind [conjSqrt_apply]
· have : ¬IsUnit (conjSqrt c a) := by grind [conjSqrt_apply, IsUnit.mul_left_iff]
simp [inverse_non_unit a ha, inverse_non_unit _ this]
@[grind =]
lemma conjSqrt_ringInverse_conjSqrt (c a : A) (hc : IsStrictlyPositive c := by cfc_tac) :
conjSqrt c⁻¹ʳ (conjSqrt c a) = a := by
grind [IsSelfAdjoint.commute_of_mul_eq_isSelfAdjoint _ (sqrt c) 1, Ring.inverse_mul_cancel,
conjSqrt_apply] =>
have : sqrt c⁻¹ʳ * sqrt c = 1
have : Commute (sqrt c) (sqrt c⁻¹ʳ)
finish
@[grind =]
lemma conjSqrt_conjSqrt_ringInverse (c a : A) (hc : IsStrictlyPositive c := by cfc_tac) :
conjSqrt c (conjSqrt c⁻¹ʳ a) = a := by
grind [conjSqrt_ringInverse_conjSqrt _ _ hc.ringInverse]
@[grind =]
lemma conjSqrt_one (c : A) (hc : 0 ≤ c := by cfc_tac) : conjSqrt c 1 = c := by
rw [conjSqrt_apply, mul_one, sqrt_mul_sqrt_self _]
@[grind =]
lemma conjSqrt_ringInverse_self (c : A) (hc : IsStrictlyPositive c := by cfc_tac) :
conjSqrt c⁻¹ʳ c = 1 := by
grind [conjSqrt_one c]
end ConjSqrt
end CFC