Theorem: Polynomial.multiset_prod_X_sub_C_coeff_card_pred
File: Mathlib/Algebra/Polynomial/BigOperators.lean

tactic: nontriviality R
state_before: R : Type u
ι : Type w
s : Finset ι
inst✝ : CommRing R
t : Multiset R
ht : 0 < Multiset.card t
⊢ (Multiset.map (fun x => X - C x) t).prod.coeff (Multiset.card t - 1) = -t.sum
state_after: R : Type u
ι : Type w
s : Finset ι
inst✝ : CommRing R
t : Multiset R
ht : 0 < Multiset.card t
a✝ : Nontrivial R
⊢ (Multiset.map (fun x => X - C x) t).prod.coeff (Multiset.card t - 1) = -t.sum

tactic: convert multiset_prod_X_sub_C_nextCoeff (by assumption)
state_before: R : Type u
ι : Type w
s : Finset ι
inst✝ : CommRing R
t : Multiset R
ht : 0 < Multiset.card t
a✝ : Nontrivial R
⊢ (Multiset.map (fun x => X - C x) t).prod.coeff (Multiset.card t - 1) = -t.sum
state_after: case h.e'_2
R : Type u
ι : Type w
s : Finset ι
inst✝ : CommRing R
t : Multiset R
ht : 0 < Multiset.card t
a✝ : Nontrivial R
⊢ (Multiset.map (fun x => X - C x) t).prod.coeff (Multiset.card t - 1) =
    (Multiset.map (fun x => X - C x) t).prod.nextCoeff

tactic: rw [nextCoeff, if_neg]
state_before: case h.e'_2
R : Type u
ι : Type w
s : Finset ι
inst✝ : CommRing R
t : Multiset R
ht : 0 < Multiset.card t
a✝ : Nontrivial R
⊢ (Multiset.map (fun x => X - C x) t).prod.coeff (Multiset.card t - 1) =
    (Multiset.map (fun x => X - C x) t).prod.nextCoeff
state_after: case h.e'_2
R : Type u
ι : Type w
s : Finset ι
inst✝ : CommRing R
t : Multiset R
ht : 0 < Multiset.card t
a✝ : Nontrivial R
⊢ (Multiset.map (fun x => X - C x) t).prod.coeff (Multiset.card t - 1) =
    (Multiset.map (fun x => X - C x) t).prod.coeff ((Multiset.map (fun x => X - C x) t).prod.natDegree - 1)

case h.e'_2.hnc
R : Type u
ι : Type w
s : Finset ι
inst✝ : CommRing R
t : Multiset R
ht : 0 < Multiset.card t
a✝ : Nontrivial R
⊢ ¬(Multiset.map (fun x => X - C x) t).prod.natDegree = 0

tactic: swap
state_before: case h.e'_2
R : Type u
ι : Type w
s : Finset ι
inst✝ : CommRing R
t : Multiset R
ht : 0 < Multiset.card t
a✝ : Nontrivial R
⊢ (Multiset.map (fun x => X - C x) t).prod.coeff (Multiset.card t - 1) =
    (Multiset.map (fun x => X - C x) t).prod.coeff ((Multiset.map (fun x => X - C x) t).prod.natDegree - 1)

case h.e'_2.hnc
R : Type u
ι : Type w
s : Finset ι
inst✝ : CommRing R
t : Multiset R
ht : 0 < Multiset.card t
a✝ : Nontrivial R
⊢ ¬(Multiset.map (fun x => X - C x) t).prod.natDegree = 0
state_after: case h.e'_2.hnc
R : Type u
ι : Type w
s : Finset ι
inst✝ : CommRing R
t : Multiset R
ht : 0 < Multiset.card t
a✝ : Nontrivial R
⊢ ¬(Multiset.map (fun x => X - C x) t).prod.natDegree = 0

