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

Commit 2f56620

Browse files
committed
feat(data/real/irrational): define Liouville numbers (#6158)
Prove that a Liouville number is irrational Co-authored-by: Jujian Zhang <jujian.zhang1998@outlook.com>
1 parent 64914d3 commit 2f56620

File tree

1 file changed

+61
-0
lines changed

1 file changed

+61
-0
lines changed

src/data/real/liouville.lean

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
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

Comments
 (0)