Theorem: cauchySeq_prod_of_eventually_eq
File: Mathlib/Analysis/Normed/Group/Basic.lean

tactic: let d : ℕ → E := fun n => ∏ k in range (n + 1), u k / v k
state_before: 𝓕 : Type ?u.1218103
𝕜 : Type ?u.1218106
α : Type ?u.1218109
ι : Type ?u.1218112
κ : Type ?u.1218115
E : Type u_1
F : Type ?u.1218121
G : Type ?u.1218124
inst✝¹ : SeminormedCommGroup E
inst✝ : SeminormedCommGroup F
a a₁ a₂ b b₁ b₂ : E
r r₁ r₂ : ℝ
u v : ℕ → E
N : ℕ
huv : ∀ (n : ℕ), n ≥ N → u n = v n
hv : CauchySeq fun n => ∏ k in range (n + 1), v k
⊢ CauchySeq fun n => ∏ k in range (n + 1), u k

tactic: rw [show (fun n => ∏ k in range (n + 1), u k) = d * fun n => ∏ k in range (n + 1), v k
    by ext n; simp]
state_before: 𝓕 : Type ?u.1218103
𝕜 : Type ?u.1218106
α : Type ?u.1218109
ι : Type ?u.1218112
κ : Type ?u.1218115
E : Type u_1
F : Type ?u.1218121
G : Type ?u.1218124
inst✝¹ : SeminormedCommGroup E
inst✝ : SeminormedCommGroup F
a a₁ a₂ b b₁ b₂ : E
r r₁ r₂ : ℝ
u v : ℕ → E
N : ℕ
huv : ∀ (n : ℕ), n ≥ N → u n = v n
hv : CauchySeq fun n => ∏ k in range (n + 1), v k
d : ℕ → E := fun n => ∏ k in range (n + 1), u k / v k
⊢ CauchySeq fun n => ∏ k in range (n + 1), u k

tactic: suffices ∀ n ≥ N, d n = d N by exact (tendsto_atTop_of_eventually_const this).cauchySeq.mul hv
state_before: 𝓕 : Type ?u.1218103
𝕜 : Type ?u.1218106
α : Type ?u.1218109
ι : Type ?u.1218112
κ : Type ?u.1218115
E : Type u_1
F : Type ?u.1218121
G : Type ?u.1218124
inst✝¹ : SeminormedCommGroup E
inst✝ : SeminormedCommGroup F
a a₁ a₂ b b₁ b₂ : E
r r₁ r₂ : ℝ
u v : ℕ → E
N : ℕ
huv : ∀ (n : ℕ), n ≥ N → u n = v n
hv : CauchySeq fun n => ∏ k in range (n + 1), v k
d : ℕ → E := fun n => ∏ k in range (n + 1), u k / v k
⊢ CauchySeq (d * fun n => ∏ k in range (n + 1), v k)

tactic: intro n hn
state_before: 𝓕 : Type ?u.1218103
𝕜 : Type ?u.1218106
α : Type ?u.1218109
ι : Type ?u.1218112
κ : Type ?u.1218115
E : Type u_1
F : Type ?u.1218121
G : Type ?u.1218124
inst✝¹ : SeminormedCommGroup E
inst✝ : SeminormedCommGroup F
a a₁ a₂ b b₁ b₂ : E
r r₁ r₂ : ℝ
u v : ℕ → E
N : ℕ
huv : ∀ (n : ℕ), n ≥ N → u n = v n
hv : CauchySeq fun n => ∏ k in range (n + 1), v k
d : ℕ → E := fun n => ∏ k in range (n + 1), u k / v k
⊢ ∀ (n : ℕ), n ≥ N → d n = d N

tactic: dsimp
state_before: 𝓕 : Type ?u.1218103
𝕜 : Type ?u.1218106
α : Type ?u.1218109
ι : Type ?u.1218112
κ : Type ?u.1218115
E : Type u_1
F : Type ?u.1218121
G : Type ?u.1218124
inst✝¹ : SeminormedCommGroup E
inst✝ : SeminormedCommGroup F
a a₁ a₂ b b₁ b₂ : E
r r₁ r₂ : ℝ
u v : ℕ → E
N : ℕ
huv : ∀ (n : ℕ), n ≥ N → u n = v n
hv : CauchySeq fun n => ∏ k in range (n + 1), v k
d : ℕ → E := fun n => ∏ k in range (n + 1), u k / v k
n : ℕ
hn : n ≥ N
⊢ d n = d N