case h.e'_2
R : Type u
ι : Type w
s : Finset ι
inst✝ : CommRing R
t : Multiset R
ht : 0 < Multiset.card t
a✝ : Nontrivial R
⊢ (Multiset.map (fun x => X - C x) t).prod.coeff (Multiset.card t - 1) =
    (Multiset.map (fun x => X - C x) t).prod.coeff ((Multiset.map (fun x => X - C x) t).prod.natDegree - 1)

tactic: congr
state_before: case h.e'_2
R : Type u
ι : Type w
s : Finset ι
inst✝ : CommRing R
t : Multiset R
ht : 0 < Multiset.card t
a✝ : Nontrivial R
⊢ (Multiset.map (fun x => X - C x) t).prod.coeff (Multiset.card t - 1) =
    (Multiset.map (fun x => X - C x) t).prod.coeff ((Multiset.map (fun x => X - C x) t).prod.natDegree - 1)
state_after: case h.e'_2.e_a.e_a
R : Type u
ι : Type w
s : Finset ι
inst✝ : CommRing R
t : Multiset R
ht : 0 < Multiset.card t
a✝ : Nontrivial R
⊢ Multiset.card t = (Multiset.map (fun x => X - C x) t).prod.natDegree

tactic: assumption
state_before: R : Type u
ι : Type w
s : Finset ι
inst✝ : CommRing R
t : Multiset R
ht : 0 < Multiset.card t
a✝ : Nontrivial R
⊢ Multiset ?m.822449
state_after: no goals

tactic: rw [natDegree_multiset_prod_of_monic]
state_before: case h.e'_2.hnc
R : Type u
ι : Type w
s : Finset ι
inst✝ : CommRing R
t : Multiset R
ht : 0 < Multiset.card t
a✝ : Nontrivial R
⊢ ¬(Multiset.map (fun x => X - C x) t).prod.natDegree = 0
state_after: case h.e'_2.hnc
R : Type u
ι : Type w
s : Finset ι
inst✝ : CommRing R
t : Multiset R
ht : 0 < Multiset.card t
a✝ : Nontrivial R
⊢ ¬(Multiset.map natDegree (Multiset.map (fun x => X - C x) t)).sum = 0

case h.e'_2.hnc.h
R : Type u
ι : Type w
s : Finset ι
inst✝ : CommRing R
t : Multiset R
ht : 0 < Multiset.card t
a✝ : Nontrivial R
⊢ ∀ f ∈ Multiset.map (fun x => X - C x) t, f.Monic

tactic: swap
state_before: case h.e'_2.hnc
R : Type u
ι : Type w
s : Finset ι
inst✝ : CommRing R
t : Multiset R
ht : 0 < Multiset.card t
a✝ : Nontrivial R
⊢ ¬(Multiset.map natDegree (Multiset.map (fun x => X - C x) t)).sum = 0

case h.e'_2.hnc.h
R : Type u
ι : Type w
s : Finset ι
inst✝ : CommRing R
t : Multiset R
ht : 0 < Multiset.card t
a✝ : Nontrivial R
⊢ ∀ f ∈ Multiset.map (fun x => X - C x) t, f.Monic
state_after: case h.e'_2.hnc.h
R : Type u
ι : Type w
s : Finset ι
inst✝ : CommRing R
t : Multiset R
ht : 0 < Multiset.card t
a✝ : Nontrivial R
⊢ ∀ f ∈ Multiset.map (fun x => X - C x) t, f.Monic

case h.e'_2.hnc
R : Type u
ι : Type w
s : Finset ι
inst✝ : CommRing R
t : Multiset R
ht : 0 < Multiset.card t
a✝ : Nontrivial R
⊢ ¬(Multiset.map natDegree (Multiset.map (fun x => X - C x) t)).sum = 0

tactic: simp_rw [Multiset.sum_eq_zero_iff, Multiset.mem_map]
state_before: case h.e'_2.hnc
R : Type u
ι : Type w
s : Finset ι
inst✝ : CommRing R
t : Multiset R
ht : 0 < Multiset.card t
a✝ : Nontrivial R
⊢ ¬(Multiset.map natDegree (Multiset.map (fun x => X - C x) t)).sum = 0
state_after: case h.e'_2.hnc
R : Type u
ι : Type w
s : Finset ι
inst✝ : CommRing R
t : Multiset R
ht : 0 < Multiset.card t
a✝ : Nontrivial R
⊢ ¬∀ (x : ℕ), (∃ a, (∃ a_1 ∈ t, X - C a_1 = a) ∧ a.natDegree = x) → x = 0

