Theorem: one_le_pow_mul_abs_eval_div
File: Mathlib/Data/Polynomial/DenomsClearable.lean

tactic: obtain ⟨ev, bi, bu, hF⟩ :=
  denomsClearable_natDegree (b := b) (algebraMap ℤ K) f a
    (by
      rw [eq_intCast, one_div_mul_cancel]
      rw [Int.cast_ne_zero]
      exact b0.ne.symm)
state_before: K : Type u_1
inst✝ : LinearOrderedField K
f : ℤ[X]
a b : ℤ
b0 : 0 < b
fab : eval (↑a / ↑b) (Polynomial.map (algebraMap ℤ K) f) ≠ 0
⊢ 1 ≤ ↑b ^ natDegree f * abs (eval (↑a / ↑b) (Polynomial.map (algebraMap ℤ K) f))

tactic: obtain Fa := _root_.congr_arg abs hF
state_before: case intro.intro.intro
K : Type u_1
inst✝ : LinearOrderedField K
f : ℤ[X]
a b : ℤ
b0 : 0 < b
fab : eval (↑a / ↑b) (Polynomial.map (algebraMap ℤ K) f) ≠ 0
ev : ℤ
bi : K
bu : bi * ↑(algebraMap ℤ K) b = 1
hF :
  ↑(algebraMap ℤ K) ev =
    ↑(algebraMap ℤ K) b ^ natDegree f * eval (↑(algebraMap ℤ K) a * bi) (Polynomial.map (algebraMap ℤ K) f)
⊢ 1 ≤ ↑b ^ natDegree f * abs (eval (↑a / ↑b) (Polynomial.map (algebraMap ℤ K) f))

tactic: rw [eq_one_div_of_mul_eq_one_left bu, eq_intCast, eq_intCast, abs_mul] at Fa
state_before: case intro.intro.intro
K : Type u_1
inst✝ : LinearOrderedField K
f : ℤ[X]
a b : ℤ
b0 : 0 < b
fab : eval (↑a / ↑b) (Polynomial.map (algebraMap ℤ K) f) ≠ 0
ev : ℤ
bi : K
bu : bi * ↑(algebraMap ℤ K) b = 1
hF :
  ↑(algebraMap ℤ K) ev =
    ↑(algebraMap ℤ K) b ^ natDegree f * eval (↑(algebraMap ℤ K) a * bi) (Polynomial.map (algebraMap ℤ K) f)
Fa :
  abs (↑(algebraMap ℤ K) ev) =
    abs (↑(algebraMap ℤ K) b ^ natDegree f * eval (↑(algebraMap ℤ K) a * bi) (Polynomial.map (algebraMap ℤ K) f))
⊢ 1 ≤ ↑b ^ natDegree f * abs (eval (↑a / ↑b) (Polynomial.map (algebraMap ℤ K) f))

tactic: rw [abs_of_pos (pow_pos (Int.cast_pos.mpr b0) _ : 0 < (b : K) ^ _), one_div, eq_intCast] at Fa
state_before: case intro.intro.intro
K : Type u_1
inst✝ : LinearOrderedField K
f : ℤ[X]
a b : ℤ
b0 : 0 < b
fab : eval (↑a / ↑b) (Polynomial.map (algebraMap ℤ K) f) ≠ 0
ev : ℤ
bi : K
bu : bi * ↑(algebraMap ℤ K) b = 1
hF :
  ↑(algebraMap ℤ K) ev =
    ↑(algebraMap ℤ K) b ^ natDegree f * eval (↑(algebraMap ℤ K) a * bi) (Polynomial.map (algebraMap ℤ K) f)
Fa : abs ↑ev = abs (↑b ^ natDegree f) * abs (eval (↑(algebraMap ℤ K) a * (1 / ↑b)) (Polynomial.map (algebraMap ℤ K) f))
⊢ 1 ≤ ↑b ^ natDegree f * abs (eval (↑a / ↑b) (Polynomial.map (algebraMap ℤ K) f))

tactic: rw [div_eq_mul_inv, ←Fa, ← Int.cast_abs, ← Int.cast_one, Int.cast_le]
state_before: case intro.intro.intro
K : Type u_1
inst✝ : LinearOrderedField K
f : ℤ[X]
a b : ℤ
b0 : 0 < b
fab : eval (↑a / ↑b) (Polynomial.map (algebraMap ℤ K) f) ≠ 0
ev : ℤ
bi : K
bu : bi * ↑(algebraMap ℤ K) b = 1
hF :
  ↑(algebraMap ℤ K) ev =
    ↑(algebraMap ℤ K) b ^ natDegree f * eval (↑(algebraMap ℤ K) a * bi) (Polynomial.map (algebraMap ℤ K) f)
Fa : abs ↑ev = ↑b ^ natDegree f * abs (eval (↑a * (↑b)⁻¹) (Polynomial.map (algebraMap ℤ K) f))
⊢ 1 ≤ ↑b ^ natDegree f * abs (eval (↑a / ↑b) (Polynomial.map (algebraMap ℤ K) f))

tactic: refine' Int.le_of_lt_add_one ((lt_add_iff_pos_left 1).mpr (abs_pos.mpr fun F0 => fab _))
state_before: case intro.intro.intro
K : Type u_1
inst✝ : LinearOrderedField K
f : ℤ[X]
a b : ℤ
b0 : 0 < b
fab : eval (↑a / ↑b) (Polynomial.map (algebraMap ℤ K) f) ≠ 0
ev : ℤ
bi : K
bu : bi * ↑(algebraMap ℤ K) b = 1
hF :
  ↑(algebraMap ℤ K) ev =
    ↑(algebraMap ℤ K) b ^ natDegree f * eval (↑(algebraMap ℤ K) a * bi) (Polynomial.map (algebraMap ℤ K) f)
