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

tactic: nontriviality R
state_before: R : Type u
ι : Type w
s : Finset ι
inst✝ : CommSemiring R
f : ι → R[X]
t : Multiset R[X]
h : ∀ f ∈ t, f.Monic
⊢ t.prod.natDegree = (Multiset.map natDegree t).sum
state_after: R : Type u
ι : Type w
s : Finset ι
inst✝ : CommSemiring R
f : ι → R[X]
t : Multiset R[X]
h : ∀ f ∈ t, f.Monic
a✝ : Nontrivial R
⊢ t.prod.natDegree = (Multiset.map natDegree t).sum

tactic: apply natDegree_multiset_prod'
state_before: R : Type u
ι : Type w
s : Finset ι
inst✝ : CommSemiring R
f : ι → R[X]
t : Multiset R[X]
h : ∀ f ∈ t, f.Monic
a✝ : Nontrivial R
⊢ t.prod.natDegree = (Multiset.map natDegree t).sum
state_after: case h
R : Type u
ι : Type w
s : Finset ι
inst✝ : CommSemiring R
f : ι → R[X]
t : Multiset R[X]
h : ∀ f ∈ t, f.Monic
a✝ : Nontrivial R
⊢ (Multiset.map (fun f => f.leadingCoeff) t).prod ≠ 0

tactic: suffices (t.map fun f => leadingCoeff f).prod = 1 by
  rw [this]
  simp
state_before: case h
R : Type u
ι : Type w
s : Finset ι
inst✝ : CommSemiring R
f : ι → R[X]
t : Multiset R[X]
h : ∀ f ∈ t, f.Monic
a✝ : Nontrivial R
⊢ (Multiset.map (fun f => f.leadingCoeff) t).prod ≠ 0
state_after: case h
R : Type u
ι : Type w
s : Finset ι
inst✝ : CommSemiring R
f : ι → R[X]
t : Multiset R[X]
h : ∀ f ∈ t, f.Monic
a✝ : Nontrivial R
⊢ (Multiset.map (fun f => f.leadingCoeff) t).prod = 1

tactic: convert prod_replicate (Multiset.card t) (1 : R)
state_before: case h
R : Type u
ι : Type w
s : Finset ι
inst✝ : CommSemiring R
f : ι → R[X]
t : Multiset R[X]
h : ∀ f ∈ t, f.Monic
a✝ : Nontrivial R
⊢ (Multiset.map (fun f => f.leadingCoeff) t).prod = 1
state_after: case h.e'_2.h.e'_3
R : Type u
ι : Type w
s : Finset ι
inst✝ : CommSemiring R
f : ι → R[X]
t : Multiset R[X]
h : ∀ f ∈ t, f.Monic
a✝ : Nontrivial R
⊢ Multiset.map (fun f => f.leadingCoeff) t = replicate (Multiset.card t) 1

case h.e'_3
R : Type u
ι : Type w
s : Finset ι
inst✝ : CommSemiring R
f : ι → R[X]
t : Multiset R[X]
h : ∀ f ∈ t, f.Monic
a✝ : Nontrivial R
⊢ 1 = 1 ^ Multiset.card t

tactic: rw [this]
state_before: R : Type u
ι : Type w
s : Finset ι
inst✝ : CommSemiring R
f : ι → R[X]
t : Multiset R[X]
h : ∀ f ∈ t, f.Monic
a✝ : Nontrivial R
this : (Multiset.map (fun f => f.leadingCoeff) t).prod = 1
⊢ (Multiset.map (fun f => f.leadingCoeff) t).prod ≠ 0
state_after: R : Type u
ι : Type w
s : Finset ι
inst✝ : CommSemiring R
f : ι → R[X]
t : Multiset R[X]
h : ∀ f ∈ t, f.Monic
a✝ : Nontrivial R
this : (Multiset.map (fun f => f.leadingCoeff) t).prod = 1
⊢ 1 ≠ 0

tactic: simp
state_before: R : Type u
ι : Type w
s : Finset ι
inst✝ : CommSemiring R
f : ι → R[X]
t : Multiset R[X]
h : ∀ f ∈ t, f.Monic
a✝ : Nontrivial R
this : (Multiset.map (fun f => f.leadingCoeff) t).prod = 1
⊢ 1 ≠ 0
state_after: no goals