tactic: obtain ⟨x, hx⟩ := card_pos_iff_exists_mem.mp ht
state_before: case h.e'_2.hnc
R : Type u
ι : Type w
s : Finset ι
inst✝ : CommRing R
t : Multiset R
ht : 0 < Multiset.card t
a✝ : Nontrivial R
⊢ ¬∀ (x : ℕ), (∃ a, (∃ a_1 ∈ t, X - C a_1 = a) ∧ a.natDegree = x) → x = 0
state_after: case h.e'_2.hnc.intro
R : Type u
ι : Type w
s : Finset ι
inst✝ : CommRing R
t : Multiset R
ht : 0 < Multiset.card t
a✝ : Nontrivial R
x : R
hx : x ∈ t
⊢ ¬∀ (x : ℕ), (∃ a, (∃ a_1 ∈ t, X - C a_1 = a) ∧ a.natDegree = x) → x = 0

tactic: exact fun h => one_ne_zero <| h 1 ⟨_, ⟨x, hx, rfl⟩, natDegree_X_sub_C _⟩
state_before: case h.e'_2.hnc.intro
R : Type u
ι : Type w
s : Finset ι
inst✝ : CommRing R
t : Multiset R
ht : 0 < Multiset.card t
a✝ : Nontrivial R
x : R
hx : x ∈ t
⊢ ¬∀ (x : ℕ), (∃ a, (∃ a_1 ∈ t, X - C a_1 = a) ∧ a.natDegree = x) → x = 0
state_after: no goals

tactic: simp only [Multiset.mem_map]
state_before: case h.e'_2.hnc.h
R : Type u
ι : Type w
s : Finset ι
inst✝ : CommRing R
t : Multiset R
ht : 0 < Multiset.card t
a✝ : Nontrivial R
⊢ ∀ f ∈ Multiset.map (fun x => X - C x) t, f.Monic
state_after: case h.e'_2.hnc.h
R : Type u
ι : Type w
s : Finset ι
inst✝ : CommRing R
t : Multiset R
ht : 0 < Multiset.card t
a✝ : Nontrivial R
⊢ ∀ (f : R[X]), (∃ a ∈ t, X - C a = f) → f.Monic

tactic: rintro _ ⟨_, _, rfl⟩
state_before: case h.e'_2.hnc.h
R : Type u
ι : Type w
s : Finset ι
inst✝ : CommRing R
t : Multiset R
ht : 0 < Multiset.card t
a✝ : Nontrivial R
⊢ ∀ (f : R[X]), (∃ a ∈ t, X - C a = f) → f.Monic
state_after: case h.e'_2.hnc.h.intro.intro
R : Type u
ι : Type w
s : Finset ι
inst✝ : CommRing R
t : Multiset R
ht : 0 < Multiset.card t
a✝ : Nontrivial R
w✝ : R
left✝ : w✝ ∈ t
⊢ (X - C w✝).Monic

tactic: apply monic_X_sub_C
state_before: case h.e'_2.hnc.h.intro.intro
R : Type u
ι : Type w
s : Finset ι
inst✝ : CommRing R
t : Multiset R
ht : 0 < Multiset.card t
a✝ : Nontrivial R
w✝ : R
left✝ : w✝ ∈ t
⊢ (X - C w✝).Monic
state_after: no goals

tactic: simp [natDegree_X_sub_C, monic_X_sub_C]
state_before: case h.e'_2.e_a.e_a.h
R : Type u
ι : Type w
s : Finset ι
inst✝ : CommRing R
t : Multiset R
ht : 0 < Multiset.card t
a✝ : Nontrivial R
⊢ ∀ f ∈ Multiset.map (fun x => X - C x) t, f.Monic
state_after: no goals