[GOAL]
x : ℝ
h : Liouville x
⊢ Irrational x
[PROOFSTEP]
rintro
  ⟨⟨a, b, bN0, cop⟩, rfl⟩
      -- clear up the mess of constructions of rationals
[GOAL]
case intro.mk'
a : ℤ
b : ℕ
bN0 : b ≠ 0
cop : Nat.coprime (Int.natAbs a) b
h : Liouville ↑(Rat.mk' a b)
⊢ False
[PROOFSTEP]
rw [Rat.cast_mk', ← div_eq_mul_inv] at h 
[GOAL]
case intro.mk'
a : ℤ
b : ℕ
bN0 : b ≠ 0
cop : Nat.coprime (Int.natAbs a) b
h : Liouville (↑a / ↑b)
⊢ False
[PROOFSTEP]
rcases h (b + 1) with
  ⟨p, q, q1, a0, a1⟩
    -- A few useful inequalities
[GOAL]
case intro.mk'.intro.intro.intro.intro
a : ℤ
b : ℕ
bN0 : b ≠ 0
cop : Nat.coprime (Int.natAbs a) b
h : Liouville (↑a / ↑b)
p q : ℤ
q1 : 1 < q
a0 : ↑a / ↑b ≠ ↑p / ↑q
a1 : |↑a / ↑b - ↑p / ↑q| < 1 / ↑q ^ (b + 1)
⊢ False
[PROOFSTEP]
have qR0 : (0 : ℝ) < q := Int.cast_pos.mpr (zero_lt_one.trans q1)
[GOAL]
case intro.mk'.intro.intro.intro.intro
a : ℤ
b : ℕ
bN0 : b ≠ 0
cop : Nat.coprime (Int.natAbs a) b
h : Liouville (↑a / ↑b)
p q : ℤ
q1 : 1 < q
a0 : ↑a / ↑b ≠ ↑p / ↑q
a1 : |↑a / ↑b - ↑p / ↑q| < 1 / ↑q ^ (b + 1)
qR0 : 0 < ↑q
⊢ False
[PROOFSTEP]
have b0 : (b : ℝ) ≠ 0 := Nat.cast_ne_zero.mpr bN0
[GOAL]
case intro.mk'.intro.intro.intro.intro
a : ℤ
b : ℕ
bN0 : b ≠ 0
cop : Nat.coprime (Int.natAbs a) b
h : Liouville (↑a / ↑b)
p q : ℤ
q1 : 1 < q
a0 : ↑a / ↑b ≠ ↑p / ↑q
a1 : |↑a / ↑b - ↑p / ↑q| < 1 / ↑q ^ (b + 1)
qR0 : 0 < ↑q
b0 : ↑b ≠ 0
⊢ False
[PROOFSTEP]
have bq0 : (0 : ℝ) < b * q := mul_pos (Nat.cast_pos.mpr bN0.bot_lt) qR0
[GOAL]
case intro.mk'.intro.intro.intro.intro
a : ℤ
b : ℕ
bN0 : b ≠ 0
cop : Nat.coprime (Int.natAbs a) b
h : Liouville (↑a / ↑b)
p q : ℤ
q1 : 1 < q
a0 : ↑a / ↑b ≠ ↑p / ↑q
a1 : |↑a / ↑b - ↑p / ↑q| < 1 / ↑q ^ (b + 1)
qR0 : 0 < ↑q
b0 : ↑b ≠ 0
bq0 : 0 < ↑b * ↑q
⊢ False
[PROOFSTEP]
replace a1 : |a * q - b * p| * q ^ (b + 1) < b * q
[GOAL]
case a1
a : ℤ
b : ℕ
bN0 : b ≠ 0
cop : Nat.coprime (Int.natAbs a) b
h : Liouville (↑a / ↑b)
p q : ℤ
q1 : 1 < q
a0 : ↑a / ↑b ≠ ↑p / ↑q
a1 : |↑a / ↑b - ↑p / ↑q| < 1 / ↑q ^ (b + 1)
qR0 : 0 < ↑q
b0 : ↑b ≠ 0
bq0 : 0 < ↑b * ↑q
⊢ |a * q - ↑b * p| * q ^ (b + 1) < ↑b * q
[PROOFSTEP]
rw [div_sub_div _ _ b0 qR0.ne', abs_div, div_lt_div_iff (abs_pos.mpr bq0.ne') (pow_pos qR0 _), abs_of_pos bq0,
  one_mul] at a1 
[GOAL]
case a1
a : ℤ
b : ℕ
bN0 : b ≠ 0
cop : Nat.coprime (Int.natAbs a) b
h : Liouville (↑a / ↑b)
p q : ℤ
q1 : 1 < q
a0 : ↑a / ↑b ≠ ↑p / ↑q
a1 : |↑a * ↑q - ↑b * ↑p| * ↑q ^ (b + 1) < ↑b * ↑q
qR0 : 0 < ↑q
b0 : ↑b ≠ 0
bq0 : 0 < ↑b * ↑q
⊢ |a * q - ↑b * p| * q ^ (b + 1) < ↑b * q
[PROOFSTEP]
exact_mod_cast a1
[GOAL]
case intro.mk'.intro.intro.intro.intro
a : ℤ
b : ℕ
bN0 : b ≠ 0
cop : Nat.coprime (Int.natAbs a) b
h : Liouville (↑a / ↑b)
p q : ℤ
q1 : 1 < q
a0 : ↑a / ↑b ≠ ↑p / ↑q
qR0 : 0 < ↑q
b0 : ↑b ≠ 0
bq0 : 0 < ↑b * ↑q
a1 : |a * q - ↑b * p| * q ^ (b + 1) < ↑b * q
⊢ False
[PROOFSTEP]
replace a0 : a * q - ↑b * p ≠ 0
[GOAL]
case a0
a : ℤ
b : ℕ
bN0 : b ≠ 0
cop : Nat.coprime (Int.natAbs a) b
h : Liouville (↑a / ↑b)
p q : ℤ
q1 : 1 < q
a0 : ↑a / ↑b ≠ ↑p / ↑q
qR0 : 0 < ↑q
b0 : ↑b ≠ 0
bq0 : 0 < ↑b * ↑q
a1 : |a * q - ↑b * p| * q ^ (b + 1) < ↑b * q
⊢ a * q - ↑b * p ≠ 0
[PROOFSTEP]
rw [Ne.def, div_eq_div_iff b0 qR0.ne', mul_comm (p : ℝ), ← sub_eq_zero] at a0 
[GOAL]
case a0
a : ℤ
b : ℕ
bN0 : b ≠ 0
cop : Nat.coprime (Int.natAbs a) b
h : Liouville (↑a / ↑b)
p q : ℤ
q1 : 1 < q
a0✝ : ¬↑a * ↑q = ↑b * ↑p
a0 : ¬↑a * ↑q - ↑b * ↑p = 0
qR0 : 0 < ↑q
b0 : ↑b ≠ 0
bq0 : 0 < ↑b * ↑q
a1 : |a * q - ↑b * p| * q ^ (b + 1) < ↑b * q
⊢ a * q - ↑b * p ≠ 0
[PROOFSTEP]
exact_mod_cast a0
[GOAL]
case intro.mk'.intro.intro.intro.intro
a : ℤ
b : ℕ
bN0 : b ≠ 0
cop : Nat.coprime (Int.natAbs a) b
h : Liouville (↑a / ↑b)
p q : ℤ
q1 : 1 < q
qR0 : 0 < ↑q
b0 : ↑b ≠ 0
bq0 : 0 < ↑b * ↑q
a1 : |a * q - ↑b * p| * q ^ (b + 1) < ↑b * q
a0 : a * q - ↑b * p ≠ 0
⊢ False
[PROOFSTEP]
lift q to ℕ using (zero_lt_one.trans q1).le
[GOAL]
case intro.mk'.intro.intro.intro.intro.intro
a : ℤ
b : ℕ
bN0 : b ≠ 0
cop : Nat.coprime (Int.natAbs a) b
h : Liouville (↑a / ↑b)
p : ℤ
b0 : ↑b ≠ 0
q : ℕ
q1 : 1 < ↑q
qR0 : 0 < ↑↑q
bq0 : 0 < ↑b * ↑↑q
a1 : |a * ↑q - ↑b * p| * ↑q ^ (b + 1) < ↑b * ↑q
a0 : a * ↑q - ↑b * p ≠ 0
⊢ False
[PROOFSTEP]
have ap : 0 < |a * ↑q - ↑b * p| := abs_pos.mpr a0
[GOAL]
case intro.mk'.intro.intro.intro.intro.intro
a : ℤ
b : ℕ
bN0 : b ≠ 0
cop : Nat.coprime (Int.natAbs a) b
h : Liouville (↑a / ↑b)
p : ℤ
b0 : ↑b ≠ 0
q : ℕ
q1 : 1 < ↑q
qR0 : 0 < ↑↑q
bq0 : 0 < ↑b * ↑↑q
a1 : |a * ↑q - ↑b * p| * ↑q ^ (b + 1) < ↑b * ↑q
a0 : a * ↑q - ↑b * p ≠ 0
ap : 0 < |a * ↑q - ↑b * p|
⊢ False
[PROOFSTEP]
lift |a * ↑q - ↑b * p| to ℕ using abs_nonneg (a * ↑q - ↑b * p) with e he
[GOAL]
case intro.mk'.intro.intro.intro.intro.intro.intro
a : ℤ
b : ℕ
bN0 : b ≠ 0
cop : Nat.coprime (Int.natAbs a) b
h : Liouville (↑a / ↑b)
p : ℤ
b0 : ↑b ≠ 0
q : ℕ
q1 : 1 < ↑q
qR0 : 0 < ↑↑q
bq0 : 0 < ↑b * ↑↑q
a0 : a * ↑q - ↑b * p ≠ 0
e : ℕ
he : ↑e = |a * ↑q - ↑b * p|
a1✝ a1 : ↑e * ↑q ^ (b + 1) < ↑b * ↑q
ap✝ ap : 0 < ↑e
⊢ False
[PROOFSTEP]
rw [← Int.ofNat_mul, ← Int.coe_nat_pow, ← Int.ofNat_mul, Int.ofNat_lt] at a1 
[GOAL]
case intro.mk'.intro.intro.intro.intro.intro.intro
a : ℤ
b : ℕ
bN0 : b ≠ 0
cop : Nat.coprime (Int.natAbs a) b
h : Liouville (↑a / ↑b)
p : ℤ
b0 : ↑b ≠ 0
q : ℕ
q1 : 1 < ↑q
qR0 : 0 < ↑↑q
bq0 : 0 < ↑b * ↑↑q
a0 : a * ↑q - ↑b * p ≠ 0
e : ℕ
he : ↑e = |a * ↑q - ↑b * p|
a1✝ : ↑e * ↑q ^ (b + 1) < ↑b * ↑q
a1 : e * q ^ (b + 1) < b * q
ap✝ ap : 0 < ↑e
⊢ False
[PROOFSTEP]
exact not_le.mpr a1 (Nat.mul_lt_mul_pow_succ (Int.coe_nat_pos.mp ap) (Int.ofNat_lt.mp q1)).le
[GOAL]
Z : Type u_1
N : Type u_2
R : Type u_3
inst✝ : PseudoMetricSpace R
d : N → ℝ
j : Z → N → R
f : R → R
α : R
ε M : ℝ
d0 : ∀ (a : N), 1 ≤ d a
e0 : 0 < ε
B : ∀ ⦃y : R⦄, y ∈ closedBall α ε → dist (f α) (f y) ≤ dist α y * M
L : ∀ ⦃z : Z⦄ ⦃a : N⦄, j z a ∈ closedBall α ε → 1 ≤ d a * dist (f α) (f (j z a))
⊢ ∃ A, 0 < A ∧ ∀ (z : Z) (a : N), 1 ≤ d a * (dist α (j z a) * A)
[PROOFSTEP]
have me0 : 0 < max (1 / ε) M :=
  lt_max_iff.mpr
    (Or.inl (one_div_pos.mpr e0))
      -- The maximum between `1 / ε` and `M` works
[GOAL]
Z : Type u_1
N : Type u_2
R : Type u_3
inst✝ : PseudoMetricSpace R
d : N → ℝ
j : Z → N → R
f : R → R
α : R
ε M : ℝ
d0 : ∀ (a : N), 1 ≤ d a
e0 : 0 < ε
B : ∀ ⦃y : R⦄, y ∈ closedBall α ε → dist (f α) (f y) ≤ dist α y * M
L : ∀ ⦃z : Z⦄ ⦃a : N⦄, j z a ∈ closedBall α ε → 1 ≤ d a * dist (f α) (f (j z a))
me0 : 0 < max (1 / ε) M
⊢ ∃ A, 0 < A ∧ ∀ (z : Z) (a : N), 1 ≤ d a * (dist α (j z a) * A)
[PROOFSTEP]
refine'
  ⟨max (1 / ε) M, me0, fun z a => _⟩
    -- First, let's deal with the easy case in which we are far away from `α`
[GOAL]
Z : Type u_1
N : Type u_2
R : Type u_3
inst✝ : PseudoMetricSpace R
d : N → ℝ
j : Z → N → R
f : R → R
α : R
ε M : ℝ
d0 : ∀ (a : N), 1 ≤ d a
e0 : 0 < ε
B : ∀ ⦃y : R⦄, y ∈ closedBall α ε → dist (f α) (f y) ≤ dist α y * M
L : ∀ ⦃z : Z⦄ ⦃a : N⦄, j z a ∈ closedBall α ε → 1 ≤ d a * dist (f α) (f (j z a))
me0 : 0 < max (1 / ε) M
z : Z
a : N
⊢ 1 ≤ d a * (dist α (j z a) * max (1 / ε) M)
[PROOFSTEP]
by_cases dm1 : 1 ≤ dist α (j z a) * max (1 / ε) M
[GOAL]
case pos
Z : Type u_1
N : Type u_2
R : Type u_3
inst✝ : PseudoMetricSpace R
d : N → ℝ
j : Z → N → R
f : R → R
α : R
ε M : ℝ
d0 : ∀ (a : N), 1 ≤ d a
e0 : 0 < ε
B : ∀ ⦃y : R⦄, y ∈ closedBall α ε → dist (f α) (f y) ≤ dist α y * M
L : ∀ ⦃z : Z⦄ ⦃a : N⦄, j z a ∈ closedBall α ε → 1 ≤ d a * dist (f α) (f (j z a))
me0 : 0 < max (1 / ε) M
z : Z
a : N
dm1 : 1 ≤ dist α (j z a) * max (1 / ε) M
⊢ 1 ≤ d a * (dist α (j z a) * max (1 / ε) M)
[PROOFSTEP]
exact one_le_mul_of_one_le_of_one_le (d0 a) dm1
[GOAL]
case neg
Z : Type u_1
N : Type u_2
R : Type u_3
inst✝ : PseudoMetricSpace R
d : N → ℝ
j : Z → N → R
f : R → R
α : R
ε M : ℝ
d0 : ∀ (a : N), 1 ≤ d a
e0 : 0 < ε
B : ∀ ⦃y : R⦄, y ∈ closedBall α ε → dist (f α) (f y) ≤ dist α y * M
L : ∀ ⦃z : Z⦄ ⦃a : N⦄, j z a ∈ closedBall α ε → 1 ≤ d a * dist (f α) (f (j z a))
me0 : 0 < max (1 / ε) M
z : Z
a : N
dm1 : ¬1 ≤ dist α (j z a) * max (1 / ε) M
⊢ 1 ≤ d a * (dist α (j z a) * max (1 / ε) M)
[PROOFSTEP]
have : j z a ∈ closedBall α ε :=
  by
  refine' mem_closedBall'.mp (le_trans _ ((one_div_le me0 e0).mpr (le_max_left _ _)))
  exact (le_div_iff me0).mpr (not_le.mp dm1).le
[GOAL]
Z : Type u_1
N : Type u_2
R : Type u_3
inst✝ : PseudoMetricSpace R
d : N → ℝ
j : Z → N → R
f : R → R
α : R
ε M : ℝ
d0 : ∀ (a : N), 1 ≤ d a
e0 : 0 < ε
B : ∀ ⦃y : R⦄, y ∈ closedBall α ε → dist (f α) (f y) ≤ dist α y * M
L : ∀ ⦃z : Z⦄ ⦃a : N⦄, j z a ∈ closedBall α ε → 1 ≤ d a * dist (f α) (f (j z a))
me0 : 0 < max (1 / ε) M
z : Z
a : N
dm1 : ¬1 ≤ dist α (j z a) * max (1 / ε) M
⊢ j z a ∈ closedBall α ε
[PROOFSTEP]
refine' mem_closedBall'.mp (le_trans _ ((one_div_le me0 e0).mpr (le_max_left _ _)))
[GOAL]
Z : Type u_1
N : Type u_2
R : Type u_3
inst✝ : PseudoMetricSpace R
d : N → ℝ
j : Z → N → R
f : R → R
α : R
ε M : ℝ
d0 : ∀ (a : N), 1 ≤ d a
e0 : 0 < ε
B : ∀ ⦃y : R⦄, y ∈ closedBall α ε → dist (f α) (f y) ≤ dist α y * M
L : ∀ ⦃z : Z⦄ ⦃a : N⦄, j z a ∈ closedBall α ε → 1 ≤ d a * dist (f α) (f (j z a))
me0 : 0 < max (1 / ε) M
z : Z
a : N
dm1 : ¬1 ≤ dist α (j z a) * max (1 / ε) M
⊢ dist α (j z a) ≤ 1 / max (1 / ε) M
[PROOFSTEP]
exact (le_div_iff me0).mpr (not_le.mp dm1).le
[GOAL]
case neg
Z : Type u_1
N : Type u_2
R : Type u_3
inst✝ : PseudoMetricSpace R
d : N → ℝ
j : Z → N → R
f : R → R
α : R
ε M : ℝ
d0 : ∀ (a : N), 1 ≤ d a
e0 : 0 < ε
B : ∀ ⦃y : R⦄, y ∈ closedBall α ε → dist (f α) (f y) ≤ dist α y * M
L : ∀ ⦃z : Z⦄ ⦃a : N⦄, j z a ∈ closedBall α ε → 1 ≤ d a * dist (f α) (f (j z a))
me0 : 0 < max (1 / ε) M
z : Z
a : N
dm1 : ¬1 ≤ dist α (j z a) * max (1 / ε) M
this : j z a ∈ closedBall α ε
⊢ 1 ≤ d a * (dist α (j z a) * max (1 / ε) M)
[PROOFSTEP]
refine'
  (L this).trans
    _
      -- remove a common factor and use the Lipschitz assumption `B`
[GOAL]
case neg
Z : Type u_1
N : Type u_2
R : Type u_3
inst✝ : PseudoMetricSpace R
d : N → ℝ
j : Z → N → R
f : R → R
α : R
ε M : ℝ
d0 : ∀ (a : N), 1 ≤ d a
e0 : 0 < ε
B : ∀ ⦃y : R⦄, y ∈ closedBall α ε → dist (f α) (f y) ≤ dist α y * M
L : ∀ ⦃z : Z⦄ ⦃a : N⦄, j z a ∈ closedBall α ε → 1 ≤ d a * dist (f α) (f (j z a))
me0 : 0 < max (1 / ε) M
z : Z
a : N
dm1 : ¬1 ≤ dist α (j z a) * max (1 / ε) M
this : j z a ∈ closedBall α ε
⊢ d a * dist (f α) (f (j z a)) ≤ d a * (dist α (j z a) * max (1 / ε) M)
[PROOFSTEP]
refine' mul_le_mul_of_nonneg_left ((B this).trans _) (zero_le_one.trans (d0 a))
[GOAL]
case neg
Z : Type u_1
N : Type u_2
R : Type u_3
inst✝ : PseudoMetricSpace R
d : N → ℝ
j : Z → N → R
f : R → R
α : R
ε M : ℝ
d0 : ∀ (a : N), 1 ≤ d a
e0 : 0 < ε
B : ∀ ⦃y : R⦄, y ∈ closedBall α ε → dist (f α) (f y) ≤ dist α y * M
L : ∀ ⦃z : Z⦄ ⦃a : N⦄, j z a ∈ closedBall α ε → 1 ≤ d a * dist (f α) (f (j z a))
me0 : 0 < max (1 / ε) M
z : Z
a : N
dm1 : ¬1 ≤ dist α (j z a) * max (1 / ε) M
this : j z a ∈ closedBall α ε
⊢ dist α (j z a) * M ≤ dist α (j z a) * max (1 / ε) M
[PROOFSTEP]
exact mul_le_mul_of_nonneg_left (le_max_right _ M) dist_nonneg
[GOAL]
α : ℝ
ha : Irrational α
f : ℤ[X]
f0 : f ≠ 0
fa : eval α (map (algebraMap ℤ ℝ) f) = 0
⊢ ∃ A, 0 < A ∧ ∀ (a : ℤ) (b : ℕ), 1 ≤ (↑b + 1) ^ natDegree f * (|α - ↑a / (↑b + 1)| * A)
[PROOFSTEP]
set fR : ℝ[X] := map (algebraMap ℤ ℝ) f
[GOAL]
α : ℝ
ha : Irrational α
f : ℤ[X]
f0 : f ≠ 0
fR : ℝ[X] := map (algebraMap ℤ ℝ) f
fa : eval α fR = 0
⊢ ∃ A, 0 < A ∧ ∀ (a : ℤ) (b : ℕ), 1 ≤ (↑b + 1) ^ natDegree f * (|α - ↑a / (↑b + 1)| * A)
[PROOFSTEP]
obtain fR0 : fR ≠ 0 := fun fR0 =>
  (map_injective (algebraMap ℤ ℝ) fun _ _ A => Int.cast_inj.mp A).ne f0
    (fR0.trans (Polynomial.map_zero _).symm)
      -- reformulating assumption `fa`: `α` is a root of `fR`.
[GOAL]
α : ℝ
ha : Irrational α
f : ℤ[X]
f0 : f ≠ 0
fR : ℝ[X] := map (algebraMap ℤ ℝ) f
fa : eval α fR = 0
fR0 : fR ≠ 0
⊢ ∃ A, 0 < A ∧ ∀ (a : ℤ) (b : ℕ), 1 ≤ (↑b + 1) ^ natDegree f * (|α - ↑a / (↑b + 1)| * A)
[PROOFSTEP]
have ar : α ∈ (fR.roots.toFinset : Set ℝ) :=
  Finset.mem_coe.mpr
    (Multiset.mem_toFinset.mpr ((mem_roots fR0).mpr (IsRoot.def.mpr fa)))
      -- Since the polynomial `fR` has finitely many roots, there is a closed interval centered at `α`
        -- such that `α` is the only root of `fR` in the interval.
[GOAL]
α : ℝ
ha : Irrational α
f : ℤ[X]
f0 : f ≠ 0
fR : ℝ[X] := map (algebraMap ℤ ℝ) f
fa : eval α fR = 0
fR0 : fR ≠ 0
ar : α ∈ ↑(Multiset.toFinset (roots fR))
⊢ ∃ A, 0 < A ∧ ∀ (a : ℤ) (b : ℕ), 1 ≤ (↑b + 1) ^ natDegree f * (|α - ↑a / (↑b + 1)| * A)
[PROOFSTEP]
obtain ⟨ζ, z0, U⟩ : ∃ ζ > 0, closedBall α ζ ∩ fR.roots.toFinset = { α } :=
  @exists_closedBall_inter_eq_singleton_of_discrete _ _ _ discrete_of_t1_of_finite _ ar
[GOAL]
case intro.intro
α : ℝ
ha : Irrational α
f : ℤ[X]
f0 : f ≠ 0
fR : ℝ[X] := map (algebraMap ℤ ℝ) f
fa : eval α fR = 0
fR0 : fR ≠ 0
ar : α ∈ ↑(Multiset.toFinset (roots fR))
ζ : ℝ
z0 : ζ > 0
U : closedBall α ζ ∩ ↑(Multiset.toFinset (roots fR)) = {α}
⊢ ∃ A, 0 < A ∧ ∀ (a : ℤ) (b : ℕ), 1 ≤ (↑b + 1) ^ natDegree f * (|α - ↑a / (↑b + 1)| * A)
[PROOFSTEP]
obtain ⟨xm, -, hM⟩ : ∃ xm : ℝ, xm ∈ Icc (α - ζ) (α + ζ) ∧ IsMaxOn (|fR.derivative.eval ·|) (Icc (α - ζ) (α + ζ)) xm :=
  IsCompact.exists_isMaxOn isCompact_Icc ⟨α, (sub_lt_self α z0).le, (lt_add_of_pos_right α z0).le⟩
    (continuous_abs.comp fR.derivative.continuous_aeval).continuousOn
[GOAL]
case intro.intro.intro.intro
α : ℝ
ha : Irrational α
f : ℤ[X]
f0 : f ≠ 0
fR : ℝ[X] := map (algebraMap ℤ ℝ) f
fa : eval α fR = 0
fR0 : fR ≠ 0
ar : α ∈ ↑(Multiset.toFinset (roots fR))
ζ : ℝ
z0 : ζ > 0
U : closedBall α ζ ∩ ↑(Multiset.toFinset (roots fR)) = {α}
xm : ℝ
hM : IsMaxOn (fun x => |eval x (↑derivative fR)|) (Icc (α - ζ) (α + ζ)) xm
⊢ ∃ A, 0 < A ∧ ∀ (a : ℤ) (b : ℕ), 1 ≤ (↑b + 1) ^ natDegree f * (|α - ↑a / (↑b + 1)| * A)
[PROOFSTEP]
refine'
  @exists_one_le_pow_mul_dist ℤ ℕ ℝ _ _ _ (fun y => fR.eval y) α ζ |fR.derivative.eval xm| _ z0 (fun y hy => _)
    fun z a hq =>
    _
      -- 1: the denominators are positive -- essentially by definition;
[GOAL]
case intro.intro.intro.intro.refine'_1
α : ℝ
ha : Irrational α
f : ℤ[X]
f0 : f ≠ 0
fR : ℝ[X] := map (algebraMap ℤ ℝ) f
fa : eval α fR = 0
fR0 : fR ≠ 0
ar : α ∈ ↑(Multiset.toFinset (roots fR))
ζ : ℝ
z0 : ζ > 0
U : closedBall α ζ ∩ ↑(Multiset.toFinset (roots fR)) = {α}
xm : ℝ
hM : IsMaxOn (fun x => |eval x (↑derivative fR)|) (Icc (α - ζ) (α + ζ)) xm
⊢ ∀ (a : ℕ), 1 ≤ (↑a + 1) ^ natDegree f
[PROOFSTEP]
exact fun a =>
  one_le_pow_of_one_le ((le_add_iff_nonneg_left 1).mpr a.cast_nonneg)
    _
      -- 2: the polynomial `fR` is Lipschitz at `α` -- as its derivative continuous;
[GOAL]
case intro.intro.intro.intro.refine'_2
α : ℝ
ha : Irrational α
f : ℤ[X]
f0 : f ≠ 0
fR : ℝ[X] := map (algebraMap ℤ ℝ) f
fa : eval α fR = 0
fR0 : fR ≠ 0
ar : α ∈ ↑(Multiset.toFinset (roots fR))
ζ : ℝ
z0 : ζ > 0
U : closedBall α ζ ∩ ↑(Multiset.toFinset (roots fR)) = {α}
xm : ℝ
hM : IsMaxOn (fun x => |eval x (↑derivative fR)|) (Icc (α - ζ) (α + ζ)) xm
y : ℝ
hy : y ∈ closedBall α ζ
⊢ dist ((fun y => eval y fR) α) ((fun y => eval y fR) y) ≤ dist α y * |eval xm (↑derivative fR)|
[PROOFSTEP]
rw [mul_comm]
[GOAL]
case intro.intro.intro.intro.refine'_2
α : ℝ
ha : Irrational α
f : ℤ[X]
f0 : f ≠ 0
fR : ℝ[X] := map (algebraMap ℤ ℝ) f
fa : eval α fR = 0
fR0 : fR ≠ 0
ar : α ∈ ↑(Multiset.toFinset (roots fR))
ζ : ℝ
z0 : ζ > 0
U : closedBall α ζ ∩ ↑(Multiset.toFinset (roots fR)) = {α}
xm : ℝ
hM : IsMaxOn (fun x => |eval x (↑derivative fR)|) (Icc (α - ζ) (α + ζ)) xm
y : ℝ
hy : y ∈ closedBall α ζ
⊢ dist ((fun y => eval y fR) α) ((fun y => eval y fR) y) ≤ |eval xm (↑derivative fR)| * dist α y
[PROOFSTEP]
rw [Real.closedBall_eq_Icc] at hy 
[GOAL]
case intro.intro.intro.intro.refine'_2
α : ℝ
ha : Irrational α
f : ℤ[X]
f0 : f ≠ 0
fR : ℝ[X] := map (algebraMap ℤ ℝ) f
fa : eval α fR = 0
fR0 : fR ≠ 0
ar : α ∈ ↑(Multiset.toFinset (roots fR))
ζ : ℝ
z0 : ζ > 0
U : closedBall α ζ ∩ ↑(Multiset.toFinset (roots fR)) = {α}
xm : ℝ
hM : IsMaxOn (fun x => |eval x (↑derivative fR)|) (Icc (α - ζ) (α + ζ)) xm
y : ℝ
hy : y ∈ Icc (α - ζ) (α + ζ)
⊢ dist ((fun y => eval y fR) α) ((fun y => eval y fR) y) ≤ |eval xm (↑derivative fR)| * dist α y
[PROOFSTEP]
refine'
  Convex.norm_image_sub_le_of_norm_deriv_le (fun _ _ => fR.differentiableAt) (fun y h => by rw [fR.deriv]; exact hM h)
    (convex_Icc _ _) hy (mem_Icc_iff_abs_le.mp _)
[GOAL]
α : ℝ
ha : Irrational α
f : ℤ[X]
f0 : f ≠ 0
fR : ℝ[X] := map (algebraMap ℤ ℝ) f
fa : eval α fR = 0
fR0 : fR ≠ 0
ar : α ∈ ↑(Multiset.toFinset (roots fR))
ζ : ℝ
z0 : ζ > 0
U : closedBall α ζ ∩ ↑(Multiset.toFinset (roots fR)) = {α}
xm : ℝ
hM : IsMaxOn (fun x => |eval x (↑derivative fR)|) (Icc (α - ζ) (α + ζ)) xm
y✝ : ℝ
hy : y✝ ∈ Icc (α - ζ) (α + ζ)
y : ℝ
h : y ∈ Icc (α - ζ) (α + ζ)
⊢ ‖deriv (fun x => eval x fR) y‖ ≤ |eval xm (↑derivative fR)|
[PROOFSTEP]
rw [fR.deriv]
[GOAL]
α : ℝ
ha : Irrational α
f : ℤ[X]
f0 : f ≠ 0
fR : ℝ[X] := map (algebraMap ℤ ℝ) f
fa : eval α fR = 0
fR0 : fR ≠ 0
ar : α ∈ ↑(Multiset.toFinset (roots fR))
ζ : ℝ
z0 : ζ > 0
U : closedBall α ζ ∩ ↑(Multiset.toFinset (roots fR)) = {α}
xm : ℝ
hM : IsMaxOn (fun x => |eval x (↑derivative fR)|) (Icc (α - ζ) (α + ζ)) xm
y✝ : ℝ
hy : y✝ ∈ Icc (α - ζ) (α + ζ)
y : ℝ
h : y ∈ Icc (α - ζ) (α + ζ)
⊢ ‖eval y (↑derivative fR)‖ ≤ |eval xm (↑derivative fR)|
[PROOFSTEP]
exact hM h
[GOAL]
case intro.intro.intro.intro.refine'_2
α : ℝ
ha : Irrational α
f : ℤ[X]
f0 : f ≠ 0
fR : ℝ[X] := map (algebraMap ℤ ℝ) f
fa : eval α fR = 0
fR0 : fR ≠ 0
ar : α ∈ ↑(Multiset.toFinset (roots fR))
ζ : ℝ
z0 : ζ > 0
U : closedBall α ζ ∩ ↑(Multiset.toFinset (roots fR)) = {α}
xm : ℝ
hM : IsMaxOn (fun x => |eval x (↑derivative fR)|) (Icc (α - ζ) (α + ζ)) xm
y : ℝ
hy : y ∈ Icc (α - ζ) (α + ζ)
⊢ |α - α| ≤ ζ
[PROOFSTEP]
exact
  @mem_closedBall_self ℝ _ α ζ
    (le_of_lt z0)
      -- 3: the weird inequality of Liouville type with powers of the denominators.
[GOAL]
case intro.intro.intro.intro.refine'_3
α : ℝ
ha : Irrational α
f : ℤ[X]
f0 : f ≠ 0
fR : ℝ[X] := map (algebraMap ℤ ℝ) f
fa : eval α fR = 0
fR0 : fR ≠ 0
ar : α ∈ ↑(Multiset.toFinset (roots fR))
ζ : ℝ
z0 : ζ > 0
U : closedBall α ζ ∩ ↑(Multiset.toFinset (roots fR)) = {α}
xm : ℝ
hM : IsMaxOn (fun x => |eval x (↑derivative fR)|) (Icc (α - ζ) (α + ζ)) xm
z : ℤ
a : ℕ
hq : ↑z / (↑a + 1) ∈ closedBall α ζ
⊢ 1 ≤ (↑a + 1) ^ natDegree f * dist ((fun y => eval y fR) α) ((fun y => eval y fR) (↑z / (↑a + 1)))
[PROOFSTEP]
show 1 ≤ (a + 1 : ℝ) ^ f.natDegree * |eval α fR - eval ((z : ℝ) / (a + 1)) fR|
[GOAL]
case intro.intro.intro.intro.refine'_3
α : ℝ
ha : Irrational α
f : ℤ[X]
f0 : f ≠ 0
fR : ℝ[X] := map (algebraMap ℤ ℝ) f
fa : eval α fR = 0
fR0 : fR ≠ 0
ar : α ∈ ↑(Multiset.toFinset (roots fR))
ζ : ℝ
z0 : ζ > 0
U : closedBall α ζ ∩ ↑(Multiset.toFinset (roots fR)) = {α}
xm : ℝ
hM : IsMaxOn (fun x => |eval x (↑derivative fR)|) (Icc (α - ζ) (α + ζ)) xm
z : ℤ
a : ℕ
hq : ↑z / (↑a + 1) ∈ closedBall α ζ
⊢ 1 ≤ (↑a + 1) ^ natDegree f * |eval α fR - eval (↑z / (↑a + 1)) fR|
[PROOFSTEP]
rw [fa, zero_sub, abs_neg]
[GOAL]
case intro.intro.intro.intro.refine'_3
α : ℝ
ha : Irrational α
f : ℤ[X]
f0 : f ≠ 0
fR : ℝ[X] := map (algebraMap ℤ ℝ) f
fa : eval α fR = 0
fR0 : fR ≠ 0
ar : α ∈ ↑(Multiset.toFinset (roots fR))
ζ : ℝ
z0 : ζ > 0
U : closedBall α ζ ∩ ↑(Multiset.toFinset (roots fR)) = {α}
xm : ℝ
hM : IsMaxOn (fun x => |eval x (↑derivative fR)|) (Icc (α - ζ) (α + ζ)) xm
z : ℤ
a : ℕ
hq : ↑z / (↑a + 1) ∈ closedBall α ζ
⊢ 1 ≤ (↑a + 1) ^ natDegree f * |eval (↑z / (↑a + 1)) fR|
[PROOFSTEP]
rw [show (a + 1 : ℝ) = ((a + 1 : ℕ) : ℤ) by norm_cast] at hq ⊢
  -- key observation: the right-hand side of the inequality is an *integer*.  Therefore,
      -- if its absolute value is not at least one, then it vanishes.  Proceed by contradiction
[GOAL]
α : ℝ
ha : Irrational α
f : ℤ[X]
f0 : f ≠ 0
fR : ℝ[X] := map (algebraMap ℤ ℝ) f
fa : eval α fR = 0
fR0 : fR ≠ 0
ar : α ∈ ↑(Multiset.toFinset (roots fR))
ζ : ℝ
z0 : ζ > 0
U : closedBall α ζ ∩ ↑(Multiset.toFinset (roots fR)) = {α}
xm : ℝ
hM : IsMaxOn (fun x => |eval x (↑derivative fR)|) (Icc (α - ζ) (α + ζ)) xm
z : ℤ
a : ℕ
hq : ↑z / (↑a + 1) ∈ closedBall α ζ
⊢ ↑a + 1 = ↑↑(a + 1)
[PROOFSTEP]
norm_cast
[GOAL]
α : ℝ
ha : Irrational α
f : ℤ[X]
f0 : f ≠ 0
fR : ℝ[X] := map (algebraMap ℤ ℝ) f
fa : eval α fR = 0
fR0 : fR ≠ 0
ar : α ∈ ↑(Multiset.toFinset (roots fR))
ζ : ℝ
z0 : ζ > 0
U : closedBall α ζ ∩ ↑(Multiset.toFinset (roots fR)) = {α}
xm : ℝ
hM : IsMaxOn (fun x => |eval x (↑derivative fR)|) (Icc (α - ζ) (α + ζ)) xm
z : ℤ
a : ℕ
hq : ↑z / ↑↑(a + 1) ∈ closedBall α ζ
⊢ ↑a + 1 = ↑↑(a + 1)
[PROOFSTEP]
norm_cast
[GOAL]
case intro.intro.intro.intro.refine'_3
α : ℝ
ha : Irrational α
f : ℤ[X]
f0 : f ≠ 0
fR : ℝ[X] := map (algebraMap ℤ ℝ) f
fa : eval α fR = 0
fR0 : fR ≠ 0
ar : α ∈ ↑(Multiset.toFinset (roots fR))
ζ : ℝ
z0 : ζ > 0
U : closedBall α ζ ∩ ↑(Multiset.toFinset (roots fR)) = {α}
xm : ℝ
hM : IsMaxOn (fun x => |eval x (↑derivative fR)|) (Icc (α - ζ) (α + ζ)) xm
z : ℤ
a : ℕ
hq : ↑z / ↑↑(a + 1) ∈ closedBall α ζ
⊢ 1 ≤ ↑↑(a + 1) ^ natDegree f * |eval (↑z / ↑↑(a + 1)) fR|
[PROOFSTEP]
refine'
  one_le_pow_mul_abs_eval_div (Int.coe_nat_succ_pos a) fun hy =>
    _
      -- As the evaluation of the polynomial vanishes, we found a root of `fR` that is rational.
          -- We know that `α` is the only root of `fR` in our interval, and `α` is irrational:
          -- follow your nose.
[GOAL]
case intro.intro.intro.intro.refine'_3
α : ℝ
ha : Irrational α
f : ℤ[X]
f0 : f ≠ 0
fR : ℝ[X] := map (algebraMap ℤ ℝ) f
fa : eval α fR = 0
fR0 : fR ≠ 0
ar : α ∈ ↑(Multiset.toFinset (roots fR))
ζ : ℝ
z0 : ζ > 0
U : closedBall α ζ ∩ ↑(Multiset.toFinset (roots fR)) = {α}
xm : ℝ
hM : IsMaxOn (fun x => |eval x (↑derivative fR)|) (Icc (α - ζ) (α + ζ)) xm
z : ℤ
a : ℕ
hq : ↑z / ↑↑(a + 1) ∈ closedBall α ζ
hy : eval (↑z / ↑↑(a + 1)) (map (algebraMap ℤ ℝ) f) = 0
⊢ False
[PROOFSTEP]
refine' (irrational_iff_ne_rational α).mp ha z (a + 1) (mem_singleton_iff.mp _).symm
[GOAL]
case intro.intro.intro.intro.refine'_3
α : ℝ
ha : Irrational α
f : ℤ[X]
f0 : f ≠ 0
fR : ℝ[X] := map (algebraMap ℤ ℝ) f
fa : eval α fR = 0
fR0 : fR ≠ 0
ar : α ∈ ↑(Multiset.toFinset (roots fR))
ζ : ℝ
z0 : ζ > 0
U : closedBall α ζ ∩ ↑(Multiset.toFinset (roots fR)) = {α}
xm : ℝ
hM : IsMaxOn (fun x => |eval x (↑derivative fR)|) (Icc (α - ζ) (α + ζ)) xm
z : ℤ
a : ℕ
hq : ↑z / ↑↑(a + 1) ∈ closedBall α ζ
hy : eval (↑z / ↑↑(a + 1)) (map (algebraMap ℤ ℝ) f) = 0
⊢ ↑z / ↑(↑a + 1) ∈ {α}
[PROOFSTEP]
refine' U.subset _
[GOAL]
case intro.intro.intro.intro.refine'_3
α : ℝ
ha : Irrational α
f : ℤ[X]
f0 : f ≠ 0
fR : ℝ[X] := map (algebraMap ℤ ℝ) f
fa : eval α fR = 0
fR0 : fR ≠ 0
ar : α ∈ ↑(Multiset.toFinset (roots fR))
ζ : ℝ
z0 : ζ > 0
U : closedBall α ζ ∩ ↑(Multiset.toFinset (roots fR)) = {α}
xm : ℝ
hM : IsMaxOn (fun x => |eval x (↑derivative fR)|) (Icc (α - ζ) (α + ζ)) xm
z : ℤ
a : ℕ
hq : ↑z / ↑↑(a + 1) ∈ closedBall α ζ
hy : eval (↑z / ↑↑(a + 1)) (map (algebraMap ℤ ℝ) f) = 0
⊢ ↑z / ↑(↑a + 1) ∈ closedBall α ζ ∩ ↑(Multiset.toFinset (roots fR))
[PROOFSTEP]
refine' ⟨hq, Finset.mem_coe.mp (Multiset.mem_toFinset.mpr _)⟩
[GOAL]
case intro.intro.intro.intro.refine'_3
α : ℝ
ha : Irrational α
f : ℤ[X]
f0 : f ≠ 0
fR : ℝ[X] := map (algebraMap ℤ ℝ) f
fa : eval α fR = 0
fR0 : fR ≠ 0
ar : α ∈ ↑(Multiset.toFinset (roots fR))
ζ : ℝ
z0 : ζ > 0
U : closedBall α ζ ∩ ↑(Multiset.toFinset (roots fR)) = {α}
xm : ℝ
hM : IsMaxOn (fun x => |eval x (↑derivative fR)|) (Icc (α - ζ) (α + ζ)) xm
z : ℤ
a : ℕ
hq : ↑z / ↑↑(a + 1) ∈ closedBall α ζ
hy : eval (↑z / ↑↑(a + 1)) (map (algebraMap ℤ ℝ) f) = 0
⊢ ↑z / ↑(↑a + 1) ∈ roots fR
[PROOFSTEP]
exact (mem_roots fR0).mpr (IsRoot.def.mpr hy)
[GOAL]
x : ℝ
lx : Liouville x
⊢ Transcendental ℤ x
[PROOFSTEP]
rintro
  ⟨f : ℤ[X], f0, ef0⟩
      -- Change `aeval x f = 0` to `eval (map _ f) = 0`, who knew.
[GOAL]
case intro.intro
x : ℝ
lx : Liouville x
f : ℤ[X]
f0 : f ≠ 0
ef0 : ↑(aeval x) f = 0
⊢ False
[PROOFSTEP]
replace ef0 : (f.map (algebraMap ℤ ℝ)).eval x = 0
[GOAL]
case ef0
x : ℝ
lx : Liouville x
f : ℤ[X]
f0 : f ≠ 0
ef0 : ↑(aeval x) f = 0
⊢ eval x (map (algebraMap ℤ ℝ) f) = 0
[PROOFSTEP]
rwa [aeval_def, ← eval_map] at ef0 
[GOAL]
case intro.intro
x : ℝ
lx : Liouville x
f : ℤ[X]
f0 : f ≠ 0
ef0 : eval x (map (algebraMap ℤ ℝ) f) = 0
⊢ False
[PROOFSTEP]
obtain ⟨A, hA, h⟩ :
  ∃ A : ℝ, 0 < A ∧ ∀ (a : ℤ) (b : ℕ), (1 : ℝ) ≤ ((b : ℝ) + 1) ^ f.natDegree * (|x - a / (b + 1)| * A) :=
  exists_pos_real_of_irrational_root lx.irrational f0 ef0
[GOAL]
case intro.intro.intro.intro
x : ℝ
lx : Liouville x
f : ℤ[X]
f0 : f ≠ 0
ef0 : eval x (map (algebraMap ℤ ℝ) f) = 0
A : ℝ
hA : 0 < A
h : ∀ (a : ℤ) (b : ℕ), 1 ≤ (↑b + 1) ^ natDegree f * (|x - ↑a / (↑b + 1)| * A)
⊢ False
[PROOFSTEP]
rcases pow_unbounded_of_one_lt A (lt_add_one 1) with
  ⟨r, hn⟩
    -- Use the Liouville property, with exponent `r + deg f`.
[GOAL]
case intro.intro.intro.intro.intro
x : ℝ
lx : Liouville x
f : ℤ[X]
f0 : f ≠ 0
ef0 : eval x (map (algebraMap ℤ ℝ) f) = 0
A : ℝ
hA : 0 < A
h : ∀ (a : ℤ) (b : ℕ), 1 ≤ (↑b + 1) ^ natDegree f * (|x - ↑a / (↑b + 1)| * A)
r : ℕ
hn : A < (1 + 1) ^ r
⊢ False
[PROOFSTEP]
obtain ⟨a, b, b1, -, a1⟩ : ∃ a b : ℤ, 1 < b ∧ x ≠ a / b ∧ |x - a / b| < 1 / (b : ℝ) ^ (r + f.natDegree) :=
  lx (r + f.natDegree)
[GOAL]
case intro.intro.intro.intro.intro.intro.intro.intro.intro
x : ℝ
lx : Liouville x
f : ℤ[X]
f0 : f ≠ 0
ef0 : eval x (map (algebraMap ℤ ℝ) f) = 0
A : ℝ
hA : 0 < A
h : ∀ (a : ℤ) (b : ℕ), 1 ≤ (↑b + 1) ^ natDegree f * (|x - ↑a / (↑b + 1)| * A)
r : ℕ
hn : A < (1 + 1) ^ r
a b : ℤ
b1 : 1 < b
a1 : |x - ↑a / ↑b| < 1 / ↑b ^ (r + natDegree f)
⊢ False
[PROOFSTEP]
have b0 : (0 : ℝ) < b :=
  zero_lt_one.trans
    (by rw [← Int.cast_one]; exact Int.cast_lt.mpr b1)
      -- Prove that `b ^ f.nat_degree * abs (x - a / b)` is strictly smaller than itself
        -- recall, this is a proof by contradiction!
[GOAL]
x : ℝ
lx : Liouville x
f : ℤ[X]
f0 : f ≠ 0
ef0 : eval x (map (algebraMap ℤ ℝ) f) = 0
A : ℝ
hA : 0 < A
h : ∀ (a : ℤ) (b : ℕ), 1 ≤ (↑b + 1) ^ natDegree f * (|x - ↑a / (↑b + 1)| * A)
r : ℕ
hn : A < (1 + 1) ^ r
a b : ℤ
b1 : 1 < b
a1 : |x - ↑a / ↑b| < 1 / ↑b ^ (r + natDegree f)
⊢ 1 < ↑b
[PROOFSTEP]
rw [← Int.cast_one]
[GOAL]
x : ℝ
lx : Liouville x
f : ℤ[X]
f0 : f ≠ 0
ef0 : eval x (map (algebraMap ℤ ℝ) f) = 0
A : ℝ
hA : 0 < A
h : ∀ (a : ℤ) (b : ℕ), 1 ≤ (↑b + 1) ^ natDegree f * (|x - ↑a / (↑b + 1)| * A)
r : ℕ
hn : A < (1 + 1) ^ r
a b : ℤ
b1 : 1 < b
a1 : |x - ↑a / ↑b| < 1 / ↑b ^ (r + natDegree f)
⊢ ↑1 < ↑b
[PROOFSTEP]
exact Int.cast_lt.mpr b1
[GOAL]
case intro.intro.intro.intro.intro.intro.intro.intro.intro
x : ℝ
lx : Liouville x
f : ℤ[X]
f0 : f ≠ 0
ef0 : eval x (map (algebraMap ℤ ℝ) f) = 0
A : ℝ
hA : 0 < A
h : ∀ (a : ℤ) (b : ℕ), 1 ≤ (↑b + 1) ^ natDegree f * (|x - ↑a / (↑b + 1)| * A)
r : ℕ
hn : A < (1 + 1) ^ r
a b : ℤ
b1 : 1 < b
a1 : |x - ↑a / ↑b| < 1 / ↑b ^ (r + natDegree f)
b0 : 0 < ↑b
⊢ False
[PROOFSTEP]
refine'
  lt_irrefl ((b : ℝ) ^ f.natDegree * |x - ↑a / ↑b|)
    _
      -- clear denominators at `a1`
[GOAL]
case intro.intro.intro.intro.intro.intro.intro.intro.intro
x : ℝ
lx : Liouville x
f : ℤ[X]
f0 : f ≠ 0
ef0 : eval x (map (algebraMap ℤ ℝ) f) = 0
A : ℝ
hA : 0 < A
h : ∀ (a : ℤ) (b : ℕ), 1 ≤ (↑b + 1) ^ natDegree f * (|x - ↑a / (↑b + 1)| * A)
r : ℕ
hn : A < (1 + 1) ^ r
a b : ℤ
b1 : 1 < b
a1 : |x - ↑a / ↑b| < 1 / ↑b ^ (r + natDegree f)
b0 : 0 < ↑b
⊢ ↑b ^ natDegree f * |x - ↑a / ↑b| < ↑b ^ natDegree f * |x - ↑a / ↑b|
[PROOFSTEP]
rw [lt_div_iff' (pow_pos b0 _), pow_add, mul_assoc] at a1 
[GOAL]
case intro.intro.intro.intro.intro.intro.intro.intro.intro
x : ℝ
lx : Liouville x
f : ℤ[X]
f0 : f ≠ 0
ef0 : eval x (map (algebraMap ℤ ℝ) f) = 0
A : ℝ
hA : 0 < A
h : ∀ (a : ℤ) (b : ℕ), 1 ≤ (↑b + 1) ^ natDegree f * (|x - ↑a / (↑b + 1)| * A)
r : ℕ
hn : A < (1 + 1) ^ r
a b : ℤ
b1 : 1 < b
a1 : ↑b ^ r * (↑b ^ natDegree f * |x - ↑a / ↑b|) < 1
b0 : 0 < ↑b
⊢ ↑b ^ natDegree f * |x - ↑a / ↑b| < ↑b ^ natDegree f * |x - ↑a / ↑b|
[PROOFSTEP]
refine'
  (_ : (b : ℝ) ^ f.natDegree * |x - a / b| < 1 / A).trans_le
    _
      -- This branch of the proof uses the Liouville condition and the Archimedean property
[GOAL]
case intro.intro.intro.intro.intro.intro.intro.intro.intro.refine'_1
x : ℝ
lx : Liouville x
f : ℤ[X]
f0 : f ≠ 0
ef0 : eval x (map (algebraMap ℤ ℝ) f) = 0
A : ℝ
hA : 0 < A
h : ∀ (a : ℤ) (b : ℕ), 1 ≤ (↑b + 1) ^ natDegree f * (|x - ↑a / (↑b + 1)| * A)
r : ℕ
hn : A < (1 + 1) ^ r
a b : ℤ
b1 : 1 < b
a1 : ↑b ^ r * (↑b ^ natDegree f * |x - ↑a / ↑b|) < 1
b0 : 0 < ↑b
⊢ ↑b ^ natDegree f * |x - ↑a / ↑b| < 1 / A
[PROOFSTEP]
refine' (lt_div_iff' hA).mpr _
[GOAL]
case intro.intro.intro.intro.intro.intro.intro.intro.intro.refine'_1
x : ℝ
lx : Liouville x
f : ℤ[X]
f0 : f ≠ 0
ef0 : eval x (map (algebraMap ℤ ℝ) f) = 0
A : ℝ
hA : 0 < A
h : ∀ (a : ℤ) (b : ℕ), 1 ≤ (↑b + 1) ^ natDegree f * (|x - ↑a / (↑b + 1)| * A)
r : ℕ
hn : A < (1 + 1) ^ r
a b : ℤ
b1 : 1 < b
a1 : ↑b ^ r * (↑b ^ natDegree f * |x - ↑a / ↑b|) < 1
b0 : 0 < ↑b
⊢ A * (↑b ^ natDegree f * |x - ↑a / ↑b|) < 1
[PROOFSTEP]
refine' lt_of_le_of_lt _ a1
[GOAL]
case intro.intro.intro.intro.intro.intro.intro.intro.intro.refine'_1
x : ℝ
lx : Liouville x
f : ℤ[X]
f0 : f ≠ 0
ef0 : eval x (map (algebraMap ℤ ℝ) f) = 0
A : ℝ
hA : 0 < A
h : ∀ (a : ℤ) (b : ℕ), 1 ≤ (↑b + 1) ^ natDegree f * (|x - ↑a / (↑b + 1)| * A)
r : ℕ
hn : A < (1 + 1) ^ r
a b : ℤ
b1 : 1 < b
a1 : ↑b ^ r * (↑b ^ natDegree f * |x - ↑a / ↑b|) < 1
b0 : 0 < ↑b
⊢ A * (↑b ^ natDegree f * |x - ↑a / ↑b|) ≤ ↑b ^ r * (↑b ^ natDegree f * |x - ↑a / ↑b|)
[PROOFSTEP]
gcongr
[GOAL]
case intro.intro.intro.intro.intro.intro.intro.intro.intro.refine'_1.h
x : ℝ
lx : Liouville x
f : ℤ[X]
f0 : f ≠ 0
ef0 : eval x (map (algebraMap ℤ ℝ) f) = 0
A : ℝ
hA : 0 < A
h : ∀ (a : ℤ) (b : ℕ), 1 ≤ (↑b + 1) ^ natDegree f * (|x - ↑a / (↑b + 1)| * A)
r : ℕ
hn : A < (1 + 1) ^ r
a b : ℤ
b1 : 1 < b
a1 : ↑b ^ r * (↑b ^ natDegree f * |x - ↑a / ↑b|) < 1
b0 : 0 < ↑b
⊢ A ≤ ↑b ^ r
[PROOFSTEP]
refine' hn.le.trans _
[GOAL]
case intro.intro.intro.intro.intro.intro.intro.intro.intro.refine'_1.h
x : ℝ
lx : Liouville x
f : ℤ[X]
f0 : f ≠ 0
ef0 : eval x (map (algebraMap ℤ ℝ) f) = 0
A : ℝ
hA : 0 < A
h : ∀ (a : ℤ) (b : ℕ), 1 ≤ (↑b + 1) ^ natDegree f * (|x - ↑a / (↑b + 1)| * A)
r : ℕ
hn : A < (1 + 1) ^ r
a b : ℤ
b1 : 1 < b
a1 : ↑b ^ r * (↑b ^ natDegree f * |x - ↑a / ↑b|) < 1
b0 : 0 < ↑b
⊢ (1 + 1) ^ r ≤ ↑b ^ r
[PROOFSTEP]
rw [one_add_one_eq_two]
[GOAL]
case intro.intro.intro.intro.intro.intro.intro.intro.intro.refine'_1.h
x : ℝ
lx : Liouville x
f : ℤ[X]
f0 : f ≠ 0
ef0 : eval x (map (algebraMap ℤ ℝ) f) = 0
A : ℝ
hA : 0 < A
h : ∀ (a : ℤ) (b : ℕ), 1 ≤ (↑b + 1) ^ natDegree f * (|x - ↑a / (↑b + 1)| * A)
r : ℕ
hn : A < (1 + 1) ^ r
a b : ℤ
b1 : 1 < b
a1 : ↑b ^ r * (↑b ^ natDegree f * |x - ↑a / ↑b|) < 1
b0 : 0 < ↑b
⊢ 2 ^ r ≤ ↑b ^ r
[PROOFSTEP]
gcongr
[GOAL]
case intro.intro.intro.intro.intro.intro.intro.intro.intro.refine'_1.h.hab
x : ℝ
lx : Liouville x
f : ℤ[X]
f0 : f ≠ 0
ef0 : eval x (map (algebraMap ℤ ℝ) f) = 0
A : ℝ
hA : 0 < A
h : ∀ (a : ℤ) (b : ℕ), 1 ≤ (↑b + 1) ^ natDegree f * (|x - ↑a / (↑b + 1)| * A)
r : ℕ
hn : A < (1 + 1) ^ r
a b : ℤ
b1 : 1 < b
a1 : ↑b ^ r * (↑b ^ natDegree f * |x - ↑a / ↑b|) < 1
b0 : 0 < ↑b
⊢ 2 ≤ ↑b
[PROOFSTEP]
exact
  Int.cast_two.symm.le.trans
    (Int.cast_le.mpr (Int.add_one_le_iff.mpr b1))
      -- this branch of the proof exploits the "integrality" of evaluations of polynomials
        -- at ratios of integers.
[GOAL]
case intro.intro.intro.intro.intro.intro.intro.intro.intro.refine'_2
x : ℝ
lx : Liouville x
f : ℤ[X]
f0 : f ≠ 0
ef0 : eval x (map (algebraMap ℤ ℝ) f) = 0
A : ℝ
hA : 0 < A
h : ∀ (a : ℤ) (b : ℕ), 1 ≤ (↑b + 1) ^ natDegree f * (|x - ↑a / (↑b + 1)| * A)
r : ℕ
hn : A < (1 + 1) ^ r
a b : ℤ
b1 : 1 < b
a1 : ↑b ^ r * (↑b ^ natDegree f * |x - ↑a / ↑b|) < 1
b0 : 0 < ↑b
⊢ 1 / A ≤ ↑b ^ natDegree f * |x - ↑a / ↑b|
[PROOFSTEP]
lift b to ℕ using zero_le_one.trans b1.le
[GOAL]
case intro.intro.intro.intro.intro.intro.intro.intro.intro.refine'_2.intro
x : ℝ
lx : Liouville x
f : ℤ[X]
f0 : f ≠ 0
ef0 : eval x (map (algebraMap ℤ ℝ) f) = 0
A : ℝ
hA : 0 < A
h : ∀ (a : ℤ) (b : ℕ), 1 ≤ (↑b + 1) ^ natDegree f * (|x - ↑a / (↑b + 1)| * A)
r : ℕ
hn : A < (1 + 1) ^ r
a : ℤ
b : ℕ
b1 : 1 < ↑b
a1 : ↑↑b ^ r * (↑↑b ^ natDegree f * |x - ↑a / ↑↑b|) < 1
b0 : 0 < ↑↑b
⊢ 1 / A ≤ ↑↑b ^ natDegree f * |x - ↑a / ↑↑b|
[PROOFSTEP]
specialize h a b.pred
[GOAL]
case intro.intro.intro.intro.intro.intro.intro.intro.intro.refine'_2.intro
x : ℝ
lx : Liouville x
f : ℤ[X]
f0 : f ≠ 0
ef0 : eval x (map (algebraMap ℤ ℝ) f) = 0
A : ℝ
hA : 0 < A
r : ℕ
hn : A < (1 + 1) ^ r
a : ℤ
b : ℕ
b1 : 1 < ↑b
a1 : ↑↑b ^ r * (↑↑b ^ natDegree f * |x - ↑a / ↑↑b|) < 1
b0 : 0 < ↑↑b
h : 1 ≤ (↑(Nat.pred b) + 1) ^ natDegree f * (|x - ↑a / (↑(Nat.pred b) + 1)| * A)
⊢ 1 / A ≤ ↑↑b ^ natDegree f * |x - ↑a / ↑↑b|
[PROOFSTEP]
rwa [← Nat.cast_succ, Nat.succ_pred_eq_of_pos (zero_lt_one.trans _), ← mul_assoc, ← div_le_iff hA] at h 
[GOAL]
x : ℝ
lx : Liouville x
f : ℤ[X]
f0 : f ≠ 0
ef0 : eval x (map (algebraMap ℤ ℝ) f) = 0
A : ℝ
hA : 0 < A
r : ℕ
hn : A < (1 + 1) ^ r
a : ℤ
b : ℕ
b1 : 1 < ↑b
a1 : ↑↑b ^ r * (↑↑b ^ natDegree f * |x - ↑a / ↑↑b|) < 1
b0 : 0 < ↑↑b
h : 1 ≤ ↑(Nat.succ (Nat.pred b)) ^ natDegree f * (|x - ↑a / ↑(Nat.succ (Nat.pred b))| * A)
⊢ 1 < b
[PROOFSTEP]
exact Int.ofNat_lt.mp b1
