@@ -4,7 +4,7 @@ Released under Apache 2.0 license as described in the file LICENSE.
4
4
Authors: Jireh Loreaux
5
5
-/
6
6
import Mathlib.Analysis.NormedSpace.Spectrum
7
- import Mathlib.Topology.ContinuousFunction.FunctionalCalculus
7
+ import Mathlib.Topology.ContinuousFunction.NonUnitalFunctionalCalculus
8
8
import Mathlib.Topology.ContinuousFunction.StoneWeierstrass
9
9
10
10
/-!
@@ -196,3 +196,212 @@ instance NNReal.instUniqueContinuousFunctionalCalculus [UniqueContinuousFunction
196
196
end NNReal
197
197
198
198
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