Theorem: Polynomial.Monic.geom_sum
File: Mathlib/RingTheory/Polynomial/Basic.lean

tactic: nontriviality R
state_before: R : Type u
S : Type u_1
inst✝ : Semiring R
P : R[X]
hP : P.Monic
hdeg : 0 < P.natDegree
n : ℕ
hn : n ≠ 0
⊢ (∑ i ∈ range n, P ^ i).Monic
state_after: R : Type u
S : Type u_1
inst✝ : Semiring R
P : R[X]
hP : P.Monic
hdeg : 0 < P.natDegree
n : ℕ
hn : n ≠ 0
a✝ : Nontrivial R
⊢ (∑ i ∈ range n, P ^ i).Monic

tactic: obtain ⟨n, rfl⟩ := Nat.exists_eq_succ_of_ne_zero hn
state_before: R : Type u
S : Type u_1
inst✝ : Semiring R
P : R[X]
hP : P.Monic
hdeg : 0 < P.natDegree
n : ℕ
hn : n ≠ 0
a✝ : Nontrivial R
⊢ (∑ i ∈ range n, P ^ i).Monic
state_after: case intro
R : Type u
S : Type u_1
inst✝ : Semiring R
P : R[X]
hP : P.Monic
hdeg : 0 < P.natDegree
a✝ : Nontrivial R
n : ℕ
hn : n.succ ≠ 0
⊢ (∑ i ∈ range n.succ, P ^ i).Monic

