Theorem: Polynomial.natDegree_expand
File: Mathlib/Data/Polynomial/Expand.lean

tactic: cases' p.eq_zero_or_pos with hp hp
state_before: R : Type u
inst✝¹ : CommSemiring R
S : Type v
inst✝ : CommSemiring S
p✝ q p : ℕ
f : R[X]
⊢ natDegree (↑(expand R p) f) = natDegree f * p

tactic: by_cases hf : f = 0
state_before: case inr
R : Type u
inst✝¹ : CommSemiring R
S : Type v
inst✝ : CommSemiring S
p✝ q p : ℕ
f : R[X]
hp : p > 0
⊢ natDegree (↑(expand R p) f) = natDegree f * p

tactic: have hf1 : expand R p f ≠ 0 := mt (expand_eq_zero hp).1 hf
state_before: case neg
R : Type u
inst✝¹ : CommSemiring R
S : Type v
inst✝ : CommSemiring S
p✝ q p : ℕ
f : R[X]
hp : p > 0
hf : ¬f = 0
⊢ natDegree (↑(expand R p) f) = natDegree f * p

tactic: rw [← WithBot.coe_eq_coe]
state_before: case neg
R : Type u
inst✝¹ : CommSemiring R
S : Type v
inst✝ : CommSemiring S
p✝ q p : ℕ
f : R[X]
hp : p > 0
hf : ¬f = 0
hf1 : ↑(expand R p) f ≠ 0
⊢ natDegree (↑(expand R p) f) = natDegree f * p

tactic: convert (degree_eq_natDegree hf1).symm
state_before: case neg
R : Type u
inst✝¹ : CommSemiring R
S : Type v
inst✝ : CommSemiring S
p✝ q p : ℕ
f : R[X]
hp : p > 0
hf : ¬f = 0
hf1 : ↑(expand R p) f ≠ 0
⊢ ↑(natDegree (↑(expand R p) f)) = ↑(natDegree f * p)

tactic: symm
state_before: case h.e'_3
R : Type u
inst✝¹ : CommSemiring R
S : Type v
inst✝ : CommSemiring S
p✝ q p : ℕ
f : R[X]
hp : p > 0
hf : ¬f = 0
hf1 : ↑(expand R p) f ≠ 0
⊢ ↑(natDegree f * p) = degree (↑(expand R p) f)

tactic: refine' le_antisymm ((degree_le_iff_coeff_zero _ _).2 fun n hn => _) _
state_before: case h.e'_3
R : Type u
inst✝¹ : CommSemiring R
S : Type v
inst✝ : CommSemiring S
p✝ q p : ℕ
f : R[X]
hp : p > 0
hf : ¬f = 0
hf1 : ↑(expand R p) f ≠ 0
⊢ degree (↑(expand R p) f) = ↑(natDegree f * p)

tactic: rw [hp, coe_expand, pow_zero, MulZeroClass.mul_zero, ← C_1, eval₂_hom, natDegree_C]
state_before: case inl
R : Type u
inst✝¹ : CommSemiring R
S : Type v
inst✝ : CommSemiring S
p✝ q p : ℕ
f : R[X]
hp : p = 0
⊢ natDegree (↑(expand R p) f) = natDegree f * p

tactic: rw [hf, AlgHom.map_zero, natDegree_zero, MulZeroClass.zero_mul]
state_before: case pos
R : Type u
inst✝¹ : CommSemiring R
S : Type v
inst✝ : CommSemiring S
p✝ q p : ℕ
f : R[X]
hp : p > 0
hf : f = 0
⊢ natDegree (↑(expand R p) f) = natDegree f * p

tactic: rw [coeff_expand hp]
state_before: case h.e'_3.refine'_1
R : Type u
inst✝¹ : CommSemiring R
S : Type v
inst✝ : CommSemiring S
p✝ q p : ℕ
f : R[X]
hp : p > 0
hf : ¬f = 0
hf1 : ↑(expand R p) f ≠ 0
n : ℕ
hn : ↑(natDegree f * p) < ↑n
⊢ coeff (↑(expand R p) f) n = 0

