Аналіз I, Глава 6.5
I have attempted to make the translation as faithful a paraphrasing as possible of the original text. When there is a choice between a more idiomatic Lean solution and a more faithful translation, I have generally chosen the latter. In particular, there will be places where the Lean code could be "golfed" to be more elegant and idiomatic, but I have consciously avoided doing so.
Main constructions and results of this section:
-
Some standard limits, including limits of sequences of the form 1/n^α, x^n, and x^(1/n).
namespace Chapter6
theorem Sequence.lim_of_const (c:ℝ) : ((fun (n:ℕ) ↦ c):Sequence).tendsTo c := c:ℝ⊢ { m := 0, seq := fun n => if n ≥ 0 then (fun n => c) n.toNat else 0, vanish := ⋯ }.tendsTo c All goals completed! 🐙
instance Sequence.inst_pow: Pow Sequence ℕ where
pow a k := {
m := a.m
seq := fun (n:ℤ) ↦ if n ≥ a.m then a n ^ k else 0
vanish := a:Sequencek:ℕ⊢ ∀ n < a.m, (if n ≥ a.m then a.seq n ^ k else 0) = 0
a:Sequencek:ℕn:ℤhn:n < a.m⊢ (if n ≥ a.m then a.seq n ^ k else 0) = 0
a:Sequencek:ℕn:ℤhn:¬n ≥ a.m⊢ (if n ≥ a.m then a.seq n ^ k else 0) = 0
All goals completed! 🐙
}
@[simp]
lemma Sequence.pow_one (a:Sequence) : a^1 = a := a:Sequence⊢ a ^ 1 = a
a:Sequence⊢ (a ^ 1).m = a.ma:Sequencen:ℤ⊢ (a ^ 1).seq n = a.seq n
a:Sequence⊢ (a ^ 1).m = a.m All goals completed! 🐙
a:Sequencen:ℤ⊢ (if n ≥ a.m then Monoid.npow 1 (a.seq n) else 0) = a.seq n
a:Sequencen:ℤh:n ≥ a.m⊢ (if n ≥ a.m then Monoid.npow 1 (a.seq n) else 0) = a.seq na:Sequencen:ℤh:¬n ≥ a.m⊢ (if n ≥ a.m then Monoid.npow 1 (a.seq n) else 0) = a.seq n
a:Sequencen:ℤh:n ≥ a.m⊢ (if n ≥ a.m then Monoid.npow 1 (a.seq n) else 0) = a.seq n All goals completed! 🐙
All goals completed! 🐙
lemma Sequence.pow_succ (a:Sequence) (k:ℕ) : a^(k+1) = a^k * a := a:Sequencek:ℕ⊢ a ^ (k + 1) = a ^ k * a
a:Sequencek:ℕ⊢ (a ^ (k + 1)).m = (a ^ k * a).ma:Sequencek:ℕn:ℤ⊢ (a ^ (k + 1)).seq n = (a ^ k * a).seq n
a:Sequencek:ℕ⊢ (a ^ (k + 1)).m = (a ^ k * a).m a:Sequencek:ℕ⊢ a.m = max a.m a.m
All goals completed! 🐙
a:Sequencek:ℕn:ℤ⊢ (if n ≥ a.m then Monoid.npow (k + 1) (a.seq n) else 0) =
if n ≥ max a.m a.m then Real.mul✝ (if n ≥ a.m then Monoid.npow k (a.seq n) else 0) (a.seq n) else 0
a:Sequencek:ℕn:ℤh:n ≥ a.m⊢ (if n ≥ a.m then Monoid.npow (k + 1) (a.seq n) else 0) =
if n ≥ max a.m a.m then Real.mul✝ (if n ≥ a.m then Monoid.npow k (a.seq n) else 0) (a.seq n) else 0a:Sequencek:ℕn:ℤh:¬n ≥ a.m⊢ (if n ≥ a.m then Monoid.npow (k + 1) (a.seq n) else 0) =
if n ≥ max a.m a.m then Real.mul✝ (if n ≥ a.m then Monoid.npow k (a.seq n) else 0) (a.seq n) else 0
a:Sequencek:ℕn:ℤh:n ≥ a.m⊢ (if n ≥ a.m then Monoid.npow (k + 1) (a.seq n) else 0) =
if n ≥ max a.m a.m then Real.mul✝ (if n ≥ a.m then Monoid.npow k (a.seq n) else 0) (a.seq n) else 0 a:Sequencek:ℕn:ℤh:n ≥ a.m⊢ a.seq n ^ (k + 1) = Real.mul✝ (a.seq n ^ k) (a.seq n); All goals completed! 🐙
All goals completed! 🐙
Наслідок 6.5.1
theorem Sequence.lim_of_power_decay {k:ℕ} :
((fun (n:ℕ) ↦ 1/((n:ℝ)+1)^(1/(k+1:ℝ))):Sequence).tendsTo 0 := k:ℕ⊢ { m := 0, seq := fun n => if n ≥ 0 then (fun n => 1 / (↑n + 1) ^ (1 / (↑k + 1))) n.toNat else 0, vanish := ⋯ }.tendsTo 0
-- This proof is written to follow the structure of the original text.
k:ℕa:Sequence := { m := 0, seq := fun n => if n ≥ 0 then (fun n => 1 / (↑n + 1) ^ (1 / (↑k + 1))) n.toNat else 0, vanish := ⋯ }⊢ a.tendsTo 0
have ha : a.bddBelow := k:ℕ⊢ { m := 0, seq := fun n => if n ≥ 0 then (fun n => 1 / (↑n + 1) ^ (1 / (↑k + 1))) n.toNat else 0, vanish := ⋯ }.tendsTo 0
k:ℕa:Sequence := { m := 0, seq := fun n => if n ≥ 0 then (fun n => 1 / (↑n + 1) ^ (1 / (↑k + 1))) n.toNat else 0, vanish := ⋯ }⊢ a.bddBelowBy 0
k:ℕa:Sequence := { m := 0, seq := fun n => if n ≥ 0 then (fun n => 1 / (↑n + 1) ^ (1 / (↑k + 1))) n.toNat else 0, vanish := ⋯ }n:ℤhn:n ≥ a.m⊢ a.seq n ≥ 0
k:ℕa:Sequence := { m := 0, seq := fun n => if n ≥ 0 then (fun n => 1 / (↑n + 1) ^ (1 / (↑k + 1))) n.toNat else 0, vanish := ⋯ }n:ℤhn:n ≥ a.m⊢ 0 ≤ if 0 ≤ n then ((↑n.toNat + 1) ^ (↑k + 1)⁻¹)⁻¹ else 0
All goals completed! 🐙
have ha' : a.isAntitone := k:ℕ⊢ { m := 0, seq := fun n => if n ≥ 0 then (fun n => 1 / (↑n + 1) ^ (1 / (↑k + 1))) n.toNat else 0, vanish := ⋯ }.tendsTo 0
k:ℕa:Sequence := { m := 0, seq := fun n => if n ≥ 0 then (fun n => 1 / (↑n + 1) ^ (1 / (↑k + 1))) n.toNat else 0, vanish := ⋯ }ha:a.bddBelown:ℤhn:n ≥ a.m⊢ a.seq (n + 1) ≤ a.seq n
k:ℕa:Sequence := { m := 0, seq := fun n => if n ≥ 0 then (fun n => 1 / (↑n + 1) ^ (1 / (↑k + 1))) n.toNat else 0, vanish := ⋯ }ha:a.bddBelown:ℤhn:0 ≤ n⊢ (if 0 ≤ n + 1 then ((↑(n + 1).toNat + 1) ^ (↑k + 1)⁻¹)⁻¹ else 0) ≤ if 0 ≤ n then ((↑n.toNat + 1) ^ (↑k + 1)⁻¹)⁻¹ else 0
have hn' : 0 ≤ n+1 := k:ℕ⊢ { m := 0, seq := fun n => if n ≥ 0 then (fun n => 1 / (↑n + 1) ^ (1 / (↑k + 1))) n.toNat else 0, vanish := ⋯ }.tendsTo 0 All goals completed! 🐙
k:ℕa:Sequence := { m := 0, seq := fun n => if n ≥ 0 then (fun n => 1 / (↑n + 1) ^ (1 / (↑k + 1))) n.toNat else 0, vanish := ⋯ }ha:a.bddBelown:ℤhn:0 ≤ nhn':0 ≤ n + 1⊢ ((↑(n + 1).toNat + 1) ^ (↑k + 1)⁻¹)⁻¹ ≤ ((↑n.toNat + 1) ^ (↑k + 1)⁻¹)⁻¹
k:ℕa:Sequence := { m := 0, seq := fun n => if n ≥ 0 then (fun n => 1 / (↑n + 1) ^ (1 / (↑k + 1))) n.toNat else 0, vanish := ⋯ }ha:a.bddBelown:ℤhn:0 ≤ nhn':0 ≤ n + 1⊢ ↑n.toNat + 1 ≤ ↑(n + 1).toNat + 1
All goals completed! 🐙
k:ℕa:Sequence := { m := 0, seq := fun n => if n ≥ 0 then (fun n => 1 / (↑n + 1) ^ (1 / (↑k + 1))) n.toNat else 0, vanish := ⋯ }ha:a.bddBelowha':a.convergent⊢ a.tendsTo 0
have hpow (n:ℕ): (a^(n+1)).convergent ∧ lim (a^(n+1)) = (lim a)^(n+1) := k:ℕ⊢ { m := 0, seq := fun n => if n ≥ 0 then (fun n => 1 / (↑n + 1) ^ (1 / (↑k + 1))) n.toNat else 0, vanish := ⋯ }.tendsTo 0
k:ℕa:Sequence := { m := 0, seq := fun n => if n ≥ 0 then (fun n => 1 / (↑n + 1) ^ (1 / (↑k + 1))) n.toNat else 0, vanish := ⋯ }ha:a.bddBelowha':a.convergent⊢ (a ^ (0 + 1)).convergent ∧ lim (a ^ (0 + 1)) = lim a ^ (0 + 1)k:ℕa:Sequence := { m := 0, seq := fun n => if n ≥ 0 then (fun n => 1 / (↑n + 1) ^ (1 / (↑k + 1))) n.toNat else 0, vanish := ⋯ }ha:a.bddBelowha':a.convergentn:ℕih:(a ^ (n + 1)).convergent ∧ lim (a ^ (n + 1)) = lim a ^ (n + 1)⊢ (a ^ (n + 1 + 1)).convergent ∧ lim (a ^ (n + 1 + 1)) = lim a ^ (n + 1 + 1)
k:ℕa:Sequence := { m := 0, seq := fun n => if n ≥ 0 then (fun n => 1 / (↑n + 1) ^ (1 / (↑k + 1))) n.toNat else 0, vanish := ⋯ }ha:a.bddBelowha':a.convergent⊢ (a ^ (0 + 1)).convergent ∧ lim (a ^ (0 + 1)) = lim a ^ (0 + 1) All goals completed! 🐙
k:ℕa:Sequence := { m := 0, seq := fun n => if n ≥ 0 then (fun n => 1 / (↑n + 1) ^ (1 / (↑k + 1))) n.toNat else 0, vanish := ⋯ }ha:a.bddBelowha':a.convergentn:ℕih:(a ^ (n + 1)).convergent ∧ lim (a ^ (n + 1)) = lim a ^ (n + 1)⊢ (a ^ (n + 1) * a).convergent ∧ lim (a ^ (n + 1) * a) = lim a ^ (n + 1 + 1)
k:ℕa:Sequence := { m := 0, seq := fun n => if n ≥ 0 then (fun n => 1 / (↑n + 1) ^ (1 / (↑k + 1))) n.toNat else 0, vanish := ⋯ }ha:a.bddBelowha':a.convergentn:ℕih:(a ^ (n + 1)).convergent ∧ lim (a ^ (n + 1)) = lim a ^ (n + 1)⊢ lim a ^ (n + 1 + 1) = lim (a ^ (n + 1)) * lim a
k:ℕa:Sequence := { m := 0, seq := fun n => if n ≥ 0 then (fun n => 1 / (↑n + 1) ^ (1 / (↑k + 1))) n.toNat else 0, vanish := ⋯ }ha:a.bddBelowha':a.convergentn:ℕih:(a ^ (n + 1)).convergent ∧ lim (a ^ (n + 1)) = lim a ^ (n + 1)⊢ lim a ^ (n + 1 + 1) = lim a ^ (n + 1) * lim a
All goals completed! 🐙
have hlim : (lim a)^(k+1) = 0 := k:ℕ⊢ { m := 0, seq := fun n => if n ≥ 0 then (fun n => 1 / (↑n + 1) ^ (1 / (↑k + 1))) n.toNat else 0, vanish := ⋯ }.tendsTo 0
k:ℕa:Sequence := { m := 0, seq := fun n => if n ≥ 0 then (fun n => 1 / (↑n + 1) ^ (1 / (↑k + 1))) n.toNat else 0, vanish := ⋯ }ha:a.bddBelowha':a.convergenthpow:∀ (n : ℕ), (a ^ (n + 1)).convergent ∧ lim (a ^ (n + 1)) = lim a ^ (n + 1)⊢ lim (a ^ (k + 1)) = 0
k:ℕa:Sequence := { m := 0, seq := fun n => if n ≥ 0 then (fun n => 1 / (↑n + 1) ^ (1 / (↑k + 1))) n.toNat else 0, vanish := ⋯ }ha:a.bddBelowha':a.convergenthpow:∀ (n : ℕ), (a ^ (n + 1)).convergent ∧ lim (a ^ (n + 1)) = lim a ^ (n + 1)n:ℤ⊢ (a ^ (k + 1)).seq n = if n ≥ 0 then (fun n => (↑n + 1)⁻¹) n.toNat else 0
k:ℕa:Sequence := { m := 0, seq := fun n => if n ≥ 0 then (fun n => 1 / (↑n + 1) ^ (1 / (↑k + 1))) n.toNat else 0, vanish := ⋯ }ha:a.bddBelowha':a.convergenthpow:∀ (n : ℕ), (a ^ (n + 1)).convergent ∧ lim (a ^ (n + 1)) = lim a ^ (n + 1)n:ℤ⊢ (if n ≥ 0 then Monoid.npow (k + 1) (if n ≥ 0 then 1 / (↑n.toNat + 1).rpow (1 / (↑k + 1)) else 0) else 0) =
if n ≥ 0 then (↑n.toNat + 1)⁻¹ else 0
k:ℕa:Sequence := { m := 0, seq := fun n => if n ≥ 0 then (fun n => 1 / (↑n + 1) ^ (1 / (↑k + 1))) n.toNat else 0, vanish := ⋯ }ha:a.bddBelowha':a.convergenthpow:∀ (n : ℕ), (a ^ (n + 1)).convergent ∧ lim (a ^ (n + 1)) = lim a ^ (n + 1)n:ℤh:n ≥ 0⊢ (if n ≥ 0 then Monoid.npow (k + 1) (if n ≥ 0 then 1 / (↑n.toNat + 1).rpow (1 / (↑k + 1)) else 0) else 0) =
if n ≥ 0 then (↑n.toNat + 1)⁻¹ else 0k:ℕa:Sequence := { m := 0, seq := fun n => if n ≥ 0 then (fun n => 1 / (↑n + 1) ^ (1 / (↑k + 1))) n.toNat else 0, vanish := ⋯ }ha:a.bddBelowha':a.convergenthpow:∀ (n : ℕ), (a ^ (n + 1)).convergent ∧ lim (a ^ (n + 1)) = lim a ^ (n + 1)n:ℤh:¬n ≥ 0⊢ (if n ≥ 0 then Monoid.npow (k + 1) (if n ≥ 0 then 1 / (↑n.toNat + 1).rpow (1 / (↑k + 1)) else 0) else 0) =
if n ≥ 0 then (↑n.toNat + 1)⁻¹ else 0
all_goals All goals completed! 🐙
k:ℕa:Sequence := { m := 0, seq := fun n => if n ≥ 0 then (fun n => 1 / (↑n + 1) ^ (1 / (↑k + 1))) n.toNat else 0, vanish := ⋯ }ha:a.bddBelowha':a.convergenthpow:∀ (n : ℕ), (a ^ (n + 1)).convergent ∧ lim (a ^ (n + 1)) = lim a ^ (n + 1)n:ℤh:n ≥ 0⊢ (↑n.toNat + 1) ^ ((↑k + 1)⁻¹ * ↑(k + 1)) = ↑n.toNat + 1
k:ℕa:Sequence := { m := 0, seq := fun n => if n ≥ 0 then (fun n => 1 / (↑n + 1) ^ (1 / (↑k + 1))) n.toNat else 0, vanish := ⋯ }ha:a.bddBelowha':a.convergenthpow:∀ (n : ℕ), (a ^ (n + 1)).convergent ∧ lim (a ^ (n + 1)) = lim a ^ (n + 1)n:ℤh:n ≥ 0⊢ (↑k + 1)⁻¹ * ↑(k + 1) = 1
All goals completed! 🐙
All goals completed! 🐙
Лема 6.5.2 / Вправа 6.5.2
theorem Sequence.lim_of_geometric {x:ℝ} (hx: |x| < 1) : lim ((fun (n:ℕ) ↦ x^n):Sequence) = 0 := x:ℝhx:|x| < 1⊢ lim { m := 0, seq := fun n => if n ≥ 0 then (fun n => x ^ n) n.toNat else 0, vanish := ⋯ } = 0
All goals completed! 🐙
Лема 6.5.2 / Вправа 6.5.2
theorem Sequence.lim_of_geometric' {x:ℝ} (hx: x = 1) : lim ((fun (n:ℕ) ↦ x^n):Sequence) = 1 := x:ℝhx:x = 1⊢ lim { m := 0, seq := fun n => if n ≥ 0 then (fun n => x ^ n) n.toNat else 0, vanish := ⋯ } = 1
All goals completed! 🐙
Лема 6.5.2 / Вправа 6.5.2
theorem Sequence.lim_of_geometric'' {x:ℝ} (hx: x = -1 ∨ |x| > 1) :
((fun (n:ℕ) ↦ x^n):Sequence).divergent := x:ℝhx:x = -1 ∨ |x| > 1⊢ { m := 0, seq := fun n => if n ≥ 0 then (fun n => x ^ n) n.toNat else 0, vanish := ⋯ }.divergent
All goals completed! 🐙
Лема 6.5.3 / Вправа 6.5.3
theorem Sequence.lim_of_roots {x:ℝ} (hx: x > 0) :
lim ((fun (n:ℕ) ↦ x^(1/(n+1))):Sequence) = 1 := x:ℝhx:x > 0⊢ lim { m := 0, seq := fun n => if n ≥ 0 then (fun n => x ^ (1 / (n + 1))) n.toNat else 0, vanish := ⋯ } = 1
All goals completed! 🐙
Вправа 6.5.1
theorem Sequence.lim_of_rat_power_decay {q:ℚ} (hq: q > 0) :
lim ((fun (n:ℕ) ↦ 1/((n:ℝ)+1)^(q:ℝ)):Sequence) = 0 := q:ℚhq:q > 0⊢ lim { m := 0, seq := fun n => if n ≥ 0 then (fun n => 1 / (↑n + 1) ^ ↑q) n.toNat else 0, vanish := ⋯ } = 0
All goals completed! 🐙
Вправа 6.5.1
theorem Sequence.lim_of_rat_power_growth {q:ℚ} (hq: q > 0) :
((fun (n:ℕ) ↦ ((n:ℝ)+1)^(q:ℝ)):Sequence).divergent := q:ℚhq:q > 0⊢ { m := 0, seq := fun n => if n ≥ 0 then (fun n => (↑n + 1) ^ ↑q) n.toNat else 0, vanish := ⋯ }.divergent
All goals completed! 🐙
end Chapter6