Skip to content
This repository was archived by the owner on Jul 24, 2024. It is now read-only.

Commit 781cc63

Browse files
committed
feat(data/real/liouville, ring_theory/algebraic): a Liouville number is transcendental! (#6204)
This is an annotated proof. It finishes the first half of the Liouville PR. A taste of what is to come in a future PR: a proof that Liouville numbers actually exist! Co-authored-by: Jujian Zhang <jujian.zhang1998@outlook.com>
1 parent efa6877 commit 781cc63

File tree

2 files changed

+54
-11
lines changed

2 files changed

+54
-11
lines changed

src/data/real/liouville.lean

Lines changed: 51 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -10,15 +10,16 @@ import ring_theory.algebraic
1010
import topology.algebra.polynomial
1111
/-!
1212
# Liouville's theorem
13-
This file will contain a proof of Liouville's theorem stating that all Liouville numbers are
13+
This file contains a proof of Liouville's theorem stating that all Liouville numbers are
1414
transcendental.
1515
16-
At the moment, it contains the definition of a Liouville number, a proof that Liouville
17-
numbers are irrational and two technical lemmas.
16+
To obtain this result, there is first a proof that Liouville numbers are irrational and two
17+
technical lemmas. These lemmas exploit the fact that a polynomial with integer coefficients
18+
takes integer values at integers. When evaluating at a rational number, we can clear denominators
19+
and obtain precise inequalities that ultimately allow us to prove transcendence of
20+
Liouville numbers.
1821
-/
1922

20-
section irrational
21-
2223
/--
2324
A Liouville number is a real number `x` such that for every natural number `n`, there exist
2425
`a, b ∈ ℤ` with `1 < b` such that `0 < |x - a/b| < 1/bⁿ`.
@@ -28,7 +29,7 @@ def liouville (x : ℝ) := ∀ n : ℕ, ∃ a b : ℤ, 1 < b ∧ x ≠ a / b ∧
2829

2930
namespace liouville
3031

31-
lemma irrational {x : ℝ} (h : liouville x) : irrational x :=
32+
@[protected] lemma irrational {x : ℝ} (h : liouville x) : irrational x :=
3233
begin
3334
-- By contradiction, `x = a / b`, with `a ∈ ℤ`, `0 < b ∈ ℕ` is a Liouville number,
3435
rintros ⟨⟨a, b, bN0, cop⟩, rfl⟩,
@@ -56,7 +57,7 @@ begin
5657
-- Actually, `q` is a natural number
5758
lift q to ℕ using (zero_lt_one.trans q1).le,
5859
-- Looks innocuous, but we now have an integer with non-zero absolute value: this is at
59-
--least one away from zero. The gain here is what gets the proof going.
60+
-- least one away from zero. The gain here is what gets the proof going.
6061
have ap : 0 < abs (a * ↑q - ↑b * p) := abs_pos.mpr a0,
6162
-- Actually, the absolute value of an integer is a natural number
6263
lift (abs (a * ↑q - ↑b * p)) to ℕ using (abs_nonneg (a * ↑q - ↑b * p)),
@@ -67,8 +68,6 @@ begin
6768
exact not_le.mpr a1 (nat.mul_lt_mul_pow_succ (int.coe_nat_pos.mp ap) (int.coe_nat_lt.mp q1)).le,
6869
end
6970

70-
end liouville
71-
7271
open polynomial metric set real ring_hom
7372

7473
/-- Let `Z, N` be types, let `R` be a metric space, let `α : R` be a point and let
@@ -93,7 +92,7 @@ lemma exists_one_le_pow_mul_dist {Z N R : Type*} [metric_space R]
9392
-- denominators are positive
9493
(d0 : ∀ (a : N), 1 ≤ d a)
9594
(e0 : 0 < ε)
96-
--function is Lipschitz at α
95+
-- function is Lipschitz at α
9796
(B : ∀ ⦃y : R⦄, y ∈ closed_ball α ε → dist (f α) (f y) ≤ (dist α y) * M)
9897
-- clear denominators
9998
(L : ∀ ⦃z : Z⦄, ∀ ⦃a : N⦄, j z a ∈ closed_ball α ε → 1 ≤ (d a) * dist (f α) (f (j z a))) :
@@ -167,4 +166,45 @@ begin
167166
exact (mem_roots fR0).mpr (is_root.def.mpr hy) }
168167
end
169168

