Skip to content

Commit 6f758e5

Browse files
committed
feat: uniqueness of the non-unital continuous functional calculus (#13363)
1 parent 13cef76 commit 6f758e5

File tree

2 files changed

+213
-1
lines changed

2 files changed

+213
-1
lines changed

Mathlib/Topology/ContinuousFunction/ContinuousMapZero.lean

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -174,6 +174,9 @@ instance instStarModule [StarRing R] {M : Type*} [SMulZeroClass M R] [Continuous
174174

175175
@[simp] lemma coe_star [StarRing R] [ContinuousStar R] (f : C(X, R)₀) : ⇑(star f) = star ⇑f := rfl
176176

177+
instance [StarRing R] [ContinuousStar R] [TrivialStar R] : TrivialStar C(X, R)₀ where
178+
star_trivial _ := DFunLike.ext _ _ fun _ ↦ star_trivial _
179+
177180
instance instCanLift : CanLift C(X, R) C(X, R)₀ (↑) (fun f ↦ f 0 = 0) where
178181
prf f hf := ⟨⟨f, hf⟩, rfl⟩
179182

Mathlib/Topology/ContinuousFunction/UniqueCFC.lean

Lines changed: 210 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ Released under Apache 2.0 license as described in the file LICENSE.
44
Authors: Jireh Loreaux
55
-/
66
import Mathlib.Analysis.NormedSpace.Spectrum
7-
import Mathlib.Topology.ContinuousFunction.FunctionalCalculus
7+
import Mathlib.Topology.ContinuousFunction.NonUnitalFunctionalCalculus
88
import Mathlib.Topology.ContinuousFunction.StoneWeierstrass
99

1010
/-!
@@ -196,3 +196,212 @@ instance NNReal.instUniqueContinuousFunctionalCalculus [UniqueContinuousFunction
196196
end NNReal
197197

198198
end UniqueUnital
199+
200+
section UniqueNonUnital
201+
202+
section RCLike
203+
204+
variable {𝕜 A : Type*} [RCLike 𝕜]
205+
206+
open NonUnitalStarAlgebra in
207+
theorem RCLike.uniqueNonUnitalContinuousFunctionalCalculus_of_compactSpace_quasispectrum
208+
[TopologicalSpace A] [T2Space A] [NonUnitalRing A] [StarRing A] [Module 𝕜 A]
209+
[IsScalarTower 𝕜 A A] [SMulCommClass 𝕜 A A] [h : ∀ a : A, CompactSpace (quasispectrum 𝕜 a)] :
210+
UniqueNonUnitalContinuousFunctionalCalculus 𝕜 A where
211+
eq_of_continuous_of_map_id s hs _inst h0 φ ψ hφ hψ h := by
212+
rw [DFunLike.ext'_iff, ← Set.eqOn_univ, ← (ContinuousMapZero.adjoin_id_dense h0).closure_eq]
213+
refine Set.EqOn.closure (fun f hf ↦ ?_) hφ hψ
214+
rw [← NonUnitalStarAlgHom.mem_equalizer]
215+
apply adjoin_le ?_ hf
216+
rw [Set.singleton_subset_iff]
217+
exact h
218+
compactSpace_quasispectrum := h
219+
220+
instance RCLike.instUniqueNonUnitalContinuousFunctionalCalculus [NonUnitalNormedRing A]
221+
[StarRing A] [CompleteSpace A] [NormedSpace 𝕜 A] [IsScalarTower 𝕜 A A] [SMulCommClass 𝕜 A A] :
222+
UniqueNonUnitalContinuousFunctionalCalculus 𝕜 A :=
223+
RCLike.uniqueNonUnitalContinuousFunctionalCalculus_of_compactSpace_quasispectrum
224+
225+
end RCLike
226+
227+
section NNReal
228+
open NNReal
229+
230+
variable {X : Type*} [TopologicalSpace X] [Zero X]
231+
232+
namespace ContinuousMapZero
233+
234+
/-- This map sends `f : C(X, ℝ)` to `Real.toNNReal ∘ f`, bundled as a continuous map `C(X, ℝ≥0)`. -/
235+
noncomputable def toNNReal (f : C(X, ℝ)₀) : C(X, ℝ≥0)₀ := ⟨.realToNNReal |>.comp f, by simp⟩
236+
237+
@[simp]
238+
lemma toNNReal_apply (f : C(X, ℝ)₀) (x : X) : f.toNNReal x = Real.toNNReal (f x) := rfl
239+
240+
@[fun_prop]
241+
lemma continuous_toNNReal : Continuous (toNNReal (X := X)) := by
242+
rw [continuous_induced_rng]
243+
convert_to Continuous (ContinuousMap.toNNReal ∘ ((↑) : C(X, ℝ)₀ → C(X, ℝ))) using 1
244+
exact ContinuousMap.continuous_comp _ |>.comp continuous_induced_dom
245+
246+
lemma toContinuousMapHom_toNNReal (f : C(X, ℝ)₀) :
247+
(toContinuousMapHom (X := X) (R := ℝ) f).toNNReal =
248+
toContinuousMapHom (X := X) (R := ℝ≥0) f.toNNReal :=
249+
rfl
250+
251+
@[simp]
252+
lemma toNNReal_smul (r : ℝ≥0) (f : C(X, ℝ)₀) : (r • f).toNNReal = r • f.toNNReal := by
253+
ext x
254+
by_cases h : 0 ≤ f x
255+
· simpa [max_eq_left h, NNReal.smul_def] using mul_nonneg r.coe_nonneg h
256+
· push_neg at h
257+
simpa [max_eq_right h.le, NNReal.smul_def]
258+
using mul_nonpos_of_nonneg_of_nonpos r.coe_nonneg h.le
259+
260+
@[simp]
261+
lemma toNNReal_neg_smul (r : ℝ≥0) (f : C(X, ℝ)₀) : (-(r • f)).toNNReal = r • (-f).toNNReal := by
262+
rw [NNReal.smul_def, ← smul_neg, ← NNReal.smul_def, toNNReal_smul]
263+
264+
lemma toNNReal_mul_add_neg_mul_add_mul_neg_eq (f g : C(X, ℝ)₀) :
265+
((f * g).toNNReal + (-f).toNNReal * g.toNNReal + f.toNNReal * (-g).toNNReal) =
266+
((-(f * g)).toNNReal + f.toNNReal * g.toNNReal + (-f).toNNReal * (-g).toNNReal) := by
267+
-- Without this, Lean fails to find the instance in time
268+
have : AddHomClass (C(X, ℝ≥0)₀ →⋆ₙₐ[ℝ≥0] C(X, ℝ≥0)) C(X, ℝ≥0)₀ C(X, ℝ≥0) :=
269+
SemilinearMapClass.toAddHomClass
270+
apply toContinuousMap_injective
271+
simpa only [← toContinuousMapHom_apply, map_add, map_mul, map_neg, toContinuousMapHom_toNNReal]
272+
using (f : C(X, ℝ)).toNNReal_mul_add_neg_mul_add_mul_neg_eq g
273+
274+
lemma toNNReal_add_add_neg_add_neg_eq (f g : C(X, ℝ)₀) :
275+
((f + g).toNNReal + (-f).toNNReal + (-g).toNNReal) =
276+
((-(f + g)).toNNReal + f.toNNReal + g.toNNReal) := by
277+
-- Without this, Lean fails to find the instance in time
278+
have : AddHomClass (C(X, ℝ≥0)₀ →⋆ₙₐ[ℝ≥0] C(X, ℝ≥0)) C(X, ℝ≥0)₀ C(X, ℝ≥0) :=
279+
SemilinearMapClass.toAddHomClass
280+
apply toContinuousMap_injective
281+
simpa only [← toContinuousMapHom_apply, map_add, map_mul, map_neg, toContinuousMapHom_toNNReal]
282+
using (f : C(X, ℝ)).toNNReal_add_add_neg_add_neg_eq g
283+
284+
end ContinuousMapZero
285+
286+
variable {A : Type*} [TopologicalSpace A] [Ring A] [StarRing A] [Algebra ℝ A] [TopologicalRing A]
287+
288+
namespace NonUnitalStarAlgHom
289+
290+
open ContinuousMapZero
291+
292+
/-- Given a non-unital star `ℝ≥0`-algebra homomorphism `φ` from `C(X, ℝ≥0)₀` into a non-unital
293+
`ℝ`-algebra `A`, this is the unique extension of `φ` from `C(X, ℝ)₀` to `A` as a non-unital
294+
star `ℝ`-algebra homomorphism. -/
295+
@[simps]
296+
noncomputable def realContinuousMapZeroOfNNReal (φ : C(X, ℝ≥0)₀ →⋆ₙₐ[ℝ≥0] A) :
297+
C(X, ℝ)₀ →⋆ₙₐ[ℝ] A where
298+
toFun f := φ f.toNNReal - φ (-f).toNNReal
299+
map_zero' := by simp
300+
map_mul' f g := by
301+
have := congr(φ $(f.toNNReal_mul_add_neg_mul_add_mul_neg_eq g))
302+
simp only [map_add, map_mul, sub_mul, mul_sub] at this ⊢
303+
rw [← sub_eq_zero] at this ⊢
304+
rw [← this]
305+
abel
306+
map_add' f g := by
307+
have := congr(φ $(f.toNNReal_add_add_neg_add_neg_eq g))
308+
simp only [map_add, map_mul, sub_mul, mul_sub] at this ⊢
309+
rw [← sub_eq_zero] at this ⊢
310+
rw [← this]
311+
abel
312+
map_smul' r f := by
313+
simp only [MonoidHom.id_apply]
314+
by_cases hr : 0 ≤ r
315+
· lift r to ℝ≥0 using hr
316+
simp only [← smul_def, toNNReal_smul, map_smul, toNNReal_neg_smul, smul_sub]
317+
· rw [not_le, ← neg_pos] at hr
318+
rw [← neg_smul]
319+
nth_rw 1 [← neg_neg r]
320+
nth_rw 3 [← neg_neg r]
321+
lift -r to ℝ≥0 using hr.le with r
322+
simp only [neg_smul, ← smul_def, toNNReal_neg_smul, map_smul, toNNReal_smul, smul_sub,
323+
sub_neg_eq_add]
324+
rw [sub_eq_add_neg, add_comm]
325+
map_star' f := by simp only [star_trivial, star_sub, ← map_star]
326+
327+
@[fun_prop]
328+
lemma continuous_realContinuousMapZeroOfNNReal (φ : C(X, ℝ≥0)₀ →⋆ₙₐ[ℝ≥0] A)
329+
(hφ : Continuous φ) : Continuous φ.realContinuousMapZeroOfNNReal := by
330+
simp [realContinuousMapZeroOfNNReal]
331+
fun_prop
332+
333+
@[simp high]
334+
lemma realContinuousMapZeroOfNNReal_apply_comp_toReal (φ : C(X, ℝ≥0)₀ →⋆ₙₐ[ℝ≥0] A)
335+
(f : C(X, ℝ≥0)₀) :
336+
φ.realContinuousMapZeroOfNNReal ((ContinuousMapZero.mk ⟨toReal, continuous_coe⟩ rfl).comp f) =
337+
φ f := by
338+
simp only [realContinuousMapZeroOfNNReal_apply]
339+
convert_to φ f - φ 0 = φ f using 2
340+
on_goal -1 => rw [map_zero, sub_zero]
341+
all_goals
342+
congr
343+
ext x
344+
simp
345+
346+
lemma realContinuousMapZeroOfNNReal_injective :
347+
Function.Injective (realContinuousMapZeroOfNNReal (X := X) (A := A)) := by
348+
intro φ ψ h
349+
ext f
350+
simpa using congr($(h) ((ContinuousMapZero.mk ⟨toReal, continuous_coe⟩ rfl).comp f))
351+
352+
end NonUnitalStarAlgHom
353+
354+
open ContinuousMapZero
355+
356+
instance NNReal.instUniqueNonUnitalContinuousFunctionalCalculus
357+
[UniqueNonUnitalContinuousFunctionalCalculus ℝ A] :
358+
UniqueNonUnitalContinuousFunctionalCalculus ℝ≥0 A where
359+
compactSpace_quasispectrum a := by
360+
have : CompactSpace (quasispectrum ℝ a) :=
361+
UniqueNonUnitalContinuousFunctionalCalculus.compactSpace_quasispectrum a
362+
rw [← isCompact_iff_compactSpace] at *
363+
rw [← quasispectrum.preimage_algebraMap ℝ]
364+
exact closedEmbedding_subtype_val isClosed_nonneg |>.isCompact_preimage <| by assumption
365+
eq_of_continuous_of_map_id s hs _inst h0 φ ψ hφ hψ h := by
366+
let s' : Set ℝ := (↑) '' s
367+
let e : s ≃ₜ s' :=
368+
{ toFun := Subtype.map (↑) (by simp [s'])
369+
invFun := Subtype.map Real.toNNReal (by simp [s'])
370+
left_inv := fun _ ↦ by ext; simp
371+
right_inv := fun x ↦ by
372+
ext
373+
obtain ⟨y, -, hy⟩ := x.2
374+
simpa using hy ▸ NNReal.coe_nonneg y
375+
continuous_toFun := continuous_coe.subtype_map (by simp [s'])
376+
continuous_invFun := continuous_real_toNNReal.subtype_map (by simp [s']) }
377+
let _inst₁ : Zero s' := ⟨0, ⟨0, h0 ▸ Subtype.property (0 : s), coe_zero⟩⟩
378+
have h0' : ((0 : s') : ℝ) = 0 := rfl
379+
have e0 : e 0 = 0 := by ext; simp [e, h0, h0']
380+
have e0' : e.symm 0 = 0 := by
381+
simpa only [Homeomorph.symm_apply_apply] using congr(e.symm $(e0)).symm
382+
have (ξ : C(s, ℝ≥0)₀ →⋆ₙₐ[ℝ≥0] A) (hξ : Continuous ξ) :
383+
(let ξ' := ξ.realContinuousMapZeroOfNNReal.comp <|
384+
ContinuousMapZero.nonUnitalStarAlgHom_precomp ℝ ⟨e, e0⟩;
385+
Continuous ξ' ∧ ξ' (ContinuousMapZero.id h0') = ξ (ContinuousMapZero.id h0)) := by
386+
intro ξ'
387+
refine ⟨ξ.continuous_realContinuousMapZeroOfNNReal hξ |>.comp <| ?_, ?_⟩
388+
· rw [continuous_induced_rng]
389+
exact ContinuousMap.continuous_comp_left _ |>.comp continuous_induced_dom
390+
· exact ξ.realContinuousMapZeroOfNNReal_apply_comp_toReal (.id h0)
391+
obtain ⟨hφ', hφ_id⟩ := this φ hφ
392+
obtain ⟨hψ', hψ_id⟩ := this ψ hψ
393+
have hs' : CompactSpace s' := e.compactSpace
394+
have h' := UniqueNonUnitalContinuousFunctionalCalculus.eq_of_continuous_of_map_id
395+
s' h0' _ _ hφ' hψ' (hφ_id ▸ hψ_id ▸ h)
396+
have h'' := congr($(h').comp <|
397+
ContinuousMapZero.nonUnitalStarAlgHom_precomp ℝ ⟨(e.symm : C(s', s)), e0'⟩)
398+
have : (ContinuousMapZero.nonUnitalStarAlgHom_precomp ℝ ⟨(e : C(s, s')), e0⟩).comp
399+
(ContinuousMapZero.nonUnitalStarAlgHom_precomp ℝ ⟨(e.symm : C(s', s)), e0'⟩) =
400+
NonUnitalStarAlgHom.id _ _ := by
401+
ext; simp
402+
simp only [NonUnitalStarAlgHom.comp_assoc, this, NonUnitalStarAlgHom.comp_id] at h''
403+
exact NonUnitalStarAlgHom.realContinuousMapZeroOfNNReal_injective h''
404+
405+
end NNReal
406+
407+
end UniqueNonUnital

0 commit comments

Comments
 (0)