@@ -10,15 +10,16 @@ import ring_theory.algebraic
10
10
import topology.algebra.polynomial
11
11
/-!
12
12
# 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
14
14
transcendental.
15
15
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.
18
21
-/
19
22
20
- section irrational
21
-
22
23
/--
23
24
A Liouville number is a real number `x` such that for every natural number `n`, there exist
24
25
`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 ∧
28
29
29
30
namespace liouville
30
31
31
- lemma irrational {x : ℝ} (h : liouville x) : irrational x :=
32
+ @[protected] lemma irrational {x : ℝ} (h : liouville x) : irrational x :=
32
33
begin
33
34
-- By contradiction, `x = a / b`, with `a ∈ ℤ`, `0 < b ∈ ℕ` is a Liouville number,
34
35
rintros ⟨⟨a, b, bN0, cop⟩, rfl⟩,
56
57
-- Actually, `q` is a natural number
57
58
lift q to ℕ using (zero_lt_one.trans q1).le,
58
59
-- 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.
60
61
have ap : 0 < abs (a * ↑q - ↑b * p) := abs_pos.mpr a0,
61
62
-- Actually, the absolute value of an integer is a natural number
62
63
lift (abs (a * ↑q - ↑b * p)) to ℕ using (abs_nonneg (a * ↑q - ↑b * p)),
67
68
exact not_le.mpr a1 (nat.mul_lt_mul_pow_succ (int.coe_nat_pos.mp ap) (int.coe_nat_lt.mp q1)).le,
68
69
end
69
70
70
- end liouville
71
-
72
71
open polynomial metric set real ring_hom
73
72
74
73
/-- 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]
93
92
-- denominators are positive
94
93
(d0 : ∀ (a : N), 1 ≤ d a)
95
94
(e0 : 0 < ε)
96
- -- function is Lipschitz at α
95
+ -- function is Lipschitz at α
97
96
(B : ∀ ⦃y : R⦄, y ∈ closed_ball α ε → dist (f α) (f y) ≤ (dist α y) * M)
98
97
-- clear denominators
99
98
(L : ∀ ⦃z : Z⦄, ∀ ⦃a : N⦄, j z a ∈ closed_ball α ε → 1 ≤ (d a) * dist (f α) (f (j z a))) :
@@ -167,4 +166,45 @@ begin
167
166
exact (mem_roots fR0).mpr (is_root.def.mpr hy) }
168
167
end
169
168
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
0 commit comments