Fa : abs ↑ev = ↑b ^ natDegree f * abs (eval (↑a * (↑b)⁻¹) (Polynomial.map (algebraMap ℤ K) f))
⊢ 1 ≤ abs ev

tactic: rw [eq_one_div_of_mul_eq_one_left bu, F0, one_div, eq_intCast, Int.cast_zero, zero_eq_mul] at hF
state_before: case intro.intro.intro
K : Type u_1
inst✝ : LinearOrderedField K
f : ℤ[X]
a b : ℤ
b0 : 0 < b
fab : eval (↑a / ↑b) (Polynomial.map (algebraMap ℤ K) f) ≠ 0
ev : ℤ
bi : K
bu : bi * ↑(algebraMap ℤ K) b = 1
hF :
  ↑(algebraMap ℤ K) ev =
    ↑(algebraMap ℤ K) b ^ natDegree f * eval (↑(algebraMap ℤ K) a * bi) (Polynomial.map (algebraMap ℤ K) f)
Fa : abs ↑ev = ↑b ^ natDegree f * abs (eval (↑a * (↑b)⁻¹) (Polynomial.map (algebraMap ℤ K) f))
F0 : ev = 0
⊢ eval (↑a / ↑b) (Polynomial.map (algebraMap ℤ K) f) = 0

tactic: cases' hF with hF hF
state_before: case intro.intro.intro
K : Type u_1
inst✝ : LinearOrderedField K
f : ℤ[X]
a b : ℤ
b0 : 0 < b
fab : eval (↑a / ↑b) (Polynomial.map (algebraMap ℤ K) f) ≠ 0
ev : ℤ
bi : K
bu : bi * ↑(algebraMap ℤ K) b = 1
hF :
  ↑(algebraMap ℤ K) b ^ natDegree f = 0 ∨
    eval (↑(algebraMap ℤ K) a * (↑(algebraMap ℤ K) b)⁻¹) (Polynomial.map (algebraMap ℤ K) f) = 0
Fa : abs ↑ev = ↑b ^ natDegree f * abs (eval (↑a * (↑b)⁻¹) (Polynomial.map (algebraMap ℤ K) f))
F0 : ev = 0
⊢ eval (↑a / ↑b) (Polynomial.map (algebraMap ℤ K) f) = 0

tactic: rw [eq_intCast, one_div_mul_cancel]
state_before: K : Type u_1
inst✝ : LinearOrderedField K
f : ℤ[X]
a b : ℤ
b0 : 0 < b
fab : eval (↑a / ↑b) (Polynomial.map (algebraMap ℤ K) f) ≠ 0
⊢ ?m.157179 * ↑(algebraMap ℤ K) b = 1

tactic: rw [Int.cast_ne_zero]
state_before: K : Type u_1
inst✝ : LinearOrderedField K
f : ℤ[X]
a b : ℤ
b0 : 0 < b
fab : eval (↑a / ↑b) (Polynomial.map (algebraMap ℤ K) f) ≠ 0
⊢ ↑b ≠ 0

tactic: exact b0.ne.symm
state_before: K : Type u_1
inst✝ : LinearOrderedField K
f : ℤ[X]
a b : ℤ
b0 : 0 < b
fab : eval (↑a / ↑b) (Polynomial.map (algebraMap ℤ K) f) ≠ 0
⊢ b ≠ 0

tactic: exact (not_le.mpr b0 (le_of_eq (Int.cast_eq_zero.mp (pow_eq_zero hF)))).elim
state_before: case intro.intro.intro.inl
K : Type u_1
inst✝ : LinearOrderedField K
f : ℤ[X]
a b : ℤ
b0 : 0 < b
fab : eval (↑a / ↑b) (Polynomial.map (algebraMap ℤ K) f) ≠ 0
ev : ℤ
bi : K
bu : bi * ↑(algebraMap ℤ K) b = 1
Fa : abs ↑ev = ↑b ^ natDegree f * abs (eval (↑a * (↑b)⁻¹) (Polynomial.map (algebraMap ℤ K) f))
F0 : ev = 0
hF : ↑(algebraMap ℤ K) b ^ natDegree f = 0
⊢ eval (↑a / ↑b) (Polynomial.map (algebraMap ℤ K) f) = 0

tactic: rwa [div_eq_mul_inv]
state_before: case intro.intro.intro.inr
K : Type u_1
inst✝ : LinearOrderedField K
f : ℤ[X]
a b : ℤ
b0 : 0 < b
fab : eval (↑a / ↑b) (Polynomial.map (algebraMap ℤ K) f) ≠ 0
ev : ℤ
bi : K
bu : bi * ↑(algebraMap ℤ K) b = 1
Fa : abs ↑ev = ↑b ^ natDegree f * abs (eval (↑a * (↑b)⁻¹) (Polynomial.map (algebraMap ℤ K) f))
F0 : ev = 0
hF : eval (↑(algebraMap ℤ K) a * (↑(algebraMap ℤ K) b)⁻¹) (Polynomial.map (algebraMap ℤ K) f) = 0
⊢ eval (↑a / ↑b) (Polynomial.map (algebraMap ℤ K) f) = 0