From 48e6f5ecfa5ed337c6337c06141b2b1c97441e2d Mon Sep 17 00:00:00 2001 From: Jireh Loreaux Date: Thu, 22 Feb 2024 19:15:53 +0000 Subject: [PATCH] =?UTF-8?q?feat:=20simpler=20conditions=20for=20SpectrumRe?= =?UTF-8?q?stricts=20for=20`=E2=84=82`,=20`=E2=84=9D`=20and=20`=E2=84=9D?= =?UTF-8?q?=E2=89=A50`.=20(#10826)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This provides conditions which are easier to verify for `SpectrumRestricts` when the scalar rings are `ℂ`, `ℝ`, or `ℝ≥0`. In addition, it provides a condition for the spectrum to restrict to `ℝ≥0` in terms of the spectral radius. --- Mathlib/Analysis/NormedSpace/Spectrum.lean | 62 ++++++++++++++++++++++ 1 file changed, 62 insertions(+) diff --git a/Mathlib/Analysis/NormedSpace/Spectrum.lean b/Mathlib/Analysis/NormedSpace/Spectrum.lean index 1567743ee20f1e..e05f0465c4534e 100644 --- a/Mathlib/Analysis/NormedSpace/Spectrum.lean +++ b/Mathlib/Analysis/NormedSpace/Spectrum.lean @@ -588,3 +588,65 @@ theorem equivAlgHom_symm_coe (f : A →ₐ[𝕜] 𝕜) : ⇑(equivAlgHom.symm f) end CharacterSpace end WeakDual + +namespace SpectrumRestricts + +open NNReal ENNReal + +/-- If `𝕜₁` is a normed field contained as subfield of a larger normed field `𝕜₂`, and if `a : A` +is an element whose `𝕜₂` spectrum restricts to `𝕜₁`, then the spectral radii over each scalar +field coincide. -/ +lemma spectralRadius_eq {𝕜₁ 𝕜₂ A : Type*} [NormedField 𝕜₁] [NormedField 𝕜₂] + [NormedRing A] [NormedAlgebra 𝕜₁ A] [NormedAlgebra 𝕜₂ A] [NormedAlgebra 𝕜₁ 𝕜₂] + [IsScalarTower 𝕜₁ 𝕜₂ A] {f : 𝕜₂ → 𝕜₁} {a : A} (h : SpectrumRestricts a f) : + spectralRadius 𝕜₁ a = spectralRadius 𝕜₂ a := by + rw [spectralRadius, spectralRadius] + have := algebraMap_isometry 𝕜₁ 𝕜₂ |>.nnnorm_map_of_map_zero (map_zero _) + apply le_antisymm + all_goals apply iSup₂_le fun x hx ↦ ?_ + · refine congr_arg ((↑) : ℝ≥0 → ℝ≥0∞) (this x) |>.symm.trans_le <| le_iSup₂ (α := ℝ≥0∞) _ ?_ + exact (spectrum.algebraMap_mem_iff _).mpr hx + · have ⟨y, hy, hy'⟩ := h.algebraMap_image.symm ▸ hx + subst hy' + exact this y ▸ le_iSup₂ (α := ℝ≥0∞) y hy + +variable {A : Type*} [Ring A] + +lemma nnreal_iff [Algebra ℝ A] {a : A} : + SpectrumRestricts a ContinuousMap.realToNNReal ↔ ∀ x ∈ spectrum ℝ a, 0 ≤ x := by + refine ⟨fun h x hx ↦ ?_, fun h ↦ ?_⟩ + · obtain ⟨x, -, rfl⟩ := h.algebraMap_image.symm ▸ hx + exact coe_nonneg x + · exact .of_subset_range_algebraMap _ _ (fun _ ↦ Real.toNNReal_coe) + fun x hx ↦ ⟨⟨x, h x hx⟩, rfl⟩ + +lemma real_iff [Algebra ℂ A] {a : A} : + SpectrumRestricts a Complex.reCLM ↔ ∀ x ∈ spectrum ℂ a, x = x.re := by + refine ⟨fun h x hx ↦ ?_, fun h ↦ ?_⟩ + · obtain ⟨x, -, rfl⟩ := h.algebraMap_image.symm ▸ hx + simp + · exact .of_subset_range_algebraMap _ _ Complex.ofReal_re fun x hx ↦ ⟨x.re, (h x hx).symm⟩ + +lemma nnreal_iff_spectralRadius_le [Algebra ℝ A] {a : A} {t : ℝ≥0} (ht : spectralRadius ℝ a ≤ t) : + SpectrumRestricts a ContinuousMap.realToNNReal ↔ + spectralRadius ℝ (algebraMap ℝ A t - a) ≤ t := by + have : spectrum ℝ a ⊆ Set.Icc (-t) t := by + intro x hx + rw [Set.mem_Icc, ← abs_le, ← Real.norm_eq_abs, ← coe_nnnorm, NNReal.coe_le_coe, + ← ENNReal.coe_le_coe] + exact le_iSup₂ (α := ℝ≥0∞) x hx |>.trans ht + rw [nnreal_iff] + refine ⟨fun h ↦ iSup₂_le fun x hx ↦ ?_, fun h ↦ ?_⟩ + · rw [← spectrum.singleton_sub_eq] at hx + obtain ⟨y, hy, rfl⟩ : ∃ y ∈ spectrum ℝ a, ↑t - y = x := by simpa using hx + obtain ⟨hty, hyt⟩ := Set.mem_Icc.mp <| this hy + lift y to ℝ≥0 using h y hy + rw [← NNReal.coe_sub (by exact_mod_cast hyt)] + simp + · replace h : ∀ x ∈ spectrum ℝ a, ‖t - x‖₊ ≤ t := by + simpa [spectralRadius, iSup₂_le_iff, ← spectrum.singleton_sub_eq] using h + peel h with x hx h_le + rw [← NNReal.coe_le_coe, coe_nnnorm, Real.norm_eq_abs, abs_le] at h_le + linarith [h_le.2] + +end SpectrumRestricts