tactic: rw [eventually_constant_prod _ hn]
state_before: 𝓕 : Type ?u.1218103
𝕜 : Type ?u.1218106
α : Type ?u.1218109
ι : Type ?u.1218112
κ : Type ?u.1218115
E : Type u_1
F : Type ?u.1218121
G : Type ?u.1218124
inst✝¹ : SeminormedCommGroup E
inst✝ : SeminormedCommGroup F
a a₁ a₂ b b₁ b₂ : E
r r₁ r₂ : ℝ
u v : ℕ → E
N : ℕ
huv : ∀ (n : ℕ), n ≥ N → u n = v n
hv : CauchySeq fun n => ∏ k in range (n + 1), v k
d : ℕ → E := fun n => ∏ k in range (n + 1), u k / v k
n : ℕ
hn : n ≥ N
⊢ ∏ k in range (n + 1), u k / v k = ∏ k in range (N + 1), u k / v k

tactic: intro m hm
state_before: 𝓕 : Type ?u.1218103
𝕜 : Type ?u.1218106
α : Type ?u.1218109
ι : Type ?u.1218112
κ : Type ?u.1218115
E : Type u_1
F : Type ?u.1218121
G : Type ?u.1218124
inst✝¹ : SeminormedCommGroup E
inst✝ : SeminormedCommGroup F
a a₁ a₂ b b₁ b₂ : E
r r₁ r₂ : ℝ
u v : ℕ → E
N : ℕ
huv : ∀ (n : ℕ), n ≥ N → u n = v n
hv : CauchySeq fun n => ∏ k in range (n + 1), v k
d : ℕ → E := fun n => ∏ k in range (n + 1), u k / v k
n : ℕ
hn : n ≥ N
⊢ ∀ (n : ℕ), n ≥ N → u n / v n = 1

tactic: simp [huv m hm]
state_before: 𝓕 : Type ?u.1218103
𝕜 : Type ?u.1218106
α : Type ?u.1218109
ι : Type ?u.1218112
κ : Type ?u.1218115
E : Type u_1
F : Type ?u.1218121
G : Type ?u.1218124
inst✝¹ : SeminormedCommGroup E
inst✝ : SeminormedCommGroup F
a a₁ a₂ b b₁ b₂ : E
r r₁ r₂ : ℝ
u v : ℕ → E
N : ℕ
huv : ∀ (n : ℕ), n ≥ N → u n = v n
hv : CauchySeq fun n => ∏ k in range (n + 1), v k
d : ℕ → E := fun n => ∏ k in range (n + 1), u k / v k
n : ℕ
hn : n ≥ N
m : ℕ
hm : m ≥ N
⊢ u m / v m = 1

tactic: ext n
state_before: 𝓕 : Type ?u.1218103
𝕜 : Type ?u.1218106
α : Type ?u.1218109
ι : Type ?u.1218112
κ : Type ?u.1218115
E : Type u_1
F : Type ?u.1218121
G : Type ?u.1218124
inst✝¹ : SeminormedCommGroup E
inst✝ : SeminormedCommGroup F
a a₁ a₂ b b₁ b₂ : E
r r₁ r₂ : ℝ
u v : ℕ → E
N : ℕ
huv : ∀ (n : ℕ), n ≥ N → u n = v n
hv : CauchySeq fun n => ∏ k in range (n + 1), v k
d : ℕ → E := fun n => ∏ k in range (n + 1), u k / v k
⊢ (fun n => ∏ k in range (n + 1), u k) = d * fun n => ∏ k in range (n + 1), v k

tactic: simp
state_before: case h
𝓕 : Type ?u.1218103
𝕜 : Type ?u.1218106
α : Type ?u.1218109
ι : Type ?u.1218112
κ : Type ?u.1218115
E : Type u_1
F : Type ?u.1218121
G : Type ?u.1218124
inst✝¹ : SeminormedCommGroup E
inst✝ : SeminormedCommGroup F
a a₁ a₂ b b₁ b₂ : E
r r₁ r₂ : ℝ
u v : ℕ → E
N : ℕ
huv : ∀ (n : ℕ), n ≥ N → u n = v n
hv : CauchySeq fun n => ∏ k in range (n + 1), v k
d : ℕ → E := fun n => ∏ k in range (n + 1), u k / v k
n : ℕ
⊢ ∏ k in range (n + 1), u k = (d * fun n => ∏ k in range (n + 1), v k) n

tactic: exact (tendsto_atTop_of_eventually_const this).cauchySeq.mul hv
state_before: 𝓕 : Type ?u.1218103
𝕜 : Type ?u.1218106
α : Type ?u.1218109
ι : Type ?u.1218112
κ : Type ?u.1218115
E : Type u_1
F : Type ?u.1218121
G : Type ?u.1218124
inst✝¹ : SeminormedCommGroup E
inst✝ : SeminormedCommGroup F
a a₁ a₂ b b₁ b₂ : E
r r₁ r₂ : ℝ
u v : ℕ → E
N : ℕ
huv : ∀ (n : ℕ), n ≥ N → u n = v n
hv : CauchySeq fun n => ∏ k in range (n + 1), v k
d : ℕ → E := fun n => ∏ k in range (n + 1), u k / v k
this : ∀ (n : ℕ), n ≥ N → d n = d N
⊢ CauchySeq (d * fun n => ∏ k in range (n + 1), v k)