Module docstring
{"# Continuity of the norm on (semi)groups
Tags
normed group "}
{"# Continuity of the norm on (semi)groups
normed group "}
tendsto_iff_norm_div_tendsto_zero
theorem
{f : Ξ± β E} {a : Filter Ξ±} {b : E} : Tendsto f a (π b) β Tendsto (fun e => βf e / bβ) a (π 0)
@[to_additive]
theorem tendsto_iff_norm_div_tendsto_zero {f : Ξ± β E} {a : Filter Ξ±} {b : E} :
TendstoTendsto f a (π b) β Tendsto (fun e => βf e / bβ) a (π 0) := by
simp only [β dist_eq_norm_div, β tendsto_iff_dist_tendsto_zero]
tendsto_one_iff_norm_tendsto_zero
theorem
{f : Ξ± β E} {a : Filter Ξ±} : Tendsto f a (π 1) β Tendsto (βf Β·β) a (π 0)
@[to_additive]
theorem tendsto_one_iff_norm_tendsto_zero {f : Ξ± β E} {a : Filter Ξ±} :
TendstoTendsto f a (π 1) β Tendsto (βf Β·β) a (π 0) :=
tendsto_iff_norm_div_tendsto_zero.trans <| by simp only [div_one]
comap_norm_nhds_one
theorem
: comap norm (π 0) = π (1 : E)
@[to_additive (attr := simp 1100)]
theorem comap_norm_nhds_one : comap norm (π 0) = π (1 : E) := by
simpa only [dist_one_right] using nhds_comap_dist (1 : E)
squeeze_one_norm'
theorem
{f : Ξ± β E} {a : Ξ± β β} {tβ : Filter Ξ±} (h : βαΆ n in tβ, βf nβ β€ a n) (h' : Tendsto a tβ (π 0)) : Tendsto f tβ (π 1)
/-- Special case of the sandwich theorem: if the norm of `f` is eventually bounded by a real
function `a` which tends to `0`, then `f` tends to `1` (neutral element of `SeminormedGroup`).
In this pair of lemmas (`squeeze_one_norm'` and `squeeze_one_norm`), following a convention of
similar lemmas in `Topology.MetricSpace.Basic` and `Topology.Algebra.Order`, the `'` version is
phrased using "eventually" and the non-`'` version is phrased absolutely. -/
@[to_additive "Special case of the sandwich theorem: if the norm of `f` is eventually bounded by a
real function `a` which tends to `0`, then `f` tends to `0`. In this pair of lemmas
(`squeeze_zero_norm'` and `squeeze_zero_norm`), following a convention of similar lemmas in
`Topology.MetricSpace.Pseudo.Defs` and `Topology.Algebra.Order`, the `'` version is phrased using
\"eventually\" and the non-`'` version is phrased absolutely."]
theorem squeeze_one_norm' {f : Ξ± β E} {a : Ξ± β β} {tβ : Filter Ξ±} (h : βαΆ n in tβ, βf nβ β€ a n)
(h' : Tendsto a tβ (π 0)) : Tendsto f tβ (π 1) :=
tendsto_one_iff_norm_tendsto_zero.2 <|
squeeze_zero' (Eventually.of_forall fun _n => norm_nonneg' _) h h'
squeeze_one_norm
theorem
{f : Ξ± β E} {a : Ξ± β β} {tβ : Filter Ξ±} (h : β n, βf nβ β€ a n) : Tendsto a tβ (π 0) β Tendsto f tβ (π 1)
/-- Special case of the sandwich theorem: if the norm of `f` is bounded by a real function `a` which
tends to `0`, then `f` tends to `1`. -/
@[to_additive "Special case of the sandwich theorem: if the norm of `f` is bounded by a real
function `a` which tends to `0`, then `f` tends to `0`."]
theorem squeeze_one_norm {f : Ξ± β E} {a : Ξ± β β} {tβ : Filter Ξ±} (h : β n, βf nβ β€ a n) :
Tendsto a tβ (π 0) β Tendsto f tβ (π 1) :=
squeeze_one_norm' <| Eventually.of_forall h
tendsto_norm_div_self
theorem
(x : E) : Tendsto (fun a => βa / xβ) (π x) (π 0)
@[to_additive]
theorem tendsto_norm_div_self (x : E) : Tendsto (fun a => βa / xβ) (π x) (π 0) := by
simpa [dist_eq_norm_div] using
tendsto_id.dist (tendsto_const_nhds : Tendsto (fun _a => (x : E)) (π x) _)
tendsto_norm_div_self_nhdsGE
theorem
(x : E) : Tendsto (fun a β¦ βa / xβ) (π x) (π[β₯] 0)
@[to_additive]
theorem tendsto_norm_div_self_nhdsGE (x : E) : Tendsto (fun a β¦ βa / xβ) (π x) (π[β₯] 0) :=
tendsto_nhdsWithin_iff.mpr β¨tendsto_norm_div_self x, by simpβ©
tendsto_norm'
theorem
{x : E} : Tendsto (fun a => βaβ) (π x) (π βxβ)
@[to_additive tendsto_norm]
theorem tendsto_norm' {x : E} : Tendsto (fun a => βaβ) (π x) (π βxβ) := by
simpa using tendsto_id.dist (tendsto_const_nhds : Tendsto (fun _a => (1 : E)) _ _)
tendsto_norm_one
theorem
: Tendsto (fun a : E => βaβ) (π 1) (π 0)
/-- See `tendsto_norm_one` for a version with pointed neighborhoods. -/
@[to_additive "See `tendsto_norm_zero` for a version with pointed neighborhoods."]
theorem tendsto_norm_one : Tendsto (fun a : E => βaβ) (π 1) (π 0) := by
simpa using tendsto_norm_div_self (1 : E)
continuous_norm'
theorem
: Continuous fun a : E => βaβ
@[to_additive (attr := continuity, fun_prop) continuous_norm]
theorem continuous_norm' : Continuous fun a : E => βaβ := by
simpa using continuous_id.dist (continuous_const : Continuous fun _a => (1 : E))
continuous_nnnorm'
theorem
: Continuous fun a : E => βaββ
@[to_additive (attr := continuity, fun_prop) continuous_nnnorm]
theorem continuous_nnnorm' : Continuous fun a : E => βaββ :=
continuous_norm'.subtype_mk _
SeminormedGroup.toContinuousENorm
instance
[SeminormedGroup E] : ContinuousENorm E
@[to_additive]
instance SeminormedGroup.toContinuousENorm [SeminormedGroup E] : ContinuousENorm E where
continuous_enorm := ENNReal.isOpenEmbedding_coe.continuous.comp continuous_nnnorm'
NormedGroup.toENormedMonoid
instance
{F : Type*} [NormedGroup F] : ENormedMonoid F
@[to_additive]
instance NormedGroup.toENormedMonoid {F : Type*} [NormedGroup F] : ENormedMonoid F where
enorm_eq_zero := by simp [enorm_eq_nnnorm]
enorm_mul_le := by simp [enorm_eq_nnnorm, β coe_add, nnnorm_mul_le']
NormedCommGroup.toENormedCommMonoid
instance
[NormedCommGroup E] : ENormedCommMonoid E
@[to_additive]
instance NormedCommGroup.toENormedCommMonoid [NormedCommGroup E] : ENormedCommMonoid E where
mul_comm := by simp [mul_comm]
Inseparable.norm_eq_norm'
theorem
{u v : E} (h : Inseparable u v) : βuβ = βvβ
@[to_additive Inseparable.norm_eq_norm]
theorem Inseparable.norm_eq_norm' {u v : E} (h : Inseparable u v) : βuβ = βvβ :=
h.map continuous_norm' |>.eq
Inseparable.nnnorm_eq_nnnorm'
theorem
{u v : E} (h : Inseparable u v) : βuββ = βvββ
@[to_additive Inseparable.nnnorm_eq_nnnorm]
theorem Inseparable.nnnorm_eq_nnnorm' {u v : E} (h : Inseparable u v) : βuββ = βvββ :=
h.map continuous_nnnorm' |>.eq
Inseparable.enorm_eq_enorm'
theorem
{E : Type*} [TopologicalSpace E] [ContinuousENorm E] {u v : E} (h : Inseparable u v) : βuββ = βvββ
@[to_additive Inseparable.enorm_eq_enorm]
theorem Inseparable.enorm_eq_enorm' {E : Type*} [TopologicalSpace E] [ContinuousENorm E]
{u v : E} (h : Inseparable u v) : βuββ = βvββ :=
h.map continuous_enorm |>.eq
mem_closure_one_iff_norm
theorem
{x : E} : x β closure ({ 1 } : Set E) β βxβ = 0
closure_one_eq
theorem
: closure ({ 1 } : Set E) = {x | βxβ = 0}
@[to_additive]
theorem closure_one_eq : closure ({1} : Set E) = { x | βxβ = 0 } :=
Set.ext fun _x => mem_closure_one_iff_norm
Filter.Tendsto.norm'
theorem
(h : Tendsto f l (π a)) : Tendsto (fun x => βf xβ) l (π βaβ)
@[to_additive Filter.Tendsto.norm]
theorem Filter.Tendsto.norm' (h : Tendsto f l (π a)) : Tendsto (fun x => βf xβ) l (π βaβ) :=
tendsto_norm'.comp h
Filter.Tendsto.nnnorm'
theorem
(h : Tendsto f l (π a)) : Tendsto (fun x => βf xββ) l (π βaββ)
@[to_additive Filter.Tendsto.nnnorm]
theorem Filter.Tendsto.nnnorm' (h : Tendsto f l (π a)) : Tendsto (fun x => βf xββ) l (π βaββ) :=
Tendsto.comp continuous_nnnorm'.continuousAt h
Filter.Tendsto.enorm'
theorem
(h : Tendsto f l (π a)) : Tendsto (βf Β·ββ) l (π βaββ)
@[to_additive Filter.Tendsto.enorm]
lemma Filter.Tendsto.enorm' (h : Tendsto f l (π a)) : Tendsto (βf Β·ββ) l (π βaββ) :=
.comp continuous_enorm.continuousAt h
Continuous.norm'
theorem
: Continuous f β Continuous fun x => βf xβ
@[to_additive (attr := fun_prop) Continuous.norm]
theorem Continuous.norm' : Continuous f β Continuous fun x => βf xβ :=
continuous_norm'.comp
Continuous.nnnorm'
theorem
: Continuous f β Continuous fun x => βf xββ
@[to_additive (attr := fun_prop) Continuous.nnnorm]
theorem Continuous.nnnorm' : Continuous f β Continuous fun x => βf xββ :=
continuous_nnnorm'.comp
ContinuousAt.norm'
theorem
{a : Ξ±} (h : ContinuousAt f a) : ContinuousAt (fun x => βf xβ) a
@[to_additive (attr := fun_prop) ContinuousAt.norm]
theorem ContinuousAt.norm' {a : Ξ±} (h : ContinuousAt f a) : ContinuousAt (fun x => βf xβ) a :=
Tendsto.norm' h
ContinuousAt.nnnorm'
theorem
{a : Ξ±} (h : ContinuousAt f a) : ContinuousAt (fun x => βf xββ) a
@[to_additive (attr := fun_prop) ContinuousAt.nnnorm]
theorem ContinuousAt.nnnorm' {a : Ξ±} (h : ContinuousAt f a) : ContinuousAt (fun x => βf xββ) a :=
Tendsto.nnnorm' h
ContinuousWithinAt.norm'
theorem
{s : Set Ξ±} {a : Ξ±} (h : ContinuousWithinAt f s a) : ContinuousWithinAt (fun x => βf xβ) s a
@[to_additive ContinuousWithinAt.norm]
theorem ContinuousWithinAt.norm' {s : Set Ξ±} {a : Ξ±} (h : ContinuousWithinAt f s a) :
ContinuousWithinAt (fun x => βf xβ) s a :=
Tendsto.norm' h
ContinuousWithinAt.nnnorm'
theorem
{s : Set Ξ±} {a : Ξ±} (h : ContinuousWithinAt f s a) : ContinuousWithinAt (fun x => βf xββ) s a
@[to_additive ContinuousWithinAt.nnnorm]
theorem ContinuousWithinAt.nnnorm' {s : Set Ξ±} {a : Ξ±} (h : ContinuousWithinAt f s a) :
ContinuousWithinAt (fun x => βf xββ) s a :=
Tendsto.nnnorm' h
ContinuousOn.norm'
theorem
{s : Set Ξ±} (h : ContinuousOn f s) : ContinuousOn (fun x => βf xβ) s
@[to_additive (attr := fun_prop) ContinuousOn.norm]
theorem ContinuousOn.norm' {s : Set Ξ±} (h : ContinuousOn f s) : ContinuousOn (fun x => βf xβ) s :=
fun x hx => (h x hx).norm'
ContinuousOn.nnnorm'
theorem
{s : Set Ξ±} (h : ContinuousOn f s) : ContinuousOn (fun x => βf xββ) s
@[to_additive (attr := fun_prop) ContinuousOn.nnnorm]
theorem ContinuousOn.nnnorm' {s : Set Ξ±} (h : ContinuousOn f s) :
ContinuousOn (fun x => βf xββ) s := fun x hx => (h x hx).nnnorm'
eventually_ne_of_tendsto_norm_atTop'
theorem
{l : Filter Ξ±} {f : Ξ± β E} (h : Tendsto (fun y => βf yβ) l atTop) (x : E) : βαΆ y in l, f y β x
/-- If `βyβ β β`, then we can assume `y β x` for any fixed `x`. -/
@[to_additive eventually_ne_of_tendsto_norm_atTop "If `βyβββ`, then we can assume `yβ x` for any
fixed `x`"]
theorem eventually_ne_of_tendsto_norm_atTop' {l : Filter Ξ±} {f : Ξ± β E}
(h : Tendsto (fun y => βf yβ) l atTop) (x : E) : βαΆ y in l, f y β x :=
(h.eventually_ne_atTop _).mono fun _x => ne_of_apply_ne norm
SeminormedCommGroup.mem_closure_iff
theorem
: a β closure s β β Ξ΅, 0 < Ξ΅ β β b β s, βa / bβ < Ξ΅
@[to_additive]
theorem SeminormedCommGroup.mem_closure_iff :
a β closure sa β closure s β β Ξ΅, 0 < Ξ΅ β β b β s, βa / bβ < Ξ΅ := by
simp [Metric.mem_closure_iff, dist_eq_norm_div]
SeminormedGroup.tendstoUniformlyOn_one
theorem
{f : ΞΉ β ΞΊ β G} {s : Set ΞΊ} {l : Filter ΞΉ} : TendstoUniformlyOn f 1 l s β β Ξ΅ > 0, βαΆ i in l, β x β s, βf i xβ < Ξ΅
@[to_additive]
theorem SeminormedGroup.tendstoUniformlyOn_one {f : ΞΉ β ΞΊ β G} {s : Set ΞΊ} {l : Filter ΞΉ} :
TendstoUniformlyOnTendstoUniformlyOn f 1 l s β β Ξ΅ > 0, βαΆ i in l, β x β s, βf i xβ < Ξ΅ := by
simp only [tendstoUniformlyOn_iff, Pi.one_apply, dist_one_left]
SeminormedGroup.uniformCauchySeqOnFilter_iff_tendstoUniformlyOnFilter_one
theorem
{f : ΞΉ β ΞΊ β G} {l : Filter ΞΉ} {l' : Filter ΞΊ} :
UniformCauchySeqOnFilter f l l' β
TendstoUniformlyOnFilter (fun n : ΞΉ Γ ΞΉ => fun z => f n.fst z / f n.snd z) 1 (l ΓΛ’ l) l'
@[to_additive]
theorem SeminormedGroup.uniformCauchySeqOnFilter_iff_tendstoUniformlyOnFilter_one {f : ΞΉ β ΞΊ β G}
{l : Filter ΞΉ} {l' : Filter ΞΊ} :
UniformCauchySeqOnFilterUniformCauchySeqOnFilter f l l' β
TendstoUniformlyOnFilter (fun n : ΞΉ Γ ΞΉ => fun z => f n.fst z / f n.snd z) 1 (l ΓΛ’ l) l' := by
refine β¨fun hf u hu => ?_, fun hf u hu => ?_β©
Β· obtain β¨Ξ΅, hΞ΅, Hβ© := uniformity_basis_dist.mem_uniformity_iff.mp hu
refine
(hf { p : G Γ G | dist p.fst p.snd < Ξ΅ } <| dist_mem_uniformity hΞ΅).mono fun x hx =>
H 1 (f x.fst.fst x.snd / f x.fst.snd x.snd) ?_
simpa [dist_eq_norm_div, norm_div_rev] using hx
Β· obtain β¨Ξ΅, hΞ΅, Hβ© := uniformity_basis_dist.mem_uniformity_iff.mp hu
refine
(hf { p : G Γ G | dist p.fst p.snd < Ξ΅ } <| dist_mem_uniformity hΞ΅).mono fun x hx =>
H (f x.fst.fst x.snd) (f x.fst.snd x.snd) ?_
simpa [dist_eq_norm_div, norm_div_rev] using hx
SeminormedGroup.uniformCauchySeqOn_iff_tendstoUniformlyOn_one
theorem
{f : ΞΉ β ΞΊ β G} {s : Set ΞΊ} {l : Filter ΞΉ} :
UniformCauchySeqOn f l s β TendstoUniformlyOn (fun n : ΞΉ Γ ΞΉ => fun z => f n.fst z / f n.snd z) 1 (l ΓΛ’ l) s
@[to_additive]
theorem SeminormedGroup.uniformCauchySeqOn_iff_tendstoUniformlyOn_one {f : ΞΉ β ΞΊ β G} {s : Set ΞΊ}
{l : Filter ΞΉ} :
UniformCauchySeqOnUniformCauchySeqOn f l s β
TendstoUniformlyOn (fun n : ΞΉ Γ ΞΉ => fun z => f n.fst z / f n.snd z) 1 (l ΓΛ’ l) s := by
rw [tendstoUniformlyOn_iff_tendstoUniformlyOnFilter,
uniformCauchySeqOn_iff_uniformCauchySeqOnFilter,
SeminormedGroup.uniformCauchySeqOnFilter_iff_tendstoUniformlyOnFilter_one]
controlled_prod_of_mem_closure
theorem
{s : Subgroup E} (hg : a β closure (s : Set E)) {b : β β β} (b_pos : β n, 0 < b n) :
β v : β β E,
Tendsto (fun n => β i β range (n + 1), v i) atTop (π a) β§
(β n, v n β s) β§ βv 0 / aβ < b 0 β§ β n, 0 < n β βv nβ < b n
@[to_additive]
theorem controlled_prod_of_mem_closure {s : Subgroup E} (hg : a β closure (s : Set E)) {b : β β β}
(b_pos : β n, 0 < b n) :
β v : β β E,
Tendsto (fun n => β i β range (n + 1), v i) atTop (π a) β§
(β n, v n β s) β§ βv 0 / aβ < b 0 β§ β n, 0 < n β βv nβ < b n := by
obtain β¨u : β β E, u_in : β n, u n β s, lim_u : Tendsto u atTop (π a)β© :=
mem_closure_iff_seq_limit.mp hg
obtain β¨nβ, hnββ© : β nβ, β n β₯ nβ, βu n / aβ < b 0 :=
haveI : { x | βx / aβ < b 0 }{ x | βx / aβ < b 0 } β π a := by
simp_rw [β dist_eq_norm_div]
exact Metric.ball_mem_nhds _ (b_pos _)
Filter.tendsto_atTop'.mp lim_u _ this
set z : β β E := fun n => u (n + nβ)
have lim_z : Tendsto z atTop (π a) := lim_u.comp (tendsto_add_atTop_nat nβ)
have mem_π€ : β n, { p : E Γ E | βp.1 / p.2β < b (n + 1) }{ p : E Γ E | βp.1 / p.2β < b (n + 1) } β π€ E := fun n => by
simpa [β dist_eq_norm_div] using Metric.dist_mem_uniformity (b_pos <| n + 1)
obtain β¨Ο : β β β, Ο_extr : StrictMono Ο, hΟ : β n, βz (Ο <| n + 1) / z (Ο n)β < b (n + 1)β© :=
lim_z.cauchySeq.subseq_mem mem_π€
set w : β β E := z β Ο
have hw : Tendsto w atTop (π a) := lim_z.comp Ο_extr.tendsto_atTop
set v : β β E := fun i => if i = 0 then w 0 else w i / w (i - 1)
refine β¨v, Tendsto.congr (Finset.eq_prod_range_div' w) hw, ?_, hnβ _ (nβ.le_add_left _), ?_β©
Β· rintro β¨β©
Β· change w 0 β s
apply u_in
Β· apply s.div_mem <;> apply u_in
Β· intro l hl
obtain β¨k, rflβ© : β k, l = k + 1 := Nat.exists_eq_succ_of_ne_zero hl.ne'
apply hΟ
controlled_prod_of_mem_closure_range
theorem
{j : E β* F} {b : F} (hb : b β closure (j.range : Set F)) {f : β β β} (b_pos : β n, 0 < f n) :
β a : β β E,
Tendsto (fun n => β i β range (n + 1), j (a i)) atTop (π b) β§ βj (a 0) / bβ < f 0 β§ β n, 0 < n β βj (a n)β < f n
@[to_additive]
theorem controlled_prod_of_mem_closure_range {j : E β* F} {b : F}
(hb : b β closure (j.range : Set F)) {f : β β β} (b_pos : β n, 0 < f n) :
β a : β β E,
Tendsto (fun n => β i β range (n + 1), j (a i)) atTop (π b) β§
βj (a 0) / bβ < f 0 β§ β n, 0 < n β βj (a n)β < f n := by
obtain β¨v, sum_v, v_in, hvβ, hv_posβ© := controlled_prod_of_mem_closure hb b_pos
choose g hg using v_in
exact
β¨g, by simpa [β hg] using sum_v, by simpa [hg 0] using hvβ,
fun n hn => by simpa [hg] using hv_pos n hnβ©
tendsto_norm_nhdsNE_one
theorem
: Tendsto (norm : E β β) (π[β ] 1) (π[>] 0)
/-- See `tendsto_norm_one` for a version with full neighborhoods. -/
@[to_additive "See `tendsto_norm_zero` for a version with full neighborhoods."]
lemma tendsto_norm_nhdsNE_one : Tendsto (norm : E β β) (π[β ] 1) (π[>] 0) :=
tendsto_norm_one.inf <| tendsto_principal_principal.2 fun _ hx β¦ norm_pos_iff'.2 hx
tendsto_norm_div_self_nhdsNE
theorem
(a : E) : Tendsto (fun x => βx / aβ) (π[β ] a) (π[>] 0)
@[to_additive]
theorem tendsto_norm_div_self_nhdsNE (a : E) : Tendsto (fun x => βx / aβ) (π[β ] a) (π[>] 0) :=
(tendsto_norm_div_self a).inf <|
tendsto_principal_principal.2 fun _x hx => norm_pos_iff'.2 <| div_ne_one.2 hx
comap_norm_nhdsGT_zero'
theorem
: comap norm (π[>] 0) = π[β ] (1 : E)
/-- A version of `comap_norm_nhdsGT_zero` for a multiplicative normed group. -/
@[to_additive comap_norm_nhdsGT_zero]
lemma comap_norm_nhdsGT_zero' : comap norm (π[>] 0) = π[β ] (1 : E) := by
simp [nhdsWithin, comap_norm_nhds_one, Set.preimage, Set.compl_def]