Theorem: Polynomial.coeff_le_of_roots_le
File: Mathlib/Topology/Algebra/Polynomial.lean

tactic: obtain hB | hB := lt_or_le B 0
state_before: α : Type ?u.183469
R : Type ?u.183472
inst✝³ : NormedRing R
inst✝² : IsAbsoluteValue norm
F : Type u_1
K : Type u_2
inst✝¹ : CommRing F
inst✝ : NormedField K
p : F[X]
f : F →+* K
B : ℝ
i : ℕ
h1 : Monic p
h2 : Splits f p
h3 : ∀ (z : K), z ∈ roots (map f p) → ‖z‖ ≤ B
⊢ ‖coeff (map f p) i‖ ≤ B ^ (natDegree p - i) * ↑(Nat.choose (natDegree p) i)

tactic: rw [← h1.natDegree_map f]
state_before: case inr
α : Type ?u.183469
R : Type ?u.183472
inst✝³ : NormedRing R
inst✝² : IsAbsoluteValue norm
F : Type u_1
K : Type u_2
inst✝¹ : CommRing F
inst✝ : NormedField K
p : F[X]
f : F →+* K
B : ℝ
i : ℕ
h1 : Monic p
h2 : Splits f p
h3 : ∀ (z : K), z ∈ roots (map f p) → ‖z‖ ≤ B
hB : 0 ≤ B
⊢ ‖coeff (map f p) i‖ ≤ B ^ (natDegree p - i) * ↑(Nat.choose (natDegree p) i)

tactic: obtain hi | hi := lt_or_le (map f p).natDegree i
state_before: case inr
α : Type ?u.183469
R : Type ?u.183472
inst✝³ : NormedRing R
inst✝² : IsAbsoluteValue norm
F : Type u_1
K : Type u_2
inst✝¹ : CommRing F
inst✝ : NormedField K
p : F[X]
f : F →+* K
B : ℝ
i : ℕ
h1 : Monic p
h2 : Splits f p
h3 : ∀ (z : K), z ∈ roots (map f p) → ‖z‖ ≤ B
hB : 0 ≤ B
⊢ ‖coeff (map f p) i‖ ≤ B ^ (natDegree (map f p) - i) * ↑(Nat.choose (natDegree (map f p)) i)

tactic: rw [coeff_eq_esymm_roots_of_splits ((splits_id_iff_splits f).2 h2) hi, (h1.map _).leadingCoeff,
  one_mul, norm_mul, norm_pow, norm_neg, norm_one, one_pow, one_mul]
state_before: case inr.inr
α : Type ?u.183469
R : Type ?u.183472
inst✝³ : NormedRing R
inst✝² : IsAbsoluteValue norm
F : Type u_1
K : Type u_2
inst✝¹ : CommRing F
inst✝ : NormedField K
p : F[X]
f : F →+* K
B : ℝ
i : ℕ
h1 : Monic p
h2 : Splits f p
h3 : ∀ (z : K), z ∈ roots (map f p) → ‖z‖ ≤ B
hB : 0 ≤ B
hi : i ≤ natDegree (map f p)
⊢ ‖coeff (map f p) i‖ ≤ B ^ (natDegree (map f p) - i) * ↑(Nat.choose (natDegree (map f p)) i)

tactic: apply ((norm_multiset_sum_le _).trans <| sum_le_card_nsmul _ _ fun r hr => _).trans
state_before: case inr.inr
α : Type ?u.183469
R : Type ?u.183472
inst✝³ : NormedRing R
inst✝² : IsAbsoluteValue norm
F : Type u_1
K : Type u_2
inst✝¹ : CommRing F
inst✝ : NormedField K
p : F[X]
f : F →+* K
B : ℝ
i : ℕ
h1 : Monic p
h2 : Splits f p
h3 : ∀ (z : K), z ∈ roots (map f p) → ‖z‖ ≤ B
hB : 0 ≤ B
hi : i ≤ natDegree (map f p)
⊢ ‖esymm (roots (map f p)) (natDegree (map f p) - i)‖ ≤
    B ^ (natDegree (map f p) - i) * ↑(Nat.choose (natDegree (map f p)) i)

