analysis.normed_space.spectrum
β·
Mathlib.Analysis.NormedSpace.Spectrum
The following section lists changes to this file in mathlib3 and mathlib4 that occured after the initial port. Most recent changes are shown first. Hovering over a commit will show all commits associated with the same mathlib3 commit.
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(last sync)
@@ -314,7 +314,7 @@ begin
simpa only [norm_to_nnreal, real.to_nnreal_coe]
using real.to_nnreal_mono (mem_closed_ball_zero_iff.mp z_mem) },
have Hβ : differentiable π (Ξ» w : π, 1 - w β’ a) := (differentiable_id.smul_const a).const_sub 1,
- exact differentiable_at.comp z (differentiable_at_inverse hu.unit) (Hβ.differentiable_at),
+ exact differentiable_at.comp z (differentiable_at_inverse hu) (Hβ.differentiable_at),
end
end one_sub_smul
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(first ported)
mathlib commit https://github.com/leanprover-community/mathlib/commit/65a1391a0106c9204fe45bc73a039f056558cb83
@@ -340,7 +340,7 @@ theorem hasFPowerSeriesOnBall_inverse_one_sub_smul [CompleteSpace A] (a : A) :
le_trans (le_trans (mul_le_mul_right' (nnnorm_pow_le' a n.succ_pos) (r ^ n.succ)) _)
(le_max_left _ _)
Β· by_cases βaββ = 0
- Β· simp only [h, MulZeroClass.zero_mul, zero_le', pow_succ]
+ Β· simp only [h, MulZeroClass.zero_mul, zero_le', pow_succ']
Β· rw [β coe_inv h, coe_lt_coe, NNReal.lt_inv_iff_mul_lt h] at hr
simpa only [β mul_pow, mul_comm] using pow_le_one' hr.le n.succ
r_pos := ENNReal.inv_pos.mpr coe_ne_top
@@ -579,7 +579,7 @@ local notation "ββ" => algebraMap π A
#print spectrum.exp_mem_exp /-
/-- For `π = β` or `π = β`, `exp π` maps the spectrum of `a` into the spectrum of `exp π a`. -/
-theorem exp_mem_exp [IsROrC π] [NormedRing A] [NormedAlgebra π A] [CompleteSpace A] (a : A) {z : π}
+theorem exp_mem_exp [RCLike π] [NormedRing A] [NormedAlgebra π A] [CompleteSpace A] (a : A) {z : π}
(hz : z β spectrum π a) : NormedSpace.exp π z β spectrum π (NormedSpace.exp π a) :=
by
have hexpmul : NormedSpace.exp π a = NormedSpace.exp π (a - ββ z) * ββ (NormedSpace.exp π z) := by
@@ -590,15 +590,15 @@ theorem exp_mem_exp [IsROrC π] [NormedRing A] [NormedAlgebra π A] [Complet
by
refine' Summable.of_norm_bounded_eventually _ (Real.summable_pow_div_factorial βa - ββ zβ) _
filter_upwards [Filter.eventually_cofinite_ne 0] with n hn
- rw [norm_smul, mul_comm, norm_inv, IsROrC.norm_natCast, β div_eq_mul_inv]
+ rw [norm_smul, mul_comm, norm_inv, RCLike.norm_natCast, β div_eq_mul_inv]
exact
div_le_div (pow_nonneg (norm_nonneg _) n) (norm_pow_le' (a - ββ z) (zero_lt_iff.mpr hn))
(by exact_mod_cast Nat.factorial_pos n)
(by exact_mod_cast Nat.factorial_le (lt_add_one n).le)
have hβ : β' n : β, ((n + 1).factorialβ»ΒΉ : π) β’ (a - ββ z) ^ (n + 1) = (a - ββ z) * b := by
- simpa only [mul_smul_comm, pow_succ] using hb.tsum_mul_left (a - ββ z)
+ simpa only [mul_smul_comm, pow_succ'] using hb.tsum_mul_left (a - ββ z)
have hβ : β' n : β, ((n + 1).factorialβ»ΒΉ : π) β’ (a - ββ z) ^ (n + 1) = b * (a - ββ z) := by
- simpa only [pow_succ', Algebra.smul_mul_assoc] using hb.tsum_mul_right (a - ββ z)
+ simpa only [pow_succ, Algebra.smul_mul_assoc] using hb.tsum_mul_right (a - ββ z)
have hβ : NormedSpace.exp π (a - ββ z) = 1 + (a - ββ z) * b :=
by
rw [NormedSpace.exp_eq_tsum]
mathlib commit https://github.com/leanprover-community/mathlib/commit/65a1391a0106c9204fe45bc73a039f056558cb83
@@ -122,7 +122,7 @@ theorem mem_resolventSet_of_norm_lt_mul {a : A} {k : π} (h : βaβ * β(1
ne_zero_of_norm_ne_zero ((mul_nonneg (norm_nonneg _) (norm_nonneg _)).trans_lt h).ne'
let ku := Units.map ββ.toMonoidHom (Units.mk0 k hk)
rw [β inv_inv β(1 : A)β,
- mul_inv_lt_iff (inv_pos.2 <| norm_pos_iff.2 (one_ne_zero : (1 : A) β 0))] at h
+ mul_inv_lt_iff (inv_pos.2 <| norm_pos_iff.2 (one_ne_zero : (1 : A) β 0))] at h
have hku : β-aβ < β(βkuβ»ΒΉ : A)ββ»ΒΉ := by simpa [ku, norm_algebraMap] using h
simpa [ku, sub_eq_add_neg, Algebra.algebraMap_eq_smul_one] using (ku.add (-a) hku).IsUnit
#align spectrum.mem_resolvent_set_of_norm_lt_mul spectrum.mem_resolventSet_of_norm_lt_mul
@@ -231,7 +231,7 @@ theorem spectralRadius_le_liminf_pow_nnnorm_pow_one_div (a : A) :
h (by simpa only [inv_inv, inv_top] using congr_arg (fun x : ββ₯0β => xβ»ΒΉ) h')
simp only [ENNReal.mul_le_iff_le_inv h (hΞ΅.trans_le le_top).Ne, mul_comm Ξ΅β»ΒΉ,
liminf_eq_supr_infi_of_nat', ENNReal.iSup_mul, ENNReal.iInf_mul hΞ΅']
- rw [β ENNReal.inv_lt_inv, inv_one] at hΞ΅
+ rw [β ENNReal.inv_lt_inv, inv_one] at hΞ΅
obtain β¨N, hNβ© :=
eventually_at_top.mp
(ENNReal.eventually_pow_one_div_le (ENNReal.coe_ne_top : ββ(1 : A)ββ β β) hΞ΅)
@@ -274,9 +274,9 @@ theorem norm_resolvent_le_forall (a : A) :
β Ξ΅ > 0, β R > 0, β z : π, R β€ βzβ β βresolvent a zβ β€ Ξ΅ :=
by
obtain β¨c, c_pos, hcβ© := (@NormedRing.inverse_one_sub_norm A _ _).exists_pos
- rw [is_O_with_iff, eventually_iff, Metric.mem_nhds_iff] at hc
+ rw [is_O_with_iff, eventually_iff, Metric.mem_nhds_iff] at hc
rcases hc with β¨Ξ΄, Ξ΄_pos, hΞ΄β©
- simp only [CstarRing.norm_one, mul_one] at hΞ΄
+ simp only [CstarRing.norm_one, mul_one] at hΞ΄
intro Ξ΅ hΞ΅
have haβ : 0 < βaβ + 1 := lt_of_le_of_lt (norm_nonneg a) (lt_add_one _)
have min_pos : 0 < min (Ξ΄ * (βaβ + 1)β»ΒΉ) (Ξ΅ * cβ»ΒΉ) :=
@@ -341,7 +341,7 @@ theorem hasFPowerSeriesOnBall_inverse_one_sub_smul [CompleteSpace A] (a : A) :
(le_max_left _ _)
Β· by_cases βaββ = 0
Β· simp only [h, MulZeroClass.zero_mul, zero_le', pow_succ]
- Β· rw [β coe_inv h, coe_lt_coe, NNReal.lt_inv_iff_mul_lt h] at hr
+ Β· rw [β coe_inv h, coe_lt_coe, NNReal.lt_inv_iff_mul_lt h] at hr
simpa only [β mul_pow, mul_comm] using pow_le_one' hr.le n.succ
r_pos := ENNReal.inv_pos.mpr coe_ne_top
HasSum := fun y hy =>
@@ -367,7 +367,7 @@ theorem isUnit_one_sub_smul_of_lt_inv_radius {a : A} {z : π} (h : ββzβ
Β· simp only [hz, isUnit_one, sub_zero, zero_smul]
Β· let u := Units.mk0 z hz
suffices hu : IsUnit (uβ»ΒΉ β’ 1 - a)
- Β· rwa [IsUnit.smul_sub_iff_sub_inv_smul, inv_inv u] at hu
+ Β· rwa [IsUnit.smul_sub_iff_sub_inv_smul, inv_inv u] at hu
Β· rw [Units.smul_def, β Algebra.algebraMap_eq_smul_one, β mem_resolvent_set_iff]
refine' mem_resolvent_set_of_spectral_radius_lt _
rwa [Units.val_inv_eq_inv_val, nnnorm_inv,
@@ -464,7 +464,7 @@ protected theorem nonempty : (spectrum β a).Nonempty :=
is differentiable on `β`. -/
rw [Set.nonempty_iff_ne_empty]
by_contra h
- have Hβ : resolventSet β a = Set.univ := by rwa [spectrum, Set.compl_empty_iff] at h
+ have Hβ : resolventSet β a = Set.univ := by rwa [spectrum, Set.compl_empty_iff] at h
have Hβ : Differentiable β fun z : β => resolvent a z := fun z =>
(has_deriv_at_resolvent (Hβ.symm βΈ Set.mem_univ z : z β resolventSet β a)).DifferentiableAt
/- The norm of the resolvent is small for all sufficently large `z`, and by compactness and
@@ -544,7 +544,7 @@ local notation "Ο" => spectrum β
#print spectrum.algebraMap_eq_of_mem /-
theorem algebraMap_eq_of_mem {a : A} {z : β} (h : z β Ο a) : algebraMap β A z = a := by
- rwa [mem_iff, hA, Classical.not_not, sub_eq_zero] at h
+ rwa [mem_iff, hA, Classical.not_not, sub_eq_zero] at h
#align spectrum.algebra_map_eq_of_mem spectrum.algebraMap_eq_of_mem
-/
mathlib commit https://github.com/leanprover-community/mathlib/commit/65a1391a0106c9204fe45bc73a039f056558cb83
@@ -328,7 +328,7 @@ power series with coefficients `a ^ n` represents the function `(1 - z β’ a)β»
radius `βaβββ»ΒΉ`. -/
theorem hasFPowerSeriesOnBall_inverse_one_sub_smul [CompleteSpace A] (a : A) :
HasFPowerSeriesOnBall (fun z : π => Ring.inverse (1 - z β’ a))
- (fun n => ContinuousMultilinearMap.mkPiField π (Fin n) (a ^ n)) 0 βaβββ»ΒΉ :=
+ (fun n => ContinuousMultilinearMap.mkPiRing π (Fin n) (a ^ n)) 0 βaβββ»ΒΉ :=
{ r_le :=
by
refine'
@@ -412,7 +412,7 @@ theorem limsup_pow_nnnorm_pow_one_div_le_spectralRadius (a : A) :
refine' ennreal.inv_le_inv.mp (le_of_forall_pos_nnreal_lt fun r r_pos r_lt => _)
simp_rw [inv_limsup, β one_div]
let p : FormalMultilinearSeries β β A := fun n =>
- ContinuousMultilinearMap.mkPiField β (Fin n) (a ^ n)
+ ContinuousMultilinearMap.mkPiRing β (Fin n) (a ^ n)
suffices h : (r : ββ₯0β) β€ p.radius
Β· convert h
simp only [p.radius_eq_liminf, β norm_toNNReal, norm_mk_pi_field]
mathlib commit https://github.com/leanprover-community/mathlib/commit/65a1391a0106c9204fe45bc73a039f056558cb83
@@ -674,7 +674,7 @@ local notation "ββ" => algebraMap π A
@[simp]
theorem toContinuousLinearMap_norm [NormOneClass A] (Ο : A ββ[π] π) :
βΟ.toContinuousLinearMapβ = 1 :=
- ContinuousLinearMap.op_norm_eq_of_bounds zero_le_one
+ ContinuousLinearMap.opNorm_eq_of_bounds zero_le_one
(fun a => (one_mul βaβ).symm βΈ spectrum.norm_le_norm_of_mem (apply_mem_spectrum Ο _))
fun _ _ h => by simpa only [coe_to_continuous_linear_map, map_one, norm_one, mul_one] using h 1
#align alg_hom.to_continuous_linear_map_norm AlgHom.toContinuousLinearMap_norm
mathlib commit https://github.com/leanprover-community/mathlib/commit/65a1391a0106c9204fe45bc73a039f056558cb83
@@ -353,7 +353,7 @@ theorem hasFPowerSeriesOnBall_inverse_one_sub_smul [CompleteSpace A] (a : A) :
simpa only [β coe_inv h, mem_ball_zero_iff, Metric.emetric_ball_nnreal] using hy
rwa [β coe_nnnorm, β Real.lt_toNNReal_iff_coe_lt, Real.toNNReal_one, nnnorm_smul, β
NNReal.lt_inv_iff_mul_lt h]
- simpa [β smul_pow, (NormedRing.summable_geometric_of_norm_lt_1 _ norm_lt).hasSum_iff] using
+ simpa [β smul_pow, (NormedRing.summable_geometric_of_norm_lt_one _ norm_lt).hasSum_iff] using
(NormedRing.inverse_one_sub _ norm_lt).symm }
#align spectrum.has_fpower_series_on_ball_inverse_one_sub_smul spectrum.hasFPowerSeriesOnBall_inverse_one_sub_smul
-/
mathlib commit https://github.com/leanprover-community/mathlib/commit/65a1391a0106c9204fe45bc73a039f056558cb83
@@ -580,11 +580,11 @@ local notation "ββ" => algebraMap π A
#print spectrum.exp_mem_exp /-
/-- For `π = β` or `π = β`, `exp π` maps the spectrum of `a` into the spectrum of `exp π a`. -/
theorem exp_mem_exp [IsROrC π] [NormedRing A] [NormedAlgebra π A] [CompleteSpace A] (a : A) {z : π}
- (hz : z β spectrum π a) : exp π z β spectrum π (exp π a) :=
+ (hz : z β spectrum π a) : NormedSpace.exp π z β spectrum π (NormedSpace.exp π a) :=
by
- have hexpmul : exp π a = exp π (a - ββ z) * ββ (exp π z) := by
- rw [algebraMap_exp_comm z, β exp_add_of_commute (Algebra.commutes z (a - ββ z)).symm,
- sub_add_cancel]
+ have hexpmul : NormedSpace.exp π a = NormedSpace.exp π (a - ββ z) * ββ (NormedSpace.exp π z) := by
+ rw [NormedSpace.algebraMap_exp_comm z, β
+ NormedSpace.exp_add_of_commute (Algebra.commutes z (a - ββ z)).symm, sub_add_cancel]
let b := β' n : β, ((n + 1).factorialβ»ΒΉ : π) β’ (a - ββ z) ^ n
have hb : Summable fun n : β => ((n + 1).factorialβ»ΒΉ : π) β’ (a - ββ z) ^ n :=
by
@@ -599,14 +599,16 @@ theorem exp_mem_exp [IsROrC π] [NormedRing A] [NormedAlgebra π A] [Complet
simpa only [mul_smul_comm, pow_succ] using hb.tsum_mul_left (a - ββ z)
have hβ : β' n : β, ((n + 1).factorialβ»ΒΉ : π) β’ (a - ββ z) ^ (n + 1) = b * (a - ββ z) := by
simpa only [pow_succ', Algebra.smul_mul_assoc] using hb.tsum_mul_right (a - ββ z)
- have hβ : exp π (a - ββ z) = 1 + (a - ββ z) * b :=
+ have hβ : NormedSpace.exp π (a - ββ z) = 1 + (a - ββ z) * b :=
by
- rw [exp_eq_tsum]
- convert tsum_eq_zero_add (expSeries_summable' (a - ββ z))
+ rw [NormedSpace.exp_eq_tsum]
+ convert tsum_eq_zero_add (NormedSpace.expSeries_summable' (a - ββ z))
simp only [Nat.factorial_zero, Nat.cast_one, inv_one, pow_zero, one_smul]
exact hβ.symm
- rw [spectrum.mem_iff, IsUnit.sub_iff, β one_mul (ββ (exp π z)), hexpmul, β _root_.sub_mul,
- Commute.isUnit_mul_iff (Algebra.commutes (exp π z) (exp π (a - ββ z) - 1)).symm,
+ rw [spectrum.mem_iff, IsUnit.sub_iff, β one_mul (ββ (NormedSpace.exp π z)), hexpmul, β
+ _root_.sub_mul,
+ Commute.isUnit_mul_iff
+ (Algebra.commutes (NormedSpace.exp π z) (NormedSpace.exp π (a - ββ z) - 1)).symm,
sub_eq_iff_eq_add'.mpr hβ, Commute.isUnit_mul_iff (hβ βΈ hβ : (a - ββ z) * b = b * (a - ββ z))]
exact not_and_of_not_left _ (not_and_of_not_left _ ((not_iff_not.mpr IsUnit.sub_iff).mp hz))
#align spectrum.exp_mem_exp spectrum.exp_mem_exp
mathlib commit https://github.com/leanprover-community/mathlib/commit/65a1391a0106c9204fe45bc73a039f056558cb83
@@ -267,7 +267,6 @@ theorem hasDerivAt_resolvent {a : A} {k : π} (hk : k β Ο a) :
#align spectrum.has_deriv_at_resolvent spectrum.hasDerivAt_resolvent
-/
-#print spectrum.norm_resolvent_le_forall /-
/- TODO: Once there is sufficient API for bornology, we should get a nice filter / asymptotics
version of this, for example: `tendsto (resolvent a) (cobounded π) (π 0)` or more specifically
`(resolvent a) =O[cobounded π] (Ξ» z, zβ»ΒΉ)`. -/
@@ -310,7 +309,6 @@ theorem norm_resolvent_le_forall (a : A) :
(mul_pos hΞ΅ (inv_pos.mpr c_pos)).le
_ = _ := inv_mul_cancel_rightβ c_pos.ne.symm Ξ΅
#align spectrum.norm_resolvent_le_forall spectrum.norm_resolvent_le_forall
--/
end resolvent
@@ -590,7 +588,7 @@ theorem exp_mem_exp [IsROrC π] [NormedRing A] [NormedAlgebra π A] [Complet
let b := β' n : β, ((n + 1).factorialβ»ΒΉ : π) β’ (a - ββ z) ^ n
have hb : Summable fun n : β => ((n + 1).factorialβ»ΒΉ : π) β’ (a - ββ z) ^ n :=
by
- refine' summable_of_norm_bounded_eventually _ (Real.summable_pow_div_factorial βa - ββ zβ) _
+ refine' Summable.of_norm_bounded_eventually _ (Real.summable_pow_div_factorial βa - ββ zβ) _
filter_upwards [Filter.eventually_cofinite_ne 0] with n hn
rw [norm_smul, mul_comm, norm_inv, IsROrC.norm_natCast, β div_eq_mul_inv]
exact
mathlib commit https://github.com/leanprover-community/mathlib/commit/ce64cd319bb6b3e82f31c2d38e79080d377be451
@@ -3,12 +3,12 @@ Copyright (c) 2021 Jireh Loreaux. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Authors: Jireh Loreaux
-/
-import Mathbin.FieldTheory.IsAlgClosed.Spectrum
-import Mathbin.Analysis.Complex.Liouville
-import Mathbin.Analysis.Complex.Polynomial
-import Mathbin.Analysis.Analytic.RadiusLiminf
-import Mathbin.Topology.Algebra.Module.CharacterSpace
-import Mathbin.Analysis.NormedSpace.Exponential
+import FieldTheory.IsAlgClosed.Spectrum
+import Analysis.Complex.Liouville
+import Analysis.Complex.Polynomial
+import Analysis.Analytic.RadiusLiminf
+import Topology.Algebra.Module.CharacterSpace
+import Analysis.NormedSpace.Exponential
#align_import analysis.normed_space.spectrum from "leanprover-community/mathlib"@"d608fc5d4e69d4cc21885913fb573a88b0deb521"
mathlib commit https://github.com/leanprover-community/mathlib/commit/ce64cd319bb6b3e82f31c2d38e79080d377be451
@@ -158,15 +158,15 @@ theorem subset_closedBall_norm [NormOneClass A] (a : A) : Ο a β Metric.closed
#align spectrum.subset_closed_ball_norm spectrum.subset_closedBall_norm
-/
-#print spectrum.is_bounded /-
-theorem is_bounded (a : A) : Metric.Bounded (Ο a) :=
- (Metric.bounded_iff_subset_ball 0).mpr β¨βaβ * β(1 : A)β, subset_closedBall_norm_mul aβ©
-#align spectrum.is_bounded spectrum.is_bounded
+#print spectrum.isBounded /-
+theorem isBounded (a : A) : Bornology.IsBounded (Ο a) :=
+ (Metric.isBounded_iff_subset_closedBall 0).mpr β¨βaβ * β(1 : A)β, subset_closedBall_norm_mul aβ©
+#align spectrum.is_bounded spectrum.isBounded
-/
#print spectrum.isCompact /-
protected theorem isCompact [ProperSpace π] (a : A) : IsCompact (Ο a) :=
- Metric.isCompact_of_isClosed_bounded (spectrum.isClosed a) (is_bounded a)
+ Metric.isCompact_of_isClosed_isBounded (spectrum.isClosed a) (isBounded a)
#align spectrum.is_compact spectrum.isCompact
-/
mathlib commit https://github.com/leanprover-community/mathlib/commit/8ea5598db6caeddde6cb734aa179cc2408dbd345
@@ -2,11 +2,6 @@
Copyright (c) 2021 Jireh Loreaux. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Authors: Jireh Loreaux
-
-! This file was ported from Lean 3 source module analysis.normed_space.spectrum
-! leanprover-community/mathlib commit d608fc5d4e69d4cc21885913fb573a88b0deb521
-! Please do not edit these lines, except to modify the commit id
-! if you have ported upstream changes.
-/
import Mathbin.FieldTheory.IsAlgClosed.Spectrum
import Mathbin.Analysis.Complex.Liouville
@@ -15,6 +10,8 @@ import Mathbin.Analysis.Analytic.RadiusLiminf
import Mathbin.Topology.Algebra.Module.CharacterSpace
import Mathbin.Analysis.NormedSpace.Exponential
+#align_import analysis.normed_space.spectrum from "leanprover-community/mathlib"@"d608fc5d4e69d4cc21885913fb573a88b0deb521"
+
/-!
# The spectrum of elements in a complete normed algebra
mathlib commit https://github.com/leanprover-community/mathlib/commit/d608fc5d4e69d4cc21885913fb573a88b0deb521
@@ -4,7 +4,7 @@ Released under Apache 2.0 license as described in the file LICENSE.
Authors: Jireh Loreaux
! This file was ported from Lean 3 source module analysis.normed_space.spectrum
-! leanprover-community/mathlib commit 087c325ae0ab42dbdd5dee55bc37d3d5a0bf2197
+! leanprover-community/mathlib commit d608fc5d4e69d4cc21885913fb573a88b0deb521
! Please do not edit these lines, except to modify the commit id
! if you have ported upstream changes.
-/
@@ -395,7 +395,7 @@ theorem differentiableOn_inverse_one_sub_smul [CompleteSpace A] {a : A} {r : β
simpa only [norm_toNNReal, Real.toNNReal_coe] using
Real.toNNReal_mono (mem_closed_ball_zero_iff.mp z_mem)
have Hβ : Differentiable π fun w : π => 1 - w β’ a := (differentiable_id.smul_const a).const_sub 1
- exact DifferentiableAt.comp z (differentiableAt_inverse hu.unit) Hβ.differentiable_at
+ exact DifferentiableAt.comp z (differentiableAt_inverse hu) Hβ.differentiable_at
#align spectrum.differentiable_on_inverse_one_sub_smul spectrum.differentiableOn_inverse_one_sub_smul
-/
mathlib commit https://github.com/leanprover-community/mathlib/commit/9fb8964792b4237dac6200193a0d533f1b3f7423
@@ -75,40 +75,48 @@ open Filter
variable [NormedField π] [NormedRing A] [NormedAlgebra π A]
--- mathport name: exprΟ
local notation "Ο" => spectrum π
--- mathport name: exprΟ
local notation "Ο" => resolventSet π
--- mathport name: Β«exprββΒ»
local notation "ββ" => algebraMap π A
+#print spectrum.SpectralRadius.of_subsingleton /-
@[simp]
theorem SpectralRadius.of_subsingleton [Subsingleton A] (a : A) : spectralRadius π a = 0 := by
simp [spectralRadius]
#align spectrum.spectral_radius.of_subsingleton spectrum.SpectralRadius.of_subsingleton
+-/
+#print spectrum.spectralRadius_zero /-
@[simp]
theorem spectralRadius_zero : spectralRadius π (0 : A) = 0 := by nontriviality A;
simp [spectralRadius]
#align spectrum.spectral_radius_zero spectrum.spectralRadius_zero
+-/
+#print spectrum.mem_resolventSet_of_spectralRadius_lt /-
theorem mem_resolventSet_of_spectralRadius_lt {a : A} {k : π} (h : spectralRadius π a < βkββ) :
k β Ο a :=
Classical.not_not.mp fun hn => h.not_le <| le_iSupβ k hn
#align spectrum.mem_resolvent_set_of_spectral_radius_lt spectrum.mem_resolventSet_of_spectralRadius_lt
+-/
variable [CompleteSpace A]
+#print spectrum.isOpen_resolventSet /-
theorem isOpen_resolventSet (a : A) : IsOpen (Ο a) :=
Units.isOpen.Preimage ((continuous_algebraMap π A).sub continuous_const)
#align spectrum.is_open_resolvent_set spectrum.isOpen_resolventSet
+-/
+#print spectrum.isClosed /-
protected theorem isClosed (a : A) : IsClosed (Ο a) :=
(isOpen_resolventSet a).isClosed_compl
#align spectrum.is_closed spectrum.isClosed
+-/
+#print spectrum.mem_resolventSet_of_norm_lt_mul /-
theorem mem_resolventSet_of_norm_lt_mul {a : A} {k : π} (h : βaβ * β(1 : A)β < βkβ) : k β Ο a :=
by
rw [resolventSet, Set.mem_setOf_eq, Algebra.algebraMap_eq_smul_one]
@@ -121,46 +129,66 @@ theorem mem_resolventSet_of_norm_lt_mul {a : A} {k : π} (h : βaβ * β(1
have hku : β-aβ < β(βkuβ»ΒΉ : A)ββ»ΒΉ := by simpa [ku, norm_algebraMap] using h
simpa [ku, sub_eq_add_neg, Algebra.algebraMap_eq_smul_one] using (ku.add (-a) hku).IsUnit
#align spectrum.mem_resolvent_set_of_norm_lt_mul spectrum.mem_resolventSet_of_norm_lt_mul
+-/
+#print spectrum.mem_resolventSet_of_norm_lt /-
theorem mem_resolventSet_of_norm_lt [NormOneClass A] {a : A} {k : π} (h : βaβ < βkβ) : k β Ο a :=
mem_resolventSet_of_norm_lt_mul (by rwa [norm_one, mul_one])
#align spectrum.mem_resolvent_set_of_norm_lt spectrum.mem_resolventSet_of_norm_lt
+-/
+#print spectrum.norm_le_norm_mul_of_mem /-
theorem norm_le_norm_mul_of_mem {a : A} {k : π} (hk : k β Ο a) : βkβ β€ βaβ * β(1 : A)β :=
le_of_not_lt <| mt mem_resolventSet_of_norm_lt_mul hk
#align spectrum.norm_le_norm_mul_of_mem spectrum.norm_le_norm_mul_of_mem
+-/
+#print spectrum.norm_le_norm_of_mem /-
theorem norm_le_norm_of_mem [NormOneClass A] {a : A} {k : π} (hk : k β Ο a) : βkβ β€ βaβ :=
le_of_not_lt <| mt mem_resolventSet_of_norm_lt hk
#align spectrum.norm_le_norm_of_mem spectrum.norm_le_norm_of_mem
+-/
+#print spectrum.subset_closedBall_norm_mul /-
theorem subset_closedBall_norm_mul (a : A) : Ο a β Metric.closedBall (0 : π) (βaβ * β(1 : A)β) :=
fun k hk => by simp [norm_le_norm_mul_of_mem hk]
#align spectrum.subset_closed_ball_norm_mul spectrum.subset_closedBall_norm_mul
+-/
+#print spectrum.subset_closedBall_norm /-
theorem subset_closedBall_norm [NormOneClass A] (a : A) : Ο a β Metric.closedBall (0 : π) βaβ :=
fun k hk => by simp [norm_le_norm_of_mem hk]
#align spectrum.subset_closed_ball_norm spectrum.subset_closedBall_norm
+-/
+#print spectrum.is_bounded /-
theorem is_bounded (a : A) : Metric.Bounded (Ο a) :=
(Metric.bounded_iff_subset_ball 0).mpr β¨βaβ * β(1 : A)β, subset_closedBall_norm_mul aβ©
#align spectrum.is_bounded spectrum.is_bounded
+-/
+#print spectrum.isCompact /-
protected theorem isCompact [ProperSpace π] (a : A) : IsCompact (Ο a) :=
Metric.isCompact_of_isClosed_bounded (spectrum.isClosed a) (is_bounded a)
#align spectrum.is_compact spectrum.isCompact
+-/
+#print spectrum.spectralRadius_le_nnnorm /-
theorem spectralRadius_le_nnnorm [NormOneClass A] (a : A) : spectralRadius π a β€ βaββ := by
refine' iSupβ_le fun k hk => _; exact_mod_cast norm_le_norm_of_mem hk
#align spectrum.spectral_radius_le_nnnorm spectrum.spectralRadius_le_nnnorm
+-/
+#print spectrum.exists_nnnorm_eq_spectralRadius_of_nonempty /-
theorem exists_nnnorm_eq_spectralRadius_of_nonempty [ProperSpace π] {a : A} (ha : (Ο a).Nonempty) :
β k β Ο a, (βkββ : ββ₯0β) = spectralRadius π a :=
by
obtain β¨k, hk, hβ© := (spectrum.isCompact a).exists_forall_ge ha continuous_nnnorm.continuous_on
exact β¨k, hk, le_antisymm (le_iSupβ k hk) (iSupβ_le <| by exact_mod_cast h)β©
#align spectrum.exists_nnnorm_eq_spectral_radius_of_nonempty spectrum.exists_nnnorm_eq_spectralRadius_of_nonempty
+-/
+#print spectrum.spectralRadius_lt_of_forall_lt_of_nonempty /-
theorem spectralRadius_lt_of_forall_lt_of_nonempty [ProperSpace π] {a : A} (ha : (Ο a).Nonempty)
{r : ββ₯0} (hr : β k β Ο a, βkββ < r) : spectralRadius π a < r :=
sSup_image.symm.trans_lt <|
@@ -168,11 +196,13 @@ theorem spectralRadius_lt_of_forall_lt_of_nonempty [ProperSpace π] {a : A} (h
(ENNReal.continuous_coe.comp continuous_nnnorm).ContinuousOn (r : ββ₯0β)).mpr
(by exact_mod_cast hr)
#align spectrum.spectral_radius_lt_of_forall_lt_of_nonempty spectrum.spectralRadius_lt_of_forall_lt_of_nonempty
+-/
open ENNReal Polynomial
variable (π)
+#print spectrum.spectralRadius_le_pow_nnnorm_pow_one_div /-
theorem spectralRadius_le_pow_nnnorm_pow_one_div (a : A) (n : β) :
spectralRadius π a β€ βa ^ (n + 1)ββ ^ (1 / (n + 1) : β) * β(1 : A)ββ ^ (1 / (n + 1) : β) :=
by
@@ -191,7 +221,9 @@ theorem spectralRadius_le_pow_nnnorm_pow_one_div (a : A) (n : β) :
erw [coe_pow, β rpow_nat_cast, β rpow_mul, mul_one_div_cancel hn.ne', rpow_one]
rw [Nat.cast_succ, ENNReal.coe_mul_rpow]
#align spectrum.spectral_radius_le_pow_nnnorm_pow_one_div spectrum.spectralRadius_le_pow_nnnorm_pow_one_div
+-/
+#print spectrum.spectralRadius_le_liminf_pow_nnnorm_pow_one_div /-
theorem spectralRadius_le_liminf_pow_nnnorm_pow_one_div (a : A) :
spectralRadius π a β€ atTop.liminf fun n : β => (βa ^ nββ : ββ₯0β) ^ (1 / n : β) :=
by
@@ -213,6 +245,7 @@ theorem spectralRadius_le_liminf_pow_nnnorm_pow_one_div (a : A) :
norm_cast
exact mul_le_mul_left' (hN (n + N + 1) (by linarith)) _
#align spectrum.spectral_radius_le_liminf_pow_nnnorm_pow_one_div spectrum.spectralRadius_le_liminf_pow_nnnorm_pow_one_div
+-/
end SpectrumCompact
@@ -222,12 +255,11 @@ open Filter Asymptotics
variable [NontriviallyNormedField π] [NormedRing A] [NormedAlgebra π A] [CompleteSpace A]
--- mathport name: exprΟ
local notation "Ο" => resolventSet π
--- mathport name: Β«exprββΒ»
local notation "ββ" => algebraMap π A
+#print spectrum.hasDerivAt_resolvent /-
theorem hasDerivAt_resolvent {a : A} {k : π} (hk : k β Ο a) :
HasDerivAt (resolvent a) (-resolvent a k ^ 2) k :=
by
@@ -236,7 +268,9 @@ theorem hasDerivAt_resolvent {a : A} {k : π} (hk : k β Ο a) :
simpa using (Algebra.linearMap π A).HasDerivAt.sub_const a
simpa [resolvent, sq, hk.unit_spec, β Ring.inverse_unit hk.unit] using Hβ.comp_has_deriv_at k Hβ
#align spectrum.has_deriv_at_resolvent spectrum.hasDerivAt_resolvent
+-/
+#print spectrum.norm_resolvent_le_forall /-
/- TODO: Once there is sufficient API for bornology, we should get a nice filter / asymptotics
version of this, for example: `tendsto (resolvent a) (cobounded π) (π 0)` or more specifically
`(resolvent a) =O[cobounded π] (Ξ» z, zβ»ΒΉ)`. -/
@@ -279,6 +313,7 @@ theorem norm_resolvent_le_forall (a : A) :
(mul_pos hΞ΅ (inv_pos.mpr c_pos)).le
_ = _ := inv_mul_cancel_rightβ c_pos.ne.symm Ξ΅
#align spectrum.norm_resolvent_le_forall spectrum.norm_resolvent_le_forall
+-/
end resolvent
@@ -292,6 +327,7 @@ variable [NontriviallyNormedField π] [NormedRing A] [NormedAlgebra π A]
variable (π)
+#print spectrum.hasFPowerSeriesOnBall_inverse_one_sub_smul /-
/-- In a Banach algebra `A` over a nontrivially normed field `π`, for any `a : A` the
power series with coefficients `a ^ n` represents the function `(1 - z β’ a)β»ΒΉ` in a disk of
radius `βaβββ»ΒΉ`. -/
@@ -325,9 +361,11 @@ theorem hasFPowerSeriesOnBall_inverse_one_sub_smul [CompleteSpace A] (a : A) :
simpa [β smul_pow, (NormedRing.summable_geometric_of_norm_lt_1 _ norm_lt).hasSum_iff] using
(NormedRing.inverse_one_sub _ norm_lt).symm }
#align spectrum.has_fpower_series_on_ball_inverse_one_sub_smul spectrum.hasFPowerSeriesOnBall_inverse_one_sub_smul
+-/
variable {π}
+#print spectrum.isUnit_one_sub_smul_of_lt_inv_radius /-
theorem isUnit_one_sub_smul_of_lt_inv_radius {a : A} {z : π} (h : ββzββ < (spectralRadius π a)β»ΒΉ) :
IsUnit (1 - z β’ a) := by
by_cases hz : z = 0
@@ -340,7 +378,9 @@ theorem isUnit_one_sub_smul_of_lt_inv_radius {a : A} {z : π} (h : ββzβ
rwa [Units.val_inv_eq_inv_val, nnnorm_inv,
coe_inv (nnnorm_ne_zero_iff.mpr (Units.val_mk0 hz βΈ hz : (u : π) β 0)), lt_inv_iff_lt_inv]
#align spectrum.is_unit_one_sub_smul_of_lt_inv_radius spectrum.isUnit_one_sub_smul_of_lt_inv_radius
+-/
+#print spectrum.differentiableOn_inverse_one_sub_smul /-
/-- In a Banach algebra `A` over `π`, for `a : A` the function `Ξ» z, (1 - z β’ a)β»ΒΉ` is
differentiable on any closed ball centered at zero of radius `r < (spectral_radius π a)β»ΒΉ`. -/
theorem differentiableOn_inverse_one_sub_smul [CompleteSpace A] {a : A} {r : ββ₯0}
@@ -357,6 +397,7 @@ theorem differentiableOn_inverse_one_sub_smul [CompleteSpace A] {a : A} {r : β
have Hβ : Differentiable π fun w : π => 1 - w β’ a := (differentiable_id.smul_const a).const_sub 1
exact DifferentiableAt.comp z (differentiableAt_inverse hu.unit) Hβ.differentiable_at
#align spectrum.differentiable_on_inverse_one_sub_smul spectrum.differentiableOn_inverse_one_sub_smul
+-/
end OneSubSmul
@@ -368,6 +409,7 @@ open scoped Topology
variable [NormedRing A] [NormedAlgebra β A] [CompleteSpace A]
+#print spectrum.limsup_pow_nnnorm_pow_one_div_le_spectralRadius /-
/-- The `limsup` relationship for the spectral radius used to prove `spectrum.gelfand_formula`. -/
theorem limsup_pow_nnnorm_pow_one_div_le_spectralRadius (a : A) :
limsup (fun n : β => ββa ^ nββ ^ (1 / n : β)) atTop β€ spectralRadius β a :=
@@ -386,7 +428,9 @@ theorem limsup_pow_nnnorm_pow_one_div_le_spectralRadius (a : A) :
Β· have Hβ := (differentiable_on_inverse_one_sub_smul r_lt).HasFPowerSeriesOnBall r_pos
exact ((has_fpower_series_on_ball_inverse_one_sub_smul β a).exchange_radius Hβ).r_le
#align spectrum.limsup_pow_nnnorm_pow_one_div_le_spectral_radius spectrum.limsup_pow_nnnorm_pow_one_div_le_spectralRadius
+-/
+#print spectrum.pow_nnnorm_pow_one_div_tendsto_nhds_spectralRadius /-
/-- **Gelfand's formula**: Given an element `a : A` of a complex Banach algebra, the
`spectral_radius` of `a` is the limit of the sequence `βa ^ nββ ^ (1 / n)` -/
theorem pow_nnnorm_pow_one_div_tendsto_nhds_spectralRadius (a : A) :
@@ -394,7 +438,9 @@ theorem pow_nnnorm_pow_one_div_tendsto_nhds_spectralRadius (a : A) :
tendsto_of_le_liminf_of_limsup_le (spectralRadius_le_liminf_pow_nnnorm_pow_one_div β a)
(limsup_pow_nnnorm_pow_one_div_le_spectralRadius a)
#align spectrum.pow_nnnorm_pow_one_div_tendsto_nhds_spectral_radius spectrum.pow_nnnorm_pow_one_div_tendsto_nhds_spectralRadius
+-/
+#print spectrum.pow_norm_pow_one_div_tendsto_nhds_spectralRadius /-
/- This is the same as `pow_nnnorm_pow_one_div_tendsto_nhds_spectral_radius` but for `norm`
instead of `nnnorm`. -/
/-- **Gelfand's formula**: Given an element `a : A` of a complex Banach algebra, the
@@ -407,6 +453,7 @@ theorem pow_norm_pow_one_div_tendsto_nhds_spectralRadius (a : A) :
rw [β of_real_rpow_of_nonneg (norm_nonneg _) _, β coe_nnnorm, coe_nnreal_eq]
exact one_div_nonneg.mpr (by exact_mod_cast zero_le _)
#align spectrum.pow_norm_pow_one_div_tendsto_nhds_spectral_radius spectrum.pow_norm_pow_one_div_tendsto_nhds_spectralRadius
+-/
end GelfandFormula
@@ -414,6 +461,7 @@ section NonemptySpectrum
variable [NormedRing A] [NormedAlgebra β A] [CompleteSpace A] [Nontrivial A] (a : A)
+#print spectrum.nonempty /-
/-- In a (nontrivial) complex Banach algebra, every element has nonempty spectrum. -/
protected theorem nonempty : (spectrum β a).Nonempty :=
by
@@ -452,35 +500,44 @@ protected theorem nonempty : (spectrum β a).Nonempty :=
not_isUnit_zero
(Hβ
.subst (is_unit_resolvent.mp (mem_resolvent_set_iff.mp (Hβ.symm βΈ Set.mem_univ 0))))
#align spectrum.nonempty spectrum.nonempty
+-/
+#print spectrum.exists_nnnorm_eq_spectralRadius /-
/-- In a complex Banach algebra, the spectral radius is always attained by some element of the
spectrum. -/
theorem exists_nnnorm_eq_spectralRadius : β z β spectrum β a, (βzββ : ββ₯0β) = spectralRadius β a :=
exists_nnnorm_eq_spectralRadius_of_nonempty (spectrum.nonempty a)
#align spectrum.exists_nnnorm_eq_spectral_radius spectrum.exists_nnnorm_eq_spectralRadius
+-/
+#print spectrum.spectralRadius_lt_of_forall_lt /-
/-- In a complex Banach algebra, if every element of the spectrum has norm strictly less than
`r : ββ₯0`, then the spectral radius is also strictly less than `r`. -/
theorem spectralRadius_lt_of_forall_lt {r : ββ₯0} (hr : β z β spectrum β a, βzββ < r) :
spectralRadius β a < r :=
spectralRadius_lt_of_forall_lt_of_nonempty (spectrum.nonempty a) hr
#align spectrum.spectral_radius_lt_of_forall_lt spectrum.spectralRadius_lt_of_forall_lt
+-/
open scoped Polynomial
open Polynomial
+#print spectrum.map_polynomial_aeval /-
/-- The **spectral mapping theorem** for polynomials in a Banach algebra over `β`. -/
theorem map_polynomial_aeval (p : β[X]) :
spectrum β (aeval a p) = (fun k => eval k p) '' spectrum β a :=
map_polynomial_aeval_of_nonempty a p (spectrum.nonempty a)
#align spectrum.map_polynomial_aeval spectrum.map_polynomial_aeval
+-/
+#print spectrum.map_pow /-
/-- A specialization of the spectral mapping theorem for polynomials in a Banach algebra over `β`
to monic monomials. -/
protected theorem map_pow (n : β) : spectrum β (a ^ n) = (fun x => x ^ n) '' spectrum β a := by
simpa only [aeval_X_pow, eval_pow, eval_X] using map_polynomial_aeval a (X ^ n)
#align spectrum.map_pow spectrum.map_pow
+-/
end NonemptySpectrum
@@ -488,15 +545,15 @@ section GelfandMazurIsomorphism
variable [NormedRing A] [NormedAlgebra β A] (hA : β {a : A}, IsUnit a β a β 0)
-include hA
-
--- mathport name: exprΟ
local notation "Ο" => spectrum β
+#print spectrum.algebraMap_eq_of_mem /-
theorem algebraMap_eq_of_mem {a : A} {z : β} (h : z β Ο a) : algebraMap β A z = a := by
rwa [mem_iff, hA, Classical.not_not, sub_eq_zero] at h
#align spectrum.algebra_map_eq_of_mem spectrum.algebraMap_eq_of_mem
+-/
+#print NormedRing.algEquivComplexOfComplete /-
/-- **Gelfand-Mazur theorem**: For a complex Banach division algebra, the natural `algebra_map β A`
is an algebra isomorphism whose inverse is given by selecting the (unique) element of
`spectrum β a`. In addition, `algebra_map_isometry` guarantees this map is an isometry.
@@ -517,14 +574,15 @@ noncomputable def NormedRing.algEquivComplexOfComplete [CompleteSpace A] : β
(@spectrum.nonempty _ _ _ _ nt <| algebraMap β A z).some_mem
right_inv := fun a => algebraMap_eq_of_mem (@hA) (@spectrum.nonempty _ _ _ _ nt a).some_mem }
#align normed_ring.alg_equiv_complex_of_complete NormedRing.algEquivComplexOfComplete
+-/
end GelfandMazurIsomorphism
section ExpMapping
--- mathport name: Β«exprββΒ»
local notation "ββ" => algebraMap π A
+#print spectrum.exp_mem_exp /-
/-- For `π = β` or `π = β`, `exp π` maps the spectrum of `a` into the spectrum of `exp π a`. -/
theorem exp_mem_exp [IsROrC π] [NormedRing A] [NormedAlgebra π A] [CompleteSpace A] (a : A) {z : π}
(hz : z β spectrum π a) : exp π z β spectrum π (exp π a) :=
@@ -557,6 +615,7 @@ theorem exp_mem_exp [IsROrC π] [NormedRing A] [NormedAlgebra π A] [Complet
sub_eq_iff_eq_add'.mpr hβ, Commute.isUnit_mul_iff (hβ βΈ hβ : (a - ββ z) * b = b * (a - ββ z))]
exact not_and_of_not_left _ (not_and_of_not_left _ ((not_iff_not.mpr IsUnit.sub_iff).mp hz))
#align spectrum.exp_mem_exp spectrum.exp_mem_exp
+-/
end ExpMapping
@@ -568,7 +627,6 @@ section NormedField
variable {F : Type _} [NormedField π] [NormedRing A] [NormedAlgebra π A] [CompleteSpace A]
--- mathport name: Β«exprββΒ»
local notation "ββ" => algebraMap π A
/-- An algebra homomorphism into the base field, as a continuous linear map (since it is
@@ -587,19 +645,25 @@ def toContinuousLinearMap (Ο : A ββ[π] π) : A βL[π] π :=
#align alg_hom.to_continuous_linear_map AlgHom.toContinuousLinearMap
-/
+#print AlgHom.coe_toContinuousLinearMap /-
@[simp]
theorem coe_toContinuousLinearMap (Ο : A ββ[π] π) : βΟ.toContinuousLinearMap = Ο :=
rfl
#align alg_hom.coe_to_continuous_linear_map AlgHom.coe_toContinuousLinearMap
+-/
+#print AlgHom.norm_apply_le_self_mul_norm_one /-
theorem norm_apply_le_self_mul_norm_one [AlgHomClass F π A π] (f : F) (a : A) :
βf aβ β€ βaβ * β(1 : A)β :=
spectrum.norm_le_norm_mul_of_mem (apply_mem_spectrum f _)
#align alg_hom.norm_apply_le_self_mul_norm_one AlgHom.norm_apply_le_self_mul_norm_one
+-/
+#print AlgHom.norm_apply_le_self /-
theorem norm_apply_le_self [NormOneClass A] [AlgHomClass F π A π] (f : F) (a : A) : βf aβ β€ βaβ :=
spectrum.norm_le_norm_of_mem (apply_mem_spectrum f _)
#align alg_hom.norm_apply_le_self AlgHom.norm_apply_le_self
+-/
end NormedField
@@ -607,9 +671,9 @@ section NontriviallyNormedField
variable [NontriviallyNormedField π] [NormedRing A] [NormedAlgebra π A] [CompleteSpace A]
--- mathport name: Β«exprββΒ»
local notation "ββ" => algebraMap π A
+#print AlgHom.toContinuousLinearMap_norm /-
@[simp]
theorem toContinuousLinearMap_norm [NormOneClass A] (Ο : A ββ[π] π) :
βΟ.toContinuousLinearMapβ = 1 :=
@@ -617,6 +681,7 @@ theorem toContinuousLinearMap_norm [NormOneClass A] (Ο : A ββ[π] π) :
(fun a => (one_mul βaβ).symm βΈ spectrum.norm_le_norm_of_mem (apply_mem_spectrum Ο _))
fun _ _ h => by simpa only [coe_to_continuous_linear_map, map_one, norm_one, mul_one] using h 1
#align alg_hom.to_continuous_linear_map_norm AlgHom.toContinuousLinearMap_norm
+-/
end NontriviallyNormedField
@@ -643,15 +708,19 @@ def equivAlgHom : characterSpace π A β (A ββ[π] π)
#align weak_dual.character_space.equiv_alg_hom WeakDual.CharacterSpace.equivAlgHom
-/
+#print WeakDual.CharacterSpace.equivAlgHom_coe /-
@[simp]
theorem equivAlgHom_coe (f : characterSpace π A) : β(equivAlgHom f) = f :=
rfl
#align weak_dual.character_space.equiv_alg_hom_coe WeakDual.CharacterSpace.equivAlgHom_coe
+-/
+#print WeakDual.CharacterSpace.equivAlgHom_symm_coe /-
@[simp]
theorem equivAlgHom_symm_coe (f : A ββ[π] π) : β(equivAlgHom.symm f) = f :=
rfl
#align weak_dual.character_space.equiv_alg_hom_symm_coe WeakDual.CharacterSpace.equivAlgHom_symm_coe
+-/
end CharacterSpace
mathlib commit https://github.com/leanprover-community/mathlib/commit/9fb8964792b4237dac6200193a0d533f1b3f7423
@@ -4,7 +4,7 @@ Released under Apache 2.0 license as described in the file LICENSE.
Authors: Jireh Loreaux
! This file was ported from Lean 3 source module analysis.normed_space.spectrum
-! leanprover-community/mathlib commit 58a272265b5e05f258161260dd2c5d247213cbd3
+! leanprover-community/mathlib commit 087c325ae0ab42dbdd5dee55bc37d3d5a0bf2197
! Please do not edit these lines, except to modify the commit id
! if you have ported upstream changes.
-/
@@ -18,6 +18,9 @@ import Mathbin.Analysis.NormedSpace.Exponential
/-!
# The spectrum of elements in a complete normed algebra
+> THIS FILE IS SYNCHRONIZED WITH MATHLIB4.
+> Any changes to this file require a corresponding PR to mathlib4.
+
This file contains the basic theory for the resolvent and spectrum of a Banach algebra.
## Main definitions
mathlib commit https://github.com/leanprover-community/mathlib/commit/c471da714c044131b90c133701e51b877c246677
@@ -50,6 +50,7 @@ This file contains the basic theory for the resolvent and spectrum of a Banach a
open scoped ENNReal NNReal
+#print spectralRadius /-
/-- The *spectral radius* is the supremum of the `nnnorm` (`ββ¬ββ`) of elements in the spectrum,
coerced into an element of `ββ₯0β`. Note that it is possible for `spectrum π a = β
`. In this
case, `spectral_radius a = 0`. It is also possible that `spectrum π a` be unbounded (though
@@ -59,6 +60,7 @@ noncomputable def spectralRadius (π : Type _) {A : Type _} [NormedField π]
(a : A) : ββ₯0β :=
β¨ k β spectrum π a, βkββ
#align spectral_radius spectralRadius
+-/
variable {π : Type _} {A : Type _}
@@ -574,11 +576,13 @@ instance (priority := 100) [AlgHomClass F π A π] : ContinuousLinearMapClas
AddMonoidHomClass.continuous_of_bound Ο β(1 : A)β fun a =>
mul_comm βaβ β(1 : A)β βΈ spectrum.norm_le_norm_mul_of_mem (apply_mem_spectrum Ο _) }
+#print AlgHom.toContinuousLinearMap /-
/-- An algebra homomorphism into the base field, as a continuous linear map (since it is
automatically bounded). -/
def toContinuousLinearMap (Ο : A ββ[π] π) : A βL[π] π :=
{ Ο.toLinearMap with cont := map_continuous Ο }
#align alg_hom.to_continuous_linear_map AlgHom.toContinuousLinearMap
+-/
@[simp]
theorem coe_toContinuousLinearMap (Ο : A ββ[π] π) : βΟ.toContinuousLinearMap = Ο :=
@@ -623,6 +627,7 @@ variable [NontriviallyNormedField π] [NormedRing A] [CompleteSpace A]
variable [NormedAlgebra π A]
+#print WeakDual.CharacterSpace.equivAlgHom /-
/-- The equivalence between characters and algebra homomorphisms into the base field. -/
def equivAlgHom : characterSpace π A β (A ββ[π] π)
where
@@ -632,17 +637,18 @@ def equivAlgHom : characterSpace π A β (A ββ[π] π)
property := by rw [eq_set_map_one_map_mul]; exact β¨map_one f, map_mul fβ© }
left_inv f := Subtype.ext <| ContinuousLinearMap.ext fun x => rfl
right_inv f := AlgHom.ext fun x => rfl
-#align weak_dual.character_space.equiv_alg_hom WeakDual.characterSpace.equivAlgHom
+#align weak_dual.character_space.equiv_alg_hom WeakDual.CharacterSpace.equivAlgHom
+-/
@[simp]
theorem equivAlgHom_coe (f : characterSpace π A) : β(equivAlgHom f) = f :=
rfl
-#align weak_dual.character_space.equiv_alg_hom_coe WeakDual.characterSpace.equivAlgHom_coe
+#align weak_dual.character_space.equiv_alg_hom_coe WeakDual.CharacterSpace.equivAlgHom_coe
@[simp]
theorem equivAlgHom_symm_coe (f : A ββ[π] π) : β(equivAlgHom.symm f) = f :=
rfl
-#align weak_dual.character_space.equiv_alg_hom_symm_coe WeakDual.characterSpace.equivAlgHom_symm_coe
+#align weak_dual.character_space.equiv_alg_hom_symm_coe WeakDual.CharacterSpace.equivAlgHom_symm_coe
end CharacterSpace
mathlib commit https://github.com/leanprover-community/mathlib/commit/a3e83f0fa4391c8740f7d773a7a9b74e311ae2a3
@@ -537,9 +537,9 @@ theorem exp_mem_exp [IsROrC π] [NormedRing A] [NormedAlgebra π A] [Complet
div_le_div (pow_nonneg (norm_nonneg _) n) (norm_pow_le' (a - ββ z) (zero_lt_iff.mpr hn))
(by exact_mod_cast Nat.factorial_pos n)
(by exact_mod_cast Nat.factorial_le (lt_add_one n).le)
- have hβ : (β' n : β, ((n + 1).factorialβ»ΒΉ : π) β’ (a - ββ z) ^ (n + 1)) = (a - ββ z) * b := by
+ have hβ : β' n : β, ((n + 1).factorialβ»ΒΉ : π) β’ (a - ββ z) ^ (n + 1) = (a - ββ z) * b := by
simpa only [mul_smul_comm, pow_succ] using hb.tsum_mul_left (a - ββ z)
- have hβ : (β' n : β, ((n + 1).factorialβ»ΒΉ : π) β’ (a - ββ z) ^ (n + 1)) = b * (a - ββ z) := by
+ have hβ : β' n : β, ((n + 1).factorialβ»ΒΉ : π) β’ (a - ββ z) ^ (n + 1) = b * (a - ββ z) := by
simpa only [pow_succ', Algebra.smul_mul_assoc] using hb.tsum_mul_right (a - ββ z)
have hβ : exp π (a - ββ z) = 1 + (a - ββ z) * b :=
by
mathlib commit https://github.com/leanprover-community/mathlib/commit/7e5137f579de09a059a5ce98f364a04e221aabf0
@@ -265,7 +265,6 @@ theorem norm_resolvent_le_forall (a : A) :
exact
mul_lt_mul_of_pos_left
((inv_mul_lt_iff haβ).mpr ((mul_one (βaβ + 1)).symm βΈ lt_add_one _)) Ξ΄_pos
-
rw [β inv_smul_smul z (resolvent a (z : π)), units_smul_resolvent_self, resolvent,
Algebra.algebraMap_eq_smul_one, one_smul, Units.smul_def, norm_smul, Units.val_inv_eq_inv_val,
norm_inv]
@@ -274,7 +273,6 @@ theorem norm_resolvent_le_forall (a : A) :
mul_le_mul (hz.trans (min_le_right _ _)) (hΞ΄ (mem_ball_zero_iff.mpr lt_Ξ΄)) (norm_nonneg _)
(mul_pos hΞ΅ (inv_pos.mpr c_pos)).le
_ = _ := inv_mul_cancel_rightβ c_pos.ne.symm Ξ΅
-
#align spectrum.norm_resolvent_le_forall spectrum.norm_resolvent_le_forall
end resolvent
mathlib commit https://github.com/leanprover-community/mathlib/commit/58a272265b5e05f258161260dd2c5d247213cbd3
@@ -4,11 +4,11 @@ Released under Apache 2.0 license as described in the file LICENSE.
Authors: Jireh Loreaux
! This file was ported from Lean 3 source module analysis.normed_space.spectrum
-! leanprover-community/mathlib commit 0b9eaaa7686280fad8cce467f5c3c57ee6ce77f8
+! leanprover-community/mathlib commit 58a272265b5e05f258161260dd2c5d247213cbd3
! Please do not edit these lines, except to modify the commit id
! if you have ported upstream changes.
-/
-import Mathbin.Algebra.Algebra.Spectrum
+import Mathbin.FieldTheory.IsAlgClosed.Spectrum
import Mathbin.Analysis.Complex.Liouville
import Mathbin.Analysis.Complex.Polynomial
import Mathbin.Analysis.Analytic.RadiusLiminf
mathlib commit https://github.com/leanprover-community/mathlib/commit/5f25c089cb34db4db112556f23c50d12da81b297
@@ -533,7 +533,7 @@ theorem exp_mem_exp [IsROrC π] [NormedRing A] [NormedAlgebra π A] [Complet
have hb : Summable fun n : β => ((n + 1).factorialβ»ΒΉ : π) β’ (a - ββ z) ^ n :=
by
refine' summable_of_norm_bounded_eventually _ (Real.summable_pow_div_factorial βa - ββ zβ) _
- filter_upwards [Filter.eventually_cofinite_ne 0]with n hn
+ filter_upwards [Filter.eventually_cofinite_ne 0] with n hn
rw [norm_smul, mul_comm, norm_inv, IsROrC.norm_natCast, β div_eq_mul_inv]
exact
div_le_div (pow_nonneg (norm_nonneg _) n) (norm_pow_le' (a - ββ z) (zero_lt_iff.mpr hn))
@@ -546,7 +546,7 @@ theorem exp_mem_exp [IsROrC π] [NormedRing A] [NormedAlgebra π A] [Complet
have hβ : exp π (a - ββ z) = 1 + (a - ββ z) * b :=
by
rw [exp_eq_tsum]
- convert tsum_eq_zero_add (exp_series_summable' (a - ββ z))
+ convert tsum_eq_zero_add (expSeries_summable' (a - ββ z))
simp only [Nat.factorial_zero, Nat.cast_one, inv_one, pow_zero, one_smul]
exact hβ.symm
rw [spectrum.mem_iff, IsUnit.sub_iff, β one_mul (ββ (exp π z)), hexpmul, β _root_.sub_mul,
mathlib commit https://github.com/leanprover-community/mathlib/commit/cca40788df1b8755d5baf17ab2f27dacc2e17acb
@@ -292,8 +292,8 @@ variable (π)
/-- In a Banach algebra `A` over a nontrivially normed field `π`, for any `a : A` the
power series with coefficients `a ^ n` represents the function `(1 - z β’ a)β»ΒΉ` in a disk of
radius `βaβββ»ΒΉ`. -/
-theorem hasFpowerSeriesOnBallInverseOneSubSmul [CompleteSpace A] (a : A) :
- HasFpowerSeriesOnBall (fun z : π => Ring.inverse (1 - z β’ a))
+theorem hasFPowerSeriesOnBall_inverse_one_sub_smul [CompleteSpace A] (a : A) :
+ HasFPowerSeriesOnBall (fun z : π => Ring.inverse (1 - z β’ a))
(fun n => ContinuousMultilinearMap.mkPiField π (Fin n) (a ^ n)) 0 βaβββ»ΒΉ :=
{ r_le :=
by
@@ -321,7 +321,7 @@ theorem hasFpowerSeriesOnBallInverseOneSubSmul [CompleteSpace A] (a : A) :
NNReal.lt_inv_iff_mul_lt h]
simpa [β smul_pow, (NormedRing.summable_geometric_of_norm_lt_1 _ norm_lt).hasSum_iff] using
(NormedRing.inverse_one_sub _ norm_lt).symm }
-#align spectrum.has_fpower_series_on_ball_inverse_one_sub_smul spectrum.hasFpowerSeriesOnBallInverseOneSubSmul
+#align spectrum.has_fpower_series_on_ball_inverse_one_sub_smul spectrum.hasFPowerSeriesOnBall_inverse_one_sub_smul
variable {π}
@@ -380,8 +380,8 @@ theorem limsup_pow_nnnorm_pow_one_div_le_spectralRadius (a : A) :
ext n
rw [norm_toNNReal, ENNReal.coe_rpow_def βa ^ nββ (1 / n : β), if_neg]
exact fun ha => by linarith [ha.2, (one_div_nonneg.mpr n.cast_nonneg : 0 β€ (1 / n : β))]
- Β· have Hβ := (differentiable_on_inverse_one_sub_smul r_lt).HasFpowerSeriesOnBall r_pos
- exact ((has_fpower_series_on_ball_inverse_one_sub_smul β a).exchangeRadius Hβ).r_le
+ Β· have Hβ := (differentiable_on_inverse_one_sub_smul r_lt).HasFPowerSeriesOnBall r_pos
+ exact ((has_fpower_series_on_ball_inverse_one_sub_smul β a).exchange_radius Hβ).r_le
#align spectrum.limsup_pow_nnnorm_pow_one_div_le_spectral_radius spectrum.limsup_pow_nnnorm_pow_one_div_le_spectralRadius
/-- **Gelfand's formula**: Given an element `a : A` of a complex Banach algebra, the
mathlib commit https://github.com/leanprover-community/mathlib/commit/cca40788df1b8755d5baf17ab2f27dacc2e17acb
@@ -112,7 +112,7 @@ theorem mem_resolventSet_of_norm_lt_mul {a : A} {k : π} (h : βaβ * β(1
ne_zero_of_norm_ne_zero ((mul_nonneg (norm_nonneg _) (norm_nonneg _)).trans_lt h).ne'
let ku := Units.map ββ.toMonoidHom (Units.mk0 k hk)
rw [β inv_inv β(1 : A)β,
- mul_inv_lt_iff (inv_pos.2 <| norm_pos_iff.2 (one_ne_zero : (1 : A) β 0))] at h
+ mul_inv_lt_iff (inv_pos.2 <| norm_pos_iff.2 (one_ne_zero : (1 : A) β 0))] at h
have hku : β-aβ < β(βkuβ»ΒΉ : A)ββ»ΒΉ := by simpa [ku, norm_algebraMap] using h
simpa [ku, sub_eq_add_neg, Algebra.algebraMap_eq_smul_one] using (ku.add (-a) hku).IsUnit
#align spectrum.mem_resolvent_set_of_norm_lt_mul spectrum.mem_resolventSet_of_norm_lt_mul
@@ -197,7 +197,7 @@ theorem spectralRadius_le_liminf_pow_nnnorm_pow_one_div (a : A) :
h (by simpa only [inv_inv, inv_top] using congr_arg (fun x : ββ₯0β => xβ»ΒΉ) h')
simp only [ENNReal.mul_le_iff_le_inv h (hΞ΅.trans_le le_top).Ne, mul_comm Ξ΅β»ΒΉ,
liminf_eq_supr_infi_of_nat', ENNReal.iSup_mul, ENNReal.iInf_mul hΞ΅']
- rw [β ENNReal.inv_lt_inv, inv_one] at hΞ΅
+ rw [β ENNReal.inv_lt_inv, inv_one] at hΞ΅
obtain β¨N, hNβ© :=
eventually_at_top.mp
(ENNReal.eventually_pow_one_div_le (ENNReal.coe_ne_top : ββ(1 : A)ββ β β) hΞ΅)
@@ -239,9 +239,9 @@ theorem norm_resolvent_le_forall (a : A) :
β Ξ΅ > 0, β R > 0, β z : π, R β€ βzβ β βresolvent a zβ β€ Ξ΅ :=
by
obtain β¨c, c_pos, hcβ© := (@NormedRing.inverse_one_sub_norm A _ _).exists_pos
- rw [is_O_with_iff, eventually_iff, Metric.mem_nhds_iff] at hc
+ rw [is_O_with_iff, eventually_iff, Metric.mem_nhds_iff] at hc
rcases hc with β¨Ξ΄, Ξ΄_pos, hΞ΄β©
- simp only [CstarRing.norm_one, mul_one] at hΞ΄
+ simp only [CstarRing.norm_one, mul_one] at hΞ΄
intro Ξ΅ hΞ΅
have haβ : 0 < βaβ + 1 := lt_of_le_of_lt (norm_nonneg a) (lt_add_one _)
have min_pos : 0 < min (Ξ΄ * (βaβ + 1)β»ΒΉ) (Ξ΅ * cβ»ΒΉ) :=
@@ -307,7 +307,7 @@ theorem hasFpowerSeriesOnBallInverseOneSubSmul [CompleteSpace A] (a : A) :
(le_max_left _ _)
Β· by_cases βaββ = 0
Β· simp only [h, MulZeroClass.zero_mul, zero_le', pow_succ]
- Β· rw [β coe_inv h, coe_lt_coe, NNReal.lt_inv_iff_mul_lt h] at hr
+ Β· rw [β coe_inv h, coe_lt_coe, NNReal.lt_inv_iff_mul_lt h] at hr
simpa only [β mul_pow, mul_comm] using pow_le_one' hr.le n.succ
r_pos := ENNReal.inv_pos.mpr coe_ne_top
HasSum := fun y hy =>
@@ -331,7 +331,7 @@ theorem isUnit_one_sub_smul_of_lt_inv_radius {a : A} {z : π} (h : ββzβ
Β· simp only [hz, isUnit_one, sub_zero, zero_smul]
Β· let u := Units.mk0 z hz
suffices hu : IsUnit (uβ»ΒΉ β’ 1 - a)
- Β· rwa [IsUnit.smul_sub_iff_sub_inv_smul, inv_inv u] at hu
+ Β· rwa [IsUnit.smul_sub_iff_sub_inv_smul, inv_inv u] at hu
Β· rw [Units.smul_def, β Algebra.algebraMap_eq_smul_one, β mem_resolvent_set_iff]
refine' mem_resolvent_set_of_spectral_radius_lt _
rwa [Units.val_inv_eq_inv_val, nnnorm_inv,
@@ -418,7 +418,7 @@ protected theorem nonempty : (spectrum β a).Nonempty :=
is differentiable on `β`. -/
rw [Set.nonempty_iff_ne_empty]
by_contra h
- have Hβ : resolventSet β a = Set.univ := by rwa [spectrum, Set.compl_empty_iff] at h
+ have Hβ : resolventSet β a = Set.univ := by rwa [spectrum, Set.compl_empty_iff] at h
have Hβ : Differentiable β fun z : β => resolvent a z := fun z =>
(has_deriv_at_resolvent (Hβ.symm βΈ Set.mem_univ z : z β resolventSet β a)).DifferentiableAt
/- The norm of the resolvent is small for all sufficently large `z`, and by compactness and
@@ -491,7 +491,7 @@ include hA
local notation "Ο" => spectrum β
theorem algebraMap_eq_of_mem {a : A} {z : β} (h : z β Ο a) : algebraMap β A z = a := by
- rwa [mem_iff, hA, Classical.not_not, sub_eq_zero] at h
+ rwa [mem_iff, hA, Classical.not_not, sub_eq_zero] at h
#align spectrum.algebra_map_eq_of_mem spectrum.algebraMap_eq_of_mem
/-- **Gelfand-Mazur theorem**: For a complex Banach division algebra, the natural `algebra_map β A`
mathlib commit https://github.com/leanprover-community/mathlib/commit/917c3c072e487b3cccdbfeff17e75b40e45f66cb
@@ -48,7 +48,7 @@ This file contains the basic theory for the resolvent and spectrum of a Banach a
-/
-open ENNReal NNReal
+open scoped ENNReal NNReal
/-- The *spectral radius* is the supremum of the `nnnorm` (`ββ¬ββ`) of elements in the spectrum,
coerced into an element of `ββ₯0β`. Note that it is possible for `spectrum π a = β
`. In this
@@ -283,7 +283,7 @@ section OneSubSmul
open ContinuousMultilinearMap ENNReal FormalMultilinearSeries
-open NNReal ENNReal
+open scoped NNReal ENNReal
variable [NontriviallyNormedField π] [NormedRing A] [NormedAlgebra π A]
@@ -361,7 +361,7 @@ section GelfandFormula
open Filter ENNReal ContinuousMultilinearMap
-open Topology
+open scoped Topology
variable [NormedRing A] [NormedAlgebra β A] [CompleteSpace A]
@@ -463,7 +463,7 @@ theorem spectralRadius_lt_of_forall_lt {r : ββ₯0} (hr : β z β spectrum
spectralRadius_lt_of_forall_lt_of_nonempty (spectrum.nonempty a) hr
#align spectrum.spectral_radius_lt_of_forall_lt spectrum.spectralRadius_lt_of_forall_lt
-open Polynomial
+open scoped Polynomial
open Polynomial
mathlib commit https://github.com/leanprover-community/mathlib/commit/917c3c072e487b3cccdbfeff17e75b40e45f66cb
@@ -85,9 +85,7 @@ theorem SpectralRadius.of_subsingleton [Subsingleton A] (a : A) : spectralRadius
#align spectrum.spectral_radius.of_subsingleton spectrum.SpectralRadius.of_subsingleton
@[simp]
-theorem spectralRadius_zero : spectralRadius π (0 : A) = 0 :=
- by
- nontriviality A
+theorem spectralRadius_zero : spectralRadius π (0 : A) = 0 := by nontriviality A;
simp [spectralRadius]
#align spectrum.spectral_radius_zero spectrum.spectralRadius_zero
@@ -147,10 +145,8 @@ protected theorem isCompact [ProperSpace π] (a : A) : IsCompact (Ο a) :=
Metric.isCompact_of_isClosed_bounded (spectrum.isClosed a) (is_bounded a)
#align spectrum.is_compact spectrum.isCompact
-theorem spectralRadius_le_nnnorm [NormOneClass A] (a : A) : spectralRadius π a β€ βaββ :=
- by
- refine' iSupβ_le fun k hk => _
- exact_mod_cast norm_le_norm_of_mem hk
+theorem spectralRadius_le_nnnorm [NormOneClass A] (a : A) : spectralRadius π a β€ βaββ := by
+ refine' iSupβ_le fun k hk => _; exact_mod_cast norm_le_norm_of_mem hk
#align spectrum.spectral_radius_le_nnnorm spectrum.spectralRadius_le_nnnorm
theorem exists_nnnorm_eq_spectralRadius_of_nonempty [ProperSpace π] {a : A} (ha : (Ο a).Nonempty) :
@@ -635,9 +631,7 @@ def equivAlgHom : characterSpace π A β (A ββ[π] π)
toFun := toAlgHom
invFun f :=
{ val := f.toContinuousLinearMap
- property := by
- rw [eq_set_map_one_map_mul]
- exact β¨map_one f, map_mul fβ© }
+ property := by rw [eq_set_map_one_map_mul]; exact β¨map_one f, map_mul fβ© }
left_inv f := Subtype.ext <| ContinuousLinearMap.ext fun x => rfl
right_inv f := AlgHom.ext fun x => rfl
#align weak_dual.character_space.equiv_alg_hom WeakDual.characterSpace.equivAlgHom
mathlib commit https://github.com/leanprover-community/mathlib/commit/33c67ae661dd8988516ff7f247b0be3018cdd952
@@ -230,7 +230,7 @@ local notation "ββ" => algebraMap π A
theorem hasDerivAt_resolvent {a : A} {k : π} (hk : k β Ο a) :
HasDerivAt (resolvent a) (-resolvent a k ^ 2) k :=
by
- have Hβ : HasFderivAt Ring.inverse _ (ββ k - a) := hasFderivAt_ring_inverse hk.unit
+ have Hβ : HasFDerivAt Ring.inverse _ (ββ k - a) := hasFDerivAt_ring_inverse hk.unit
have Hβ : HasDerivAt (fun k => ββ k - a) 1 k := by
simpa using (Algebra.linearMap π A).HasDerivAt.sub_const a
simpa [resolvent, sq, hk.unit_spec, β Ring.inverse_unit hk.unit] using Hβ.comp_has_deriv_at k Hβ
mathlib commit https://github.com/leanprover-community/mathlib/commit/0b9eaaa7686280fad8cce467f5c3c57ee6ce77f8
@@ -4,12 +4,11 @@ Released under Apache 2.0 license as described in the file LICENSE.
Authors: Jireh Loreaux
! This file was ported from Lean 3 source module analysis.normed_space.spectrum
-! leanprover-community/mathlib commit 3f655f5297b030a87d641ad4e825af8d9679eb0b
+! leanprover-community/mathlib commit 0b9eaaa7686280fad8cce467f5c3c57ee6ce77f8
! Please do not edit these lines, except to modify the commit id
! if you have ported upstream changes.
-/
import Mathbin.Algebra.Algebra.Spectrum
-import Mathbin.Analysis.SpecialFunctions.Pow
import Mathbin.Analysis.Complex.Liouville
import Mathbin.Analysis.Complex.Polynomial
import Mathbin.Analysis.Analytic.RadiusLiminf
mathlib commit https://github.com/leanprover-community/mathlib/commit/e3fb84046afd187b710170887195d50bada934ee
@@ -94,7 +94,7 @@ theorem spectralRadius_zero : spectralRadius π (0 : A) = 0 :=
theorem mem_resolventSet_of_spectralRadius_lt {a : A} {k : π} (h : spectralRadius π a < βkββ) :
k β Ο a :=
- Classical.not_not.mp fun hn => h.not_le <| le_supα΅’β k hn
+ Classical.not_not.mp fun hn => h.not_le <| le_iSupβ k hn
#align spectrum.mem_resolvent_set_of_spectral_radius_lt spectrum.mem_resolventSet_of_spectralRadius_lt
variable [CompleteSpace A]
@@ -150,7 +150,7 @@ protected theorem isCompact [ProperSpace π] (a : A) : IsCompact (Ο a) :=
theorem spectralRadius_le_nnnorm [NormOneClass A] (a : A) : spectralRadius π a β€ βaββ :=
by
- refine' supα΅’β_le fun k hk => _
+ refine' iSupβ_le fun k hk => _
exact_mod_cast norm_le_norm_of_mem hk
#align spectrum.spectral_radius_le_nnnorm spectrum.spectralRadius_le_nnnorm
@@ -158,13 +158,13 @@ theorem exists_nnnorm_eq_spectralRadius_of_nonempty [ProperSpace π] {a : A} (
β k β Ο a, (βkββ : ββ₯0β) = spectralRadius π a :=
by
obtain β¨k, hk, hβ© := (spectrum.isCompact a).exists_forall_ge ha continuous_nnnorm.continuous_on
- exact β¨k, hk, le_antisymm (le_supα΅’β k hk) (supα΅’β_le <| by exact_mod_cast h)β©
+ exact β¨k, hk, le_antisymm (le_iSupβ k hk) (iSupβ_le <| by exact_mod_cast h)β©
#align spectrum.exists_nnnorm_eq_spectral_radius_of_nonempty spectrum.exists_nnnorm_eq_spectralRadius_of_nonempty
theorem spectralRadius_lt_of_forall_lt_of_nonempty [ProperSpace π] {a : A} (ha : (Ο a).Nonempty)
{r : ββ₯0} (hr : β k β Ο a, βkββ < r) : spectralRadius π a < r :=
- supβ_image.symm.trans_lt <|
- ((spectrum.isCompact a).supβ_lt_iff_of_continuous ha
+ sSup_image.symm.trans_lt <|
+ ((spectrum.isCompact a).sSup_lt_iff_of_continuous ha
(ENNReal.continuous_coe.comp continuous_nnnorm).ContinuousOn (r : ββ₯0β)).mpr
(by exact_mod_cast hr)
#align spectrum.spectral_radius_lt_of_forall_lt_of_nonempty spectrum.spectralRadius_lt_of_forall_lt_of_nonempty
@@ -176,7 +176,7 @@ variable (π)
theorem spectralRadius_le_pow_nnnorm_pow_one_div (a : A) (n : β) :
spectralRadius π a β€ βa ^ (n + 1)ββ ^ (1 / (n + 1) : β) * β(1 : A)ββ ^ (1 / (n + 1) : β) :=
by
- refine' supα΅’β_le fun k hk => _
+ refine' iSupβ_le fun k hk => _
-- apply easy direction of the spectral mapping theorem for polynomials
have pow_mem : k ^ (n + 1) β Ο (a ^ (n + 1)) := by
simpa only [one_mul, Algebra.algebraMap_eq_smul_one, one_smul, aeval_monomial, one_mul,
@@ -201,13 +201,13 @@ theorem spectralRadius_le_liminf_pow_nnnorm_pow_one_div (a : A) :
have hΞ΅' : Ξ΅β»ΒΉ β β := fun h' =>
h (by simpa only [inv_inv, inv_top] using congr_arg (fun x : ββ₯0β => xβ»ΒΉ) h')
simp only [ENNReal.mul_le_iff_le_inv h (hΞ΅.trans_le le_top).Ne, mul_comm Ξ΅β»ΒΉ,
- liminf_eq_supr_infi_of_nat', ENNReal.supα΅’_mul, ENNReal.infα΅’_mul hΞ΅']
+ liminf_eq_supr_infi_of_nat', ENNReal.iSup_mul, ENNReal.iInf_mul hΞ΅']
rw [β ENNReal.inv_lt_inv, inv_one] at hΞ΅
obtain β¨N, hNβ© :=
eventually_at_top.mp
(ENNReal.eventually_pow_one_div_le (ENNReal.coe_ne_top : ββ(1 : A)ββ β β) hΞ΅)
- refine' le_trans _ (le_supα΅’ _ (N + 1))
- refine' le_infα΅’ fun n => _
+ refine' le_trans _ (le_iSup _ (N + 1))
+ refine' le_iInf fun n => _
simp only [β add_assoc]
refine' (spectral_radius_le_pow_nnnorm_pow_one_div π a (n + N)).trans _
norm_cast
mathlib commit https://github.com/leanprover-community/mathlib/commit/2f8347015b12b0864dfaf366ec4909eb70c78740
@@ -539,7 +539,7 @@ theorem exp_mem_exp [IsROrC π] [NormedRing A] [NormedAlgebra π A] [Complet
by
refine' summable_of_norm_bounded_eventually _ (Real.summable_pow_div_factorial βa - ββ zβ) _
filter_upwards [Filter.eventually_cofinite_ne 0]with n hn
- rw [norm_smul, mul_comm, norm_inv, IsROrC.norm_nat_cast, β div_eq_mul_inv]
+ rw [norm_smul, mul_comm, norm_inv, IsROrC.norm_natCast, β div_eq_mul_inv]
exact
div_le_div (pow_nonneg (norm_nonneg _) n) (norm_pow_le' (a - ββ z) (zero_lt_iff.mpr hn))
(by exact_mod_cast Nat.factorial_pos n)
mathlib commit https://github.com/leanprover-community/mathlib/commit/2f8347015b12b0864dfaf366ec4909eb70c78740
@@ -325,7 +325,7 @@ theorem hasFpowerSeriesOnBallInverseOneSubSmul [CompleteSpace A] (a : A) :
rwa [β coe_nnnorm, β Real.lt_toNNReal_iff_coe_lt, Real.toNNReal_one, nnnorm_smul, β
NNReal.lt_inv_iff_mul_lt h]
simpa [β smul_pow, (NormedRing.summable_geometric_of_norm_lt_1 _ norm_lt).hasSum_iff] using
- (NormedRing.inverse_oneSub _ norm_lt).symm }
+ (NormedRing.inverse_one_sub _ norm_lt).symm }
#align spectrum.has_fpower_series_on_ball_inverse_one_sub_smul spectrum.hasFpowerSeriesOnBallInverseOneSubSmul
variable {π}
mathlib commit https://github.com/leanprover-community/mathlib/commit/d4437c68c8d350fc9d4e95e1e174409db35e30d7
@@ -4,7 +4,7 @@ Released under Apache 2.0 license as described in the file LICENSE.
Authors: Jireh Loreaux
! This file was ported from Lean 3 source module analysis.normed_space.spectrum
-! leanprover-community/mathlib commit f2ce6086713c78a7f880485f7917ea547a215982
+! leanprover-community/mathlib commit 3f655f5297b030a87d641ad4e825af8d9679eb0b
! Please do not edit these lines, except to modify the commit id
! if you have ported upstream changes.
-/
@@ -539,7 +539,7 @@ theorem exp_mem_exp [IsROrC π] [NormedRing A] [NormedAlgebra π A] [Complet
by
refine' summable_of_norm_bounded_eventually _ (Real.summable_pow_div_factorial βa - ββ zβ) _
filter_upwards [Filter.eventually_cofinite_ne 0]with n hn
- rw [norm_smul, mul_comm, norm_inv, IsROrC.norm_eq_abs, IsROrC.abs_cast_nat, β div_eq_mul_inv]
+ rw [norm_smul, mul_comm, norm_inv, IsROrC.norm_nat_cast, β div_eq_mul_inv]
exact
div_le_div (pow_nonneg (norm_nonneg _) n) (norm_pow_le' (a - ββ z) (zero_lt_iff.mpr hn))
(by exact_mod_cast Nat.factorial_pos n)
mathlib commit https://github.com/leanprover-community/mathlib/commit/3180fab693e2cee3bff62675571264cb8778b212
@@ -197,7 +197,7 @@ theorem spectralRadius_le_liminf_pow_nnnorm_pow_one_div (a : A) :
by
refine' ENNReal.le_of_forall_lt_one_mul_le fun Ξ΅ hΞ΅ => _
by_cases Ξ΅ = 0
- Β· simp only [h, zero_mul, zero_le']
+ Β· simp only [h, MulZeroClass.zero_mul, zero_le']
have hΞ΅' : Ξ΅β»ΒΉ β β := fun h' =>
h (by simpa only [inv_inv, inv_top] using congr_arg (fun x : ββ₯0β => xβ»ΒΉ) h')
simp only [ENNReal.mul_le_iff_le_inv h (hΞ΅.trans_le le_top).Ne, mul_comm Ξ΅β»ΒΉ,
@@ -311,7 +311,7 @@ theorem hasFpowerSeriesOnBallInverseOneSubSmul [CompleteSpace A] (a : A) :
le_trans (le_trans (mul_le_mul_right' (nnnorm_pow_le' a n.succ_pos) (r ^ n.succ)) _)
(le_max_left _ _)
Β· by_cases βaββ = 0
- Β· simp only [h, zero_mul, zero_le', pow_succ]
+ Β· simp only [h, MulZeroClass.zero_mul, zero_le', pow_succ]
Β· rw [β coe_inv h, coe_lt_coe, NNReal.lt_inv_iff_mul_lt h] at hr
simpa only [β mul_pow, mul_comm] using pow_le_one' hr.le n.succ
r_pos := ENNReal.inv_pos.mpr coe_ne_top
mathlib commit https://github.com/leanprover-community/mathlib/commit/195fcd60ff2bfe392543bceb0ec2adcdb472db4c
@@ -321,7 +321,7 @@ theorem hasFpowerSeriesOnBallInverseOneSubSmul [CompleteSpace A] (a : A) :
by_cases h : βaββ = 0
Β· simp only [nnnorm_eq_zero.mp h, norm_zero, zero_lt_one, smul_zero]
Β· have nnnorm_lt : βyββ < βaβββ»ΒΉ := by
- simpa only [β coe_inv h, mem_ball_zero_iff, Metric.emetric_ball_nNReal] using hy
+ simpa only [β coe_inv h, mem_ball_zero_iff, Metric.emetric_ball_nnreal] using hy
rwa [β coe_nnnorm, β Real.lt_toNNReal_iff_coe_lt, Real.toNNReal_one, nnnorm_smul, β
NNReal.lt_inv_iff_mul_lt h]
simpa [β smul_pow, (NormedRing.summable_geometric_of_norm_lt_1 _ norm_lt).hasSum_iff] using
mathlib commit https://github.com/leanprover-community/mathlib/commit/eb0cb4511aaef0da2462207b67358a0e1fe1e2ee
@@ -49,7 +49,7 @@ This file contains the basic theory for the resolvent and spectrum of a Banach a
-/
-open Ennreal NNReal
+open ENNReal NNReal
/-- The *spectral radius* is the supremum of the `nnnorm` (`ββ¬ββ`) of elements in the spectrum,
coerced into an element of `ββ₯0β`. Note that it is possible for `spectrum π a = β
`. In this
@@ -165,11 +165,11 @@ theorem spectralRadius_lt_of_forall_lt_of_nonempty [ProperSpace π] {a : A} (h
{r : ββ₯0} (hr : β k β Ο a, βkββ < r) : spectralRadius π a < r :=
supβ_image.symm.trans_lt <|
((spectrum.isCompact a).supβ_lt_iff_of_continuous ha
- (Ennreal.continuous_coe.comp continuous_nnnorm).ContinuousOn (r : ββ₯0β)).mpr
+ (ENNReal.continuous_coe.comp continuous_nnnorm).ContinuousOn (r : ββ₯0β)).mpr
(by exact_mod_cast hr)
#align spectrum.spectral_radius_lt_of_forall_lt_of_nonempty spectrum.spectralRadius_lt_of_forall_lt_of_nonempty
-open Ennreal Polynomial
+open ENNReal Polynomial
variable (π)
@@ -184,28 +184,28 @@ theorem spectralRadius_le_pow_nnnorm_pow_one_div (a : A) (n : β) :
-- power of the norm is bounded by norm of the power
have nnnorm_pow_le : (β(βkββ ^ (n + 1)) : ββ₯0β) β€ βa ^ (n + 1)ββ * β(1 : A)ββ := by
simpa only [Real.toNNReal_mul (norm_nonneg _), norm_toNNReal, nnnorm_pow k (n + 1),
- Ennreal.coe_mul] using coe_mono (Real.toNNReal_mono (norm_le_norm_mul_of_mem pow_mem))
+ ENNReal.coe_mul] using coe_mono (Real.toNNReal_mono (norm_le_norm_mul_of_mem pow_mem))
-- take (n + 1)α΅Κ° roots and clean up the left-hand side
have hn : 0 < ((n + 1 : β) : β) := by exact_mod_cast Nat.succ_pos'
convert monotone_rpow_of_nonneg (one_div_pos.mpr hn).le nnnorm_pow_le
erw [coe_pow, β rpow_nat_cast, β rpow_mul, mul_one_div_cancel hn.ne', rpow_one]
- rw [Nat.cast_succ, Ennreal.coe_mul_rpow]
+ rw [Nat.cast_succ, ENNReal.coe_mul_rpow]
#align spectrum.spectral_radius_le_pow_nnnorm_pow_one_div spectrum.spectralRadius_le_pow_nnnorm_pow_one_div
theorem spectralRadius_le_liminf_pow_nnnorm_pow_one_div (a : A) :
spectralRadius π a β€ atTop.liminf fun n : β => (βa ^ nββ : ββ₯0β) ^ (1 / n : β) :=
by
- refine' Ennreal.le_of_forall_lt_one_mul_le fun Ξ΅ hΞ΅ => _
+ refine' ENNReal.le_of_forall_lt_one_mul_le fun Ξ΅ hΞ΅ => _
by_cases Ξ΅ = 0
Β· simp only [h, zero_mul, zero_le']
have hΞ΅' : Ξ΅β»ΒΉ β β := fun h' =>
h (by simpa only [inv_inv, inv_top] using congr_arg (fun x : ββ₯0β => xβ»ΒΉ) h')
- simp only [Ennreal.mul_le_iff_le_inv h (hΞ΅.trans_le le_top).Ne, mul_comm Ξ΅β»ΒΉ,
- liminf_eq_supr_infi_of_nat', Ennreal.supα΅’_mul, Ennreal.infα΅’_mul hΞ΅']
- rw [β Ennreal.inv_lt_inv, inv_one] at hΞ΅
+ simp only [ENNReal.mul_le_iff_le_inv h (hΞ΅.trans_le le_top).Ne, mul_comm Ξ΅β»ΒΉ,
+ liminf_eq_supr_infi_of_nat', ENNReal.supα΅’_mul, ENNReal.infα΅’_mul hΞ΅']
+ rw [β ENNReal.inv_lt_inv, inv_one] at hΞ΅
obtain β¨N, hNβ© :=
eventually_at_top.mp
- (Ennreal.eventually_pow_one_div_le (Ennreal.coe_ne_top : ββ(1 : A)ββ β β) hΞ΅)
+ (ENNReal.eventually_pow_one_div_le (ENNReal.coe_ne_top : ββ(1 : A)ββ β β) hΞ΅)
refine' le_trans _ (le_supα΅’ _ (N + 1))
refine' le_infα΅’ fun n => _
simp only [β add_assoc]
@@ -286,9 +286,9 @@ end resolvent
section OneSubSmul
-open ContinuousMultilinearMap Ennreal FormalMultilinearSeries
+open ContinuousMultilinearMap ENNReal FormalMultilinearSeries
-open NNReal Ennreal
+open NNReal ENNReal
variable [NontriviallyNormedField π] [NormedRing A] [NormedAlgebra π A]
@@ -314,7 +314,7 @@ theorem hasFpowerSeriesOnBallInverseOneSubSmul [CompleteSpace A] (a : A) :
Β· simp only [h, zero_mul, zero_le', pow_succ]
Β· rw [β coe_inv h, coe_lt_coe, NNReal.lt_inv_iff_mul_lt h] at hr
simpa only [β mul_pow, mul_comm] using pow_le_one' hr.le n.succ
- r_pos := Ennreal.inv_pos.mpr coe_ne_top
+ r_pos := ENNReal.inv_pos.mpr coe_ne_top
HasSum := fun y hy =>
by
have norm_lt : βy β’ aβ < 1 := by
@@ -364,7 +364,7 @@ end OneSubSmul
section GelfandFormula
-open Filter Ennreal ContinuousMultilinearMap
+open Filter ENNReal ContinuousMultilinearMap
open Topology
@@ -383,7 +383,7 @@ theorem limsup_pow_nnnorm_pow_one_div_le_spectralRadius (a : A) :
simp only [p.radius_eq_liminf, β norm_toNNReal, norm_mk_pi_field]
congr
ext n
- rw [norm_toNNReal, Ennreal.coe_rpow_def βa ^ nββ (1 / n : β), if_neg]
+ rw [norm_toNNReal, ENNReal.coe_rpow_def βa ^ nββ (1 / n : β), if_neg]
exact fun ha => by linarith [ha.2, (one_div_nonneg.mpr n.cast_nonneg : 0 β€ (1 / n : β))]
Β· have Hβ := (differentiable_on_inverse_one_sub_smul r_lt).HasFpowerSeriesOnBall r_pos
exact ((has_fpower_series_on_ball_inverse_one_sub_smul β a).exchangeRadius Hβ).r_le
@@ -402,7 +402,7 @@ instead of `nnnorm`. -/
/-- **Gelfand's formula**: Given an element `a : A` of a complex Banach algebra, the
`spectral_radius` of `a` is the limit of the sequence `βa ^ nββ ^ (1 / n)` -/
theorem pow_norm_pow_one_div_tendsto_nhds_spectralRadius (a : A) :
- Tendsto (fun n : β => Ennreal.ofReal (βa ^ nβ ^ (1 / n : β))) atTop (π (spectralRadius β a)) :=
+ Tendsto (fun n : β => ENNReal.ofReal (βa ^ nβ ^ (1 / n : β))) atTop (π (spectralRadius β a)) :=
by
convert pow_nnnorm_pow_one_div_tendsto_nhds_spectral_radius a
ext1
mathlib commit https://github.com/leanprover-community/mathlib/commit/bd9851ca476957ea4549eb19b40e7b5ade9428cc
@@ -188,8 +188,8 @@ theorem spectralRadius_le_pow_nnnorm_pow_one_div (a : A) (n : β) :
have hn : 0 < ((n + 1 : β) : β) := mod_cast Nat.succ_pos'
convert monotone_rpow_of_nonneg (one_div_pos.mpr hn).le nnnorm_pow_le using 1
all_goals dsimp
- rw [one_div, pow_rpow_inv_natCast]
- positivity
+ Β· rw [one_div, pow_rpow_inv_natCast]
+ positivity
rw [Nat.cast_succ, ENNReal.coe_mul_rpow]
#align spectrum.spectral_radius_le_pow_nnnorm_pow_one_div spectrum.spectralRadius_le_pow_nnnorm_pow_one_div
@@ -489,8 +489,8 @@ theorem exp_mem_exp [RCLike π] [NormedRing A] [NormedAlgebra π A] [Complet
have hβ : exp π (a - ββ z) = 1 + (a - ββ z) * b := by
rw [exp_eq_tsum]
convert tsum_eq_zero_add (expSeries_summable' (π := π) (a - ββ z))
- simp only [Nat.factorial_zero, Nat.cast_one, inv_one, pow_zero, one_smul]
- exact hβ.symm
+ Β· simp only [Nat.factorial_zero, Nat.cast_one, inv_one, pow_zero, one_smul]
+ Β· exact hβ.symm
rw [spectrum.mem_iff, IsUnit.sub_iff, β one_mul (ββ (exp π z)), hexpmul, β _root_.sub_mul,
Commute.isUnit_mul_iff (Algebra.commutes (exp π z) (exp π (a - ββ z) - 1)).symm,
sub_eq_iff_eq_add'.mpr hβ, Commute.isUnit_mul_iff (hβ βΈ hβ : (a - ββ z) * b = b * (a - ββ z))]
When working with the continuous functional calculus generically, it is currently hard to establish lemmas that work well for positive across the board.
This is in part due to the fact that one cannot conclude from the continuous functional calculus alone that the spectrum of nonnegative elements in a star-ordered ring is nonnegative. So, we use a type class to encode this, and this type class actually uses the quasispectrum, because for unital algebras the two notions are equivalent.
@@ -3,6 +3,7 @@ Copyright (c) 2021 Jireh Loreaux. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Authors: Jireh Loreaux
-/
+import Mathlib.Algebra.Algebra.Quasispectrum
import Mathlib.FieldTheory.IsAlgClosed.Spectrum
import Mathlib.Analysis.Complex.Liouville
import Mathlib.Analysis.Complex.Polynomial
@@ -618,6 +619,11 @@ lemma nnreal_iff [Algebra β A] {a : A} :
Β· exact .of_subset_range_algebraMap _ _ (fun _ β¦ Real.toNNReal_coe)
fun x hx β¦ β¨β¨x, h x hxβ©, rflβ©
+lemma nnreal_of_nonneg {A : Type*} [Ring A] [PartialOrder A] [Algebra β A]
+ [NonnegSpectrumClass β A] {a : A} (ha : 0 β€ a) :
+ SpectrumRestricts a ContinuousMap.realToNNReal :=
+ nnreal_iff.mpr <| spectrum_nonneg_of_nonneg ha
+
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 β¦ ?_β©
@@ -47,12 +47,12 @@ This file contains the basic theory for the resolvent and spectrum of a Banach a
open scoped ENNReal NNReal
-open NormedSpace -- For `exp`.
+open NormedSpace -- For `NormedSpace.exp`.
/-- The *spectral radius* is the supremum of the `nnnorm` (`βΒ·ββ`) of elements in the spectrum,
coerced into an element of `ββ₯0β`. Note that it is possible for `spectrum π a = β
`. In this
case, `spectralRadius a = 0`. It is also possible that `spectrum π a` be unbounded (though
- not for Banach algebras, see `spectrum.is_bounded`, below). In this case,
+ not for Banach algebras, see `spectrum.isBounded`, below). In this case,
`spectralRadius a = β`. -/
noncomputable def spectralRadius (π : Type*) {A : Type*} [NormedField π] [Ring A] [Algebra π A]
(a : A) : ββ₯0β :=
We change the following field in the definition of an additive commutative monoid:
nsmul_succ : β (n : β) (x : G),
- AddMonoid.nsmul (n + 1) x = x + AddMonoid.nsmul n x
+ AddMonoid.nsmul (n + 1) x = AddMonoid.nsmul n x + x
where the latter is more natural
We adjust the definitions of ^
in monoids, groups, etc.
Originally there was a warning comment about why this natural order was preferred
use
x * npowRec n x
and notnpowRec n x * x
in the definition to make sure that definitional unfolding ofnpowRec
is blocked, to avoid deep recursion issues.
but it seems to no longer apply.
Remarks on the PR :
pow_succ
and pow_succ'
have switched their meanings.Ideal.IsPrime.mul_mem_pow
which is defined in [Mathlib/RingTheory/DedekindDomain/Ideal.lean]. Changing the order of operation forced me to add the symmetric lemma Ideal.IsPrime.mem_pow_mul
.@@ -282,7 +282,7 @@ theorem hasFPowerSeriesOnBall_inverse_one_sub_smul [CompleteSpace A] (a : A) :
le_trans (le_trans (mul_le_mul_right' (nnnorm_pow_le' a n.succ_pos) (r ^ n.succ)) _)
(le_max_left _ _)
Β· by_cases h : βaββ = 0
- Β· simp only [h, zero_mul, zero_le', pow_succ]
+ Β· simp only [h, zero_mul, zero_le', pow_succ']
Β· rw [β coe_inv h, coe_lt_coe, NNReal.lt_inv_iff_mul_lt h] at hr
simpa only [β mul_pow, mul_comm] using pow_le_one' hr.le n.succ
r_pos := ENNReal.inv_pos.mpr coe_ne_top
@@ -482,9 +482,9 @@ theorem exp_mem_exp [RCLike π] [NormedRing A] [NormedAlgebra π A] [Complet
exact div_le_div (pow_nonneg (norm_nonneg _) n) (norm_pow_le' (a - ββ z) (zero_lt_iff.mpr hn))
(mod_cast Nat.factorial_pos n) (mod_cast Nat.factorial_le (lt_add_one n).le)
have hβ : (β' n : β, ((n + 1).factorialβ»ΒΉ : π) β’ (a - ββ z) ^ (n + 1)) = (a - ββ z) * b := by
- simpa only [mul_smul_comm, pow_succ] using hb.tsum_mul_left (a - ββ z)
+ simpa only [mul_smul_comm, pow_succ'] using hb.tsum_mul_left (a - ββ z)
have hβ : (β' n : β, ((n + 1).factorialβ»ΒΉ : π) β’ (a - ββ z) ^ (n + 1)) = b * (a - ββ z) := by
- simpa only [pow_succ', Algebra.smul_mul_assoc] using hb.tsum_mul_right (a - ββ z)
+ simpa only [pow_succ, Algebra.smul_mul_assoc] using hb.tsum_mul_right (a - ββ z)
have hβ : exp π (a - ββ z) = 1 + (a - ββ z) * b := by
rw [exp_eq_tsum]
convert tsum_eq_zero_add (expSeries_summable' (π := π) (a - ββ z))
IsROrC
to RCLike
(#10819)
IsROrC
contains data, which goes against the expectation that classes prefixed with Is
are prop-valued. People have been complaining about this on and off, so this PR renames IsROrC
to RCLike
.
@@ -469,8 +469,8 @@ section ExpMapping
local notation "ββ" => algebraMap π A
/-- For `π = β` or `π = β`, `exp π` maps the spectrum of `a` into the spectrum of `exp π a`. -/
-theorem exp_mem_exp [IsROrC π] [NormedRing A] [NormedAlgebra π A] [CompleteSpace A] (a : A) {z : π}
- (hz : z β spectrum π a) : exp π z β spectrum π (exp π a) := by
+theorem exp_mem_exp [RCLike π] [NormedRing A] [NormedAlgebra π A] [CompleteSpace A] (a : A)
+ {z : π} (hz : z β spectrum π a) : exp π z β spectrum π (exp π a) := by
have hexpmul : exp π a = exp π (a - ββ z) * ββ (exp π z) := by
rw [algebraMap_exp_comm z, β exp_add_of_commute (Algebra.commutes z (a - ββ z)).symm,
sub_add_cancel]
@@ -478,7 +478,7 @@ theorem exp_mem_exp [IsROrC π] [NormedRing A] [NormedAlgebra π A] [Complet
have hb : Summable fun n : β => ((n + 1).factorialβ»ΒΉ : π) β’ (a - ββ z) ^ n := by
refine' .of_norm_bounded_eventually _ (Real.summable_pow_div_factorial βa - ββ zβ) _
filter_upwards [Filter.eventually_cofinite_ne 0] with n hn
- rw [norm_smul, mul_comm, norm_inv, IsROrC.norm_natCast, β div_eq_mul_inv]
+ rw [norm_smul, mul_comm, norm_inv, RCLike.norm_natCast, β div_eq_mul_inv]
exact div_le_div (pow_nonneg (norm_nonneg _) n) (norm_pow_le' (a - ββ z) (zero_lt_iff.mpr hn))
(mod_cast Nat.factorial_pos n) (mod_cast Nat.factorial_le (lt_add_one n).le)
have hβ : (β' n : β, ((n + 1).factorialβ»ΒΉ : π) β’ (a - ββ z) ^ (n + 1)) = (a - ββ z) * b := by
Empty lines were removed by executing the following Python script twice
import os
import re
# Loop through each file in the repository
for dir_path, dirs, files in os.walk('.'):
for filename in files:
if filename.endswith('.lean'):
file_path = os.path.join(dir_path, filename)
# Open the file and read its contents
with open(file_path, 'r') as file:
content = file.read()
# Use a regular expression to replace sequences of "variable" lines separated by empty lines
# with sequences without empty lines
modified_content = re.sub(r'(variable.*\n)\n(variable(?! .* in))', r'\1\2', content)
# Write the modified content back to the file
with open(file_path, 'w') as file:
file.write(modified_content)
@@ -264,7 +264,6 @@ open ContinuousMultilinearMap ENNReal FormalMultilinearSeries
open scoped NNReal ENNReal
variable [NontriviallyNormedField π] [NormedRing A] [NormedAlgebra π A]
-
variable (π)
/-- In a Banach algebra `A` over a nontrivially normed field `π`, for any `a : A` the
@@ -562,7 +561,6 @@ namespace WeakDual
namespace CharacterSpace
variable [NontriviallyNormedField π] [NormedRing A] [CompleteSpace A]
-
variable [NormedAlgebra π A]
/-- The equivalence between characters and algebra homomorphisms into the base field. -/
I ran tryAtEachStep on all files under Mathlib
to find all locations where omega
succeeds. For each that was a linarith
without an only
, I tried replacing it with omega
, and I verified that elaboration time got smaller. (In almost all cases, there was a noticeable speedup.) I also replaced some slow aesop
s along the way.
@@ -210,7 +210,7 @@ theorem spectralRadius_le_liminf_pow_nnnorm_pow_one_div (a : A) :
simp only [β add_assoc]
refine' (spectralRadius_le_pow_nnnorm_pow_one_div π a (n + N)).trans _
norm_cast
- exact mul_le_mul_left' (hN (n + N + 1) (by linarith)) _
+ exact mul_le_mul_left' (hN (n + N + 1) (by omega)) _
#align spectrum.spectral_radius_le_liminf_pow_nnnorm_pow_one_div spectrum.spectralRadius_le_liminf_pow_nnnorm_pow_one_div
end SpectrumCompact
@@ -107,8 +107,8 @@ theorem mem_resolventSet_of_norm_lt_mul {a : A} {k : π} (h : βaβ * β(1
letI ku := Units.map ββ.toMonoidHom (Units.mk0 k hk)
rw [β inv_inv β(1 : A)β,
mul_inv_lt_iff (inv_pos.2 <| norm_pos_iff.2 (one_ne_zero : (1 : A) β 0))] at h
- have hku : β-aβ < β(βkuβ»ΒΉ : A)ββ»ΒΉ := by simpa [norm_algebraMap] using h
- simpa [sub_eq_add_neg, Algebra.algebraMap_eq_smul_one] using (ku.add (-a) hku).isUnit
+ have hku : β-aβ < β(βkuβ»ΒΉ : A)ββ»ΒΉ := by simpa [ku, norm_algebraMap] using h
+ simpa [ku, sub_eq_add_neg, Algebra.algebraMap_eq_smul_one] using (ku.add (-a) hku).isUnit
#align spectrum.mem_resolvent_set_of_norm_lt_mul spectrum.mem_resolventSet_of_norm_lt_mul
theorem mem_resolventSet_of_norm_lt [NormOneClass A] {a : A} {k : π} (h : βaβ < βkβ) : k β Ο a :=
@@ -348,7 +348,7 @@ theorem limsup_pow_nnnorm_pow_one_div_le_spectralRadius (a : A) :
ContinuousMultilinearMap.mkPiRing β (Fin n) (a ^ n)
suffices h : (r : ββ₯0β) β€ p.radius by
convert h
- simp only [p.radius_eq_liminf, β norm_toNNReal, norm_mkPiRing]
+ simp only [p, p.radius_eq_liminf, β norm_toNNReal, norm_mkPiRing]
congr
ext n
rw [norm_toNNReal, ENNReal.coe_rpow_def βa ^ nββ (1 / n : β), if_neg]
β
, β
and ββ₯0
. (#10826)
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.
@@ -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
have
, replace
and suffices
(#10640)
No changes to tactic file, it's just boring fixes throughout the library.
This follows on from #6964.
Co-authored-by: sgouezel <sebastien.gouezel@univ-rennes1.fr> Co-authored-by: Eric Wieser <wieser.eric@gmail.com>
@@ -306,12 +306,12 @@ theorem isUnit_one_sub_smul_of_lt_inv_radius {a : A} {z : π} (h : ββzβ
by_cases hz : z = 0
Β· simp only [hz, isUnit_one, sub_zero, zero_smul]
Β· let u := Units.mk0 z hz
- suffices hu : IsUnit (uβ»ΒΉ β’ (1 : A) - a)
- Β· rwa [IsUnit.smul_sub_iff_sub_inv_smul, inv_inv u] at hu
- Β· rw [Units.smul_def, β Algebra.algebraMap_eq_smul_one, β mem_resolventSet_iff]
- refine' mem_resolventSet_of_spectralRadius_lt _
- rwa [Units.val_inv_eq_inv_val, nnnorm_inv,
- coe_inv (nnnorm_ne_zero_iff.mpr (Units.val_mk0 hz βΈ hz : (u : π) β 0)), lt_inv_iff_lt_inv]
+ suffices hu : IsUnit (uβ»ΒΉ β’ (1 : A) - a) by
+ rwa [IsUnit.smul_sub_iff_sub_inv_smul, inv_inv u] at hu
+ rw [Units.smul_def, β Algebra.algebraMap_eq_smul_one, β mem_resolventSet_iff]
+ refine mem_resolventSet_of_spectralRadius_lt ?_
+ rwa [Units.val_inv_eq_inv_val, nnnorm_inv,
+ coe_inv (nnnorm_ne_zero_iff.mpr (Units.val_mk0 hz βΈ hz : (u : π) β 0)), lt_inv_iff_lt_inv]
#align spectrum.is_unit_one_sub_smul_of_lt_inv_radius spectrum.isUnit_one_sub_smul_of_lt_inv_radius
/-- In a Banach algebra `A` over `π`, for `a : A` the function `fun z β¦ (1 - z β’ a)β»ΒΉ` is
@@ -346,16 +346,16 @@ theorem limsup_pow_nnnorm_pow_one_div_le_spectralRadius (a : A) :
simp_rw [inv_limsup, β one_div]
let p : FormalMultilinearSeries β β A := fun n =>
ContinuousMultilinearMap.mkPiRing β (Fin n) (a ^ n)
- suffices h : (r : ββ₯0β) β€ p.radius
- Β· convert h
+ suffices h : (r : ββ₯0β) β€ p.radius by
+ convert h
simp only [p.radius_eq_liminf, β norm_toNNReal, norm_mkPiRing]
congr
ext n
rw [norm_toNNReal, ENNReal.coe_rpow_def βa ^ nββ (1 / n : β), if_neg]
exact fun ha => (lt_self_iff_false _).mp
(ha.2.trans_le (one_div_nonneg.mpr n.cast_nonneg : 0 β€ (1 / n : β)))
- Β· have Hβ := (differentiableOn_inverse_one_sub_smul r_lt).hasFPowerSeriesOnBall r_pos
- exact ((hasFPowerSeriesOnBall_inverse_one_sub_smul β a).exchange_radius Hβ).r_le
+ have Hβ := (differentiableOn_inverse_one_sub_smul r_lt).hasFPowerSeriesOnBall r_pos
+ exact ((hasFPowerSeriesOnBall_inverse_one_sub_smul β a).exchange_radius Hβ).r_le
#align spectrum.limsup_pow_nnnorm_pow_one_div_le_spectral_radius spectrum.limsup_pow_nnnorm_pow_one_div_le_spectralRadius
/-- **Gelfand's formula**: Given an element `a : A` of a complex Banach algebra, the
@@ -139,6 +139,15 @@ protected theorem isCompact [ProperSpace π] (a : A) : IsCompact (Ο a) :=
Metric.isCompact_of_isClosed_isBounded (spectrum.isClosed a) (isBounded a)
#align spectrum.is_compact spectrum.isCompact
+instance instCompactSpace [ProperSpace π] (a : A) : CompactSpace (spectrum π a) :=
+ isCompact_iff_compactSpace.mp <| spectrum.isCompact a
+
+instance instCompactSpaceNNReal {A : Type*} [NormedRing A] [NormedAlgebra β A]
+ (a : A) [CompactSpace (spectrum β a)] : CompactSpace (spectrum ββ₯0 a) := by
+ rw [β isCompact_iff_compactSpace] at *
+ rw [β preimage_algebraMap β]
+ exact closedEmbedding_subtype_val isClosed_nonneg |>.isCompact_preimage <| by assumption
+
theorem spectralRadius_le_nnnorm [NormOneClass A] (a : A) : spectralRadius π a β€ βaββ := by
refine' iSupβ_le fun k hk => _
exact mod_cast norm_le_norm_of_mem hk
ContinuousMultilinearLinearMap.mkPiField
to mkPiRing
(#9910)
This matches the generality of the non-continuous versions.
The norm_smulRight
lemma is the only new result.
@@ -263,11 +263,11 @@ power series with coefficients `a ^ n` represents the function `(1 - z β’ a)β»
radius `βaβββ»ΒΉ`. -/
theorem hasFPowerSeriesOnBall_inverse_one_sub_smul [CompleteSpace A] (a : A) :
HasFPowerSeriesOnBall (fun z : π => Ring.inverse (1 - z β’ a))
- (fun n => ContinuousMultilinearMap.mkPiField π (Fin n) (a ^ n)) 0 βaβββ»ΒΉ :=
+ (fun n => ContinuousMultilinearMap.mkPiRing π (Fin n) (a ^ n)) 0 βaβββ»ΒΉ :=
{ r_le := by
refine'
le_of_forall_nnreal_lt fun r hr => le_radius_of_bound_nnreal _ (max 1 β(1 : A)ββ) fun n => _
- rw [β norm_toNNReal, norm_mkPiField, norm_toNNReal]
+ rw [β norm_toNNReal, norm_mkPiRing, norm_toNNReal]
cases' n with n
Β· simp only [Nat.zero_eq, le_refl, mul_one, or_true_iff, le_max_iff, pow_zero]
Β· refine'
@@ -336,10 +336,10 @@ theorem limsup_pow_nnnorm_pow_one_div_le_spectralRadius (a : A) :
refine' ENNReal.inv_le_inv.mp (le_of_forall_pos_nnreal_lt fun r r_pos r_lt => _)
simp_rw [inv_limsup, β one_div]
let p : FormalMultilinearSeries β β A := fun n =>
- ContinuousMultilinearMap.mkPiField β (Fin n) (a ^ n)
+ ContinuousMultilinearMap.mkPiRing β (Fin n) (a ^ n)
suffices h : (r : ββ₯0β) β€ p.radius
Β· convert h
- simp only [p.radius_eq_liminf, β norm_toNNReal, norm_mkPiField]
+ simp only [p.radius_eq_liminf, β norm_toNNReal, norm_mkPiRing]
congr
ext n
rw [norm_toNNReal, ENNReal.coe_rpow_def βa ^ nββ (1 / n : β), if_neg]
ββ₯0 β ββ₯0β
commute defeqly with nsmul
and pow
(#10225)
by tweaking the definition of the AddMonoid
and MonoidWithZero
instances for WithTop
. Also unprotect ENNReal.coe_injective
and rename ENNReal.coe_eq_coe β ENNReal.coe_inj
.
From LeanAPAP
@@ -178,7 +178,8 @@ theorem spectralRadius_le_pow_nnnorm_pow_one_div (a : A) (n : β) :
have hn : 0 < ((n + 1 : β) : β) := mod_cast Nat.succ_pos'
convert monotone_rpow_of_nonneg (one_div_pos.mpr hn).le nnnorm_pow_le using 1
all_goals dsimp
- erw [coe_pow, β rpow_nat_cast, β rpow_mul, mul_one_div_cancel hn.ne', rpow_one]
+ rw [one_div, pow_rpow_inv_natCast]
+ positivity
rw [Nat.cast_succ, ENNReal.coe_mul_rpow]
#align spectrum.spectral_radius_le_pow_nnnorm_pow_one_div spectrum.spectralRadius_le_pow_nnnorm_pow_one_div
The FunLike hierarchy is very big and gets scanned through each time we need a coercion (via the CoeFun
instance). It looks like unbundled inheritance suits Lean 4 better here. The only class that still extends FunLike
is EquivLike
, since that has a custom coe_injective'
field that is easier to implement. All other classes should take FunLike
or EquivLike
as a parameter.
Previously, morphism classes would be Type
-valued and extend FunLike
:
/-- `MyHomClass F A B` states that `F` is a type of `MyClass.op`-preserving morphisms.
You should extend this class when you extend `MyHom`. -/
class MyHomClass (F : Type*) (A B : outParam <| Type*) [MyClass A] [MyClass B]
extends FunLike F A B :=
(map_op : β (f : F) (x y : A), f (MyClass.op x y) = MyClass.op (f x) (f y))
After this PR, they should be Prop
-valued and take FunLike
as a parameter:
/-- `MyHomClass F A B` states that `F` is a type of `MyClass.op`-preserving morphisms.
You should extend this class when you extend `MyHom`. -/
class MyHomClass (F : Type*) (A B : outParam <| Type*) [MyClass A] [MyClass B]
[FunLike F A B] : Prop :=
(map_op : β (f : F) (x y : A), f (MyClass.op x y) = MyClass.op (f x) (f y))
(Note that A B
stay marked as outParam
even though they are not purely required to be so due to the FunLike
parameter already filling them in. This is required to see through type synonyms, which is important in the category theory library. Also, I think keeping them as outParam
is slightly faster.)
Similarly, MyEquivClass
should take EquivLike
as a parameter.
As a result, every mention of [MyHomClass F A B]
should become [FunLike F A B] [MyHomClass F A B]
.
While overall this gives some great speedups, there are some cases that are noticeably slower. In particular, a failing application of a lemma such as map_mul
is more expensive. This is due to suboptimal processing of arguments. For example:
variable [FunLike F M N] [Mul M] [Mul N] (f : F) (x : M) (y : M)
theorem map_mul [MulHomClass F M N] : f (x * y) = f x * f y
example [AddHomClass F A B] : f (x * y) = f x * f y := map_mul f _ _
Before this PR, applying map_mul f
gives the goals [Mul ?M] [Mul ?N] [MulHomClass F ?M ?N]
. Since M
and N
are out_param
s, [MulHomClass F ?M ?N]
is synthesized first, supplies values for ?M
and ?N
and then the Mul M
and Mul N
instances can be found.
After this PR, the goals become [FunLike F ?M ?N] [Mul ?M] [Mul ?N] [MulHomClass F ?M ?N]
. Now [FunLike F ?M ?N]
is synthesized first, supplies values for ?M
and ?N
and then the Mul M
and Mul N
instances can be found, before trying MulHomClass F M N
which fails. Since the Mul
hierarchy is very big, this can be slow to fail, especially when there is no such Mul
instance.
A long-term but harder to achieve solution would be to specify the order in which instance goals get solved. For example, we'd like to change the arguments to map_mul
to look like [FunLike F M N] [Mul M] [Mul N] [highPriority <| MulHomClass F M N]
because MulHomClass
fails or succeeds much faster than the others.
As a consequence, the simpNF
linter is much slower since by design it tries and fails to apply many map_
lemmas. The same issue occurs a few times in existing calls to simp [map_mul]
, where map_mul
is tried "too soon" and fails. Thanks to the speedup of leanprover/lean4#2478 the impact is very limited, only in files that already were close to the timeout.
simp
not firing sometimesThis affects map_smulββ
and related definitions. For simp
lemmas Lean apparently uses a slightly different mechanism to find instances, so that rw
can find every argument to map_smulββ
successfully but simp
can't: leanprover/lean4#3701.
Especially in the category theory library, we might sometimes have a type A
which is also accessible as a synonym (Bundled A hA).1
. Instance synthesis doesn't always work if we have f : A β* B
but x * y : (Bundled A hA).1
or vice versa. This seems to be mostly fixed by keeping A B
as outParam
s in MulHomClass F A B
. (Presumably because Lean will do a definitional check A =?= (Bundled A hA).1
instead of using the syntax in the discrimination tree.)
The timeouts can be worked around for now by specifying which map_mul
we mean, either as map_mul f
for some explicit f
, or as e.g. MonoidHomClass.map_mul
.
map_smulββ
not firing as simp
lemma can be worked around by going back to the pre-FunLike situation and making LinearMap.map_smulββ
a simp
lemma instead of the generic map_smulββ
. Writing simp [map_smulββ _]
also works.
Co-authored-by: Matthew Ballard <matt@mrb.email> Co-authored-by: Scott Morrison <scott.morrison@gmail.com> Co-authored-by: Scott Morrison <scott@tqft.net> Co-authored-by: Anne Baanen <Vierkantor@users.noreply.github.com>
@@ -499,9 +499,8 @@ variable {F : Type*} [NormedField π] [NormedRing A] [NormedAlgebra π A] [C
local notation "ββ" => algebraMap π A
-/-- An algebra homomorphism into the base field, as a continuous linear map (since it is
-automatically bounded). See note [lower instance priority] -/
-instance (priority := 100) [AlgHomClass F π A π] : ContinuousLinearMapClass F π A π :=
+instance (priority := 100) [FunLike F A π] [AlgHomClass F π A π] :
+ ContinuousLinearMapClass F π A π :=
{ AlgHomClass.linearMapClass with
map_continuous := fun Ο =>
AddMonoidHomClass.continuous_of_bound Ο β(1 : A)β fun a =>
@@ -518,12 +517,13 @@ theorem coe_toContinuousLinearMap (Ο : A ββ[π] π) : βΟ.toContinuou
rfl
#align alg_hom.coe_to_continuous_linear_map AlgHom.coe_toContinuousLinearMap
-theorem norm_apply_le_self_mul_norm_one [AlgHomClass F π A π] (f : F) (a : A) :
+theorem norm_apply_le_self_mul_norm_one [FunLike F A π] [AlgHomClass F π A π] (f : F) (a : A) :
βf aβ β€ βaβ * β(1 : A)β :=
spectrum.norm_le_norm_mul_of_mem (apply_mem_spectrum f _)
#align alg_hom.norm_apply_le_self_mul_norm_one AlgHom.norm_apply_le_self_mul_norm_one
-theorem norm_apply_le_self [NormOneClass A] [AlgHomClass F π A π] (f : F) (a : A) : βf aβ β€ βaβ :=
+theorem norm_apply_le_self [NormOneClass A] [FunLike F A π] [AlgHomClass F π A π]
+ (f : F) (a : A) : βf aβ β€ βaβ :=
spectrum.norm_le_norm_of_mem (apply_mem_spectrum f _)
#align alg_hom.norm_apply_le_self AlgHom.norm_apply_le_self
@@ -538,7 +538,7 @@ local notation "ββ" => algebraMap π A
@[simp]
theorem toContinuousLinearMap_norm [NormOneClass A] (Ο : A ββ[π] π) :
βΟ.toContinuousLinearMapβ = 1 :=
- ContinuousLinearMap.op_norm_eq_of_bounds zero_le_one
+ ContinuousLinearMap.opNorm_eq_of_bounds zero_le_one
(fun a => (one_mul βaβ).symm βΈ spectrum.norm_le_norm_of_mem (apply_mem_spectrum Ο _))
fun _ _ h => by simpa only [coe_toContinuousLinearMap, map_one, norm_one, mul_one] using h 1
#align alg_hom.to_continuous_linear_map_norm AlgHom.toContinuousLinearMap_norm
@@ -285,7 +285,7 @@ theorem hasFPowerSeriesOnBall_inverse_one_sub_smul [CompleteSpace A] (a : A) :
simpa only [β coe_inv h, mem_ball_zero_iff, Metric.emetric_ball_nnreal] using hy
rwa [β coe_nnnorm, β Real.lt_toNNReal_iff_coe_lt, Real.toNNReal_one, nnnorm_smul,
β NNReal.lt_inv_iff_mul_lt h]
- simpa [β smul_pow, (NormedRing.summable_geometric_of_norm_lt_1 _ norm_lt).hasSum_iff] using
+ simpa [β smul_pow, (NormedRing.summable_geometric_of_norm_lt_one _ norm_lt).hasSum_iff] using
(NormedRing.inverse_one_sub _ norm_lt).symm }
#align spectrum.has_fpower_series_on_ball_inverse_one_sub_smul spectrum.hasFPowerSeriesOnBall_inverse_one_sub_smul
@@ -226,9 +226,8 @@ theorem hasDerivAt_resolvent {a : A} {k : π} (hk : k β Ο a) :
#noalign spectrum.norm_resolvent_le_forall
theorem eventually_isUnit_resolvent (a : A) : βαΆ z in cobounded π, IsUnit (resolvent a z) := by
- rw [β comap_norm_atTop, atTop_basis.comap (βΒ·β) |>.eventually_iff]
- refine β¨βaβ * β(1 : A)β + 1, by trivial, fun z hz β¦ ?_β©
- exact isUnit_resolvent.mp <| mem_resolventSet_of_norm_lt_mul <| (lt_add_one (βaβ * _)).trans_le hz
+ rw [atTop_basis_Ioi.cobounded_of_norm.eventually_iff]
+ exact β¨βaβ * β(1 : A)β, trivial, fun _ β¦ isUnit_resolvent.mp β mem_resolventSet_of_norm_lt_mulβ©
theorem resolvent_isBigO_inv (a : A) : resolvent a =O[cobounded π] Inv.inv :=
have h : (fun z β¦ resolvent (zβ»ΒΉ β’ a) (1 : π)) =O[cobounded π] (fun _ β¦ (1 : β)) := by
@@ -240,7 +239,7 @@ theorem resolvent_isBigO_inv (a : A) : resolvent a =O[cobounded π] Inv.inv :=
filter_upwards [isBounded_singleton (x := 0)] with z hz
lift z to πΛ£ using Ne.isUnit hz
simpa [Units.smul_def] using congr(zβ»ΒΉ β’ $(units_smul_resolvent_self (r := z) (a := a)))
- _ =O[cobounded π] (Β· β»ΒΉ) := IsBigO.of_norm_right <| by
+ _ =O[cobounded π] (Β· β»ΒΉ) := .of_norm_right <| by
simpa using (isBigO_refl (Β· β»ΒΉ) (cobounded π)).norm_right.smul h
theorem resolvent_tendsto_cobounded (a : A) : Tendsto (resolvent a) (cobounded π) (π 0) :=
Nsmul
-> NSMul
, Zpow
-> ZPow
, etc (#9067)
Normalising to naming convention rule number 6.
@@ -248,7 +248,7 @@ theorem resolvent_tendsto_cobounded (a : A) : Tendsto (resolvent a) (cobounded
end resolvent
-section OneSubSmul
+section OneSubSMul
open ContinuousMultilinearMap ENNReal FormalMultilinearSeries
@@ -320,7 +320,7 @@ theorem differentiableOn_inverse_one_sub_smul [CompleteSpace A] {a : A} {r : β
exact DifferentiableAt.comp z (differentiableAt_inverse hu) Hβ.differentiableAt
#align spectrum.differentiable_on_inverse_one_sub_smul spectrum.differentiableOn_inverse_one_sub_smul
-end OneSubSmul
+end OneSubSMul
section GelfandFormula
@@ -380,7 +380,7 @@ variable [NormedRing A] [NormedAlgebra β A] [CompleteSpace A] [Nontrivial A] (
protected theorem nonempty : (spectrum β a).Nonempty := by
/- Suppose `Ο a = β
`, then resolvent set is `β`, any `(z β’ 1 - a)` is a unit, and `resolvent a`
is differentiable on `β`. -/
- by_contra' h
+ by_contra! h
have Hβ : resolventSet β a = Set.univ := by rwa [spectrum, Set.compl_empty_iff] at h
have Hβ : Differentiable β fun z : β => resolvent a z := fun z =>
(hasDerivAt_resolvent (Hβ.symm βΈ Set.mem_univ z : z β resolventSet β a)).differentiableAt
@@ -226,7 +226,7 @@ theorem hasDerivAt_resolvent {a : A} {k : π} (hk : k β Ο a) :
#noalign spectrum.norm_resolvent_le_forall
theorem eventually_isUnit_resolvent (a : A) : βαΆ z in cobounded π, IsUnit (resolvent a z) := by
- rw [βcomap_norm_atTop, atTop_basis.comap (βΒ·β) |>.eventually_iff]
+ rw [β comap_norm_atTop, atTop_basis.comap (βΒ·β) |>.eventually_iff]
refine β¨βaβ * β(1 : A)β + 1, by trivial, fun z hz β¦ ?_β©
exact isUnit_resolvent.mp <| mem_resolventSet_of_norm_lt_mul <| (lt_add_one (βaβ * _)).trans_le hz
I've also got a change to make this required, but I'd like to land this first.
@@ -185,7 +185,7 @@ theorem spectralRadius_le_pow_nnnorm_pow_one_div (a : A) (n : β) :
theorem spectralRadius_le_liminf_pow_nnnorm_pow_one_div (a : A) :
spectralRadius π a β€ atTop.liminf fun n : β => (βa ^ nββ : ββ₯0β) ^ (1 / n : β) := by
refine' ENNReal.le_of_forall_lt_one_mul_le fun Ξ΅ hΞ΅ => _
- by_cases Ξ΅ = 0
+ by_cases h : Ξ΅ = 0
Β· simp only [h, zero_mul, zero_le']
have hΞ΅' : Ξ΅β»ΒΉ β β := fun h' =>
h (by simpa only [inv_inv, inv_top] using congr_arg (fun x : ββ₯0β => xβ»ΒΉ) h')
@@ -273,7 +273,7 @@ theorem hasFPowerSeriesOnBall_inverse_one_sub_smul [CompleteSpace A] (a : A) :
Β· refine'
le_trans (le_trans (mul_le_mul_right' (nnnorm_pow_le' a n.succ_pos) (r ^ n.succ)) _)
(le_max_left _ _)
- Β· by_cases βaββ = 0
+ Β· by_cases h : βaββ = 0
Β· simp only [h, zero_mul, zero_le', pow_succ]
Β· rw [β coe_inv h, coe_lt_coe, NNReal.lt_inv_iff_mul_lt h] at hr
simpa only [β mul_pow, mul_comm] using pow_le_one' hr.le n.succ
exact_mod_cast
tactic with mod_cast
elaborator where possible (#8404)
We still have the exact_mod_cast
tactic, used in a few places, which somehow (?) works a little bit harder to prevent the expected type influencing the elaboration of the term. I would like to get to the bottom of this, and it will be easier once the only usages of exact_mod_cast
are the ones that don't work using the term elaborator by itself.
Co-authored-by: Scott Morrison <scott.morrison@gmail.com>
@@ -141,13 +141,13 @@ protected theorem isCompact [ProperSpace π] (a : A) : IsCompact (Ο a) :=
theorem spectralRadius_le_nnnorm [NormOneClass A] (a : A) : spectralRadius π a β€ βaββ := by
refine' iSupβ_le fun k hk => _
- exact_mod_cast norm_le_norm_of_mem hk
+ exact mod_cast norm_le_norm_of_mem hk
#align spectrum.spectral_radius_le_nnnorm spectrum.spectralRadius_le_nnnorm
theorem exists_nnnorm_eq_spectralRadius_of_nonempty [ProperSpace π] {a : A} (ha : (Ο a).Nonempty) :
β k β Ο a, (βkββ : ββ₯0β) = spectralRadius π a := by
obtain β¨k, hk, hβ© := (spectrum.isCompact a).exists_forall_ge ha continuous_nnnorm.continuousOn
- exact β¨k, hk, le_antisymm (le_iSupβ (Ξ± := ββ₯0β) k hk) (iSupβ_le <| by exact_mod_cast h)β©
+ exact β¨k, hk, le_antisymm (le_iSupβ (Ξ± := ββ₯0β) k hk) (iSupβ_le <| mod_cast h)β©
#align spectrum.exists_nnnorm_eq_spectral_radius_of_nonempty spectrum.exists_nnnorm_eq_spectralRadius_of_nonempty
theorem spectralRadius_lt_of_forall_lt_of_nonempty [ProperSpace π] {a : A} (ha : (Ο a).Nonempty)
@@ -155,7 +155,7 @@ theorem spectralRadius_lt_of_forall_lt_of_nonempty [ProperSpace π] {a : A} (h
sSup_image.symm.trans_lt <|
((spectrum.isCompact a).sSup_lt_iff_of_continuous ha
(ENNReal.continuous_coe.comp continuous_nnnorm).continuousOn (r : ββ₯0β)).mpr
- (by dsimp only [(Β· β Β·)]; exact_mod_cast hr)
+ (by dsimp only [(Β· β Β·)]; exact mod_cast hr)
#align spectrum.spectral_radius_lt_of_forall_lt_of_nonempty spectrum.spectralRadius_lt_of_forall_lt_of_nonempty
open ENNReal Polynomial
@@ -175,7 +175,7 @@ theorem spectralRadius_le_pow_nnnorm_pow_one_div (a : A) (n : β) :
simpa only [Real.toNNReal_mul (norm_nonneg _), norm_toNNReal, nnnorm_pow k (n + 1),
ENNReal.coe_mul] using coe_mono (Real.toNNReal_mono (norm_le_norm_mul_of_mem pow_mem))
-- take (n + 1)α΅Κ° roots and clean up the left-hand side
- have hn : 0 < ((n + 1 : β) : β) := by exact_mod_cast Nat.succ_pos'
+ have hn : 0 < ((n + 1 : β) : β) := mod_cast Nat.succ_pos'
convert monotone_rpow_of_nonneg (one_div_pos.mpr hn).le nnnorm_pow_le using 1
all_goals dsimp
erw [coe_pow, β rpow_nat_cast, β rpow_mul, mul_one_div_cancel hn.ne', rpow_one]
@@ -367,7 +367,7 @@ theorem pow_norm_pow_one_div_tendsto_nhds_spectralRadius (a : A) :
convert pow_nnnorm_pow_one_div_tendsto_nhds_spectralRadius a using 1
ext1
rw [β ofReal_rpow_of_nonneg (norm_nonneg _) _, β coe_nnnorm, coe_nnreal_eq]
- exact one_div_nonneg.mpr (by exact_mod_cast zero_le _)
+ exact one_div_nonneg.mpr (mod_cast zero_le _)
#align spectrum.pow_norm_pow_one_div_tendsto_nhds_spectral_radius spectrum.pow_norm_pow_one_div_tendsto_nhds_spectralRadius
end GelfandFormula
@@ -472,7 +472,7 @@ theorem exp_mem_exp [IsROrC π] [NormedRing A] [NormedAlgebra π A] [Complet
filter_upwards [Filter.eventually_cofinite_ne 0] with n hn
rw [norm_smul, mul_comm, norm_inv, IsROrC.norm_natCast, β div_eq_mul_inv]
exact div_le_div (pow_nonneg (norm_nonneg _) n) (norm_pow_le' (a - ββ z) (zero_lt_iff.mpr hn))
- (by exact_mod_cast Nat.factorial_pos n) (by exact_mod_cast Nat.factorial_le (lt_add_one n).le)
+ (mod_cast Nat.factorial_pos n) (mod_cast Nat.factorial_le (lt_add_one n).le)
have hβ : (β' n : β, ((n + 1).factorialβ»ΒΉ : π) β’ (a - ββ z) ^ (n + 1)) = (a - ββ z) * b := by
simpa only [mul_smul_comm, pow_succ] using hb.tsum_mul_left (a - ββ z)
have hβ : (β' n : β, ((n + 1).factorialβ»ΒΉ : π) β’ (a - ββ z) ^ (n + 1)) = b * (a - ββ z) := by
@@ -414,11 +414,10 @@ theorem map_polynomial_aeval (p : β[X]) :
map_polynomial_aeval_of_nonempty a p (spectrum.nonempty a)
#align spectrum.map_polynomial_aeval spectrum.map_polynomial_aeval
--- Porting note: Replaced `x ^ n` with `HPow.hPow x n`
/-- A specialization of the spectral mapping theorem for polynomials in a Banach algebra over `β`
to monic monomials. -/
protected theorem map_pow (n : β) :
- spectrum β (a ^ n) = (fun x : β => HPow.hPow x n) '' spectrum β a := by
+ spectrum β (a ^ n) = (Β· ^ n) '' spectrum β a := by
simpa only [aeval_X_pow, eval_pow, eval_X] using map_polynomial_aeval a (X ^ n)
#align spectrum.map_pow spectrum.map_pow
@@ -47,6 +47,8 @@ This file contains the basic theory for the resolvent and spectrum of a Banach a
open scoped ENNReal NNReal
+open NormedSpace -- For `exp`.
+
/-- The *spectral radius* is the supremum of the `nnnorm` (`βΒ·ββ`) of elements in the spectrum,
coerced into an element of `ββ₯0β`. Note that it is possible for `spectrum π a = β
`. In this
case, `spectralRadius a = 0`. It is also possible that `spectrum π a` be unbounded (though
This is the supremum of
along with some minor fixes from failures on nightly-testing as Mathlib master
is merged into it.
Note that some PRs for changes that are already compatible with the current toolchain and will be necessary have already been split out: #8380.
I am hopeful that in future we will be able to progressively merge adaptation PRs into a bump/v4.X.0
branch, so we never end up with a "big merge" like this. However one of these adaptation PRs (#8056) predates my new scheme for combined CI, and it wasn't possible to keep that PR viable in the meantime.
In particular this includes adjustments for the Lean PRs
We can get rid of all the
local macro_rules | `($x ^ $y) => `(HPow.hPow $x $y) -- Porting note: See issue [lean4#2220](https://github.com/leanprover/lean4/pull/2220)
macros across Mathlib (and in any projects that want to write natural number powers of reals).
Changes the default behaviour of simp
to (config := {decide := false})
. This makes simp
(and consequentially norm_num
) less powerful, but also more consistent, and less likely to blow up in long failures. This requires a variety of changes: changing some previously by simp
or norm_num
to decide
or rfl
, or adding (config := {decide := true})
.
This changed the behaviour of simp
so that simp [f]
will only unfold "fully applied" occurrences of f
. The old behaviour can be recovered with simp (config := { unfoldPartialApp := true })
. We may in future add a syntax for this, e.g. simp [!f]
; please provide feedback! In the meantime, we have made the following changes:
(config := { unfoldPartialApp := true })
in some places, to recover the old behaviour@[eqns]
to manually adjust the equation lemmas for a particular definition, recovering the old behaviour just for that definition. See #8371, where we do this for Function.comp
and Function.flip
.This change in Lean may require further changes down the line (e.g. adding the !f
syntax, and/or upstreaming the special treatment for Function.comp
and Function.flip
, and/or removing this special treatment). Please keep an open and skeptical mind about these changes!
Co-authored-by: leanprover-community-mathlib4-bot <leanprover-community-mathlib4-bot@users.noreply.github.com> Co-authored-by: Scott Morrison <scott.morrison@gmail.com> Co-authored-by: Eric Wieser <wieser.eric@gmail.com> Co-authored-by: Mauricio Collares <mauricio@collares.org>
@@ -230,8 +230,9 @@ theorem eventually_isUnit_resolvent (a : A) : βαΆ z in cobounded π, IsUnit
theorem resolvent_isBigO_inv (a : A) : resolvent a =O[cobounded π] Inv.inv :=
have h : (fun z β¦ resolvent (zβ»ΒΉ β’ a) (1 : π)) =O[cobounded π] (fun _ β¦ (1 : β)) := by
- simpa [Function.comp, resolvent] using (NormedRing.inverse_one_sub_norm (R := A)).comp_tendsto
- (by simpa using (tendsto_invβ_cobounded (Ξ± := π)).smul_const a)
+ simpa [Function.comp_def, resolvent] using
+ (NormedRing.inverse_one_sub_norm (R := A)).comp_tendsto
+ (by simpa using (tendsto_invβ_cobounded (Ξ± := π)).smul_const a)
calc
resolvent a =αΆ [cobounded π] fun z β¦ zβ»ΒΉ β’ resolvent (zβ»ΒΉ β’ a) (1 : π) := by
filter_upwards [isBounded_singleton (x := 0)] with z hz
spectrum.nonempty
using the cobounded filter (#8246)
This uses the API developed in these recent PRs (for the cobounded filter and some corollaries to Liouville's theorem) to greatly simplify the proof of spectrum.nonempty
. Previously, this depended on the technical lemma spectrum.norm_resolvent_le_forall
, and now we instead prove the greatly simplified spectrum.resolvent_isBigO_inv
and spectrum.resolvent_tendsto_cobounded
.
@@ -205,7 +205,7 @@ end SpectrumCompact
section resolvent
-open Filter Asymptotics
+open Filter Asymptotics Bornology Topology
variable [NontriviallyNormedField π] [NormedRing A] [NormedAlgebra π A] [CompleteSpace A]
@@ -220,41 +220,28 @@ theorem hasDerivAt_resolvent {a : A} {k : π} (hk : k β Ο a) :
simpa [resolvent, sq, hk.unit_spec, β Ring.inverse_unit hk.unit] using Hβ.comp_hasDerivAt k Hβ
#align spectrum.has_deriv_at_resolvent spectrum.hasDerivAt_resolvent
-/- TODO: Once there is sufficient API for bornology, we should get a nice filter / asymptotics
-version of this, for example: `Tendsto (resolvent a) (cobounded π) (π 0)` or more specifically
-`(resolvent a) =O[cobounded π] (fun z β¦ zβ»ΒΉ)`. -/
-theorem norm_resolvent_le_forall (a : A) :
- β Ξ΅ > 0, β R > 0, β z : π, R β€ βzβ β βresolvent a zβ β€ Ξ΅ := by
- obtain β¨c, c_pos, hcβ© := (@NormedRing.inverse_one_sub_norm A _ _).exists_pos
- rw [isBigOWith_iff, eventually_iff, Metric.mem_nhds_iff] at hc
- rcases hc with β¨Ξ΄, Ξ΄_pos, hΞ΄β©
- simp only [CstarRing.norm_one, mul_one] at hΞ΄
- intro Ξ΅ hΞ΅
- have haβ : 0 < βaβ + 1 := lt_of_le_of_lt (norm_nonneg a) (lt_add_one _)
- have min_pos : 0 < min (Ξ΄ * (βaβ + 1)β»ΒΉ) (Ξ΅ * cβ»ΒΉ) :=
- lt_min (mul_pos Ξ΄_pos (inv_pos.mpr haβ)) (mul_pos hΞ΅ (inv_pos.mpr c_pos))
- refine' β¨(min (Ξ΄ * (βaβ + 1)β»ΒΉ) (Ξ΅ * cβ»ΒΉ))β»ΒΉ, inv_pos.mpr min_pos, fun z hz => _β©
- have hnz : z β 0 := norm_pos_iff.mp (lt_of_lt_of_le (inv_pos.mpr min_pos) hz)
- replace hz := inv_le_of_inv_le min_pos hz
- rcases (β¨Units.mk0 z hnz, Units.val_mk0 hnzβ© : IsUnit z) with β¨z, rflβ©
- have lt_Ξ΄ : βzβ»ΒΉ β’ aβ < Ξ΄ := by
- rw [Units.smul_def, norm_smul, Units.val_inv_eq_inv_val, norm_inv]
- calc
- β(z : π)ββ»ΒΉ * βaβ β€ Ξ΄ * (βaβ + 1)β»ΒΉ * βaβ :=
- mul_le_mul_of_nonneg_right (hz.trans (min_le_left _ _)) (norm_nonneg _)
- _ < Ξ΄ := by
- conv => rw [mul_assoc]; rhs; rw [(mul_one Ξ΄).symm]
- exact mul_lt_mul_of_pos_left
- ((inv_mul_lt_iff haβ).mpr ((mul_one (βaβ + 1)).symm βΈ lt_add_one _)) Ξ΄_pos
- rw [β inv_smul_smul z (resolvent a (z : π)), units_smul_resolvent_self, resolvent,
- Algebra.algebraMap_eq_smul_one, one_smul, Units.smul_def, norm_smul, Units.val_inv_eq_inv_val,
- norm_inv]
+-- refactored so this result was no longer necessary or useful
+#noalign spectrum.norm_resolvent_le_forall
+
+theorem eventually_isUnit_resolvent (a : A) : βαΆ z in cobounded π, IsUnit (resolvent a z) := by
+ rw [βcomap_norm_atTop, atTop_basis.comap (βΒ·β) |>.eventually_iff]
+ refine β¨βaβ * β(1 : A)β + 1, by trivial, fun z hz β¦ ?_β©
+ exact isUnit_resolvent.mp <| mem_resolventSet_of_norm_lt_mul <| (lt_add_one (βaβ * _)).trans_le hz
+
+theorem resolvent_isBigO_inv (a : A) : resolvent a =O[cobounded π] Inv.inv :=
+ have h : (fun z β¦ resolvent (zβ»ΒΉ β’ a) (1 : π)) =O[cobounded π] (fun _ β¦ (1 : β)) := by
+ simpa [Function.comp, resolvent] using (NormedRing.inverse_one_sub_norm (R := A)).comp_tendsto
+ (by simpa using (tendsto_invβ_cobounded (Ξ± := π)).smul_const a)
calc
- _ β€ Ξ΅ * cβ»ΒΉ * c :=
- mul_le_mul (hz.trans (min_le_right _ _)) (hΞ΄ (mem_ball_zero_iff.mpr lt_Ξ΄)) (norm_nonneg _)
- (mul_pos hΞ΅ (inv_pos.mpr c_pos)).le
- _ = _ := inv_mul_cancel_rightβ c_pos.ne.symm Ξ΅
-#align spectrum.norm_resolvent_le_forall spectrum.norm_resolvent_le_forall
+ resolvent a =αΆ [cobounded π] fun z β¦ zβ»ΒΉ β’ resolvent (zβ»ΒΉ β’ a) (1 : π) := by
+ filter_upwards [isBounded_singleton (x := 0)] with z hz
+ lift z to πΛ£ using Ne.isUnit hz
+ simpa [Units.smul_def] using congr(zβ»ΒΉ β’ $(units_smul_resolvent_self (r := z) (a := a)))
+ _ =O[cobounded π] (Β· β»ΒΉ) := IsBigO.of_norm_right <| by
+ simpa using (isBigO_refl (Β· β»ΒΉ) (cobounded π)).norm_right.smul h
+
+theorem resolvent_tendsto_cobounded (a : A) : Tendsto (resolvent a) (cobounded π) (π 0) :=
+ resolvent_isBigO_inv a |>.trans_tendsto tendsto_invβ_cobounded
end resolvent
@@ -388,36 +375,17 @@ variable [NormedRing A] [NormedAlgebra β A] [CompleteSpace A] [Nontrivial A] (
/-- In a (nontrivial) complex Banach algebra, every element has nonempty spectrum. -/
protected theorem nonempty : (spectrum β a).Nonempty := by
- /- Suppose `Ο a = β
`, then resolvent set is `β`, any `(z β’ 1 - a)` is a unit, and `resolvent`
+ /- Suppose `Ο a = β
`, then resolvent set is `β`, any `(z β’ 1 - a)` is a unit, and `resolvent a`
is differentiable on `β`. -/
- rw [Set.nonempty_iff_ne_empty]
- by_contra h
+ by_contra' h
have Hβ : resolventSet β a = Set.univ := by rwa [spectrum, Set.compl_empty_iff] at h
have Hβ : Differentiable β fun z : β => resolvent a z := fun z =>
(hasDerivAt_resolvent (Hβ.symm βΈ Set.mem_univ z : z β resolventSet β a)).differentiableAt
- /- The norm of the resolvent is small for all sufficiently large `z`, and by compactness and
- continuity it is bounded on the complement of a large ball, thus uniformly bounded on `β`.
- By Liouville's theorem `fun z β¦ resolvent a z` is constant. -/
- have Hβ := norm_resolvent_le_forall (π := β) a
- have Hβ : β z : β, resolvent a z = resolvent a (0 : β) := by
- refine' fun z => Hβ.apply_eq_apply_of_bounded (isBounded_iff_forall_norm_le.mpr _) z 0
- rcases Hβ 1 zero_lt_one with β¨R, _, hRβ©
- rcases (ProperSpace.isCompact_closedBall (0 : β) R).exists_bound_of_continuousOn
- Hβ.continuous.continuousOn with
- β¨C, hCβ©
- use max C 1
- rintro _ β¨w, rflβ©
- refine' Or.elim (em (βwβ β€ R)) (fun hw => _) fun hw => _
- Β· exact (hC w (mem_closedBall_zero_iff.mpr hw)).trans (le_max_left _ _)
- Β· exact (hR w (not_le.mp hw).le).trans (le_max_right _ _)
- -- `resolvent a 0 = 0`, which is a contradiction because it isn't a unit.
- have Hβ
: resolvent a (0 : β) = 0 := by
- refine' norm_eq_zero.mp (le_antisymm (le_of_forall_pos_le_add fun Ξ΅ hΞ΅ => _) (norm_nonneg _))
- rcases Hβ Ξ΅ hΞ΅ with β¨R, _, hRβ©
- simpa only [Hβ R] using (zero_add Ξ΅).symm.subst (hR R (by simp [le_abs_self]))
- -- `not_isUnit_zero` is where we need `Nontrivial A`, it is unavoidable.
- exact not_isUnit_zero
- (Hβ
.subst (isUnit_resolvent.mp (mem_resolventSet_iff.mp (Hβ.symm βΈ Set.mem_univ 0))))
+ /- Since `resolvent a` tends to zero at infinity, by Liouville's theorem `resolvent a = 0`,
+ which contradicts that `resolvent a z` is invertible. -/
+ have Hβ := Hβ.apply_eq_of_tendsto_cocompact 0 <| by
+ simpa [Metric.cobounded_eq_cocompact] using resolvent_tendsto_cobounded a (π := β)
+ exact not_isUnit_zero <| Hβ βΈ (isUnit_resolvent.mp <| Hβ.symm βΈ Set.mem_univ 0)
#align spectrum.nonempty spectrum.nonempty
/-- In a complex Banach algebra, the spectral radius is always attained by some element of the
summable_of_norm_bounded
-> Summable.of_norm_bounded
;summable_of_norm_bounded_eventually
-> Summable.of_norm_bounded_eventually
;summable_of_nnnorm_bounded
-> Summable.of_nnnorm_bounded
;summable_of_summable_norm
-> Summable.of_norm
;summable_of_summable_nnnorm
-> Summable.of_nnnorm
;Summable.of_norm_bounded_eventually_nat
Summable.norm
@@ -498,7 +498,7 @@ theorem exp_mem_exp [IsROrC π] [NormedRing A] [NormedAlgebra π A] [Complet
sub_add_cancel]
let b := β' n : β, ((n + 1).factorialβ»ΒΉ : π) β’ (a - ββ z) ^ n
have hb : Summable fun n : β => ((n + 1).factorialβ»ΒΉ : π) β’ (a - ββ z) ^ n := by
- refine' summable_of_norm_bounded_eventually _ (Real.summable_pow_div_factorial βa - ββ zβ) _
+ refine' .of_norm_bounded_eventually _ (Real.summable_pow_div_factorial βa - ββ zβ) _
filter_upwards [Filter.eventually_cofinite_ne 0] with n hn
rw [norm_smul, mul_comm, norm_inv, IsROrC.norm_natCast, β div_eq_mul_inv]
exact div_le_div (pow_nonneg (norm_nonneg _) n) (norm_pow_le' (a - ββ z) (zero_lt_iff.mpr hn))
Metric.Bounded
(#7240)
Use Bornology.IsBounded
instead.
@@ -129,12 +129,12 @@ theorem subset_closedBall_norm [NormOneClass A] (a : A) : Ο a β Metric.closed
fun k hk => by simp [norm_le_norm_of_mem hk]
#align spectrum.subset_closed_ball_norm spectrum.subset_closedBall_norm
-theorem is_bounded (a : A) : Metric.Bounded (Ο a) :=
- (Metric.bounded_iff_subset_ball 0).mpr β¨βaβ * β(1 : A)β, subset_closedBall_norm_mul aβ©
-#align spectrum.is_bounded spectrum.is_bounded
+theorem isBounded (a : A) : Bornology.IsBounded (Ο a) :=
+ Metric.isBounded_closedBall.subset (subset_closedBall_norm_mul a)
+#align spectrum.is_bounded spectrum.isBounded
protected theorem isCompact [ProperSpace π] (a : A) : IsCompact (Ο a) :=
- Metric.isCompact_of_isClosed_bounded (spectrum.isClosed a) (is_bounded a)
+ Metric.isCompact_of_isClosed_isBounded (spectrum.isClosed a) (isBounded a)
#align spectrum.is_compact spectrum.isCompact
theorem spectralRadius_le_nnnorm [NormOneClass A] (a : A) : spectralRadius π a β€ βaββ := by
@@ -400,7 +400,7 @@ protected theorem nonempty : (spectrum β a).Nonempty := by
By Liouville's theorem `fun z β¦ resolvent a z` is constant. -/
have Hβ := norm_resolvent_le_forall (π := β) a
have Hβ : β z : β, resolvent a z = resolvent a (0 : β) := by
- refine' fun z => Hβ.apply_eq_apply_of_bounded (bounded_iff_forall_norm_le.mpr _) z 0
+ refine' fun z => Hβ.apply_eq_apply_of_bounded (isBounded_iff_forall_norm_le.mpr _) z 0
rcases Hβ 1 zero_lt_one with β¨R, _, hRβ©
rcases (ProperSpace.isCompact_closedBall (0 : β) R).exists_bound_of_continuousOn
Hβ.continuous.continuousOn with
MulZeroClass.
in mul_zero
/zero_mul
(#6682)
Search&replace MulZeroClass.mul_zero
-> mul_zero
, MulZeroClass.zero_mul
-> zero_mul
.
These were introduced by Mathport, as the full name of mul_zero
is actually MulZeroClass.mul_zero
(it's exported with the short name).
@@ -184,7 +184,7 @@ theorem spectralRadius_le_liminf_pow_nnnorm_pow_one_div (a : A) :
spectralRadius π a β€ atTop.liminf fun n : β => (βa ^ nββ : ββ₯0β) ^ (1 / n : β) := by
refine' ENNReal.le_of_forall_lt_one_mul_le fun Ξ΅ hΞ΅ => _
by_cases Ξ΅ = 0
- Β· simp only [h, MulZeroClass.zero_mul, zero_le']
+ Β· simp only [h, zero_mul, zero_le']
have hΞ΅' : Ξ΅β»ΒΉ β β := fun h' =>
h (by simpa only [inv_inv, inv_top] using congr_arg (fun x : ββ₯0β => xβ»ΒΉ) h')
simp only [ENNReal.mul_le_iff_le_inv h (hΞ΅.trans_le le_top).ne, mul_comm Ξ΅β»ΒΉ,
@@ -284,7 +284,7 @@ theorem hasFPowerSeriesOnBall_inverse_one_sub_smul [CompleteSpace A] (a : A) :
le_trans (le_trans (mul_le_mul_right' (nnnorm_pow_le' a n.succ_pos) (r ^ n.succ)) _)
(le_max_left _ _)
Β· by_cases βaββ = 0
- Β· simp only [h, MulZeroClass.zero_mul, zero_le', pow_succ]
+ Β· simp only [h, zero_mul, zero_le', pow_succ]
Β· rw [β coe_inv h, coe_lt_coe, NNReal.lt_inv_iff_mul_lt h] at hr
simpa only [β mul_pow, mul_comm] using pow_le_one' hr.le n.succ
r_pos := ENNReal.inv_pos.mpr coe_ne_top
β¬ BLACK VERY SMALL SQUARE
with Β· MIDDLE DOT
(#6522)
MIDDLE DOT
is now valid Lean syntax for function arguments, which is what these docstrings are referring to.
@@ -47,7 +47,7 @@ This file contains the basic theory for the resolvent and spectrum of a Banach a
open scoped ENNReal NNReal
-/-- The *spectral radius* is the supremum of the `nnnorm` (`ββ¬ββ`) of elements in the spectrum,
+/-- The *spectral radius* is the supremum of the `nnnorm` (`βΒ·ββ`) of elements in the spectrum,
coerced into an element of `ββ₯0β`. Note that it is possible for `spectrum π a = β
`. In this
case, `spectralRadius a = 0`. It is also possible that `spectrum π a` be unbounded (though
not for Banach algebras, see `spectrum.is_bounded`, below). In this case,
Type _
and Sort _
(#6499)
We remove all possible occurences of Type _
and Sort _
in favor of Type*
and Sort*
.
This has nice performance benefits.
@@ -52,12 +52,12 @@ open scoped ENNReal NNReal
case, `spectralRadius a = 0`. It is also possible that `spectrum π a` be unbounded (though
not for Banach algebras, see `spectrum.is_bounded`, below). In this case,
`spectralRadius a = β`. -/
-noncomputable def spectralRadius (π : Type _) {A : Type _} [NormedField π] [Ring A] [Algebra π A]
+noncomputable def spectralRadius (π : Type*) {A : Type*} [NormedField π] [Ring A] [Algebra π A]
(a : A) : ββ₯0β :=
β¨ k β spectrum π a, βkββ
#align spectral_radius spectralRadius
-variable {π : Type _} {A : Type _}
+variable {π : Type*} {A : Type*}
namespace spectrum
@@ -526,7 +526,7 @@ namespace AlgHom
section NormedField
-variable {F : Type _} [NormedField π] [NormedRing A] [NormedAlgebra π A] [CompleteSpace A]
+variable {F : Type*} [NormedField π] [NormedRing A] [NormedAlgebra π A] [CompleteSpace A]
local notation "ββ" => algebraMap π A
@@ -2,11 +2,6 @@
Copyright (c) 2021 Jireh Loreaux. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Authors: Jireh Loreaux
-
-! This file was ported from Lean 3 source module analysis.normed_space.spectrum
-! leanprover-community/mathlib commit d608fc5d4e69d4cc21885913fb573a88b0deb521
-! Please do not edit these lines, except to modify the commit id
-! if you have ported upstream changes.
-/
import Mathlib.FieldTheory.IsAlgClosed.Spectrum
import Mathlib.Analysis.Complex.Liouville
@@ -15,6 +10,8 @@ import Mathlib.Analysis.Analytic.RadiusLiminf
import Mathlib.Topology.Algebra.Module.CharacterSpace
import Mathlib.Analysis.NormedSpace.Exponential
+#align_import analysis.normed_space.spectrum from "leanprover-community/mathlib"@"d608fc5d4e69d4cc21885913fb573a88b0deb521"
+
/-!
# The spectrum of elements in a complete normed algebra
@@ -4,7 +4,7 @@ Released under Apache 2.0 license as described in the file LICENSE.
Authors: Jireh Loreaux
! This file was ported from Lean 3 source module analysis.normed_space.spectrum
-! leanprover-community/mathlib commit 58a272265b5e05f258161260dd2c5d247213cbd3
+! leanprover-community/mathlib commit d608fc5d4e69d4cc21885913fb573a88b0deb521
! Please do not edit these lines, except to modify the commit id
! if you have ported upstream changes.
-/
@@ -330,7 +330,7 @@ theorem differentiableOn_inverse_one_sub_smul [CompleteSpace A] {a : A} {r : β
simpa only [norm_toNNReal, Real.toNNReal_coe] using
Real.toNNReal_mono (mem_closedBall_zero_iff.mp z_mem)
have Hβ : Differentiable π fun w : π => 1 - w β’ a := (differentiable_id.smul_const a).const_sub 1
- exact DifferentiableAt.comp z (differentiableAt_inverse hu.unit) Hβ.differentiableAt
+ exact DifferentiableAt.comp z (differentiableAt_inverse hu) Hβ.differentiableAt
#align spectrum.differentiable_on_inverse_one_sub_smul spectrum.differentiableOn_inverse_one_sub_smul
end OneSubSmul
@@ -398,7 +398,7 @@ protected theorem nonempty : (spectrum β a).Nonempty := by
have Hβ : resolventSet β a = Set.univ := by rwa [spectrum, Set.compl_empty_iff] at h
have Hβ : Differentiable β fun z : β => resolvent a z := fun z =>
(hasDerivAt_resolvent (Hβ.symm βΈ Set.mem_univ z : z β resolventSet β a)).differentiableAt
- /- The norm of the resolvent is small for all sufficently large `z`, and by compactness and
+ /- The norm of the resolvent is small for all sufficiently large `z`, and by compactness and
continuity it is bounded on the complement of a large ball, thus uniformly bounded on `β`.
By Liouville's theorem `fun z β¦ resolvent a z` is constant. -/
have Hβ := norm_resolvent_le_forall (π := β) a
@@ -413,7 +413,7 @@ protected theorem nonempty : (spectrum β a).Nonempty := by
refine' Or.elim (em (βwβ β€ R)) (fun hw => _) fun hw => _
Β· exact (hC w (mem_closedBall_zero_iff.mpr hw)).trans (le_max_left _ _)
Β· exact (hR w (not_le.mp hw).le).trans (le_max_right _ _)
- -- `resolvent a 0 = 0`, which is a contradition because it isn't a unit.
+ -- `resolvent a 0 = 0`, which is a contradiction because it isn't a unit.
have Hβ
: resolvent a (0 : β) = 0 := by
refine' norm_eq_zero.mp (le_antisymm (le_of_forall_pos_le_add fun Ξ΅ hΞ΅ => _) (norm_nonneg _))
rcases Hβ Ξ΅ hΞ΅ with β¨R, _, hRβ©
The unported dependencies are
algebra.order.module
init.core
linear_algebra.free_module.finite.rank
algebra.order.monoid.cancel.defs
algebra.abs
algebra.group_power.lemmas
init.data.list.basic
linear_algebra.free_module.rank
algebra.order.monoid.cancel.basic
init.data.list.default
topology.subset_properties
init.logic
The following 1 dependencies have changed in mathlib3 since they were ported, which may complicate porting this file