Аналіз 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:

namespace Chapter6theorem declaration uses 'sorry'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:Sequencea ^ 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.ma.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.ma.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.m0 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.ma.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 + 1n.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.convergenta.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 declaration uses 'sorry'Sequence.lim_of_geometric {x:} (hx: |x| < 1) : lim ((fun (n:) x^n):Sequence) = 0 := x:hx:|x| < 1lim { 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 declaration uses 'sorry'Sequence.lim_of_geometric' {x:} (hx: x = 1) : lim ((fun (n:) x^n):Sequence) = 1 := x:hx:x = 1lim { 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 declaration uses 'sorry'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 declaration uses 'sorry'Sequence.lim_of_roots {x:} (hx: x > 0) : lim ((fun (n:) x^(1/(n+1))):Sequence) = 1 := x:hx:x > 0lim { 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 declaration uses 'sorry'Sequence.lim_of_rat_power_decay {q:} (hq: q > 0) : lim ((fun (n:) 1/((n:)+1)^(q:)):Sequence) = 0 := q:hq:q > 0lim { 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 declaration uses 'sorry'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