tactic: intro r hr
state_before: α : Type ?u.183469
R : Type ?u.183472
inst✝³ : NormedRing R
inst✝² : IsAbsoluteValue norm
F : Type u_1
K : Type u_2
inst✝¹ : CommRing F
inst✝ : NormedField K
p : F[X]
f : F →+* K
B : ℝ
i : ℕ
h1 : Monic p
h2 : Splits f p
h3 : ∀ (z : K), z ∈ roots (map f p) → ‖z‖ ≤ B
hB : 0 ≤ B
hi : i ≤ natDegree (map f p)
⊢ ∀ (r : ℝ),
    r ∈ Multiset.map (fun x => ‖x‖) (Multiset.map prod (powersetLen (natDegree (map f p) - i) (roots (map f p)))) →
      r ≤ B ^ (natDegree (map f p) - i)

tactic: simp_rw [Multiset.mem_map] at hr
state_before: α : Type ?u.183469
R : Type ?u.183472
inst✝³ : NormedRing R
inst✝² : IsAbsoluteValue norm
F : Type u_1
K : Type u_2
inst✝¹ : CommRing F
inst✝ : NormedField K
p : F[X]
f : F →+* K
B : ℝ
i : ℕ
h1 : Monic p
h2 : Splits f p
h3 : ∀ (z : K), z ∈ roots (map f p) → ‖z‖ ≤ B
hB : 0 ≤ B
hi : i ≤ natDegree (map f p)
r : ℝ
hr : r ∈ Multiset.map (fun x => ‖x‖) (Multiset.map prod (powersetLen (natDegree (map f p) - i) (roots (map f p))))
⊢ r ≤ B ^ (natDegree (map f p) - i)

tactic: obtain ⟨_, ⟨s, hs, rfl⟩, rfl⟩ := hr
state_before: α : Type ?u.183469
R : Type ?u.183472
inst✝³ : NormedRing R
inst✝² : IsAbsoluteValue norm
F : Type u_1
K : Type u_2
inst✝¹ : CommRing F
inst✝ : NormedField K
p : F[X]
f : F →+* K
B : ℝ
i : ℕ
h1 : Monic p
h2 : Splits f p
h3 : ∀ (z : K), z ∈ roots (map f p) → ‖z‖ ≤ B
hB : 0 ≤ B
hi : i ≤ natDegree (map f p)
r : ℝ
hr : ∃ a, (∃ a_1, a_1 ∈ powersetLen (natDegree (map f p) - i) (roots (map f p)) ∧ prod a_1 = a) ∧ ‖a‖ = r
⊢ r ≤ B ^ (natDegree (map f p) - i)

tactic: rw [mem_powersetLen] at hs
state_before: case intro.intro.intro.intro
α : Type ?u.183469
R : Type ?u.183472
inst✝³ : NormedRing R
inst✝² : IsAbsoluteValue norm
F : Type u_1
K : Type u_2
inst✝¹ : CommRing F
inst✝ : NormedField K
p : F[X]
f : F →+* K
B : ℝ
i : ℕ
h1 : Monic p
h2 : Splits f p
h3 : ∀ (z : K), z ∈ roots (map f p) → ‖z‖ ≤ B
hB : 0 ≤ B
hi : i ≤ natDegree (map f p)
s : Multiset K
hs : s ∈ powersetLen (natDegree (map f p) - i) (roots (map f p))
⊢ ‖prod s‖ ≤ B ^ (natDegree (map f p) - i)

tactic: lift B to ℝ≥0 using hB
state_before: case intro.intro.intro.intro
α : Type ?u.183469
R : Type ?u.183472
inst✝³ : NormedRing R
inst✝² : IsAbsoluteValue norm
F : Type u_1
K : Type u_2
inst✝¹ : CommRing F
inst✝ : NormedField K
p : F[X]
f : F →+* K
B : ℝ
i : ℕ
h1 : Monic p
h2 : Splits f p
h3 : ∀ (z : K), z ∈ roots (map f p) → ‖z‖ ≤ B
hB : 0 ≤ B
hi : i ≤ natDegree (map f p)
s : Multiset K
hs : s ≤ roots (map f p) ∧ ↑card s = natDegree (map f p) - i
⊢ ‖prod s‖ ≤ B ^ (natDegree (map f p) - i)

tactic: rw [← coe_nnnorm, ← NNReal.coe_pow, NNReal.coe_le_coe, ← nnnormHom_apply, ← MonoidHom.coe_coe,
  MonoidHom.map_multiset_prod]