tactic: rw [geom_sum_succ']
state_before: case intro
R : Type u
S : Type u_1
inst✝ : Semiring R
P : R[X]
hP : P.Monic
hdeg : 0 < P.natDegree
a✝ : Nontrivial R
n : ℕ
hn : n.succ ≠ 0
⊢ (∑ i ∈ range n.succ, P ^ i).Monic
state_after: case intro
R : Type u
S : Type u_1
inst✝ : Semiring R
P : R[X]
hP : P.Monic
hdeg : 0 < P.natDegree
a✝ : Nontrivial R
n : ℕ
hn : n.succ ≠ 0
⊢ (P ^ n + ∑ i ∈ range n, P ^ i).Monic

tactic: refine (hP.pow _).add_of_left ?_
state_before: case intro
R : Type u
S : Type u_1
inst✝ : Semiring R
P : R[X]
hP : P.Monic
hdeg : 0 < P.natDegree
a✝ : Nontrivial R
n : ℕ
hn : n.succ ≠ 0
⊢ (P ^ n + ∑ i ∈ range n, P ^ i).Monic
state_after: case intro
R : Type u
S : Type u_1
inst✝ : Semiring R
P : R[X]
hP : P.Monic
hdeg : 0 < P.natDegree
a✝ : Nontrivial R
n : ℕ
hn : n.succ ≠ 0
⊢ (∑ i ∈ range n, P ^ i).degree < (P ^ n).degree

tactic: refine lt_of_le_of_lt (degree_sum_le _ _) ?_
state_before: case intro
R : Type u
S : Type u_1
inst✝ : Semiring R
P : R[X]
hP : P.Monic
hdeg : 0 < P.natDegree
a✝ : Nontrivial R
n : ℕ
hn : n.succ ≠ 0
⊢ (∑ i ∈ range n, P ^ i).degree < (P ^ n).degree
state_after: case intro
R : Type u
S : Type u_1
inst✝ : Semiring R
P : R[X]
hP : P.Monic
hdeg : 0 < P.natDegree
a✝ : Nontrivial R
n : ℕ
hn : n.succ ≠ 0
⊢ ((range n).sup fun b => (P ^ b).degree) < (P ^ n).degree

tactic: rw [Finset.sup_lt_iff]
state_before: case intro
R : Type u
S : Type u_1
inst✝ : Semiring R
P : R[X]
hP : P.Monic
hdeg : 0 < P.natDegree
a✝ : Nontrivial R
n : ℕ
hn : n.succ ≠ 0
⊢ ((range n).sup fun b => (P ^ b).degree) < (P ^ n).degree
state_after: case intro
R : Type u
S : Type u_1
inst✝ : Semiring R
P : R[X]
hP : P.Monic
hdeg : 0 < P.natDegree
a✝ : Nontrivial R
n : ℕ
hn : n.succ ≠ 0
⊢ ∀ b ∈ range n, (P ^ b).degree < (P ^ n).degree

case intro
R : Type u
S : Type u_1
inst✝ : Semiring R
P : R[X]
hP : P.Monic
hdeg : 0 < P.natDegree
a✝ : Nontrivial R
n : ℕ
hn : n.succ ≠ 0
⊢ ⊥ < (P ^ n).degree

tactic: simp only [Finset.mem_range, degree_eq_natDegree (hP.pow _).ne_zero]
state_before: case intro
R : Type u
S : Type u_1
inst✝ : Semiring R
P : R[X]
hP : P.Monic
hdeg : 0 < P.natDegree
a✝ : Nontrivial R
n : ℕ
hn : n.succ ≠ 0
⊢ ∀ b ∈ range n, (P ^ b).degree < (P ^ n).degree
state_after: case intro
R : Type u
S : Type u_1
inst✝ : Semiring R
P : R[X]
hP : P.Monic
hdeg : 0 < P.natDegree
a✝ : Nontrivial R
n : ℕ
hn : n.succ ≠ 0
⊢ ∀ b < n, ↑(P ^ b).natDegree < ↑(P ^ n).natDegree

tactic: simp only [Nat.cast_lt, hP.natDegree_pow]
state_before: case intro
R : Type u
S : Type u_1
inst✝ : Semiring R
P : R[X]
hP : P.Monic
hdeg : 0 < P.natDegree
a✝ : Nontrivial R
n : ℕ
hn : n.succ ≠ 0
⊢ ∀ b < n, ↑(P ^ b).natDegree < ↑(P ^ n).natDegree
state_after: case intro
R : Type u
S : Type u_1
inst✝ : Semiring R
P : R[X]
hP : P.Monic
hdeg : 0 < P.natDegree
a✝ : Nontrivial R
n : ℕ
hn : n.succ ≠ 0
⊢ ∀ b < n, b * P.natDegree < n * P.natDegree

tactic: intro k
state_before: case intro
R : Type u
S : Type u_1
inst✝ : Semiring R
P : R[X]
hP : P.Monic
hdeg : 0 < P.natDegree
a✝ : Nontrivial R
n : ℕ
hn : n.succ ≠ 0
⊢ ∀ b < n, b * P.natDegree < n * P.natDegree
state_after: case intro
R : Type u
S : Type u_1
inst✝ : Semiring R
P : R[X]
hP : P.Monic
hdeg : 0 < P.natDegree
a✝ : Nontrivial R
n : ℕ
hn : n.succ ≠ 0
k : ℕ
⊢ k < n → k * P.natDegree < n * P.natDegree

tactic: exact nsmul_lt_nsmul_left hdeg
state_before: case intro
R : Type u
S : Type u_1
inst✝ : Semiring R
P : R[X]
hP : P.Monic
hdeg : 0 < P.natDegree
a✝ : Nontrivial R
n : ℕ
hn : n.succ ≠ 0
k : ℕ
⊢ k < n → k * P.natDegree < n * P.natDegree
state_after: no goals

tactic: rw [bot_lt_iff_ne_bot, Ne, degree_eq_bot]
state_before: case intro
R : Type u
S : Type u_1
inst✝ : Semiring R
P : R[X]
hP : P.Monic
hdeg : 0 < P.natDegree
a✝ : Nontrivial R
n : ℕ
hn : n.succ ≠ 0
⊢ ⊥ < (P ^ n).degree
state_after: case intro
R : Type u
S : Type u_1
inst✝ : Semiring R
P : R[X]
hP : P.Monic
hdeg : 0 < P.natDegree
a✝ : Nontrivial R
n : ℕ
hn : n.succ ≠ 0
⊢ ¬P ^ n = 0

tactic: exact (hP.pow _).ne_zero
state_before: case intro
R : Type u
S : Type u_1
inst✝ : Semiring R
P : R[X]
hP : P.Monic
hdeg : 0 < P.natDegree
a✝ : Nontrivial R
n : ℕ
hn : n.succ ≠ 0
⊢ ¬P ^ n = 0
state_after: no goals