|
| 1 | +/- |
| 2 | +Copyright (c) 2020 Jujian Zhang. All rights reserved. |
| 3 | +Released under Apache 2.0 license as described in the file LICENSE. |
| 4 | +Authors: Jujian Zhang |
| 5 | +-/ |
| 6 | +import data.real.irrational |
| 7 | + |
| 8 | +/-! |
| 9 | +# Liouville's theorem |
| 10 | +This file will contain a proof of Liouville's theorem stating that all Liouville numbers are |
| 11 | +transcendental. |
| 12 | +
|
| 13 | +At the moment, it contains the definition of a Liouville number and a proof that Liouville |
| 14 | +numbers are irrational. |
| 15 | +
|
| 16 | +The commented imports below will appear as they are needed. I (Damiano) leave them here for |
| 17 | +ease of reference. |
| 18 | +--import data.polynomial.denoms_clearable |
| 19 | +--import ring_theory.algebraic |
| 20 | +--import topology.algebra.polynomial |
| 21 | +--import analysis.calculus.mean_value |
| 22 | +-/ |
| 23 | + |
| 24 | +section irrational |
| 25 | + |
| 26 | +/-- |
| 27 | +A Liouville number is a real number `x` such that for every natural number `n`, there exist |
| 28 | +`a, b ∈ ℤ` with `1 < b` such that `0 < |x - a/b| < 1/bⁿ`. |
| 29 | +In the implementation, the condition `x ≠ a/b` replaces the traditional equivalent `0 < |x - a/b|`. |
| 30 | +-/ |
| 31 | +def is_liouville (x : ℝ) := ∀ n : ℕ, ∃ a b : ℤ, |
| 32 | + 1 < b ∧ x ≠ a / b ∧ abs (x - a / b) < 1 / b ^ n |
| 33 | + |
| 34 | +namespace is_liouville |
| 35 | + |
| 36 | +lemma irrational {x : ℝ} (h : is_liouville x) : irrational x := |
| 37 | +begin |
| 38 | + rintros ⟨⟨a, b, bN0, cop⟩, rfl⟩, |
| 39 | + change (is_liouville (a / b)) at h, |
| 40 | + rcases h (b + 1) with ⟨p, q, q1, a0, a1⟩, |
| 41 | + have qR0 : (0 : ℝ) < q := int.cast_pos.mpr (zero_lt_one.trans q1), |
| 42 | + have b0 : (b : ℝ) ≠ 0 := ne_of_gt (nat.cast_pos.mpr bN0), |
| 43 | + have bq0 : (0 : ℝ) < b * q := mul_pos (nat.cast_pos.mpr bN0) qR0, |
| 44 | + replace a1 : abs (a * q - b * p) * q ^ (b + 1) < b * q, by |
| 45 | + rwa [div_sub_div _ _ b0 (ne_of_gt qR0), abs_div, div_lt_div_iff (abs_pos.mpr (ne_of_gt bq0)) |
| 46 | + (pow_pos qR0 _), abs_of_pos bq0, one_mul, ← int.cast_pow, ← int.cast_mul, ← int.cast_coe_nat, |
| 47 | + ← int.cast_mul, ← int.cast_mul, ← int.cast_sub, ← int.cast_abs, ← int.cast_mul, int.cast_lt] |
| 48 | + at a1, |
| 49 | + replace a0 : ¬a * q - ↑b * p = 0, by |
| 50 | + rwa [ne.def, div_eq_div_iff b0 (ne_of_gt qR0), mul_comm ↑p, ← sub_eq_zero_iff_eq, |
| 51 | + ← int.cast_coe_nat, ← int.cast_mul, ← int.cast_mul, ← int.cast_sub, int.cast_eq_zero] at a0, |
| 52 | + lift q to ℕ using (zero_lt_one.trans q1).le, |
| 53 | + have ap : 0 < abs (a * ↑q - ↑b * p) := abs_pos.mpr a0, |
| 54 | + lift (abs (a * ↑q - ↑b * p)) to ℕ using (abs_nonneg (a * ↑q - ↑b * p)), |
| 55 | + rw [← int.coe_nat_mul, ← int.coe_nat_pow, ← int.coe_nat_mul, int.coe_nat_lt] at a1, |
| 56 | + exact not_le.mpr a1 (nat.mul_lt_mul_pow_succ (int.coe_nat_pos.mp ap) (int.coe_nat_lt.mp q1)).le, |
| 57 | +end |
| 58 | + |
| 59 | +end is_liouville |
| 60 | + |
| 61 | +end irrational |
0 commit comments