|
| 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