tactic: split_ifs with hpn
state_before: case h.e'_3.refine'_1
R : Type u
inst✝¹ : CommSemiring R
S : Type v
inst✝ : CommSemiring S
p✝ q p : ℕ
f : R[X]
hp : p > 0
hf : ¬f = 0
hf1 : ↑(expand R p) f ≠ 0
n : ℕ
hn : ↑(natDegree f * p) < ↑n
⊢ (if p ∣ n then coeff f (n / p) else 0) = 0

tactic: rw [coeff_eq_zero_of_natDegree_lt]
state_before: case h.e'_3.refine'_1.inl
R : Type u
inst✝¹ : CommSemiring R
S : Type v
inst✝ : CommSemiring S
p✝ q p : ℕ
f : R[X]
hp : p > 0
hf : ¬f = 0
hf1 : ↑(expand R p) f ≠ 0
n : ℕ
hn : ↑(natDegree f * p) < ↑n
hpn : p ∣ n
⊢ coeff f (n / p) = 0

tactic: contrapose! hn
state_before: case h.e'_3.refine'_1.inl
R : Type u
inst✝¹ : CommSemiring R
S : Type v
inst✝ : CommSemiring S
p✝ q p : ℕ
f : R[X]
hp : p > 0
hf : ¬f = 0
hf1 : ↑(expand R p) f ≠ 0
n : ℕ
hn : ↑(natDegree f * p) < ↑n
hpn : p ∣ n
⊢ natDegree f < n / p

tactic: erw [WithBot.coe_le_coe, ← Nat.div_mul_cancel hpn]
state_before: case h.e'_3.refine'_1.inl
R : Type u
inst✝¹ : CommSemiring R
S : Type v
inst✝ : CommSemiring S
p✝ q p : ℕ
f : R[X]
hp : p > 0
hf : ¬f = 0
hf1 : ↑(expand R p) f ≠ 0
n : ℕ
hpn : p ∣ n
hn : n / p ≤ natDegree f
⊢ ↑n ≤ ↑(natDegree f * p)

tactic: exact Nat.mul_le_mul_right p hn
state_before: case h.e'_3.refine'_1.inl
R : Type u
inst✝¹ : CommSemiring R
S : Type v
inst✝ : CommSemiring S
p✝ q p : ℕ
f : R[X]
hp : p > 0
hf : ¬f = 0
hf1 : ↑(expand R p) f ≠ 0
n : ℕ
hpn : p ∣ n
hn : n / p ≤ natDegree f
⊢ ↑(n / p * p) ≤ natDegree f * p

tactic: rfl
state_before: case h.e'_3.refine'_1.inr
R : Type u
inst✝¹ : CommSemiring R
S : Type v
inst✝ : CommSemiring S
p✝ q p : ℕ
f : R[X]
hp : p > 0
hf : ¬f = 0
hf1 : ↑(expand R p) f ≠ 0
n : ℕ
hn : ↑(natDegree f * p) < ↑n
hpn : ¬p ∣ n
⊢ 0 = 0

tactic: refine' le_degree_of_ne_zero _
state_before: case h.e'_3.refine'_2
R : Type u
inst✝¹ : CommSemiring R
S : Type v
inst✝ : CommSemiring S
p✝ q p : ℕ
f : R[X]
hp : p > 0
hf : ¬f = 0
hf1 : ↑(expand R p) f ≠ 0
⊢ ↑(natDegree f * p) ≤ degree (↑(expand R p) f)

tactic: erw [coeff_expand_mul hp, ← leadingCoeff]
state_before: case h.e'_3.refine'_2
R : Type u
inst✝¹ : CommSemiring R
S : Type v
inst✝ : CommSemiring S
p✝ q p : ℕ
f : R[X]
hp : p > 0
hf : ¬f = 0
hf1 : ↑(expand R p) f ≠ 0
⊢ coeff (↑(expand R p) f) (Mul.mul (natDegree f) p) ≠ 0

tactic: exact mt leadingCoeff_eq_zero.1 hf
state_before: case h.e'_3.refine'_2
R : Type u
inst✝¹ : CommSemiring R
S : Type v
inst✝ : CommSemiring S
p✝ q p : ℕ
f : R[X]
hp : p > 0
hf : ¬f = 0
hf1 : ↑(expand R p) f ≠ 0
⊢ leadingCoeff f ≠ 0