Skip to content

Commit 4c492e5

Browse files
committed
feat: the unitary group in a C⋆-algebra is locally path connected (#30311)
When `A` is a unital C⋆-algebra and `u : unitary A` is a unitary element whose distance to `1` is less that `2`, the spectrum of `u` is contained in the slit plane, so the principal branch of the logarithm is continuous on the spectrum of `u` (or equivalently, `Complex.arg` is continuous on the spectrum). The continuous functional calculus can then be used to define a selfadjoint element `x` such that `u = exp (I • x)`. Moreover, there is a relatively nice relationship between the norm of `x` and the norm of `u - 1`, namely `‖u - 1‖ ^ 2 = 2 * (1 - cos ‖x‖)`. In fact, these maps `u ↦ x` and `x ↦ u` establish a partial homeomorphism between `ball (1 : unitary A) 2` and `ball (0 : selfAdjoint A) π`. The map `t ↦ exp (t • (I • x))` constitutes a path from `1` to `u`, showing that unitary elements sufficiently close (i.e., within a distance `2`) to `1 : unitary A` are path connected to `1`. This property can be translated around the unitary group to show that if `u v : unitary A` are unitary elements with `‖u - v‖ < 2`, then there is a path joining them. In fact, this path has the property that it lies within `closedBall u ‖u - v‖`, and consequently any ball of radius `δ < 2` in `unitary A` is path connected. Therefore, the unitary group is locally path connected. Finally, we provide the standard characterization of the path component of `1 : unitary A` as finite products of exponential unitaries.
1 parent 8a1a1e3 commit 4c492e5

File tree

3 files changed

+350
-0
lines changed

3 files changed

+350
-0
lines changed

Mathlib.lean

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1460,6 +1460,7 @@ import Mathlib.Analysis.CStarAlgebra.PositiveLinearMap
14601460
import Mathlib.Analysis.CStarAlgebra.Projection
14611461
import Mathlib.Analysis.CStarAlgebra.SpecialFunctions.PosPart
14621462
import Mathlib.Analysis.CStarAlgebra.Spectrum
1463+
import Mathlib.Analysis.CStarAlgebra.Unitary.Connected
14631464
import Mathlib.Analysis.CStarAlgebra.Unitary.Span
14641465
import Mathlib.Analysis.CStarAlgebra.Unitization
14651466
import Mathlib.Analysis.CStarAlgebra.lpSpace

Mathlib/Analysis/CStarAlgebra/Spectrum.lean

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,10 @@ theorem spectrum.subset_circle_of_unitary {u : E} (h : u ∈ unitary E) :
8484
spectrum 𝕜 u ⊆ Metric.sphere 0 1 :=
8585
unitary.spectrum_subset_circle ⟨u, h⟩
8686

87+
theorem spectrum.norm_eq_one_of_unitary {u : E} (hu : u ∈ unitary E)
88+
⦃z : 𝕜⦄ (hz : z ∈ spectrum 𝕜 u) : ‖z‖ = 1 := by
89+
simpa using spectrum.subset_circle_of_unitary hu hz
90+
8791
end UnitarySpectrum
8892

8993
section Quasispectrum
Lines changed: 345 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,345 @@
1+
/-
2+
Copyright (c) 2025 Jireh Loreaux. All rights reserved.
3+
Released under Apache 2.0 license as described in the file LICENSE.
4+
Authors: Jireh Loreaux
5+
-/
6+
import Mathlib.Analysis.CStarAlgebra.ContinuousFunctionalCalculus.Continuity
7+
import Mathlib.Analysis.CStarAlgebra.ContinuousFunctionalCalculus.Order
8+
import Mathlib.Analysis.CStarAlgebra.Exponential
9+
import Mathlib.Analysis.SpecialFunctions.Complex.Circle
10+
import Mathlib.Analysis.SpecialFunctions.ContinuousFunctionalCalculus.ExpLog
11+
12+
/-! # The unitary group in a unital C⋆-algebra is locally path connected
13+
14+
When `A` is a unital C⋆-algebra and `u : unitary A` is a unitary element whose distance to `1` is
15+
less that `2`, the spectrum of `u` is contained in the slit plane, so the principal branch of the
16+
logarithm is continuous on the spectrum of `u` (or equivalently, `Complex.arg` is continuous on the
17+
spectrum). The continuous functional calculus can then be used to define a selfadjoint element `x`
18+
such that `u = exp (I • x)`. Moreover, there is a relatively nice relationship between the norm of
19+
`x` and the norm of `u - 1`, namely `‖u - 1‖ ^ 2 = 2 * (1 - cos ‖x‖)`. In fact, these maps `u ↦ x`
20+
and `x ↦ u` establish a partial homeomorphism between `ball (1 : unitary A) 2` and
21+
`ball (0 : selfAdjoint A) π`.
22+
23+
The map `t ↦ exp (t • (I • x))` constitutes a path from `1` to `u`, showing that unitary elements
24+
sufficiently close (i.e., within a distance `2`) to `1 : unitary A` are path connected to `1`.
25+
This property can be translated around the unitary group to show that if `u v : unitary A` are
26+
unitary elements with `‖u - v‖ < 2`, then there is a path joining them. In fact, this path has the
27+
property that it lies within `closedBall u ‖u - v‖`, and consequently any ball of radius `δ < 2` in
28+
`unitary A` is path connected. Therefore, the unitary group is locally path connected.
29+
30+
Finally, we provide the standard characterization of the path component of `1 : unitary A` as finite
31+
products of exponential unitaries.
32+
33+
## Main results
34+
35+
+ `unitary.argSelfAdjoint`: the selfadjoint element obtained by taking the argument (using the
36+
principal branch and the continuous functional calculus) of a unitary. This returns `0` if
37+
the principal branch of the logarithm is not continuous on the spectrum of the unitary element.
38+
+ `selfAdjoint.norm_sq_expUnitary_sub_one`:
39+
`‖(selfAdjoint.expUnitary x - 1 : A)‖ ^ 2 = 2 * (1 - Real.cos ‖x‖)`
40+
+ `unitary.norm_argSelfAdjoint`:
41+
`‖unitary.argSelfAdjoint u‖ = Real.arccos (1 - ‖(u - 1 : A)‖ ^ 2 / 2)`
42+
+ `unitary.openPartialHomeomorph`: the maps `unitary.argSelfAdjoint` and `selfAdjoint.expUnitary`
43+
form a partial homeomorphism between `ball (1 : unitary A) 2` and `ball (0 : selfAdjoint A) π`.
44+
+ `selfAdjoint.expUnitaryPathToOne`: the path `t ↦ expUnitary (t • x)` from `1` to
45+
`expUnitary x` for a selfadjoint element `x`.
46+
+ `unitary.isPathConnected_ball`: any ball of radius `δ < 2` in the unitary group of a unital
47+
C⋆-algebra is path connected.
48+
+ `unitary.instLocPathConnectedSpace`: the unitary group of a C⋆-algebra is locally path connected.
49+
+ `unitary.mem_pathComponentOne_iff`: The path component of the identity in the unitary group of a
50+
C⋆-algebra is the set of unitaries that can be expressed as a product of exponentials of
51+
selfadjoint elements.
52+
-/
53+
54+
variable {A : Type*} [CStarAlgebra A]
55+
56+
open Complex Metric NormedSpace selfAdjoint unitary
57+
open scoped Real
58+
59+
lemma unitary.two_mul_one_sub_le_norm_sub_one_sq {u : A} (hu : u ∈ unitary A)
60+
{z : ℂ} (hz : z ∈ spectrum ℂ u) :
61+
2 * (1 - z.re) ≤ ‖u - 1‖ ^ 2 := by
62+
rw [← Real.sqrt_le_left (by positivity)]
63+
have := spectrum.subset_circle_of_unitary hu hz
64+
simp only [mem_sphere_iff_norm, sub_zero] at this
65+
rw [← cfc_id' ℂ u, ← cfc_one ℂ u, ← cfc_sub ..]
66+
convert norm_apply_le_norm_cfc (fun z ↦ z - 1) u hz
67+
simpa using congr(Real.sqrt $(norm_sub_one_sq_eq_of_norm_one this)).symm
68+
69+
lemma unitary.norm_sub_one_sq_eq {u : A} (hu : u ∈ unitary A) {x : ℝ}
70+
(hz : IsLeast (re '' (spectrum ℂ u)) x) :
71+
‖u - 1‖ ^ 2 = 2 * (1 - x) := by
72+
obtain (_ | _) := subsingleton_or_nontrivial A
73+
· exfalso; apply hz.nonempty.of_image.ne_empty; simp
74+
rw [← cfc_id' ℂ u, ← cfc_one ℂ u, ← cfc_sub ..]
75+
have h_eqOn : (spectrum ℂ u).EqOn (fun z ↦ ‖z - 1‖ ^ 2) (fun z ↦ 2 * (1 - z.re)) :=
76+
Complex.norm_sub_one_sq_eqOn_sphere.mono <| spectrum.subset_circle_of_unitary (𝕜 := ℂ) hu
77+
have h₂ : IsGreatest ((fun z ↦ 2 * (1 - z.re)) '' (spectrum ℂ u)) (2 * (1 - x)) := by
78+
have : Antitone (fun y : ℝ ↦ 2 * (1 - y)) := by intro _ _ _; simp only; gcongr
79+
simpa [Set.image_image] using this.map_isLeast hz
80+
have h₃ : IsGreatest ((‖· - 1‖ ^ 2) '' spectrum ℂ u) (‖cfc (· - 1 : ℂ → ℂ) u‖ ^ 2) := by
81+
have := pow_left_monotoneOn (n := 2) |>.mono (s₂ := ((‖· - 1‖) '' spectrum ℂ u)) (by aesop)
82+
simpa [Set.image_image] using this.map_isGreatest (IsGreatest.norm_cfc (fun z : ℂ ↦ z - 1) u)
83+
exact h₃.unique (h_eqOn.image_eq ▸ h₂)
84+
85+
lemma unitary.norm_sub_one_lt_two_iff {u : A} (hu : u ∈ unitary A) :
86+
‖u - 1‖ < 2 ↔ -1 ∉ spectrum ℂ u := by
87+
nontriviality A
88+
rw [← sq_lt_sq₀ (by positivity) (by positivity)]
89+
constructor
90+
· intro h h1
91+
have := two_mul_one_sub_le_norm_sub_one_sq hu h1 |>.trans_lt h
92+
norm_num at this
93+
· contrapose!
94+
obtain ⟨x, hx⟩ := spectrum.isCompact (𝕜 := ℂ) u |>.image continuous_re |>.exists_isLeast <|
95+
(spectrum.nonempty _).image _
96+
rw [norm_sub_one_sq_eq hu hx]
97+
obtain ⟨z, hz, rfl⟩ := hx.1
98+
intro key
99+
replace key : z.re ≤ -1 := by linarith
100+
have hz_norm : ‖z‖ = 1 := spectrum.norm_eq_one_of_unitary hu hz
101+
rw [← hz_norm, ← RCLike.re_eq_complex_re, RCLike.re_le_neg_norm_iff_eq_neg_norm, hz_norm] at key
102+
exact key ▸ hz
103+
104+
lemma unitary.spectrum_subset_slitPlane_iff_norm_lt_two {u : A} (hu : u ∈ unitary A) :
105+
spectrum ℂ u ⊆ slitPlane ↔ ‖u - 1‖ < 2 := by
106+
simp [subset_slitPlane_iff_of_subset_sphere (spectrum.subset_circle_of_unitary hu),
107+
unitary.norm_sub_one_lt_two_iff hu]
108+
109+
@[aesop safe apply (rule_sets := [CStarAlgebra])]
110+
lemma IsSelfAdjoint.cfc_arg (u : A) : IsSelfAdjoint (cfc (ofReal ∘ arg : ℂ → ℂ) u) := by
111+
simp [isSelfAdjoint_iff, ← cfc_star, Function.comp_def]
112+
113+
/-- The selfadjoint element obtained by taking the argument (using the principal branch and the
114+
continuous functional calculus) of a unitary whose spectrum does not contain `-1`. This returns
115+
`0` if the principal branch of the logarithm is not continuous on the spectrum of the unitary
116+
element. -/
117+
@[simps]
118+
noncomputable def unitary.argSelfAdjoint (u : unitary A) : selfAdjoint A :=
119+
⟨cfc (arg · : ℂ → ℂ) (u : A), .cfc_arg (u : A)⟩
120+
121+
lemma selfAdjoint.norm_sq_expUnitary_sub_one {x : selfAdjoint A} (hx : ‖x‖ ≤ π) :
122+
‖(expUnitary x - 1 : A)‖ ^ 2 = 2 * (1 - Real.cos ‖x‖) := by
123+
nontriviality A
124+
apply norm_sub_one_sq_eq (expUnitary x).2
125+
simp only [expUnitary_coe, AddSubgroupClass.coe_norm]
126+
rw [← CFC.exp_eq_normedSpace_exp, ← cfc_comp_smul I _ (x : A), cfc_map_spectrum ..,
127+
← x.2.spectrumRestricts.algebraMap_image]
128+
simp only [Set.image_image, coe_algebraMap, smul_eq_mul, mul_comm I, ← exp_eq_exp_ℂ,
129+
exp_ofReal_mul_I_re]
130+
refine ⟨?_, ?_⟩
131+
· cases CStarAlgebra.norm_or_neg_norm_mem_spectrum x.2 with
132+
| inl h => exact ⟨_, h, rfl⟩
133+
| inr h => exact ⟨_, h, by simp⟩
134+
· rintro - ⟨y, hy, rfl⟩
135+
exact Real.cos_abs y ▸ Real.cos_le_cos_of_nonneg_of_le_pi (by positivity) hx <|
136+
spectrum.norm_le_norm_of_mem hy
137+
138+
lemma argSelfAdjoint_expUnitary {x : selfAdjoint A} (hx : ‖x‖ < π) :
139+
argSelfAdjoint (expUnitary x) = x := by
140+
nontriviality A
141+
ext
142+
have : spectrum ℂ (expUnitary x : A) ⊆ slitPlane := by
143+
rw [spectrum_subset_slitPlane_iff_norm_lt_two (expUnitary x).2,
144+
← sq_lt_sq₀ (by positivity) (by positivity), norm_sq_expUnitary_sub_one hx.le]
145+
calc
146+
2 * (1 - Real.cos ‖x‖) < 2 * (1 - Real.cos π) := by
147+
gcongr
148+
exact Real.cos_lt_cos_of_nonneg_of_le_pi (by positivity) le_rfl hx
149+
_ = 2 ^ 2 := by norm_num
150+
simp only [argSelfAdjoint_coe, expUnitary_coe]
151+
rw [← CFC.exp_eq_normedSpace_exp, ← cfc_comp_smul .., ← cfc_comp' (hg := ?hg)]
152+
case hg =>
153+
refine continuous_ofReal.comp_continuousOn <| continuousOn_arg.mono ?_
154+
rwa [expUnitary_coe, ← CFC.exp_eq_normedSpace_exp, ← cfc_comp_smul ..,
155+
cfc_map_spectrum ..] at this
156+
conv_rhs => rw [← cfc_id' ℂ (x : A)]
157+
refine cfc_congr fun y hy ↦ ?_
158+
rw [← x.2.spectrumRestricts.algebraMap_image] at hy
159+
obtain ⟨y, hy, rfl⟩ := hy
160+
simp only [coe_algebraMap, smul_eq_mul, mul_comm I, ← exp_eq_exp_ℂ, ofReal_inj]
161+
replace hy : ‖y‖ < π := spectrum.norm_le_norm_of_mem hy |>.trans_lt hx
162+
simp only [Real.norm_eq_abs, abs_lt] at hy
163+
rw [← Circle.coe_exp, Circle.arg_exp hy.1 hy.2.le]
164+
165+
lemma expUnitary_argSelfAdjoint {u : unitary A} (hu : ‖(u - 1 : A)‖ < 2) :
166+
expUnitary (argSelfAdjoint u) = u := by
167+
ext
168+
have : ContinuousOn arg (spectrum ℂ (u : A)) :=
169+
continuousOn_arg.mono <| (spectrum_subset_slitPlane_iff_norm_lt_two u.2).mpr hu
170+
rw [expUnitary_coe, argSelfAdjoint_coe, ← CFC.exp_eq_normedSpace_exp,
171+
← cfc_comp_smul .., ← cfc_comp' ..]
172+
conv_rhs => rw [← cfc_id' ℂ (u : A)]
173+
refine cfc_congr fun y hy ↦ ?_
174+
have hy₁ : ‖y‖ = 1 := spectrum.norm_eq_one_of_unitary u.2 hy
175+
have : I * y.arg = log y :=
176+
Complex.ext (by simp [log_re, spectrum.norm_eq_one_of_unitary u.2 hy]) (by simp [log_im])
177+
simpa [← exp_eq_exp_ℂ, this] using exp_log (by aesop)
178+
179+
lemma unitary.norm_argSelfAdjoint_le_pi (u : unitary A) :
180+
‖argSelfAdjoint u‖ ≤ π :=
181+
norm_cfc_le (by positivity) fun y hy ↦ by simpa using abs_arg_le_pi y
182+
183+
lemma unitary.two_mul_one_sub_cos_norm_argSelfAdjoint {u : unitary A} (hu : ‖(u - 1 : A)‖ < 2) :
184+
2 * (1 - Real.cos ‖argSelfAdjoint u‖) = ‖(u - 1 : A)‖ ^ 2 := by
185+
conv_rhs => rw [← expUnitary_argSelfAdjoint hu]
186+
exact Eq.symm <| norm_sq_expUnitary_sub_one <| norm_argSelfAdjoint_le_pi u
187+
188+
lemma unitary.norm_argSelfAdjoint {u : unitary A} (hu : ‖(u - 1 : A)‖ < 2) :
189+
‖argSelfAdjoint u‖ = Real.arccos (1 - ‖(u - 1 : A)‖ ^ 2 / 2) := by
190+
refine Real.arccos_eq_of_eq_cos (by positivity) (norm_argSelfAdjoint_le_pi u) ?_ |>.symm
191+
linarith [two_mul_one_sub_cos_norm_argSelfAdjoint hu]
192+
193+
lemma unitary.norm_expUnitary_smul_argSelfAdjoint_sub_one_le (u : unitary A)
194+
{t : ℝ} (ht : t ∈ Set.Icc 0 1) (hu : ‖(u - 1 : A)‖ < 2) :
195+
‖(expUnitary (t • argSelfAdjoint u) - 1 : A)‖ ≤ ‖(u - 1 : A)‖ := by
196+
have key : ‖t • argSelfAdjoint u‖ ≤ ‖argSelfAdjoint u‖ := by
197+
rw [← one_mul ‖argSelfAdjoint u‖]
198+
simp_rw [AddSubgroupClass.coe_norm, val_smul, norm_smul, Real.norm_eq_abs, abs_of_nonneg ht.1]
199+
gcongr
200+
exact ht.2
201+
rw [← sq_le_sq₀ (by positivity) (by positivity)]
202+
rw [norm_sq_expUnitary_sub_one (key.trans <| norm_argSelfAdjoint_le_pi u)]
203+
trans 2 * (1 - Real.cos ‖argSelfAdjoint u‖)
204+
· gcongr
205+
exact Real.cos_le_cos_of_nonneg_of_le_pi (by positivity) (norm_argSelfAdjoint_le_pi u) key
206+
· exact (two_mul_one_sub_cos_norm_argSelfAdjoint hu).le
207+
208+
@[fun_prop]
209+
lemma unitary.continuousOn_argSelfAdjoint :
210+
ContinuousOn (argSelfAdjoint : unitary A → selfAdjoint A) (ball (1 : unitary A) 2) := by
211+
rw [Topology.IsInducing.subtypeVal.continuousOn_iff]
212+
simp only [SetLike.coe_sort_coe, Function.comp_def, argSelfAdjoint_coe]
213+
rw [isOpen_ball.continuousOn_iff]
214+
intro u (hu : dist u 1 < 2)
215+
obtain ⟨ε, huε, hε2⟩ := exists_between (sq_lt_sq₀ (by positivity) (by positivity) |>.mpr hu)
216+
have hε : 0 < ε := lt_of_le_of_lt (by positivity) huε
217+
have huε' : dist u 1 < √ε := Real.lt_sqrt_of_sq_lt huε
218+
apply ContinuousOn.continuousAt ?_ (closedBall_mem_nhds_of_mem huε')
219+
apply ContinuousOn.image_comp_continuous ?_ continuous_subtype_val
220+
apply continuousOn_cfc A (s := sphere 0 1 ∩ {z | 2 * (1 - z.re) ≤ ε}) ?_ _ ?_ |>.mono
221+
· rintro - ⟨v, hv, rfl⟩
222+
simp only [Set.subset_inter_iff, Set.mem_setOf_eq]
223+
refine ⟨inferInstance, spectrum_subset_circle v, ?_⟩
224+
intro z hz
225+
simp only [Set.mem_setOf_eq]
226+
trans ‖(v - 1 : A)‖ ^ 2
227+
· exact two_mul_one_sub_le_norm_sub_one_sq v.2 hz
228+
· refine Real.le_sqrt (by positivity) (by positivity) |>.mp ?_
229+
simpa [Subtype.dist_eq, dist_eq_norm] using hv
230+
· exact isCompact_sphere 0 1 |>.inter_right <| isClosed_le (by fun_prop) (by fun_prop)
231+
· refine continuous_ofReal.comp_continuousOn <| continuousOn_arg.mono ?_
232+
apply subset_slitPlane_iff_of_subset_sphere Set.inter_subset_left |>.mpr
233+
norm_num at hε2
234+
exact hε2
235+
236+
/-- the maps `unitary.argSelfAdjoint` and `selfAdjoint.expUnitary` form a partial
237+
homeomorphism between `ball (1 : unitary A) 2` and `ball (0 : selfAdjoint A) π`. -/
238+
@[simps]
239+
noncomputable def unitary.openPartialHomeomorph :
240+
OpenPartialHomeomorph (unitary A) (selfAdjoint A) where
241+
toFun := argSelfAdjoint
242+
invFun := expUnitary
243+
source := ball 1 2
244+
target := ball 0 π
245+
map_source' u hu := by
246+
simp only [mem_ball, Subtype.dist_eq, OneMemClass.coe_one, dist_eq_norm, sub_zero] at hu ⊢
247+
rw [norm_argSelfAdjoint hu]
248+
calc
249+
Real.arccos (1 - ‖(u - 1 : A)‖ ^ 2 / 2) < Real.arccos (1 - 2 ^ 2 / 2) := by
250+
apply Real.arccos_lt_arccos (by norm_num) (by gcongr)
251+
linarith [(by positivity : 0 ≤ ‖(u - 1 : A)‖ ^ 2 / 2)]
252+
_ = π := by norm_num
253+
map_target' x hx := by
254+
simp only [mem_ball, Subtype.dist_eq, OneMemClass.coe_one, dist_eq_norm, sub_zero] at hx ⊢
255+
rw [← sq_lt_sq₀ (by positivity) (by positivity), norm_sq_expUnitary_sub_one hx.le]
256+
have : -1 < Real.cos ‖(x : A)‖ :=
257+
Real.cos_pi ▸ Real.cos_lt_cos_of_nonneg_of_le_pi (by positivity) le_rfl hx
258+
simp only [AddSubgroupClass.coe_norm, mul_sub, mul_one, sq, gt_iff_lt]
259+
linarith
260+
left_inv' u hu := expUnitary_argSelfAdjoint <| by
261+
simpa [Subtype.dist_eq, dist_eq_norm] using hu
262+
right_inv' x hx := argSelfAdjoint_expUnitary <| by simpa using hx
263+
open_source := isOpen_ball
264+
open_target := isOpen_ball
265+
continuousOn_toFun := by fun_prop
266+
continuousOn_invFun := by fun_prop
267+
268+
lemma unitary.norm_sub_eq (u v : unitary A) :
269+
‖(u - v : A)‖ = ‖((u * star v : unitary A) - 1 : A)‖ := calc
270+
‖(u - v : A)‖ = ‖(u * star v - 1 : A) * v‖ := by simp [sub_mul, mul_assoc]
271+
_ = ‖((u * star v : unitary A) - 1 : A)‖ := by simp
272+
273+
lemma unitary.expUnitary_eq_mul_inv (u v : unitary A) (huv : ‖(u - v : A)‖ < 2) :
274+
expUnitary (argSelfAdjoint (u * star v)) = u * star v :=
275+
expUnitary_argSelfAdjoint <| norm_sub_eq u v ▸ huv
276+
277+
/-- For a selfadjoint element `x` in a C⋆-algebra, this is the path from `1` to `expUnitary x`
278+
given by `t ↦ expUnitary (t • x)`. -/
279+
@[simps]
280+
noncomputable def selfAdjoint.expUnitaryPathToOne (x : selfAdjoint A) :
281+
Path 1 (expUnitary x) where
282+
toFun t := expUnitary ((t : ℝ) • x)
283+
continuous_toFun := by fun_prop
284+
source' := by simp
285+
target' := by simp
286+
287+
@[simp]
288+
lemma selfAdjoint.joined_one_expUnitary (x : selfAdjoint A) :
289+
Joined (1 : unitary A) (expUnitary x) :=
290+
⟨expUnitaryPathToOne x⟩
291+
292+
/-- The path `t ↦ expUnitary (t • argSelfAdjoint (v * star u)) * u`
293+
from `u : unitary A` to `v` when `‖v - u‖ < 2`. -/
294+
@[simps]
295+
noncomputable def unitary.path (u v : unitary A) (huv : ‖(v - u : A)‖ < 2) :
296+
Path u v where
297+
toFun t := expUnitary ((t : ℝ) • argSelfAdjoint (v * star u)) * u
298+
continuous_toFun := by fun_prop
299+
source' := by ext; simp
300+
target' := by simp [expUnitary_eq_mul_inv v u huv, mul_assoc]
301+
302+
/-- Two unitary elements `u` and `v` in a unital C⋆-algebra are joined by a path if the
303+
distance between them is less than `2`. -/
304+
lemma unitary.joined (u v : unitary A) (huv : ‖(v - u : A)‖ < 2) :
305+
Joined u v :=
306+
⟨path u v huv⟩
307+
308+
/-- Any ball of radius `δ < 2` in the unitary group of a unital C⋆-algebra is path connected. -/
309+
lemma unitary.isPathConnected_ball (u : unitary A) (δ : ℝ) (hδ₀ : 0 < δ) (hδ₂ : δ < 2) :
310+
IsPathConnected (ball (u : unitary A) δ) := by
311+
suffices IsPathConnected (ball (1 : unitary A) δ) by
312+
convert this |>.image (f := (u * ·)) (by fun_prop)
313+
ext v
314+
rw [← inv_mul_cancel u]
315+
simp [- inv_mul_cancel, Subtype.dist_eq, dist_eq_norm, ← mul_sub]
316+
refine ⟨1, by simpa, fun {u} hu ↦ ?_⟩
317+
have hu : ‖(u - 1 : A)‖ < δ := by simpa [Subtype.dist_eq, dist_eq_norm] using hu
318+
refine ⟨path 1 u (hu.trans hδ₂), fun t ↦ ?_⟩
319+
simpa [Subtype.dist_eq, dist_eq_norm] using
320+
norm_expUnitary_smul_argSelfAdjoint_sub_one_le u t.2 (hu.trans hδ₂) |>.trans_lt hu
321+
322+
/-- The unitary group in a C⋆-algebra is locally path connected. -/
323+
instance unitary.instLocPathConnectedSpace : LocPathConnectedSpace (unitary A) :=
324+
.of_bases (fun _ ↦ nhds_basis_uniformity <| uniformity_basis_dist_lt zero_lt_two) <| by
325+
simpa using isPathConnected_ball
326+
327+
/-- The path component of the identity in the unitary group of a C⋆-algebra is the set of
328+
unitaries that can be expressed as a product of exponential unitaries. -/
329+
lemma unitary.mem_pathComponentOne_iff {u : unitary A} :
330+
u ∈ pathComponent 1 ↔ ∃ l : List (selfAdjoint A), (l.map expUnitary).prod = u := by
331+
constructor
332+
· revert u
333+
simp_rw [← Set.mem_range, ← Set.subset_def, pathComponent_eq_connectedComponent]
334+
refine IsClopen.connectedComponent_subset ?_ ⟨[], by simp⟩
335+
refine .of_thickening_subset_self zero_lt_two ?_
336+
intro u hu
337+
rw [mem_thickening_iff] at hu
338+
obtain ⟨v, ⟨⟨l, (hlv : (l.map expUnitary).prod = v)⟩, huv⟩⟩ := hu
339+
refine ⟨argSelfAdjoint (u * star v) :: l, ?_⟩
340+
simp [hlv, mul_assoc,
341+
expUnitary_eq_mul_inv u v (by simpa [Subtype.dist_eq, dist_eq_norm] using huv)]
342+
· rintro ⟨l, rfl⟩
343+
induction l with
344+
| nil => simp
345+
| cons x xs ih => simpa using (joined_one_expUnitary x).mul ih

0 commit comments

Comments
 (0)