Skip to content

Commit 531a22a

Browse files
committed
Merge branch 'Smooth.Basic' of https://github.com/JX-Mo/mathlib4 into Smooth.Basic
2 parents ab47e86 + 017f810 commit 531a22a

1 file changed

Lines changed: 253 additions & 0 deletions

File tree

Lines changed: 253 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,253 @@
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

Comments
 (0)