Theorem: Polynomial.eq_zero_of_natDegree_lt_card_of_eval_eq_zero
File: Mathlib/Algebra/Polynomial/Roots.lean

tactic: classical
by_contra hp
apply not_lt_of_le (le_refl (Finset.card p.roots.toFinset))
calc
  Finset.card p.roots.toFinset ≤ Multiset.card p.roots := Multiset.toFinset_card_le _
  _ ≤ natDegree p := Polynomial.card_roots' p
  _ < Fintype.card ι := hcard
  _ = Fintype.card (Set.range f) := (Set.card_range_of_injective hf).symm
  _ = Finset.card (Finset.univ.image f) := by rw [← Set.toFinset_card, Set.toFinset_range]
  _ ≤ Finset.card p.roots.toFinset := Finset.card_mono ?_
intro _
simp only [Finset.mem_image, Finset.mem_univ, true_and, Multiset.mem_toFinset, mem_roots', ne_eq,
  IsRoot.def, forall_exists_index, hp, not_false_eq_true]
rintro x rfl
exact heval _
state_before: R✝ : Type u
S : Type v
T : Type w
a b : R✝
n : ℕ
inst✝⁴ : CommRing R✝
inst✝³ : IsDomain R✝
p✝ q : R✝[X]
R : Type u_1
inst✝² : CommRing R
inst✝¹ : IsDomain R
p : R[X]
ι : Type u_2
inst✝ : Fintype ι
f : ι → R
hf : Function.Injective f
heval : ∀ (i : ι), eval (f i) p = 0
hcard : p.natDegree < Fintype.card ι
⊢ p = 0
state_after: no goals

tactic: by_contra hp
state_before: R✝ : Type u
S : Type v
T : Type w
a b : R✝
n : ℕ
inst✝⁴ : CommRing R✝
inst✝³ : IsDomain R✝
p✝ q : R✝[X]
R : Type u_1
inst✝² : CommRing R
inst✝¹ : IsDomain R
p : R[X]
ι : Type u_2
inst✝ : Fintype ι
f : ι → R
hf : Function.Injective f
heval : ∀ (i : ι), eval (f i) p = 0
hcard : p.natDegree < Fintype.card ι
⊢ p = 0
state_after: R✝ : Type u
S : Type v
T : Type w
a b : R✝
n : ℕ
inst✝⁴ : CommRing R✝
inst✝³ : IsDomain R✝
p✝ q : R✝[X]
R : Type u_1
inst✝² : CommRing R
inst✝¹ : IsDomain R
p : R[X]
ι : Type u_2
inst✝ : Fintype ι
f : ι → R
hf : Function.Injective f
heval : ∀ (i : ι), eval (f i) p = 0
hcard : p.natDegree < Fintype.card ι
hp : ¬p = 0
⊢ False

tactic: apply not_lt_of_le (le_refl (Finset.card p.roots.toFinset))
state_before: R✝ : Type u
S : Type v
T : Type w
a b : R✝
n : ℕ
inst✝⁴ : CommRing R✝
inst✝³ : IsDomain R✝
p✝ q : R✝[X]
R : Type u_1
inst✝² : CommRing R
inst✝¹ : IsDomain R
p : R[X]
ι : Type u_2
inst✝ : Fintype ι
f : ι → R
hf : Function.Injective f
heval : ∀ (i : ι), eval (f i) p = 0
hcard : p.natDegree < Fintype.card ι
hp : ¬p = 0
⊢ False
state_after: R✝ : Type u
S : Type v
T : Type w
a b : R✝
n : ℕ
inst✝⁴ : CommRing R✝
inst✝³ : IsDomain R✝
p✝ q : R✝[X]
R : Type u_1
inst✝² : CommRing R
inst✝¹ : IsDomain R
p : R[X]
ι : Type u_2
inst✝ : Fintype ι
f : ι → R
hf : Function.Injective f
heval : ∀ (i : ι), eval (f i) p = 0
hcard : p.natDegree < Fintype.card ι
hp : ¬p = 0
⊢ p.roots.toFinset.card < p.roots.toFinset.card

tactic: calc
  Finset.card p.roots.toFinset ≤ Multiset.card p.roots := Multiset.toFinset_card_le _
  _ ≤ natDegree p := Polynomial.card_roots' p
  _ < Fintype.card ι := hcard
  _ = Fintype.card (Set.range f) := (Set.card_range_of_injective hf).symm
  _ = Finset.card (Finset.univ.image f) := by rw [← Set.toFinset_card, Set.toFinset_range]
  _ ≤ Finset.card p.roots.toFinset := Finset.card_mono ?_
state_before: R✝ : Type u
S : Type v
T : Type w
a b : R✝
n : ℕ
inst✝⁴ : CommRing R✝
inst✝³ : IsDomain R✝
p✝ q : R✝[X]
R : Type u_1
inst✝² : CommRing R
inst✝¹ : IsDomain R
p : R[X]
ι : Type u_2
inst✝ : Fintype ι
f : ι → R
hf : Function.Injective f
heval : ∀ (i : ι), eval (f i) p = 0
hcard : p.natDegree < Fintype.card ι
hp : ¬p = 0
⊢ p.roots.toFinset.card < p.roots.toFinset.card
state_after: R✝ : Type u
S : Type v
T : Type w
a b : R✝
n : ℕ
inst✝⁴ : CommRing R✝
inst✝³ : IsDomain R✝
p✝ q : R✝[X]
R : Type u_1
inst✝² : CommRing R
inst✝¹ : IsDomain R
p : R[X]
ι : Type u_2
inst✝ : Fintype ι
f : ι → R
hf : Function.Injective f
heval : ∀ (i : ι), eval (f i) p = 0
hcard : p.natDegree < Fintype.card ι
hp : ¬p = 0
⊢ Finset.image f Finset.univ ≤ p.roots.toFinset

