@@ -10,6 +10,7 @@ import Mathlib.Order.Iterate
1010import Mathlib.Topology.Algebra.Algebra
1111import Mathlib.Topology.Algebra.InfiniteSum.Real
1212import Mathlib.Topology.Instances.EReal.Lemmas
13+ import Mathlib.Topology.Instances.Rat
1314
1415/-!
1516# A collection of specific limit computations
@@ -27,24 +28,32 @@ open Set Function Filter Finset Metric Topology Nat uniformity NNReal ENNReal
2728
2829variable {α : Type *} {β : Type *} {ι : Type *}
2930
30- theorem tendsto_inverse_atTop_nhds_zero_nat : Tendsto (fun n : ℕ ↦ (n : ℝ )⁻¹) atTop (𝓝 0 ) :=
31+ theorem NNRat.tendsto_inv_atTop_nhds_zero_nat : Tendsto (fun n : ℕ ↦ (n : ℚ≥ 0 )⁻¹) atTop (𝓝 0 ) :=
3132 tendsto_inv_atTop_zero.comp tendsto_natCast_atTop_atTop
3233
33- theorem tendsto_const_div_atTop_nhds_zero_nat (C : ℝ) :
34- Tendsto ( fun n : ℕ ↦ C / n) atTop (𝓝 0 ) := by
35- simpa only [mul_zero] using tendsto_const_nhds.mul tendsto_inverse_atTop_nhds_zero_nat
36-
37- theorem tendsto_one_div_atTop_nhds_zero_nat : Tendsto ( fun n : ℕ ↦ 1 / (n : ℝ)) atTop (𝓝 0 ) :=
38- tendsto_const_div_atTop_nhds_zero_nat 1
34+ theorem NNRat.tendsto_algebraMap_inv_atTop_nhds_zero_nat (𝕜 : Type *) [Semiring 𝕜]
35+ [Algebra ℚ≥ 0 𝕜] [TopologicalSpace 𝕜] [ContinuousSMul ℚ≥ 0 𝕜] :
36+ Tendsto (algebraMap ℚ≥ 0 𝕜 ∘ fun n : ℕ ↦ (n : ℚ≥ 0 )⁻¹) atTop (𝓝 0 ) := by
37+ convert (continuous_algebraMap ℚ≥ 0 𝕜).continuousAt.tendsto.comp
38+ tendsto_inv_atTop_nhds_zero_nat
39+ rw [map_zero]
3940
40- theorem NNReal.tendsto_inverse_atTop_nhds_zero_nat :
41- Tendsto (fun n : ℕ ↦ (n : ℝ≥0 )⁻¹) atTop (𝓝 0 ) := by
42- rw [← NNReal.tendsto_coe]
43- exact _root_.tendsto_inverse_atTop_nhds_zero_nat
41+ theorem tendsto_inv_atTop_nhds_zero_nat {𝕜 : Type *} [DivisionSemiring 𝕜] [CharZero 𝕜]
42+ [TopologicalSpace 𝕜] [ContinuousSMul ℚ≥0 𝕜] :
43+ Tendsto (fun n : ℕ ↦ (n : 𝕜)⁻¹) atTop (𝓝 0 ) := by
44+ convert NNRat.tendsto_algebraMap_inv_atTop_nhds_zero_nat 𝕜
45+ simp
4446
45- theorem NNReal.tendsto_const_div_atTop_nhds_zero_nat (C : ℝ≥0 ) :
47+ theorem tendsto_const_div_atTop_nhds_zero_nat {𝕜 : Type *} [DivisionSemiring 𝕜] [CharZero 𝕜]
48+ [TopologicalSpace 𝕜] [ContinuousSMul ℚ≥0 𝕜] [ContinuousMul 𝕜] (C : 𝕜) :
4649 Tendsto (fun n : ℕ ↦ C / n) atTop (𝓝 0 ) := by
47- simpa using tendsto_const_nhds.mul NNReal.tendsto_inverse_atTop_nhds_zero_nat
50+ simpa only [mul_zero, div_eq_mul_inv] using
51+ (tendsto_const_nhds (x := C)).mul tendsto_inv_atTop_nhds_zero_nat
52+
53+ theorem tendsto_one_div_atTop_nhds_zero_nat {𝕜 : Type *} [DivisionSemiring 𝕜] [CharZero 𝕜]
54+ [TopologicalSpace 𝕜] [ContinuousSMul ℚ≥0 𝕜] :
55+ Tendsto (fun n : ℕ ↦ 1 / (n : 𝕜)) atTop (𝓝 0 ) := by
56+ simp [tendsto_inv_atTop_nhds_zero_nat]
4857
4958theorem EReal.tendsto_const_div_atTop_nhds_zero_nat {C : EReal} (h : C ≠ ⊥) (h' : C ≠ ⊤) :
5059 Tendsto (fun n : ℕ ↦ C / n) atTop (𝓝 0 ) := by
@@ -54,30 +63,23 @@ theorem EReal.tendsto_const_div_atTop_nhds_zero_nat {C : EReal} (h : C ≠ ⊥)
5463 rw [this, ← coe_zero, tendsto_coe]
5564 exact _root_.tendsto_const_div_atTop_nhds_zero_nat C.toReal
5665
57- theorem tendsto_one_div_add_atTop_nhds_zero_nat :
58- Tendsto (fun n : ℕ ↦ 1 / ((n : ℝ) + 1 )) atTop (𝓝 0 ) :=
59- suffices Tendsto (fun n : ℕ ↦ 1 / (↑(n + 1 ) : ℝ)) atTop (𝓝 0 ) by simpa
60- (tendsto_add_atTop_iff_nat 1 ).2 (_root_.tendsto_const_div_atTop_nhds_zero_nat 1 )
61-
62- theorem NNReal.tendsto_algebraMap_inverse_atTop_nhds_zero_nat (𝕜 : Type *) [Semiring 𝕜]
63- [Algebra ℝ≥0 𝕜] [TopologicalSpace 𝕜] [ContinuousSMul ℝ≥0 𝕜] :
64- Tendsto (algebraMap ℝ≥0 𝕜 ∘ fun n : ℕ ↦ (n : ℝ≥0 )⁻¹) atTop (𝓝 0 ) := by
65- convert (continuous_algebraMap ℝ≥0 𝕜).continuousAt.tendsto.comp
66- tendsto_inverse_atTop_nhds_zero_nat
66+ theorem tendsto_one_div_add_atTop_nhds_zero_nat {𝕜 : Type *} [DivisionSemiring 𝕜] [CharZero 𝕜]
67+ [TopologicalSpace 𝕜] [ContinuousSMul ℚ≥0 𝕜] :
68+ Tendsto (fun n : ℕ ↦ 1 / ((n : 𝕜) + 1 )) atTop (𝓝 0 ) :=
69+ suffices Tendsto (fun n : ℕ ↦ 1 / (↑(n + 1 ) : 𝕜)) atTop (𝓝 0 ) by simpa
70+ (tendsto_add_atTop_iff_nat 1 ).2 tendsto_one_div_atTop_nhds_zero_nat
71+
72+ theorem tendsto_algebraMap_inv_atTop_nhds_zero_nat {𝕜 : Type *} (A : Type *)
73+ [Semifield 𝕜] [CharZero 𝕜] [TopologicalSpace 𝕜] [ContinuousSMul ℚ≥0 𝕜]
74+ [Semiring A] [Algebra 𝕜 A] [TopologicalSpace A] [ContinuousSMul 𝕜 A] :
75+ Tendsto (algebraMap 𝕜 A ∘ fun n : ℕ ↦ (n : 𝕜)⁻¹) atTop (𝓝 0 ) := by
76+ convert (continuous_algebraMap 𝕜 A).continuousAt.tendsto.comp tendsto_inv_atTop_nhds_zero_nat
6777 rw [map_zero]
6878
69- theorem tendsto_algebraMap_inverse_atTop_nhds_zero_nat (𝕜 : Type *) [Semiring 𝕜] [Algebra ℝ 𝕜]
70- [TopologicalSpace 𝕜] [ContinuousSMul ℝ 𝕜] :
71- Tendsto (algebraMap ℝ 𝕜 ∘ fun n : ℕ ↦ (n : ℝ)⁻¹) atTop (𝓝 0 ) :=
72- NNReal.tendsto_algebraMap_inverse_atTop_nhds_zero_nat 𝕜
73-
7479/-- The limit of `n / (n + x)` is 1, for any constant `x` (valid in `ℝ` or any topological division
75- algebra over `ℝ`, e.g., `ℂ`).
76-
77- TODO: introduce a typeclass saying that `1 / n` tends to 0 at top, making it possible to get this
78- statement simultaneously on `ℚ`, `ℝ` and `ℂ`. -/
79- theorem tendsto_natCast_div_add_atTop {𝕜 : Type *} [DivisionRing 𝕜] [TopologicalSpace 𝕜]
80- [CharZero 𝕜] [Algebra ℝ 𝕜] [ContinuousSMul ℝ 𝕜] [IsTopologicalDivisionRing 𝕜] (x : 𝕜) :
80+ algebra over `ℚ≥0`, e.g., `ℂ`). -/
81+ theorem tendsto_natCast_div_add_atTop {𝕜 : Type *} [DivisionSemiring 𝕜] [TopologicalSpace 𝕜]
82+ [CharZero 𝕜] [ContinuousSMul ℚ≥0 𝕜] [IsTopologicalSemiring 𝕜] [ContinuousInv₀ 𝕜] (x : 𝕜) :
8183 Tendsto (fun n : ℕ ↦ (n : 𝕜) / (n + x)) atTop (𝓝 1 ) := by
8284 convert Tendsto.congr' ((eventually_ne_atTop 0 ).mp (Eventually.of_forall fun n hn ↦ _)) _
8385 · exact fun n : ℕ ↦ 1 / (1 + x / n)
@@ -88,12 +90,28 @@ theorem tendsto_natCast_div_add_atTop {𝕜 : Type*} [DivisionRing 𝕜] [Topolo
8890 refine tendsto_const_nhds.div (tendsto_const_nhds.add ?_) (by simp)
8991 simp_rw [div_eq_mul_inv]
9092 refine tendsto_const_nhds.mul ?_
91- have := ((continuous_algebraMap ℝ 𝕜).tendsto _).comp tendsto_inverse_atTop_nhds_zero_nat
93+ have := ((continuous_algebraMap ℚ≥ 0 𝕜).tendsto _).comp tendsto_inv_atTop_nhds_zero_nat
9294 rw [map_zero, Filter.tendsto_atTop'] at this
9395 refine Iff.mpr tendsto_atTop' ?_
9496 intros
9597 simp_all only [comp_apply, map_inv₀, map_natCast]
9698
99+ theorem tendsto_add_mul_div_add_mul_atTop_nhds {𝕜 : Type *} [Semifield 𝕜] [CharZero 𝕜]
100+ [TopologicalSpace 𝕜] [ContinuousSMul ℚ≥0 𝕜] [IsTopologicalSemiring 𝕜] [ContinuousInv₀ 𝕜]
101+ (a b c : 𝕜) {d : 𝕜} (hd : d ≠ 0 ) :
102+ Tendsto (fun k : ℕ ↦ (a + c * k) / (b + d * k)) atTop (𝓝 (c / d)) := by
103+ apply Filter.Tendsto.congr'
104+ case f₁ => exact fun k ↦ (a * (↑k)⁻¹ + c) / (b * (↑k)⁻¹ + d)
105+ · refine (eventually_ne_atTop 0 ).mp (Eventually.of_forall ?_)
106+ intro h hx
107+ dsimp
108+ field (discharger := norm_cast)
109+ · apply Filter.Tendsto.div _ _ hd
110+ all_goals
111+ apply zero_add (_ : 𝕜) ▸ Filter.Tendsto.add_const _ _
112+ apply mul_zero (_ : 𝕜) ▸ Filter.Tendsto.const_mul _ _
113+ exact tendsto_inv_atTop_nhds_zero_nat
114+
97115/-- For any positive `m : ℕ`, `((n % m : ℕ) : ℝ) / (n : ℝ)` tends to `0` as `n` tends to `∞`. -/
98116theorem tendsto_mod_div_atTop_nhds_zero_nat {m : ℕ} (hm : 0 < m) :
99117 Tendsto (fun n : ℕ => ((n % m : ℕ) : ℝ) / (n : ℝ)) atTop (𝓝 0 ) := by
@@ -117,7 +135,7 @@ theorem Filter.EventuallyEq.div_mul_cancel {α G : Type*} [GroupWithZero G] {f g
117135
118136/-- If `g` tends to `∞`, then eventually for all `x` we have `(f x / g x) * g x = f x`. -/
119137theorem Filter.EventuallyEq.div_mul_cancel_atTop {α K : Type *}
120- [Semifield K] [LinearOrder K] [IsStrictOrderedRing K]
138+ [DivisionSemiring K] [LinearOrder K] [IsStrictOrderedRing K]
121139 {f g : α → K} {l : Filter α} (hg : Tendsto g l atTop) :
122140 (fun x ↦ f x / g x * g x) =ᶠ[l] fun x ↦ f x :=
123141 div_mul_cancel <| hg.mono_right <| le_principal_iff.mpr <|
@@ -163,16 +181,14 @@ theorem tendsto_add_one_pow_atTop_atTop_of_pos
163181 not_bddAbove_iff.2 fun _ ↦ Set.exists_range_iff.2 <| add_one_pow_unbounded_of_pos _ h
164182
165183theorem tendsto_pow_atTop_atTop_of_one_lt
166- [Ring α] [LinearOrder α] [IsStrictOrderedRing α] [Archimedean α] {r : α}
167- (h : 1 < r) : Tendsto (fun n : ℕ ↦ r ^ n) atTop atTop :=
168- sub_add_cancel r 1 ▸ tendsto_add_one_pow_atTop_atTop_of_pos (sub_pos.2 h)
169-
170- theorem Nat.tendsto_pow_atTop_atTop_of_one_lt {m : ℕ} (h : 1 < m) :
171- Tendsto (fun n : ℕ ↦ m ^ n) atTop atTop :=
172- tsub_add_cancel_of_le (le_of_lt h) ▸ tendsto_add_one_pow_atTop_atTop_of_pos (tsub_pos_of_lt h)
184+ [Semiring α] [LinearOrder α] [IsStrictOrderedRing α] [ExistsAddOfLE α] [Archimedean α] {r : α}
185+ (h : 1 < r) : Tendsto (fun n : ℕ ↦ r ^ n) atTop atTop := by
186+ obtain ⟨r, r0, rfl⟩ := exists_pos_add_of_lt' h
187+ rw [add_comm]
188+ exact tendsto_add_one_pow_atTop_atTop_of_pos r0
173189
174190theorem tendsto_pow_atTop_nhds_zero_of_lt_one {𝕜 : Type *}
175- [Field 𝕜] [LinearOrder 𝕜] [IsStrictOrderedRing 𝕜] [Archimedean 𝕜]
191+ [Semifield 𝕜] [LinearOrder 𝕜] [IsStrictOrderedRing 𝕜] [ExistsAddOfLE 𝕜] [Archimedean 𝕜]
176192 [TopologicalSpace 𝕜] [OrderTopology 𝕜] {r : 𝕜} (h₁ : 0 ≤ r) (h₂ : r < 1 ) :
177193 Tendsto (fun n : ℕ ↦ r ^ n) atTop (𝓝 0 ) :=
178194 h₁.eq_or_lt.elim
@@ -201,7 +217,7 @@ theorem tendsto_pow_atTop_nhds_zero_of_lt_one {𝕜 : Type*}
201217 · simpa only [← abs_pow] using (tendsto_pow_atTop_nhds_zero_of_lt_one (abs_nonneg r)) h
202218
203219theorem tendsto_pow_atTop_nhdsWithin_zero_of_lt_one {𝕜 : Type *}
204- [Field 𝕜] [LinearOrder 𝕜] [IsStrictOrderedRing 𝕜]
220+ [Semifield 𝕜] [LinearOrder 𝕜] [IsStrictOrderedRing 𝕜] [ExistsAddOfLE 𝕜]
205221 [Archimedean 𝕜] [TopologicalSpace 𝕜] [OrderTopology 𝕜] {r : 𝕜} (h₁ : 0 < r) (h₂ : r < 1 ) :
206222 Tendsto (fun n : ℕ ↦ r ^ n) atTop (𝓝[>] 0 ) :=
207223 tendsto_inf.2
@@ -743,3 +759,23 @@ lemma Nat.tendsto_div_const_atTop {n : ℕ} (hn : n ≠ 0) : Tendsto (· / n) at
743759 rw [Tendsto, map_div_atTop_eq_nat n hn.bot_lt]
744760
745761end
762+
763+ @[deprecated (since := "2025-10-27")]
764+ alias tendsto_inverse_atTop_nhds_zero_nat := tendsto_inv_atTop_nhds_zero_nat
765+
766+ @[deprecated (since := "2025-10-27")]
767+ alias NNReal.tendsto_inverse_atTop_nhds_zero_nat := tendsto_inv_atTop_nhds_zero_nat
768+
769+ @[deprecated (since := "2025-10-27")]
770+ alias NNReal.tendsto_const_div_atTop_nhds_zero_nat := tendsto_const_div_atTop_nhds_zero_nat
771+
772+ @[deprecated (since := "2025-10-27")]
773+ alias NNReal.tendsto_algebraMap_inverse_atTop_nhds_zero_nat :=
774+ tendsto_algebraMap_inv_atTop_nhds_zero_nat
775+
776+ @[deprecated (since := "2025-10-27")]
777+ alias tendsto_algebraMap_inverse_atTop_nhds_zero_nat :=
778+ tendsto_algebraMap_inv_atTop_nhds_zero_nat
779+
780+ @[deprecated (since := "2025-10-27")]
781+ protected alias Nat.tendsto_pow_atTop_atTop_of_one_lt := tendsto_pow_atTop_atTop_of_one_lt
0 commit comments