|
| 1 | +/- |
| 2 | +Copyright (c) 2026 Jiaxi Mo. All rights reserved. |
| 3 | +Released under Apache 2.0 license as described in the file LICENSE. |
| 4 | +Authors: Jiaxi Mo |
| 5 | +-/ |
| 6 | +module |
| 7 | + |
| 8 | +public import Mathlib.RepresentationTheory.Basic |
| 9 | +public import Mathlib.RepresentationTheory.Stabilizer |
| 10 | +public import Mathlib.RepresentationTheory.Subrepresentation |
| 11 | +public import Mathlib.RepresentationTheory.Intertwining |
| 12 | +public import Mathlib.Topology.Algebra.Group.Basic |
| 13 | +public import Mathlib.LinearAlgebra.TensorProduct.Finiteness |
| 14 | +public import Mathlib.Topology.Algebra.OpenSubgroup |
| 15 | + |
| 16 | +/-! |
| 17 | +# Smooth representations |
| 18 | +
|
| 19 | +This file defines smoothness for representations of a topological group, proves basic closure |
| 20 | +properties. |
| 21 | +
|
| 22 | +A representation is called smooth if the stabilizer of any vector is open. We prove that |
| 23 | +subrepresentations, quotient representations, direct sums, and tensor products of smooth |
| 24 | +representations are smooth. We construct smoothHom/smoothDual by cutting out the smooth vectors |
| 25 | +from the naive Hom/Dual. |
| 26 | +
|
| 27 | +## Main definitions |
| 28 | +
|
| 29 | +* `Representation.Smooth.IsSmooth` |
| 30 | +* `Representation.Smooth.smoothHom` |
| 31 | +* `Representation.Smooth.smoothDual` |
| 32 | +
|
| 33 | +## Main theorems |
| 34 | +
|
| 35 | +* `isSmooth_smoothVectors` |
| 36 | +
|
| 37 | +-/ |
| 38 | + |
| 39 | +@[expose] public section |
| 40 | + |
| 41 | +open Representation |
| 42 | + |
| 43 | +namespace Representation.Smooth |
| 44 | + |
| 45 | +section basic |
| 46 | + |
| 47 | +variable {G : Type*} [TopologicalSpace G] [Group G] |
| 48 | +variable {k : Type*} [Semiring k] |
| 49 | +variable {V : Type*} [AddCommMonoid V] [Module k V] |
| 50 | + |
| 51 | +/-- A vector is called smooth if its stabilizer is open. -/ |
| 52 | +def IsSmoothVector (ρ : Representation k G V) (v : V) : Prop := |
| 53 | + IsOpen ((stabilizer ρ v) : Set G) |
| 54 | + |
| 55 | +lemma isSmoothVector_iff {ρ : Representation k G V} {v : V} : |
| 56 | + (IsSmoothVector ρ v) ↔ IsOpen {g : G | ρ g v = v} := by |
| 57 | + rfl |
| 58 | + |
| 59 | +/-- A representation is called smooth if every vector is smooth. -/ |
| 60 | +class IsSmooth (ρ : Representation k G V) : Prop where |
| 61 | + smooth : ∀ (v : V), IsSmoothVector ρ v |
| 62 | + |
| 63 | +lemma isSmooth_iff {ρ : Representation k G V} : |
| 64 | + (IsSmooth ρ) ↔ ∀ (v : V), IsOpen {g : G | ρ g v = v} := by |
| 65 | + constructor |
| 66 | + · exact fun h v => isSmoothVector_iff.mp (h.smooth v) |
| 67 | + · exact fun h => {smooth := fun v => isSmoothVector_iff.mpr (h v)} |
| 68 | + |
| 69 | +/-- Any trivial representation is smooth. -/ |
| 70 | +lemma isSmooth_trivial : IsSmooth (trivial k G V) := by |
| 71 | + simp [isSmooth_iff] |
| 72 | + |
| 73 | +/-- Any subrepresentation of a smooth representation is smooth. -/ |
| 74 | +lemma isSmooth_subrepresentation (ρ : Representation k G V) (φ : Subrepresentation ρ) |
| 75 | + [h : IsSmooth ρ] : IsSmooth φ.toRepresentation := by |
| 76 | + simpa [isSmooth_iff, isSmoothVector_iff] using fun v hv => h.smooth v |
| 77 | + |
| 78 | +/-- An arbitrary direct sum of smooth representations is smooth. -/ |
| 79 | +lemma isSmooth_directSum {I : Type*} {V : I → Type*} [(i : I) → AddCommMonoid (V i)] |
| 80 | + [(i : I) → Module k (V i)] (ρ : (i : I) → Representation k G (V i)) (h : ∀ i, IsSmooth (ρ i)) : |
| 81 | + IsSmooth (Representation.directSum ρ) := by |
| 82 | + simp only [isSmooth_iff, directSum_apply, DirectSum.ext_iff, DirectSum.lmap_apply] |
| 83 | + classical |
| 84 | + simp only [isSmooth_iff] at h |
| 85 | + intro v |
| 86 | + have hset : {g : G | ∀ i : I, ((ρ i) g) (v i) = v i} |
| 87 | + = ⋂ i ∈ DFinsupp.support v, {g : G | ((ρ i) g) (v i) = v i} := by |
| 88 | + ext g |
| 89 | + simp only [Set.mem_setOf_eq, Set.mem_iInter] |
| 90 | + constructor |
| 91 | + · exact fun h_stab i _ => h_stab i |
| 92 | + · intro h_stab i |
| 93 | + by_cases h_supp : i ∈ DFinsupp.support v |
| 94 | + · exact h_stab i h_supp |
| 95 | + · rw [DFinsupp.notMem_support_iff] at h_supp |
| 96 | + rw [h_supp, map_zero] |
| 97 | + rw [hset] |
| 98 | + exact isOpen_biInter_finset fun i _ => h i (v i) |
| 99 | + |
| 100 | +end basic |
| 101 | + |
| 102 | +section Quotient |
| 103 | + |
| 104 | +variable {G : Type*} [TopologicalSpace G] [Group G] [IsTopologicalGroup G] |
| 105 | +variable {k : Type*} [Ring k] |
| 106 | +variable {V : Type*} [AddCommGroup V] [Module k V] |
| 107 | + |
| 108 | +/-- Any quotient representation of a smooth representation is smooth. -/ |
| 109 | +lemma isSmooth_quotient {ρ : Representation k G V} {φ : Subrepresentation ρ} [IsSmooth ρ] |
| 110 | + : IsSmooth (φ.quotient) := by |
| 111 | + constructor |
| 112 | + intro w |
| 113 | + refine Quotient.inductionOn' w ?_ |
| 114 | + intro v |
| 115 | + have h_sub : stabilizer ρ v ≤ stabilizer (φ.quotient) ⟦v⟧ := by |
| 116 | + simp +contextual [Subrepresentation.quotient_apply_mk, SetLike.le_def] |
| 117 | + exact Subgroup.isOpen_mono h_sub (IsSmooth.smooth v) |
| 118 | + |
| 119 | +end Quotient |
| 120 | + |
| 121 | +section smoothVectors |
| 122 | + |
| 123 | +variable {G : Type*} [TopologicalSpace G] [Group G] [IsTopologicalGroup G] |
| 124 | +variable {k : Type*} [Semiring k] |
| 125 | +variable {V : Type*} [AddCommMonoid V] [Module k V] |
| 126 | +variable {V' : Type*} [AddCommMonoid V'] [Module k V'] |
| 127 | + |
| 128 | +omit [IsTopologicalGroup G] in |
| 129 | +lemma isSmoothVector_zero (ρ : Representation k G V) : IsSmoothVector ρ 0 := by |
| 130 | + simp [isSmoothVector_iff] |
| 131 | + |
| 132 | +lemma isSmoothVector_add {ρ : Representation k G V} {v1 v2 : V} |
| 133 | + (hv1 : IsSmoothVector ρ v1) (hv2 : IsSmoothVector ρ v2) |
| 134 | + : IsSmoothVector ρ (v1 + v2) := by |
| 135 | + have h_sub := le_stabilizer_add ρ v1 v2 |
| 136 | + have h_open := hv1.inter hv2 |
| 137 | + exact Subgroup.isOpen_mono h_sub h_open |
| 138 | + |
| 139 | +lemma isSmoothVector_sum {n : ℕ} {ρ : Representation k G V} {v : Fin n → V} |
| 140 | + (h_smooth : ∀ (i : Fin n), IsSmoothVector ρ (v i)) |
| 141 | + : IsSmoothVector ρ (∑ i, v i) := by |
| 142 | + have h_sub := le_stabilizer_sum ρ v |
| 143 | + have h_open := isOpen_iInter_of_finite h_smooth |
| 144 | + rw [← Subgroup.coe_iInf] at h_open |
| 145 | + exact Subgroup.isOpen_mono h_sub h_open |
| 146 | + |
| 147 | +lemma isSmoothVector_smul {ρ : Representation k G V} {v : V} (c : k) |
| 148 | + (h_smooth : IsSmoothVector ρ v) |
| 149 | + : IsSmoothVector ρ (c • v) := by |
| 150 | + have h_sub := le_stabilizer_smul ρ c v |
| 151 | + exact Subgroup.isOpen_mono h_sub h_smooth |
| 152 | + |
| 153 | +lemma isSmoothVector_apply {ρ : Representation k G V} {v : V} (g : G) |
| 154 | + (h_smooth : IsSmoothVector ρ v) |
| 155 | + : IsSmoothVector ρ (ρ g v) := by |
| 156 | + let gS := (fun x => g * x) '' (stabilizer ρ v) |
| 157 | + let S_conj := (fun x => x * g⁻¹) '' gS |
| 158 | + have h_open_gS : IsOpen gS := isOpenMap_mul_left g (stabilizer ρ v) h_smooth |
| 159 | + have h_open_S_conj : IsOpen S_conj := isOpenMap_mul_right g⁻¹ gS h_open_gS |
| 160 | + have heq : S_conj = {y | ∃ x ∈ ρ.stabilizer v, g * x * g⁻¹ = y} := by |
| 161 | + ext y |
| 162 | + constructor |
| 163 | + · rintro ⟨gx, ⟨x, hx, rfl⟩, rfl⟩ |
| 164 | + exact ⟨x, hx, rfl⟩ |
| 165 | + · rintro ⟨x, hx, rfl⟩ |
| 166 | + exact ⟨g * x, ⟨x, hx, rfl⟩, rfl⟩ |
| 167 | + simpa [heq, isSmoothVector_iff, ← mem_stabilizer, stabilizer_conj] using h_open_S_conj |
| 168 | + |
| 169 | +/-- Intertwining maps send smooth vectors to smooth vectors. -/ |
| 170 | +lemma IntertwiningMap.isSmoothVector {ρ : Representation k G V} {ρ' : Representation k G V'} |
| 171 | + {v : V} (f : ρ.IntertwiningMap ρ') (h_smooth : IsSmoothVector ρ v) |
| 172 | + : IsSmoothVector ρ' (f v) := by |
| 173 | + have h_sub := IntertwiningMap.stabilizer_le f v |
| 174 | + exact Subgroup.isOpen_mono h_sub h_smooth |
| 175 | + |
| 176 | +/-- The submodule of smooth vectors of a representation. -/ |
| 177 | +def smoothSubmodule (ρ : Representation k G V) : Submodule k V where |
| 178 | + carrier := {v : V | IsSmoothVector ρ v} |
| 179 | + add_mem' := fun h1 h2 => isSmoothVector_add h1 h2 |
| 180 | + zero_mem' := isSmoothVector_zero ρ |
| 181 | + smul_mem' := fun c _ h => isSmoothVector_smul c h |
| 182 | + |
| 183 | +/-- Smooth vectors of a representation form a subrepresentation. -/ |
| 184 | +def smoothVectors (ρ : Representation k G V) : Subrepresentation ρ where |
| 185 | + toSubmodule := smoothSubmodule ρ |
| 186 | + apply_mem_toSubmodule := fun g _ h_smooth => isSmoothVector_apply g h_smooth |
| 187 | + |
| 188 | +@[simp] |
| 189 | +lemma mem_smoothVectors {ρ : Representation k G V} {v : V} : |
| 190 | + v ∈ (smoothVectors ρ).toSubmodule ↔ IsSmoothVector ρ v := by |
| 191 | + rfl |
| 192 | + |
| 193 | +/-- Taking smooth vectors gives a smooth representation. -/ |
| 194 | +instance isSmooth_smoothVectors {ρ : Representation k G V} : |
| 195 | + IsSmooth ((smoothVectors ρ).toRepresentation) := by |
| 196 | + simp [isSmooth_iff, isSmoothVector_iff] |
| 197 | + |
| 198 | +end smoothVectors |
| 199 | + |
| 200 | +section TensorHomDual |
| 201 | + |
| 202 | +variable {G : Type*} [TopologicalSpace G] [Group G] [IsTopologicalGroup G] |
| 203 | +variable {k : Type*} [CommSemiring k] |
| 204 | +variable {V : Type*} [AddCommMonoid V] [Module k V] |
| 205 | +variable {V' : Type*} [AddCommMonoid V'] [Module k V'] |
| 206 | + |
| 207 | +/-- The tensor product of two smooth representations is smooth. -/ |
| 208 | +lemma isSmooth_tprod {ρ : Representation k G V} {ρ' : Representation k G V'} |
| 209 | + [h : IsSmooth ρ] [h' : IsSmooth ρ'] : IsSmooth (tprod ρ ρ') := by |
| 210 | + constructor |
| 211 | + intro m |
| 212 | + rcases TensorProduct.exists_sum_tmul_eq m with ⟨n, v, v', rfl⟩ |
| 213 | + apply isSmoothVector_sum |
| 214 | + intro i |
| 215 | + let S := (stabilizer ρ (v i)) ⊓ (stabilizer ρ' (v' i)) |
| 216 | + have h_open: IsOpen (S : Set G) := by |
| 217 | + apply TopologicalSpace.isOpen_inter |
| 218 | + · obtain h_s := h.smooth |
| 219 | + specialize h_s (v i) |
| 220 | + rw [isSmoothVector_iff] at h_s |
| 221 | + exact h_s |
| 222 | + · obtain h'_s := h'.smooth |
| 223 | + specialize h'_s (v' i) |
| 224 | + rw [isSmoothVector_iff] at h'_s |
| 225 | + exact h'_s |
| 226 | + have h_sub : S ≤ ((ρ.tprod ρ').stabilizer (v i ⊗ₜ[k] v' i)) := by |
| 227 | + intro s hs |
| 228 | + rw [mem_stabilizer, Representation.tprod_apply, TensorProduct.map_tmul] |
| 229 | + simp only [Subgroup.mem_inf, mem_stabilizer, S] at hs |
| 230 | + simp [hs] |
| 231 | + exact S.isOpen_mono h_sub h_open |
| 232 | + |
| 233 | +/-- The smooth vectors in the internal Hom representation. -/ |
| 234 | +def smoothHom (ρ : Representation k G V) (ρ' : Representation k G V') : |
| 235 | + Representation k G (smoothVectors (linHom ρ ρ')).toSubmodule := |
| 236 | + (smoothVectors (linHom ρ ρ')).toRepresentation |
| 237 | + |
| 238 | +instance isSmooth_smoothHom {ρ : Representation k G V} {ρ' : Representation k G V'} |
| 239 | + : IsSmooth (smoothHom ρ ρ') := by |
| 240 | + apply isSmooth_smoothVectors |
| 241 | + |
| 242 | +/-- The smooth vectors in the dual representation. -/ |
| 243 | +def smoothDual (ρ : Representation k G V) : |
| 244 | + Representation k G (smoothVectors ρ.dual).toSubmodule := |
| 245 | + (smoothVectors ρ.dual).toRepresentation |
| 246 | + |
| 247 | +instance isSmooth_smoothDual {ρ : Representation k G V} |
| 248 | + : IsSmooth (smoothDual ρ) := by |
| 249 | + apply isSmooth_smoothVectors |
| 250 | + |
| 251 | +end TensorHomDual |
| 252 | + |
| 253 | +end Representation.Smooth |
0 commit comments