tactic: intro _
state_before: R✝ : Type u
S : Type v
T : Type w
a b : R✝
n : ℕ
inst✝⁴ : CommRing R✝
inst✝³ : IsDomain R✝
p✝ q : R✝[X]
R : Type u_1
inst✝² : CommRing R
inst✝¹ : IsDomain R
p : R[X]
ι : Type u_2
inst✝ : Fintype ι
f : ι → R
hf : Function.Injective f
heval : ∀ (i : ι), eval (f i) p = 0
hcard : p.natDegree < Fintype.card ι
hp : ¬p = 0
⊢ Finset.image f Finset.univ ≤ p.roots.toFinset
state_after: R✝ : Type u
S : Type v
T : Type w
a b : R✝
n : ℕ
inst✝⁴ : CommRing R✝
inst✝³ : IsDomain R✝
p✝ q : R✝[X]
R : Type u_1
inst✝² : CommRing R
inst✝¹ : IsDomain R
p : R[X]
ι : Type u_2
inst✝ : Fintype ι
f : ι → R
hf : Function.Injective f
heval : ∀ (i : ι), eval (f i) p = 0
hcard : p.natDegree < Fintype.card ι
hp : ¬p = 0
a✝ : R
⊢ a✝ ∈ Finset.image f Finset.univ → a✝ ∈ p.roots.toFinset

tactic: simp only [Finset.mem_image, Finset.mem_univ, true_and, Multiset.mem_toFinset, mem_roots', ne_eq,
  IsRoot.def, forall_exists_index, hp, not_false_eq_true]
state_before: R✝ : Type u
S : Type v
T : Type w
a b : R✝
n : ℕ
inst✝⁴ : CommRing R✝
inst✝³ : IsDomain R✝
p✝ q : R✝[X]
R : Type u_1
inst✝² : CommRing R
inst✝¹ : IsDomain R
p : R[X]
ι : Type u_2
inst✝ : Fintype ι
f : ι → R
hf : Function.Injective f
heval : ∀ (i : ι), eval (f i) p = 0
hcard : p.natDegree < Fintype.card ι
hp : ¬p = 0
a✝ : R
⊢ a✝ ∈ Finset.image f Finset.univ → a✝ ∈ p.roots.toFinset
state_after: R✝ : Type u
S : Type v
T : Type w
a b : R✝
n : ℕ
inst✝⁴ : CommRing R✝
inst✝³ : IsDomain R✝
p✝ q : R✝[X]
R : Type u_1
inst✝² : CommRing R
inst✝¹ : IsDomain R
p : R[X]
ι : Type u_2
inst✝ : Fintype ι
f : ι → R
hf : Function.Injective f
heval : ∀ (i : ι), eval (f i) p = 0
hcard : p.natDegree < Fintype.card ι
hp : ¬p = 0
a✝ : R
⊢ ∀ (x : ι), f x = a✝ → eval a✝ p = 0

tactic: rintro x rfl
state_before: R✝ : Type u
S : Type v
T : Type w
a b : R✝
n : ℕ
inst✝⁴ : CommRing R✝
inst✝³ : IsDomain R✝
p✝ q : R✝[X]
R : Type u_1
inst✝² : CommRing R
inst✝¹ : IsDomain R
p : R[X]
ι : Type u_2
inst✝ : Fintype ι
f : ι → R
hf : Function.Injective f
heval : ∀ (i : ι), eval (f i) p = 0
hcard : p.natDegree < Fintype.card ι
hp : ¬p = 0
a✝ : R
⊢ ∀ (x : ι), f x = a✝ → eval a✝ p = 0
state_after: R✝ : Type u
S : Type v
T : Type w
a b : R✝
n : ℕ
inst✝⁴ : CommRing R✝
inst✝³ : IsDomain R✝
p✝ q : R✝[X]
R : Type u_1
inst✝² : CommRing R
inst✝¹ : IsDomain R
p : R[X]
ι : Type u_2
inst✝ : Fintype ι
f : ι → R
hf : Function.Injective f
heval : ∀ (i : ι), eval (f i) p = 0
hcard : p.natDegree < Fintype.card ι
hp : ¬p = 0
x : ι
⊢ eval (f x) p = 0

tactic: exact heval _
state_before: R✝ : Type u
S : Type v
T : Type w
a b : R✝
n : ℕ
inst✝⁴ : CommRing R✝
inst✝³ : IsDomain R✝
p✝ q : R✝[X]
R : Type u_1
inst✝² : CommRing R
inst✝¹ : IsDomain R
p : R[X]
ι : Type u_2
inst✝ : Fintype ι
f : ι → R
hf : Function.Injective f
heval : ∀ (i : ι), eval (f i) p = 0
hcard : p.natDegree < Fintype.card ι
hp : ¬p = 0
x : ι
⊢ eval (f x) p = 0
state_after: no goals

tactic: rw [← Set.toFinset_card, Set.toFinset_range]
state_before: R✝ : Type u
S : Type v
T : Type w
a b : R✝
n : ℕ
inst✝⁴ : CommRing R✝
inst✝³ : IsDomain R✝
p✝ q : R✝[X]
R : Type u_1
inst✝² : CommRing R
inst✝¹ : IsDomain R
p : R[X]
ι : Type u_2
inst✝ : Fintype ι
f : ι → R
hf : Function.Injective f
heval : ∀ (i : ι), eval (f i) p = 0
hcard : p.natDegree < Fintype.card ι
hp : ¬p = 0
⊢ Fintype.card ↑(Set.range f) = (Finset.image f Finset.univ).card
state_after: no goals