|
| 1 | +/- |
| 2 | +Copyright (c) 2024 Salvatore Mercuri. All rights reserved. |
| 3 | +Released under Apache 2.0 license as described in the file LICENSE. |
| 4 | +Authors: Salvatore Mercuri |
| 5 | +-/ |
| 6 | +import Mathlib.Topology.Algebra.Algebra |
| 7 | + |
| 8 | +/-! |
| 9 | +# Isomorphisms of topological algebras |
| 10 | +
|
| 11 | +This file contains an API for `ContinuousAlgEquiv R A B`, the type of |
| 12 | +continuous `R`-algebra isomorphisms with continuous inverses. Here `R` is a |
| 13 | +commutative (semi)ring, and `A` and `B` are `R`-algebras with topologies. |
| 14 | +
|
| 15 | +## Main definitions |
| 16 | +
|
| 17 | +Let `R` be a commutative semiring and let `A` and `B` be `R`-algebras which |
| 18 | +are also topological spaces. |
| 19 | +
|
| 20 | +* `ContinuousAlgEquiv R A B`: the type of continuous `R`-algebra isomorphisms |
| 21 | + from `A` to `B` with continuous inverses. |
| 22 | +
|
| 23 | +## Notations |
| 24 | +
|
| 25 | +`A ≃A[R] B` : notation for `ContinuousAlgEquiv R A B`. |
| 26 | +
|
| 27 | +## Tags |
| 28 | +
|
| 29 | +* continuous, isomorphism, algebra |
| 30 | +-/ |
| 31 | + |
| 32 | +open scoped Topology |
| 33 | + |
| 34 | + |
| 35 | +/-- |
| 36 | +`ContinuousAlgEquiv R A B`, with notation `A ≃A[R] B`, is the type of bijections |
| 37 | +between the topological `R`-algebras `A` and `B` which are both homeomorphisms |
| 38 | +and `R`-algebra isomorphisms. |
| 39 | +-/ |
| 40 | +structure ContinuousAlgEquiv (R A B : Type*) [CommSemiring R] |
| 41 | + [Semiring A] [TopologicalSpace A] [Semiring B] [TopologicalSpace B] [Algebra R A] |
| 42 | + [Algebra R B] extends A ≃ₐ[R] B, A ≃ₜ B |
| 43 | + |
| 44 | +@[inherit_doc] |
| 45 | +notation:50 A " ≃A[" R "]" B => ContinuousAlgEquiv R A B |
| 46 | + |
| 47 | +attribute [nolint docBlame] ContinuousAlgEquiv.toHomeomorph |
| 48 | + |
| 49 | +/-- |
| 50 | +`ContinuousAlgEquivClass F R A B` states that `F` is a type of topological algebra |
| 51 | + structure-preserving equivalences. You should extend this class when you |
| 52 | + extend `ContinuousAlgEquiv`. |
| 53 | +-/ |
| 54 | +class ContinuousAlgEquivClass (F : Type*) (R A B : outParam Type*) [CommSemiring R] |
| 55 | + [Semiring A] [TopologicalSpace A] [Semiring B] [TopologicalSpace B] |
| 56 | + [Algebra R A] [Algebra R B] [EquivLike F A B] |
| 57 | + extends AlgEquivClass F R A B, HomeomorphClass F A B : Prop |
| 58 | + |
| 59 | +namespace ContinuousAlgEquiv |
| 60 | + |
| 61 | +variable {R A B C : Type*} |
| 62 | + [CommSemiring R] [Semiring A] [TopologicalSpace A] [Semiring B] |
| 63 | + [TopologicalSpace B] [Semiring C] [TopologicalSpace C] [Algebra R A] [Algebra R B] |
| 64 | + [Algebra R C] |
| 65 | + |
| 66 | +/-- The natural coercion from a continuous algebra isomorphism to a continuous |
| 67 | +algebra morphism. -/ |
| 68 | +@[coe] |
| 69 | +def toContinuousAlgHom (e : A ≃A[R] B) : A →A[R] B where |
| 70 | + __ := e.toAlgHom |
| 71 | + cont := e.continuous_toFun |
| 72 | + |
| 73 | +instance coe : Coe (A ≃A[R] B) (A →A[R] B) := ⟨toContinuousAlgHom⟩ |
| 74 | + |
| 75 | +instance equivLike : EquivLike (A ≃A[R] B) A B where |
| 76 | + coe f := f.toFun |
| 77 | + inv f := f.invFun |
| 78 | + coe_injective' f g h₁ h₂ := by |
| 79 | + cases' f with f' _ |
| 80 | + cases' g with g' _ |
| 81 | + rcases f' with ⟨⟨_, _⟩, _⟩ |
| 82 | + rcases g' with ⟨⟨_, _⟩, _⟩ |
| 83 | + congr |
| 84 | + left_inv f := f.left_inv |
| 85 | + right_inv f := f.right_inv |
| 86 | + |
| 87 | +instance continuousAlgEquivClass : ContinuousAlgEquivClass (A ≃A[R] B) R A B where |
| 88 | + map_add f := f.map_add' |
| 89 | + map_mul f := f.map_mul' |
| 90 | + commutes f := f.commutes' |
| 91 | + map_continuous := continuous_toFun |
| 92 | + inv_continuous := continuous_invFun |
| 93 | + |
| 94 | +theorem coe_apply (e : A ≃A[R] B) (a : A) : (e : A →A[R] B) a = e a := rfl |
| 95 | + |
| 96 | +@[simp] |
| 97 | +theorem coe_coe (e : A ≃A[R] B) : ⇑(e : A →A[R] B) = e := rfl |
| 98 | + |
| 99 | +theorem toAlgEquiv_injective : Function.Injective (toAlgEquiv : (A ≃A[R] B) → A ≃ₐ[R] B) := by |
| 100 | + rintro ⟨e, _, _⟩ ⟨e', _, _⟩ rfl |
| 101 | + rfl |
| 102 | + |
| 103 | +@[ext] |
| 104 | +theorem ext {f g : A ≃A[R] B} (h : ⇑f = ⇑g) : f = g := |
| 105 | + toAlgEquiv_injective <| AlgEquiv.ext <| congr_fun h |
| 106 | + |
| 107 | +theorem coe_injective : Function.Injective ((↑) : (A ≃A[R] B) → A →A[R] B) := |
| 108 | + fun _ _ h => ext <| funext <| ContinuousAlgHom.ext_iff.1 h |
| 109 | + |
| 110 | +@[simp] |
| 111 | +theorem coe_inj {f g : A ≃A[R] B} : (f : A →A[R] B) = g ↔ f = g := |
| 112 | + coe_injective.eq_iff |
| 113 | + |
| 114 | +@[simp] |
| 115 | +theorem coe_toAlgEquiv (e : A ≃A[R] B) : ⇑e.toAlgEquiv = e := rfl |
| 116 | + |
| 117 | +theorem isOpenMap (e : A ≃A[R] B) : IsOpenMap e := |
| 118 | + e.toHomeomorph.isOpenMap |
| 119 | + |
| 120 | +theorem image_closure (e : A ≃A[R] B) (S : Set A) : e '' closure S = closure (e '' S) := |
| 121 | + e.toHomeomorph.image_closure S |
| 122 | + |
| 123 | +theorem preimage_closure (e : A ≃A[R] B) (S : Set B) : e ⁻¹' closure S = closure (e ⁻¹' S) := |
| 124 | + e.toHomeomorph.preimage_closure S |
| 125 | + |
| 126 | +@[simp] |
| 127 | +theorem isClosed_image (e : A ≃A[R] B) {S : Set A} : IsClosed (e '' S) ↔ IsClosed S := |
| 128 | + e.toHomeomorph.isClosed_image |
| 129 | + |
| 130 | +theorem map_nhds_eq (e : A ≃A[R] B) (a : A) : Filter.map e (𝓝 a) = 𝓝 (e a) := |
| 131 | + e.toHomeomorph.map_nhds_eq a |
| 132 | + |
| 133 | +theorem map_eq_zero_iff (e : A ≃A[R] B) {a : A} : e a = 0 ↔ a = 0 := |
| 134 | + e.toAlgEquiv.toLinearEquiv.map_eq_zero_iff |
| 135 | + |
| 136 | +attribute [continuity] |
| 137 | + ContinuousAlgEquiv.continuous_invFun ContinuousAlgEquiv.continuous_toFun |
| 138 | + |
| 139 | +@[fun_prop] |
| 140 | +theorem continuous (e : A ≃A[R] B) : Continuous e := e.continuous_toFun |
| 141 | + |
| 142 | +theorem continuousOn (e : A ≃A[R] B) {S : Set A} : ContinuousOn e S := |
| 143 | + e.continuous.continuousOn |
| 144 | + |
| 145 | +theorem continuousAt (e : A ≃A[R] B) {a : A} : ContinuousAt e a := |
| 146 | + e.continuous.continuousAt |
| 147 | + |
| 148 | +theorem continuousWithinAt (e : A ≃A[R] B) {S : Set A} {a : A} : |
| 149 | + ContinuousWithinAt e S a := |
| 150 | + e.continuous.continuousWithinAt |
| 151 | + |
| 152 | +theorem comp_continuous_iff {α : Type*} [TopologicalSpace α] (e : A ≃A[R] B) {f : α → A} : |
| 153 | + Continuous (e ∘ f) ↔ Continuous f := |
| 154 | + e.toHomeomorph.comp_continuous_iff |
| 155 | + |
| 156 | +theorem comp_continuous_iff' {β : Type*} [TopologicalSpace β] (e : A ≃A[R] B) {g : B → β} : |
| 157 | + Continuous (g ∘ e) ↔ Continuous g := |
| 158 | + e.toHomeomorph.comp_continuous_iff' |
| 159 | + |
| 160 | +variable (R A) |
| 161 | + |
| 162 | +/-- The identity isomorphism as a continuous `R`-algebra equivalence. -/ |
| 163 | +@[refl] |
| 164 | +def refl : A ≃A[R] A where |
| 165 | + __ := AlgEquiv.refl |
| 166 | + continuous_toFun := continuous_id |
| 167 | + continuous_invFun := continuous_id |
| 168 | + |
| 169 | +@[simp] |
| 170 | +theorem refl_apply (a : A) : refl R A a = a := rfl |
| 171 | + |
| 172 | +@[simp] |
| 173 | +theorem coe_refl : refl R A = ContinuousAlgHom.id R A := rfl |
| 174 | + |
| 175 | +@[simp] |
| 176 | +theorem coe_refl' : ⇑(refl R A) = id := rfl |
| 177 | + |
| 178 | +variable {R A} |
| 179 | + |
| 180 | +/-- The inverse of a continuous algebra equivalence. -/ |
| 181 | +@[symm] |
| 182 | +def symm (e : A ≃A[R] B) : B ≃A[R] A where |
| 183 | + __ := e.toAlgEquiv.symm |
| 184 | + continuous_toFun := e.continuous_invFun |
| 185 | + continuous_invFun := e.continuous_toFun |
| 186 | + |
| 187 | +@[simp] |
| 188 | +theorem apply_symm_apply (e : A ≃A[R] B) (b : B) : e (e.symm b) = b := |
| 189 | + e.1.right_inv b |
| 190 | + |
| 191 | +@[simp] |
| 192 | +theorem symm_apply_apply (e : A ≃A[R] B) (a : A) : e.symm (e a) = a := |
| 193 | + e.1.left_inv a |
| 194 | + |
| 195 | +@[simp] |
| 196 | +theorem symm_image_image (e : A ≃A[R] B) (S : Set A) : e.symm '' (e '' S) = S := |
| 197 | + e.toEquiv.symm_image_image S |
| 198 | + |
| 199 | +@[simp] |
| 200 | +theorem image_symm_image (e : A ≃A[R] B) (S : Set B) : e '' (e.symm '' S) = S := |
| 201 | + e.symm.symm_image_image S |
| 202 | + |
| 203 | +@[simp] |
| 204 | +theorem symm_toAlgEquiv (e : A ≃A[R] B) : e.symm.toAlgEquiv = e.toAlgEquiv.symm := rfl |
| 205 | + |
| 206 | +@[simp] |
| 207 | +theorem symm_toHomeomorph (e : A ≃A[R] B) : e.symm.toHomeomorph = e.toHomeomorph.symm := rfl |
| 208 | + |
| 209 | +theorem symm_map_nhds_eq (e : A ≃A[R] B) (a : A) : Filter.map e.symm (𝓝 (e a)) = 𝓝 a := |
| 210 | + e.toHomeomorph.symm_map_nhds_eq a |
| 211 | + |
| 212 | +/-- The composition of two continuous algebra equivalences. -/ |
| 213 | +@[trans] |
| 214 | +def trans (e₁ : A ≃A[R] B) (e₂ : B ≃A[R] C) : A ≃A[R] C where |
| 215 | + __ := e₁.toAlgEquiv.trans e₂.toAlgEquiv |
| 216 | + continuous_toFun := e₂.continuous_toFun.comp e₁.continuous_toFun |
| 217 | + continuous_invFun := e₁.continuous_invFun.comp e₂.continuous_invFun |
| 218 | + |
| 219 | +@[simp] |
| 220 | +theorem trans_toAlgEquiv (e₁ : A ≃A[R] B) (e₂ : B ≃A[R] C) : |
| 221 | + (e₁.trans e₂).toAlgEquiv = e₁.toAlgEquiv.trans e₂.toAlgEquiv := |
| 222 | + rfl |
| 223 | + |
| 224 | +@[simp] |
| 225 | +theorem trans_apply (e₁ : A ≃A[R] B) (e₂ : B ≃A[R] C) (a : A) : |
| 226 | + (e₁.trans e₂) a = e₂ (e₁ a) := |
| 227 | + rfl |
| 228 | + |
| 229 | +@[simp] |
| 230 | +theorem symm_trans_apply (e₁ : B ≃A[R] A) (e₂ : C ≃A[R] B) (a : A) : |
| 231 | + (e₂.trans e₁).symm a = e₂.symm (e₁.symm a) := |
| 232 | + rfl |
| 233 | + |
| 234 | +theorem comp_coe (e₁ : A ≃A[R] B) (e₂ : B ≃A[R] C) : |
| 235 | + e₂.toAlgHom.comp e₁.toAlgHom = e₁.trans e₂ := by |
| 236 | + rfl |
| 237 | + |
| 238 | +@[simp high] |
| 239 | +theorem coe_comp_coe_symm (e : A ≃A[R] B) : |
| 240 | + e.toContinuousAlgHom.comp e.symm = ContinuousAlgHom.id R B := |
| 241 | + ContinuousAlgHom.ext e.apply_symm_apply |
| 242 | + |
| 243 | +@[simp high] |
| 244 | +theorem coe_symm_comp_coe (e : A ≃A[R] B) : |
| 245 | + e.symm.toContinuousAlgHom.comp e = ContinuousAlgHom.id R A := |
| 246 | + ContinuousAlgHom.ext e.symm_apply_apply |
| 247 | + |
| 248 | +@[simp] |
| 249 | +theorem symm_comp_self (e : A ≃A[R] B) : (e.symm : B → A) ∘ e = id := by |
| 250 | + exact funext <| e.symm_apply_apply |
| 251 | + |
| 252 | +@[simp] |
| 253 | +theorem self_comp_symm (e : A ≃A[R] B) : (e : A → B) ∘ e.symm = id := |
| 254 | + funext <| e.apply_symm_apply |
| 255 | + |
| 256 | +@[simp] |
| 257 | +theorem symm_symm (e : A ≃A[R] B) : e.symm.symm = e := rfl |
| 258 | + |
| 259 | +@[simp] |
| 260 | +theorem refl_symm : (refl R A).symm = refl R A := rfl |
| 261 | + |
| 262 | +theorem symm_symm_apply (e : A ≃A[R] B) (a : A) : e.symm.symm a = e a := rfl |
| 263 | + |
| 264 | +theorem symm_apply_eq (e : A ≃A[R] B) {a : A} {b : B} : e.symm b = a ↔ b = e a := |
| 265 | + e.toEquiv.symm_apply_eq |
| 266 | + |
| 267 | +theorem eq_symm_apply (e : A ≃A[R] B) {a : A} {b : B} : a = e.symm b ↔ e a = b := |
| 268 | + e.toEquiv.eq_symm_apply |
| 269 | + |
| 270 | +theorem image_eq_preimage (e : A ≃A[R] B) (S : Set A) : e '' S = e.symm ⁻¹' S := |
| 271 | + e.toEquiv.image_eq_preimage S |
| 272 | + |
| 273 | +theorem image_symm_eq_preimage (e : A ≃A[R] B) (S : Set B) : e.symm '' S = e ⁻¹' S := by |
| 274 | + rw [e.symm.image_eq_preimage, e.symm_symm] |
| 275 | + |
| 276 | +@[simp] |
| 277 | +theorem symm_preimage_preimage (e : A ≃A[R] B) (S : Set B) : e.symm ⁻¹' (e ⁻¹' S) = S := |
| 278 | + e.toEquiv.symm_preimage_preimage S |
| 279 | + |
| 280 | +@[simp] |
| 281 | +theorem preimage_symm_preimage (e : A ≃A[R] B) (S : Set A) : e ⁻¹' (e.symm ⁻¹' S) = S := |
| 282 | + e.symm.symm_preimage_preimage S |
| 283 | + |
| 284 | +theorem isUniformEmbedding {E₁ E₂ : Type*} [UniformSpace E₁] [UniformSpace E₂] [Ring E₁] |
| 285 | + [UniformAddGroup E₁] [Algebra R E₁] [Ring E₂] [UniformAddGroup E₂] [Algebra R E₂] |
| 286 | + (e : E₁ ≃A[R] E₂) : IsUniformEmbedding e := |
| 287 | + e.toAlgEquiv.isUniformEmbedding e.toContinuousAlgHom.uniformContinuous |
| 288 | + e.symm.toContinuousAlgHom.uniformContinuous |
| 289 | + |
| 290 | +theorem _root_.AlgEquiv.isUniformEmbedding {E₁ E₂ : Type*} [UniformSpace E₁] [UniformSpace E₂] |
| 291 | + [Ring E₁] [UniformAddGroup E₁] [Algebra R E₁] [Ring E₂] [UniformAddGroup E₂] [Algebra R E₂] |
| 292 | + (e : E₁ ≃ₐ[R] E₂) (h₁ : Continuous e) (h₂ : Continuous e.symm) : |
| 293 | + IsUniformEmbedding e := |
| 294 | + ContinuousAlgEquiv.isUniformEmbedding { e with continuous_toFun := h₁ } |
| 295 | + |
| 296 | +end ContinuousAlgEquiv |
0 commit comments