170-
end irrational
169+
theorem transcendental {x : ℝ} (lx : liouville x) :
170+
transcendental ℤ x :=
171+
begin
172+
-- Proceed by contradiction: if `x` is algebraic, then `x` is the root (`ef0`) of a
173+
-- non-zero (`f0`) polynomial `f`
174+
rintros ⟨f : polynomial ℤ, f0, ef0⟩,
175+
-- Change `aeval x f = 0` to `eval (map _ f) = 0`, who knew.
176+
replace ef0 : (f.map (algebra_map ℤ ℝ)).eval x = 0, { rwa [aeval_def, ← eval_map] at ef0 },
177+
-- There is a "large" real number `A` such that `(b + 1) ^ (deg f) * |f (x - a / (b + 1))| * A`
178+
-- is at least one. This is obtained from lemma `exists_pos_real_of_irrational_root`.
179+
obtain ⟨A, hA, h⟩ : ∃ (A : ℝ), 0 < A ∧
180+
∀ (a : ℤ) (b : ℕ), (1 : ℝ) ≤ (b.succ) ^ f.nat_degree * (abs (x - a / (b.succ)) * A) :=
181+
exists_pos_real_of_irrational_root lx.irrational f0 ef0,
182+
-- Since the real numbers are Archimedean, a power of `2` exceeds `A`: `hn : A < 2 ^ r`.
183+
rcases pow_unbounded_of_one_lt A (lt_add_one 1) with ⟨r, hn⟩,
184+
-- Use the Liouville property, with exponent `r + deg f`.
185+
obtain ⟨a, b, b1, -, a1⟩ : ∃ (a b : ℤ), 1 < b ∧ x ≠ a / b ∧
186+
abs (x - a / b) < 1 / b ^ (r + f.nat_degree) := lx (r + f.nat_degree),
187+
have b0 : (0 : ℝ) < b := zero_lt_one.trans (by { rw ← int.cast_one, exact int.cast_lt.mpr b1 }),
188+
-- Prove that `b ^ f.nat_degree * abs (x - a / b)` is strictly smaller than itself
189+
-- recall, this is a proof by contradiction!
190+
refine lt_irrefl ((b : ℝ) ^ f.nat_degree * abs (x - ↑a / ↑b)) _,
191+
-- clear denominators at `a1`
192+
rw [lt_div_iff' (pow_pos b0 _), pow_add, mul_assoc] at a1,
193+
-- split the inequality via `1 / A`.
194+
refine ((_ : (b : ℝ) ^ f.nat_degree * abs (x - a / b) < 1 / A).trans_le _),
195+
-- This branch of the proof uses the Liouville condition and the Archimedean property
196+
{ refine (lt_div_iff' hA).mpr _,
197+
refine lt_of_le_of_lt _ a1,
198+
refine mul_le_mul_of_nonneg_right _ (mul_nonneg (pow_nonneg b0.le _) (abs_nonneg _)),
199+
refine hn.le.trans _,
200+
refine pow_le_pow_of_le_left zero_le_two _ _,
201+
exact int.cast_two.symm.le.trans (int.cast_le.mpr (int.add_one_le_iff.mpr b1)) },
202+
-- this branch of the proof exploits the "integrality" of evaluations of polynomials
203+
-- at ratios of integers.
204+
{ lift b to ℕ using zero_le_one.trans b1.le,
205+
specialize h a b.pred,
206+
rwa [nat.succ_pred_eq_of_pos (zero_lt_one.trans _), ← mul_assoc, ← (div_le_iff hA)] at h,
207+
exact int.coe_nat_lt.mp b1 }
208+
end
209+
210+
end liouville

src/ring_theory/algebraic.lean

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,9 @@ variables (R : Type u) {A : Type v} [comm_ring R] [ring A] [algebra R A]
2929
def is_algebraic (x : A) : Prop :=
3030
∃ p : polynomial R, p ≠ 0 ∧ aeval x p = 0
3131

32+
/-- An element of an R-algebra is transcendental over R if it is not algebraic over R. -/
33+
def transcendental (x : A) : Prop := ¬ is_algebraic R x
34+
3235
variables {R}
3336

3437
/-- A subalgebra is algebraic if all its elements are algebraic. -/

0 commit comments

Comments
 (0)