tactic: simp only [eq_replicate, Multiset.card_map, eq_self_iff_true, true_and_iff]
state_before: case h.e'_2.h.e'_3
R : Type u
ι : Type w
s : Finset ι
inst✝ : CommSemiring R
f : ι → R[X]
t : Multiset R[X]
h : ∀ f ∈ t, f.Monic
a✝ : Nontrivial R
⊢ Multiset.map (fun f => f.leadingCoeff) t = replicate (Multiset.card t) 1
state_after: case h.e'_2.h.e'_3
R : Type u
ι : Type w
s : Finset ι
inst✝ : CommSemiring R
f : ι → R[X]
t : Multiset R[X]
h : ∀ f ∈ t, f.Monic
a✝ : Nontrivial R
⊢ ∀ b ∈ Multiset.map (fun f => f.leadingCoeff) t, b = 1

tactic: rintro i hi
state_before: case h.e'_2.h.e'_3
R : Type u
ι : Type w
s : Finset ι
inst✝ : CommSemiring R
f : ι → R[X]
t : Multiset R[X]
h : ∀ f ∈ t, f.Monic
a✝ : Nontrivial R
⊢ ∀ b ∈ Multiset.map (fun f => f.leadingCoeff) t, b = 1
state_after: case h.e'_2.h.e'_3
R : Type u
ι : Type w
s : Finset ι
inst✝ : CommSemiring R
f : ι → R[X]
t : Multiset R[X]
h : ∀ f ∈ t, f.Monic
a✝ : Nontrivial R
i : R
hi : i ∈ Multiset.map (fun f => f.leadingCoeff) t
⊢ i = 1

tactic: obtain ⟨i, hi, rfl⟩ := Multiset.mem_map.mp hi
state_before: case h.e'_2.h.e'_3
R : Type u
ι : Type w
s : Finset ι
inst✝ : CommSemiring R
f : ι → R[X]
t : Multiset R[X]
h : ∀ f ∈ t, f.Monic
a✝ : Nontrivial R
i : R
hi : i ∈ Multiset.map (fun f => f.leadingCoeff) t
⊢ i = 1
state_after: case h.e'_2.h.e'_3.intro.intro
R : Type u
ι : Type w
s : Finset ι
inst✝ : CommSemiring R
f : ι → R[X]
t : Multiset R[X]
h : ∀ f ∈ t, f.Monic
a✝ : Nontrivial R
i : R[X]
hi✝ : i ∈ t
hi : i.leadingCoeff ∈ Multiset.map (fun f => f.leadingCoeff) t
⊢ i.leadingCoeff = 1

tactic: apply h
state_before: case h.e'_2.h.e'_3.intro.intro
R : Type u
ι : Type w
s : Finset ι
inst✝ : CommSemiring R
f : ι → R[X]
t : Multiset R[X]
h : ∀ f ∈ t, f.Monic
a✝ : Nontrivial R
i : R[X]
hi✝ : i ∈ t
hi : i.leadingCoeff ∈ Multiset.map (fun f => f.leadingCoeff) t
⊢ i.leadingCoeff = 1
state_after: case h.e'_2.h.e'_3.intro.intro.a
R : Type u
ι : Type w
s : Finset ι
inst✝ : CommSemiring R
f : ι → R[X]
t : Multiset R[X]
h : ∀ f ∈ t, f.Monic
a✝ : Nontrivial R
i : R[X]
hi✝ : i ∈ t
hi : i.leadingCoeff ∈ Multiset.map (fun f => f.leadingCoeff) t
⊢ i ∈ t

tactic: assumption
state_before: case h.e'_2.h.e'_3.intro.intro.a
R : Type u
ι : Type w
s : Finset ι
inst✝ : CommSemiring R
f : ι → R[X]
t : Multiset R[X]
h : ∀ f ∈ t, f.Monic
a✝ : Nontrivial R
i : R[X]
hi✝ : i ∈ t
hi : i.leadingCoeff ∈ Multiset.map (fun f => f.leadingCoeff) t
⊢ i ∈ t
state_after: no goals

tactic: simp
state_before: case h.e'_3
R : Type u
ι : Type w
s : Finset ι
inst✝ : CommSemiring R
f : ι → R[X]
t : Multiset R[X]
h : ∀ f ∈ t, f.Monic
a✝ : Nontrivial R
⊢ 1 = 1 ^ Multiset.card t
state_after: no goals