state_before: case intro.intro.intro.intro.intro
α : Type ?u.183469
R : Type ?u.183472
inst✝³ : NormedRing R
inst✝² : IsAbsoluteValue norm
F : Type u_1
K : Type u_2
inst✝¹ : CommRing F
inst✝ : NormedField K
p : F[X]
f : F →+* K
i : ℕ
h1 : Monic p
h2 : Splits f p
hi : i ≤ natDegree (map f p)
s : Multiset K
hs : s ≤ roots (map f p) ∧ ↑card s = natDegree (map f p) - i
B : ℝ≥0
h3 : ∀ (z : K), z ∈ roots (map f p) → ‖z‖ ≤ ↑B
⊢ ‖prod s‖ ≤ ↑B ^ (natDegree (map f p) - i)

tactic: refine' (prod_le_pow_card _ B fun x hx => _).trans_eq (by rw [card_map, hs.2])
state_before: case intro.intro.intro.intro.intro
α : Type ?u.183469
R : Type ?u.183472
inst✝³ : NormedRing R
inst✝² : IsAbsoluteValue norm
F : Type u_1
K : Type u_2
inst✝¹ : CommRing F
inst✝ : NormedField K
p : F[X]
f : F →+* K
i : ℕ
h1 : Monic p
h2 : Splits f p
hi : i ≤ natDegree (map f p)
s : Multiset K
hs : s ≤ roots (map f p) ∧ ↑card s = natDegree (map f p) - i
B : ℝ≥0
h3 : ∀ (z : K), z ∈ roots (map f p) → ‖z‖ ≤ ↑B
⊢ prod (Multiset.map (↑↑nnnormHom) s) ≤ B ^ (natDegree (map f p) - i)

tactic: obtain ⟨z, hz, rfl⟩ := Multiset.mem_map.1 hx
state_before: case intro.intro.intro.intro.intro
α : Type ?u.183469
R : Type ?u.183472
inst✝³ : NormedRing R
inst✝² : IsAbsoluteValue norm
F : Type u_1
K : Type u_2
inst✝¹ : CommRing F
inst✝ : NormedField K
p : F[X]
f : F →+* K
i : ℕ
h1 : Monic p
h2 : Splits f p
hi : i ≤ natDegree (map f p)
s : Multiset K
hs : s ≤ roots (map f p) ∧ ↑card s = natDegree (map f p) - i
B : ℝ≥0
h3 : ∀ (z : K), z ∈ roots (map f p) → ‖z‖ ≤ ↑B
x : ℝ≥0
hx : x ∈ Multiset.map (↑↑nnnormHom) s
⊢ x ≤ B

tactic: exact h3 z (mem_of_le hs.1 hz)
state_before: case intro.intro.intro.intro.intro.intro.intro
α : Type ?u.183469
R : Type ?u.183472
inst✝³ : NormedRing R
inst✝² : IsAbsoluteValue norm
F : Type u_1
K : Type u_2
inst✝¹ : CommRing F
inst✝ : NormedField K
p : F[X]
f : F →+* K
i : ℕ
h1 : Monic p
h2 : Splits f p
hi : i ≤ natDegree (map f p)
s : Multiset K
hs : s ≤ roots (map f p) ∧ ↑card s = natDegree (map f p) - i
B : ℝ≥0
h3 : ∀ (z : K), z ∈ roots (map f p) → ‖z‖ ≤ ↑B
z : K
hz : z ∈ s
hx : ↑↑nnnormHom z ∈ Multiset.map (↑↑nnnormHom) s
⊢ ↑↑nnnormHom z ≤ B

tactic: rw [eq_one_of_roots_le hB h1 h2 h3, Polynomial.map_one, natDegree_one, zero_tsub, pow_zero,
  one_mul, coeff_one]
state_before: case inl
α : Type ?u.183469
R : Type ?u.183472
inst✝³ : NormedRing R
inst✝² : IsAbsoluteValue norm
F : Type u_1
K : Type u_2
inst✝¹ : CommRing F
inst✝ : NormedField K
p : F[X]
f : F →+* K
B : ℝ
i : ℕ
h1 : Monic p
h2 : Splits f p
h3 : ∀ (z : K), z ∈ roots (map f p) → ‖z‖ ≤ B
hB : B < 0
⊢ ‖coeff (map f p) i‖ ≤ B ^ (natDegree p - i) * ↑(Nat.choose (natDegree p) i)

