Skip to content
This repository was archived by the owner on Jul 24, 2024. It is now read-only.

Commit e35438b

Browse files
committed
feat(analysis): Cauchy sequence and series lemmas (#7858)
from LTE. Mostly relaxing assumptions from metric to pseudo-metric and proving some obvious lemmas. eventually_constant_prod and eventually_constant_sum are duplicated by hand because `to_additive` gets confused by the appearance of `1`. In `norm_le_zero_iff' {G : Type*} [semi_normed_group G] [separated_space G]` and the following two lemmas the type classes assumptions look silly, but those lemmas are indeed useful in some specific situation in LTE.
1 parent a421185 commit e35438b

File tree

4 files changed

+163
-6
lines changed

4 files changed

+163
-6
lines changed

src/algebra/big_operators/basic.lean

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -761,6 +761,24 @@ lemma prod_range_succ' (f : ℕ → β) :
761761
| 0 := prod_range_succ _ _
762762
| (n + 1) := by rw [prod_range_succ _ n, mul_right_comm, ← prod_range_succ', prod_range_succ]
763763

764+
lemma eventually_constant_prod {u : ℕ → β} {N : ℕ} (hu : ∀ n ≥ N, u n = 1) {n : ℕ} (hn : N ≤ n) :
765+
∏ k in range (n + 1), u k = ∏ k in range (N + 1), u k :=
766+
begin
767+
obtain ⟨m, rfl : n = N + m⟩ := le_iff_exists_add.mp hn,
768+
clear hn,
769+
induction m with m hm,
770+
{ simp },
771+
erw [prod_range_succ, hm],
772+
simp [hu]
773+
end
774+
775+
lemma eventually_constant_sum {β} [add_comm_monoid β] {u : ℕ → β} {N : ℕ}
776+
(hu : ∀ n ≥ N, u n = 0) {n : ℕ} (hn : N ≤ n) :
777+
∑ k in range (n + 1), u k = ∑ k in range (N + 1), u k :=
778+
@eventually_constant_prod (multiplicative β) _ _ _ hu _ hn
779+
780+
attribute [to_additive] eventually_constant_prod
781+
764782
lemma prod_range_add (f : ℕ → β) (n m : ℕ) :
765783
∏ x in range (n + m), f x =
766784
(∏ x in range n, f x) * (∏ x in range m, f (n + x)) :=

src/analysis/normed_space/basic.lean

Lines changed: 71 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -208,6 +208,9 @@ lemma norm_le_insert (u v : α) : ∥v∥ ≤ ∥u∥ + ∥u - v∥ :=
208208
calc ∥v∥ = ∥u - (u - v)∥ : by abel
209209
... ≤ ∥u∥ + ∥u - v∥ : norm_sub_le u _
210210

211+
lemma norm_le_insert' (u v : α) : ∥u∥ ≤ ∥v∥ + ∥u - v∥ :=
212+
by { rw norm_sub_rev, exact norm_le_insert v u }
213+
211214
lemma ball_0_eq (ε : ℝ) : ball (0:α) ε = {x | ∥x∥ < ε} :=
212215
set.ext $ assume a, by simp
213216

@@ -294,6 +297,44 @@ lemma normed_group.tendsto_nhds_nhds {f : α → β} {x : α} {y : β} :
294297
tendsto f (𝓝 x) (𝓝 y) ↔ ∀ ε > 0, ∃ δ > 0, ∀ x', ∥x' - x∥ < δ → ∥f x' - y∥ < ε :=
295298
by simp_rw [metric.tendsto_nhds_nhds, dist_eq_norm]
296299

300+
lemma normed_group.cauchy_seq_iff {u : ℕ → α} :
301+
cauchy_seq u ↔ ∀ ε > 0, ∃ N, ∀ m n, N ≤ m → N ≤ n → ∥u m - u n∥ < ε :=
302+
by simp [metric.cauchy_seq_iff, dist_eq_norm]
303+
304+
lemma cauchy_seq.add {u v : ℕ → α} (hu : cauchy_seq u) (hv : cauchy_seq v) : cauchy_seq (u + v) :=
305+
begin
306+
rw normed_group.cauchy_seq_iff at *,
307+
intros ε ε_pos,
308+
rcases hu (ε/2) (half_pos ε_pos) with ⟨Nu, hNu⟩,
309+
rcases hv (ε/2) (half_pos ε_pos) with ⟨Nv, hNv⟩,
310+
use max Nu Nv,
311+
intros m n hm hn,
312+
replace hm := max_le_iff.mp hm,
313+
replace hn := max_le_iff.mp hn,
314+
315+
calc ∥(u + v) m - (u + v) n∥ = ∥u m + v m - (u n + v n)∥ : rfl
316+
... = ∥(u m - u n) + (v m - v n)∥ : by abel
317+
... ≤ ∥u m - u n∥ + ∥v m - v n∥ : norm_add_le _ _
318+
... < ε : by linarith only [hNu m n hm.1 hn.1, hNv m n hm.2 hn.2]
319+
end
320+
321+
open finset
322+
323+
lemma cauchy_seq_sum_of_eventually_eq {u v : ℕ → α} {N : ℕ} (huv : ∀ n ≥ N, u n = v n)
324+
(hv : cauchy_seq (λ n, ∑ k in range (n+1), v k)) : cauchy_seq (λ n, ∑ k in range (n + 1), u k) :=
325+
begin
326+
let d : ℕ → α := λ n, ∑ k in range (n + 1), (u k - v k),
327+
rw show (λ n, ∑ k in range (n + 1), u k) = d + (λ n, ∑ k in range (n + 1), v k),
328+
by { ext n, simp [d] },
329+
have : ∀ n ≥ N, d n = d N,
330+
{ intros n hn,
331+
dsimp [d],
332+
rw eventually_constant_sum _ hn,
333+
intros m hm,
334+
simp [huv m hm] },
335+
exact (tendsto_at_top_of_eventually_const this).cauchy_seq.add hv
336+
end
337+
297338
/-- A homomorphism `f` of seminormed groups is Lipschitz, if there exists a constant `C` such that
298339
for all `x`, one has `∥f x∥ ≤ C * ∥x∥`. The analogous condition for a linear map of
299340
(semi)normed spaces is in `normed_space.operator_norm`. -/
@@ -619,6 +660,35 @@ lemma nat.norm_cast_le [has_one α] : ∀ n : ℕ, ∥(n : α)∥ ≤ n * ∥(1
619660
| (n + 1) := by { rw [n.cast_succ, n.cast_succ, add_mul, one_mul],
620661
exact norm_add_le_of_le (nat.norm_cast_le n) le_rfl }
621662

663+
lemma semi_normed_group.mem_closure_iff {s : set α} {x : α} :
664+
x ∈ closure s ↔ ∀ ε > 0, ∃ y ∈ s, ∥x - y∥ < ε :=
665+
by simp [metric.mem_closure_iff, dist_eq_norm]
666+
667+
lemma norm_le_zero_iff' [separated_space α] {g : α} :
668+
∥g∥ ≤ 0 ↔ g = 0 :=
669+
begin
670+
have : g = 0 ↔ g ∈ closure ({0} : set α),
671+
by simpa only [separated_space.out, mem_id_rel, sub_zero] using group_separation_rel g (0 : α),
672+
rw [this, semi_normed_group.mem_closure_iff],
673+
simp [forall_lt_iff_le']
674+
end
675+
676+
lemma norm_eq_zero_iff' [separated_space α] {g : α} : ∥g∥ = 0 ↔ g = 0 :=
677+
begin
678+
conv_rhs { rw ← norm_le_zero_iff' },
679+
split ; intro h,
680+
{ rw h },
681+
{ exact le_antisymm h (norm_nonneg g) }
682+
end
683+
684+
lemma norm_pos_iff' [separated_space α] {g : α} : 0 < ∥g∥ ↔ g ≠ 0 :=
685+
begin
686+
rw lt_iff_le_and_ne,
687+
simp only [norm_nonneg, true_and],
688+
rw [ne_comm],
689+
exact not_iff_not_of_iff (norm_eq_zero_iff'),
690+
end
691+
622692
end semi_normed_group
623693

624694
section normed_group
@@ -667,7 +737,7 @@ dist_zero_right g ▸ dist_eq_zero
667737
dist_zero_right g ▸ dist_pos
668738

669739
@[simp] lemma norm_le_zero_iff {g : α} : ∥g∥ ≤ 0 ↔ g = 0 :=
670-
by { rw[←dist_zero_right], exact dist_le_zero }
740+
by { rw [← dist_zero_right], exact dist_le_zero }
671741

672742
lemma eq_of_norm_sub_le_zero {g h : α} (a : ∥g - h∥ ≤ 0) : g = h :=
673743
by rwa [← sub_eq_zero, ← norm_le_zero_iff]

src/analysis/specific_limits.lean

Lines changed: 66 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -180,7 +180,7 @@ begin
180180
tfae_finish
181181
end
182182

183-
lemma uniformity_basis_dist_pow_of_lt_1 {α : Type*} [metric_space α]
183+
lemma uniformity_basis_dist_pow_of_lt_1 {α : Type*} [pseudo_metric_space α]
184184
{r : ℝ} (h₀ : 0 < r) (h₁ : r < 1) :
185185
(𝓤 α).has_basis (λ k : ℕ, true) (λ k, {p : α × α | dist p.1 p.2 < r ^ k}) :=
186186
metric.mk_uniformity_basis (λ i _, pow_pos h₀ _) $ λ ε ε0,
@@ -477,7 +477,7 @@ decaying terms.
477477
-/
478478
section edist_le_geometric
479479

480-
variables [emetric_space α] (r C : ℝ≥0∞) (hr : r < 1) (hC : C ≠ ⊤) {f : ℕ → α}
480+
variables [pseudo_emetric_space α] (r C : ℝ≥0∞) (hr : r < 1) (hC : C ≠ ⊤) {f : ℕ → α}
481481
(hu : ∀n, edist (f n) (f (n+1)) ≤ C * r^n)
482482

483483
include hr hC hu
@@ -513,7 +513,7 @@ end edist_le_geometric
513513

514514
section edist_le_geometric_two
515515

516-
variables [emetric_space α] (C : ℝ≥0∞) (hC : C ≠ ⊤) {f : ℕ → α}
516+
variables [pseudo_emetric_space α] (C : ℝ≥0∞) (hC : C ≠ ⊤) {f : ℕ → α}
517517
(hu : ∀n, edist (f n) (f (n+1)) ≤ C / 2^n) {a : α} (ha : tendsto f at_top (𝓝 a))
518518

519519
include hC hu
@@ -550,7 +550,7 @@ end edist_le_geometric_two
550550

551551
section le_geometric
552552

553-
variables [metric_space α] {r C : ℝ} (hr : r < 1) {f : ℕ → α}
553+
variables [pseudo_metric_space α] {r C : ℝ} (hr : r < 1) {f : ℕ → α}
554554
(hu : ∀n, dist (f n) (f (n+1)) ≤ C * r^n)
555555

556556
include hr hu
@@ -620,7 +620,11 @@ end le_geometric
620620

621621
section summable_le_geometric
622622

623-
variables [normed_group α] {r C : ℝ} {f : ℕ → α}
623+
variables [semi_normed_group α] {r C : ℝ} {f : ℕ → α}
624+
625+
lemma semi_normed_group.cauchy_seq_of_le_geometric {C : ℝ} {r : ℝ} (hr : r < 1)
626+
{u : ℕ → α} (h : ∀ n, ∥u n - u (n + 1)∥ ≤ C*r^n) : cauchy_seq u :=
627+
cauchy_seq_of_le_geometric r C hr (by simpa [dist_eq_norm] using h)
624628

625629
lemma dist_partial_sum_le_of_le_geometric (hf : ∀n, ∥f n∥ ≤ C * r^n) (n : ℕ) :
626630
dist (∑ i in range n, f i) (∑ i in range (n+1), f i) ≤ C * r ^ n :=
@@ -648,6 +652,63 @@ begin
648652
exact ha.tendsto_sum_nat
649653
end
650654

655+
@[simp] lemma dist_partial_sum (u : ℕ → α) (n : ℕ) :
656+
dist (∑ k in range (n + 1), u k) (∑ k in range n, u k) = ∥u n∥ :=
657+
by simp [dist_eq_norm, sum_range_succ]
658+
659+
@[simp] lemma dist_partial_sum' (u : ℕ → α) (n : ℕ) :
660+
dist (∑ k in range n, u k) (∑ k in range (n+1), u k) = ∥u n∥ :=
661+
by simp [dist_eq_norm', sum_range_succ]
662+
663+
lemma cauchy_series_of_le_geometric {C : ℝ} {u : ℕ → α}
664+
{r : ℝ} (hr : r < 1) (h : ∀ n, ∥u n∥ ≤ C*r^n) : cauchy_seq (λ n, ∑ k in range n, u k) :=
665+
cauchy_seq_of_le_geometric r C hr (by simp [h])
666+
667+
lemma normed_group.cauchy_series_of_le_geometric' {C : ℝ} {u : ℕ → α} {r : ℝ} (hr : r < 1)
668+
(h : ∀ n, ∥u n∥ ≤ C*r^n) : cauchy_seq (λ n, ∑ k in range (n + 1), u k) :=
669+
begin
670+
by_cases hC : C = 0,
671+
{ subst hC,
672+
simp at h,
673+
exact cauchy_seq_of_le_geometric 0 0 zero_lt_one (by simp [h]) },
674+
have : 0 ≤ C,
675+
{ simpa using (norm_nonneg _).trans (h 0) },
676+
replace hC : 0 < C,
677+
from (ne.symm hC).le_iff_lt.mp this,
678+
have : 0 ≤ r,
679+
{ have := (norm_nonneg _).trans (h 1),
680+
rw pow_one at this,
681+
exact (zero_le_mul_left hC).mp this },
682+
simp_rw finset.sum_range_succ_comm,
683+
have : cauchy_seq u,
684+
{ apply tendsto.cauchy_seq,
685+
apply squeeze_zero_norm h,
686+
rw show 0 = C*0, by simp,
687+
exact tendsto_const_nhds.mul (tendsto_pow_at_top_nhds_0_of_lt_1 this hr) },
688+
exact this.add (cauchy_series_of_le_geometric hr h),
689+
end
690+
691+
lemma normed_group.cauchy_series_of_le_geometric'' {C : ℝ} {u : ℕ → α} {N : ℕ} {r : ℝ}
692+
(hr₀ : 0 < r) (hr₁ : r < 1)
693+
(h : ∀ n ≥ N, ∥u n∥ ≤ C*r^n) : cauchy_seq (λ n, ∑ k in range (n + 1), u k) :=
694+
begin
695+
set v : ℕ → α := λ n, if n < N then 0 else u n,
696+
have hC : 0 ≤ C,
697+
from (zero_le_mul_right $ pow_pos hr₀ N).mp ((norm_nonneg _).trans $ h N $ le_refl N),
698+
have : ∀ n ≥ N, u n = v n,
699+
{ intros n hn,
700+
simp [v, hn, if_neg (not_lt.mpr hn)] },
701+
refine cauchy_seq_sum_of_eventually_eq this (normed_group.cauchy_series_of_le_geometric' hr₁ _),
702+
{ exact C },
703+
intro n,
704+
dsimp [v],
705+
split_ifs with H H,
706+
{ rw norm_zero,
707+
exact mul_nonneg hC (pow_nonneg hr₀.le _) },
708+
{ push_neg at H,
709+
exact h _ H }
710+
end
711+
651712
end summable_le_geometric
652713

653714
section normed_ring_geometric

src/topology/basic.lean

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -675,6 +675,14 @@ all_mem_nhds_filter _ _ (λ s t h, preimage_mono h) _
675675
lemma tendsto_const_nhds {a : α} {f : filter β} : tendsto (λb:β, a) f (𝓝 a) :=
676676
tendsto_nhds.mpr $ assume s hs ha, univ_mem_sets' $ assume _, ha
677677

678+
lemma tendsto_at_top_of_eventually_const {ι : Type*} [semilattice_sup ι] [nonempty ι]
679+
{x : α} {u : ι → α} {i₀ : ι} (h : ∀ i ≥ i₀, u i = x) : tendsto u at_top (𝓝 x) :=
680+
tendsto.congr' (eventually_eq.symm (eventually_at_top.mpr ⟨i₀, h⟩)) tendsto_const_nhds
681+
682+
lemma tendsto_at_bot_of_eventually_const {ι : Type*} [semilattice_inf ι] [nonempty ι]
683+
{x : α} {u : ι → α} {i₀ : ι} (h : ∀ i ≤ i₀, u i = x) : tendsto u at_bot (𝓝 x) :=
684+
tendsto.congr' (eventually_eq.symm (eventually_at_bot.mpr ⟨i₀, h⟩)) tendsto_const_nhds
685+
678686
lemma pure_le_nhds : pure ≤ (𝓝 : α → filter α) :=
679687
assume a s hs, mem_pure_sets.2 $ mem_of_mem_nhds hs
680688

0 commit comments

Comments
 (0)