tactic: split_ifs <;> norm_num [h]
state_before: case inl
α : Type ?u.183469
R : Type ?u.183472
inst✝³ : NormedRing R
inst✝² : IsAbsoluteValue norm
F : Type u_1
K : Type u_2
inst✝¹ : CommRing F
inst✝ : NormedField K
p : F[X]
f : F →+* K
B : ℝ
i : ℕ
h1 : Monic p
h2 : Splits f p
h3 : ∀ (z : K), z ∈ roots (map f p) → ‖z‖ ≤ B
hB : B < 0
⊢ ‖if 0 = i then 1 else 0‖ ≤ ↑(Nat.choose 0 i)

tactic: simp [‹0 = i›]
state_before: case inl.inl
α : Type ?u.183469
R : Type ?u.183472
inst✝³ : NormedRing R
inst✝² : IsAbsoluteValue norm
F : Type u_1
K : Type u_2
inst✝¹ : CommRing F
inst✝ : NormedField K
p : F[X]
f : F →+* K
B : ℝ
i : ℕ
h1 : Monic p
h2 : Splits f p
h3 : ∀ (z : K), z ∈ roots (map f p) → ‖z‖ ≤ B
hB : B < 0
h✝ : 0 = i
⊢ 1 ≤ Nat.choose 0 i

tactic: rw [coeff_eq_zero_of_natDegree_lt hi, norm_zero]
state_before: case inr.inl
α : Type ?u.183469
R : Type ?u.183472
inst✝³ : NormedRing R
inst✝² : IsAbsoluteValue norm
F : Type u_1
K : Type u_2
inst✝¹ : CommRing F
inst✝ : NormedField K
p : F[X]
f : F →+* K
B : ℝ
i : ℕ
h1 : Monic p
h2 : Splits f p
h3 : ∀ (z : K), z ∈ roots (map f p) → ‖z‖ ≤ B
hB : 0 ≤ B
hi : natDegree (map f p) < i
⊢ ‖coeff (map f p) i‖ ≤ B ^ (natDegree (map f p) - i) * ↑(Nat.choose (natDegree (map f p)) i)

tactic: positivity
state_before: case inr.inl
α : Type ?u.183469
R : Type ?u.183472
inst✝³ : NormedRing R
inst✝² : IsAbsoluteValue norm
F : Type u_1
K : Type u_2
inst✝¹ : CommRing F
inst✝ : NormedField K
p : F[X]
f : F →+* K
B : ℝ
i : ℕ
h1 : Monic p
h2 : Splits f p
h3 : ∀ (z : K), z ∈ roots (map f p) → ‖z‖ ≤ B
hB : 0 ≤ B
hi : natDegree (map f p) < i
⊢ 0 ≤ B ^ (natDegree (map f p) - i) * ↑(Nat.choose (natDegree (map f p)) i)

tactic: rw [Multiset.map_map, card_map, card_powersetLen, ← natDegree_eq_card_roots' h2,
  Nat.choose_symm hi, mul_comm, nsmul_eq_mul]
state_before: case inr.inr
α : Type ?u.183469
R : Type ?u.183472
inst✝³ : NormedRing R
inst✝² : IsAbsoluteValue norm
F : Type u_1
K : Type u_2
inst✝¹ : CommRing F
inst✝ : NormedField K
p : F[X]
f : F →+* K
B : ℝ
i : ℕ
h1 : Monic p
h2 : Splits f p
h3 : ∀ (z : K), z ∈ roots (map f p) → ‖z‖ ≤ B
hB : 0 ≤ B
hi : i ≤ natDegree (map f p)
⊢ ↑card (Multiset.map (fun x => ‖x‖) (Multiset.map prod (powersetLen (natDegree (map f p) - i) (roots (map f p))))) •
      ?m.198217 ≤
    B ^ (natDegree (map f p) - i) * ↑(Nat.choose (natDegree (map f p)) i)

tactic: rw [card_map, hs.2]
state_before: α : Type ?u.183469
R : Type ?u.183472
inst✝³ : NormedRing R
inst✝² : IsAbsoluteValue norm
F : Type u_1
K : Type u_2
inst✝¹ : CommRing F
inst✝ : NormedField K
p : F[X]
f : F →+* K
i : ℕ
h1 : Monic p
h2 : Splits f p
hi : i ≤ natDegree (map f p)
s : Multiset K
hs : s ≤ roots (map f p) ∧ ↑card s = natDegree (map f p) - i
B : ℝ≥0
h3 : ∀ (z : K), z ∈ roots (map f p) → ‖z‖ ≤ ↑B
⊢ B ^ ↑card (Multiset.map (↑↑nnnormHom) s) = B ^ (natDegree (map f p) - i)