number_theory.liouville.basic
⟷
Mathlib.NumberTheory.Liouville.Basic
The following section lists changes to this file in mathlib3 and mathlib4 that occured after the initial port. Most recent changes are shown first. Hovering over a commit will show all commits associated with the same mathlib3 commit.
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(last sync)
mathlib commit https://github.com/leanprover-community/mathlib/commit/65a1391a0106c9204fe45bc73a039f056558cb83
@@ -182,7 +182,7 @@ theorem exists_pos_real_of_irrational_root {α : ℝ} (ha : Irrational α) {f :
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
- refine' one_le_pow_mul_abs_eval_div (Int.coe_nat_succ_pos a) fun hy => _
+ refine' one_le_pow_mul_abs_eval_div (Int.natCast_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.
mathlib commit https://github.com/leanprover-community/mathlib/commit/65a1391a0106c9204fe45bc73a039f056558cb83
@@ -60,14 +60,14 @@ protected theorem irrational {x : ℝ} (h : Liouville x) : Irrational x :=
div_lt_div_iff (abs_pos.mpr (ne_of_gt bq0)) (pow_pos qR0 _), abs_of_pos bq0, one_mul,
←-- ... and revert to integers
Int.cast_pow,
- ← Int.cast_mul, ← Int.cast_ofNat, ← Int.cast_mul, ← Int.cast_mul, ← Int.cast_sub, ←
+ ← Int.cast_mul, ← Int.cast_natCast, ← Int.cast_mul, ← Int.cast_mul, ← Int.cast_sub, ←
Int.cast_abs, ← Int.cast_mul, Int.cast_lt] at a1
-- At a0, clear denominators...
replace a0 : ¬a * q - ↑b * p = 0;
·
rwa [Ne.def, div_eq_div_iff b0 (ne_of_gt qR0), mul_comm ↑p, ← sub_eq_zero,
←-- ... and revert to integers
- Int.cast_ofNat,
+ Int.cast_natCast,
← Int.cast_mul, ← Int.cast_mul, ← Int.cast_sub, Int.cast_eq_zero] at a0
-- Actually, `q` is a natural number
lift q to ℕ using (zero_lt_one.trans q1).le
mathlib commit https://github.com/leanprover-community/mathlib/commit/65a1391a0106c9204fe45bc73a039f056558cb83
@@ -4,7 +4,7 @@ Released under Apache 2.0 license as described in the file LICENSE.
Authors: Damiano Testa, Jujian Zhang
-/
import Analysis.Calculus.MeanValue
-import Data.Polynomial.DenomsClearable
+import Algebra.Polynomial.DenomsClearable
import Data.Real.Irrational
#align_import number_theory.liouville.basic from "leanprover-community/mathlib"@"af471b9e3ce868f296626d33189b4ce730fa4c00"
mathlib commit https://github.com/leanprover-community/mathlib/commit/65a1391a0106c9204fe45bc73a039f056558cb83
@@ -57,14 +57,18 @@ protected theorem irrational {x : ℝ} (h : Liouville x) : Irrational x :=
replace a1 : |a * q - b * p| * q ^ (b + 1) < b * q;
·
rwa [div_sub_div _ _ b0 (ne_of_gt qR0), abs_div,
- div_lt_div_iff (abs_pos.mpr (ne_of_gt bq0)) (pow_pos qR0 _), abs_of_pos bq0, one_mul, ←
- Int.cast_pow, ← Int.cast_mul, ← Int.cast_ofNat, ← Int.cast_mul, ← Int.cast_mul, ←
- Int.cast_sub, ← Int.cast_abs, ← Int.cast_mul, Int.cast_lt] at a1
+ div_lt_div_iff (abs_pos.mpr (ne_of_gt bq0)) (pow_pos qR0 _), abs_of_pos bq0, one_mul,
+ ←-- ... and revert to integers
+ Int.cast_pow,
+ ← Int.cast_mul, ← Int.cast_ofNat, ← Int.cast_mul, ← Int.cast_mul, ← Int.cast_sub, ←
+ Int.cast_abs, ← Int.cast_mul, Int.cast_lt] at a1
-- At a0, clear denominators...
replace a0 : ¬a * q - ↑b * p = 0;
·
- rwa [Ne.def, div_eq_div_iff b0 (ne_of_gt qR0), mul_comm ↑p, ← sub_eq_zero, ← Int.cast_ofNat, ←
- Int.cast_mul, ← Int.cast_mul, ← Int.cast_sub, Int.cast_eq_zero] at a0
+ rwa [Ne.def, div_eq_div_iff b0 (ne_of_gt qR0), mul_comm ↑p, ← sub_eq_zero,
+ ←-- ... and revert to integers
+ Int.cast_ofNat,
+ ← Int.cast_mul, ← Int.cast_mul, ← Int.cast_sub, Int.cast_eq_zero] at a0
-- Actually, `q` is a natural number
lift q to ℕ using (zero_lt_one.trans q1).le
-- Looks innocuous, but we now have an integer with non-zero absolute value: this is at
mathlib commit https://github.com/leanprover-community/mathlib/commit/65a1391a0106c9204fe45bc73a039f056558cb83
@@ -45,7 +45,7 @@ protected theorem irrational {x : ℝ} (h : Liouville x) : Irrational x :=
-- By contradiction, `x = a / b`, with `a ∈ ℤ`, `0 < b ∈ ℕ` is a Liouville number,
rintro ⟨⟨a, b, bN0, cop⟩, rfl⟩
-- clear up the mess of constructions of rationals
- rw [Rat.cast_mk', ← div_eq_mul_inv] at h
+ rw [Rat.cast_mk', ← div_eq_mul_inv] at h
-- Since `a / b` is a Liouville number, there are `p, q ∈ ℤ`, with `q1 : 1 < q`,
-- `a0 : a / b ≠ p / q` and `a1 : |a / b - p / q| < 1 / q ^ (b + 1)`
rcases h (b + 1) with ⟨p, q, q1, a0, a1⟩
@@ -57,18 +57,14 @@ protected theorem irrational {x : ℝ} (h : Liouville x) : Irrational x :=
replace a1 : |a * q - b * p| * q ^ (b + 1) < b * q;
·
rwa [div_sub_div _ _ b0 (ne_of_gt qR0), abs_div,
- div_lt_div_iff (abs_pos.mpr (ne_of_gt bq0)) (pow_pos qR0 _), abs_of_pos bq0, one_mul,
- ←-- ... and revert to integers
- Int.cast_pow,
- ← Int.cast_mul, ← Int.cast_ofNat, ← Int.cast_mul, ← Int.cast_mul, ← Int.cast_sub, ←
- Int.cast_abs, ← Int.cast_mul, Int.cast_lt] at a1
+ div_lt_div_iff (abs_pos.mpr (ne_of_gt bq0)) (pow_pos qR0 _), abs_of_pos bq0, one_mul, ←
+ Int.cast_pow, ← Int.cast_mul, ← Int.cast_ofNat, ← Int.cast_mul, ← Int.cast_mul, ←
+ Int.cast_sub, ← Int.cast_abs, ← Int.cast_mul, Int.cast_lt] at a1
-- At a0, clear denominators...
replace a0 : ¬a * q - ↑b * p = 0;
·
- rwa [Ne.def, div_eq_div_iff b0 (ne_of_gt qR0), mul_comm ↑p, ← sub_eq_zero,
- ←-- ... and revert to integers
- Int.cast_ofNat,
- ← Int.cast_mul, ← Int.cast_mul, ← Int.cast_sub, Int.cast_eq_zero] at a0
+ rwa [Ne.def, div_eq_div_iff b0 (ne_of_gt qR0), mul_comm ↑p, ← sub_eq_zero, ← Int.cast_ofNat, ←
+ Int.cast_mul, ← Int.cast_mul, ← Int.cast_sub, Int.cast_eq_zero] at a0
-- Actually, `q` is a natural number
lift q to ℕ using (zero_lt_one.trans q1).le
-- Looks innocuous, but we now have an integer with non-zero absolute value: this is at
@@ -77,7 +73,7 @@ protected theorem irrational {x : ℝ} (h : Liouville x) : Irrational x :=
-- Actually, the absolute value of an integer is a natural number
lift |a * ↑q - ↑b * p| to ℕ using abs_nonneg (a * ↑q - ↑b * p)
-- At a1, revert to natural numbers
- rw [← Int.ofNat_mul, ← Int.coe_nat_pow, ← Int.ofNat_mul, Int.ofNat_lt] at a1
+ rw [← Int.ofNat_mul, ← Int.coe_nat_pow, ← Int.ofNat_mul, Int.ofNat_lt] at a1
-- Recall this is by contradiction: we obtained the inequality `b * q ≤ x * q ^ (b + 1)`, so
-- we are done.
exact not_le.mpr a1 (Nat.mul_lt_mul_pow_succ (int.coe_nat_pos.mp ap) (int.coe_nat_lt.mp q1)).le
@@ -170,7 +166,7 @@ theorem exists_pos_real_of_irrational_root {α : ℝ} (ha : Irrational α) {f :
· 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;
· rw [mul_comm]
- rw [Real.closedBall_eq_Icc] at hy
+ rw [Real.closedBall_eq_Icc] at hy
-- apply the Mean Value Theorem: the bound on the derivative comes from differentiability.
refine'
Convex.norm_image_sub_le_of_norm_deriv_le (fun _ _ => fR.differentiable_at)
@@ -202,7 +198,7 @@ protected theorem transcendental {x : ℝ} (lx : Liouville x) : Transcendental
rintro ⟨f : ℤ[X], f0, ef0⟩
-- Change `aeval x f = 0` to `eval (map _ f) = 0`, who knew.
replace ef0 : (f.map (algebraMap ℤ ℝ)).eval x = 0;
- · rwa [aeval_def, ← eval_map] at ef0
+ · rwa [aeval_def, ← eval_map] at ef0
-- There is a "large" real number `A` such that `(b + 1) ^ (deg f) * |f (x - a / (b + 1))| * A`
-- is at least one. This is obtained from lemma `exists_pos_real_of_irrational_root`.
obtain ⟨A, hA, h⟩ :
@@ -219,7 +215,7 @@ protected theorem transcendental {x : ℝ} (lx : Liouville x) : Transcendental
-- recall, this is a proof by contradiction!
refine' lt_irrefl ((b : ℝ) ^ f.nat_degree * |x - ↑a / ↑b|) _
-- clear denominators at `a1`
- rw [lt_div_iff' (pow_pos b0 _), pow_add, mul_assoc] at a1
+ rw [lt_div_iff' (pow_pos b0 _), pow_add, mul_assoc] at a1
-- split the inequality via `1 / A`.
refine' (_ : (b : ℝ) ^ f.nat_degree * |x - a / b| < 1 / A).trans_le _
-- This branch of the proof uses the Liouville condition and the Archimedean property
@@ -234,7 +230,7 @@ protected theorem transcendental {x : ℝ} (lx : Liouville x) : Transcendental
· lift b to ℕ using zero_le_one.trans b1.le
specialize h a b.pred
rwa [← Nat.cast_succ, Nat.succ_pred_eq_of_pos (zero_lt_one.trans _), ← mul_assoc, ←
- div_le_iff hA] at h
+ div_le_iff hA] at h
exact int.coe_nat_lt.mp b1
#align liouville.transcendental Liouville.transcendental
-/
mathlib commit https://github.com/leanprover-community/mathlib/commit/65a1391a0106c9204fe45bc73a039f056558cb83
@@ -227,7 +227,7 @@ protected theorem transcendental {x : ℝ} (lx : Liouville x) : Transcendental
refine' lt_of_le_of_lt _ a1
refine' mul_le_mul_of_nonneg_right _ (mul_nonneg (pow_nonneg b0.le _) (abs_nonneg _))
refine' hn.le.trans _
- refine' pow_le_pow_of_le_left zero_le_two _ _
+ refine' pow_le_pow_left zero_le_two _ _
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.
mathlib commit https://github.com/leanprover-community/mathlib/commit/ce64cd319bb6b3e82f31c2d38e79080d377be451
@@ -3,9 +3,9 @@ Copyright (c) 2020 Jujian Zhang. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Authors: Damiano Testa, Jujian Zhang
-/
-import Mathbin.Analysis.Calculus.MeanValue
-import Mathbin.Data.Polynomial.DenomsClearable
-import Mathbin.Data.Real.Irrational
+import Analysis.Calculus.MeanValue
+import Data.Polynomial.DenomsClearable
+import Data.Real.Irrational
#align_import number_theory.liouville.basic from "leanprover-community/mathlib"@"af471b9e3ce868f296626d33189b4ce730fa4c00"
mathlib commit https://github.com/leanprover-community/mathlib/commit/8ea5598db6caeddde6cb734aa179cc2408dbd345
@@ -2,16 +2,13 @@
Copyright (c) 2020 Jujian Zhang. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Authors: Damiano Testa, Jujian Zhang
-
-! This file was ported from Lean 3 source module number_theory.liouville.basic
-! leanprover-community/mathlib commit af471b9e3ce868f296626d33189b4ce730fa4c00
-! Please do not edit these lines, except to modify the commit id
-! if you have ported upstream changes.
-/
import Mathbin.Analysis.Calculus.MeanValue
import Mathbin.Data.Polynomial.DenomsClearable
import Mathbin.Data.Real.Irrational
+#align_import number_theory.liouville.basic from "leanprover-community/mathlib"@"af471b9e3ce868f296626d33189b4ce730fa4c00"
+
/-!
# Liouville's theorem
mathlib commit https://github.com/leanprover-community/mathlib/commit/9240e8be927a0955b9a82c6c85ef499ee3a626b8
@@ -167,7 +167,7 @@ theorem exists_pos_real_of_irrational_root {α : ℝ} (ha : Irrational α) {f :
(continuous_abs.comp fR.derivative.continuous_aeval).ContinuousOn
-- Use the key lemma `exists_one_le_pow_mul_dist`: we are left to show that ...
refine'
- @exists_one_le_pow_mul_dist ℤ ℕ ℝ _ _ _ (fun y => fR.eval y) α ζ (|fR.derivative.eval xm|) _ z0
+ @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;
· exact fun a => one_le_pow_of_one_le ((le_add_iff_nonneg_left 1).mpr a.cast_nonneg) _
mathlib commit https://github.com/leanprover-community/mathlib/commit/9fb8964792b4237dac6200193a0d533f1b3f7423
@@ -91,6 +91,7 @@ open Polynomial Metric Set Real RingHom
open scoped Polynomial
+#print Liouville.exists_one_le_pow_mul_dist /-
/-- Let `Z, N` be types, let `R` be a metric space, let `α : R` be a point and let
`j : Z → N → R` be a function. We aim to estimate how close we can get to `α`, while staying
in the image of `j`. The points `j z a` of `R` in the image of `j` come with a "cost" equal to
@@ -137,7 +138,9 @@ theorem exists_one_le_pow_mul_dist {Z N R : Type _} [PseudoMetricSpace R] {d : N
refine' mul_le_mul_of_nonneg_left ((B this).trans _) (zero_le_one.trans (d0 a))
exact mul_le_mul_of_nonneg_left (le_max_right _ M) dist_nonneg
#align liouville.exists_one_le_pow_mul_dist Liouville.exists_one_le_pow_mul_dist
+-/
+#print Liouville.exists_pos_real_of_irrational_root /-
theorem exists_pos_real_of_irrational_root {α : ℝ} (ha : Irrational α) {f : ℤ[X]} (f0 : f ≠ 0)
(fa : eval α (map (algebraMap ℤ ℝ) f) = 0) :
∃ A : ℝ, 0 < A ∧ ∀ a : ℤ, ∀ b : ℕ, (1 : ℝ) ≤ (b + 1) ^ f.natDegree * (|α - a / (b + 1)| * A) :=
@@ -191,7 +194,9 @@ theorem exists_pos_real_of_irrational_root {α : ℝ} (ha : Irrational α) {f :
refine' ⟨hq, finset.mem_coe.mp (multiset.mem_to_finset.mpr _)⟩
exact (mem_roots fR0).mpr (is_root.def.mpr hy)
#align liouville.exists_pos_real_of_irrational_root Liouville.exists_pos_real_of_irrational_root
+-/
+#print Liouville.transcendental /-
/-- **Liouville's Theorem** -/
protected theorem transcendental {x : ℝ} (lx : Liouville x) : Transcendental ℤ x :=
by
@@ -235,6 +240,7 @@ protected theorem transcendental {x : ℝ} (lx : Liouville x) : Transcendental
div_le_iff hA] at h
exact int.coe_nat_lt.mp b1
#align liouville.transcendental Liouville.transcendental
+-/
end Liouville
mathlib commit https://github.com/leanprover-community/mathlib/commit/5f25c089cb34db4db112556f23c50d12da81b297
@@ -4,7 +4,7 @@ Released under Apache 2.0 license as described in the file LICENSE.
Authors: Damiano Testa, Jujian Zhang
! This file was ported from Lean 3 source module number_theory.liouville.basic
-! leanprover-community/mathlib commit 04e80bb7e8510958cd9aacd32fe2dc147af0b9f1
+! leanprover-community/mathlib commit af471b9e3ce868f296626d33189b4ce730fa4c00
! Please do not edit these lines, except to modify the commit id
! if you have ported upstream changes.
-/
@@ -16,6 +16,9 @@ import Mathbin.Data.Real.Irrational
# Liouville's theorem
+> THIS FILE IS SYNCHRONIZED WITH MATHLIB4.
+> Any changes to this file require a corresponding PR to mathlib4.
+
This file contains a proof of Liouville's theorem stating that all Liouville numbers are
transcendental.
@@ -27,6 +30,7 @@ Liouville numbers.
-/
+#print Liouville /-
/-- A Liouville number is a real number `x` such that for every natural number `n`, there exist
`a, b ∈ ℤ` with `1 < b` such that `0 < |x - a/b| < 1/bⁿ`.
In the implementation, the condition `x ≠ a/b` replaces the traditional equivalent `0 < |x - a/b|`.
@@ -34,9 +38,11 @@ In the implementation, the condition `x ≠ a/b` replaces the traditional equiva
def Liouville (x : ℝ) :=
∀ n : ℕ, ∃ a b : ℤ, 1 < b ∧ x ≠ a / b ∧ |x - a / b| < 1 / b ^ n
#align liouville Liouville
+-/
namespace Liouville
+#print Liouville.irrational /-
protected theorem irrational {x : ℝ} (h : Liouville x) : Irrational x :=
by
-- By contradiction, `x = a / b`, with `a ∈ ℤ`, `0 < b ∈ ℕ` is a Liouville number,
@@ -79,6 +85,7 @@ protected theorem irrational {x : ℝ} (h : Liouville x) : Irrational x :=
-- we are done.
exact not_le.mpr a1 (Nat.mul_lt_mul_pow_succ (int.coe_nat_pos.mp ap) (int.coe_nat_lt.mp q1)).le
#align liouville.irrational Liouville.irrational
+-/
open Polynomial Metric Set Real RingHom
mathlib commit https://github.com/leanprover-community/mathlib/commit/34ebaffc1d1e8e783fc05438ec2e70af87275ac9
@@ -4,7 +4,7 @@ Released under Apache 2.0 license as described in the file LICENSE.
Authors: Damiano Testa, Jujian Zhang
! This file was ported from Lean 3 source module number_theory.liouville.basic
-! leanprover-community/mathlib commit 62c0a4ef1441edb463095ea02a06e87f3dfe135c
+! leanprover-community/mathlib commit 04e80bb7e8510958cd9aacd32fe2dc147af0b9f1
! Please do not edit these lines, except to modify the commit id
! if you have ported upstream changes.
-/
@@ -37,8 +37,7 @@ def Liouville (x : ℝ) :=
namespace Liouville
-@[protected]
-theorem irrational {x : ℝ} (h : Liouville x) : Irrational x :=
+protected theorem irrational {x : ℝ} (h : Liouville x) : Irrational x :=
by
-- By contradiction, `x = a / b`, with `a ∈ ℤ`, `0 < b ∈ ℕ` is a Liouville number,
rintro ⟨⟨a, b, bN0, cop⟩, rfl⟩
@@ -187,7 +186,7 @@ theorem exists_pos_real_of_irrational_root {α : ℝ} (ha : Irrational α) {f :
#align liouville.exists_pos_real_of_irrational_root Liouville.exists_pos_real_of_irrational_root
/-- **Liouville's Theorem** -/
-theorem transcendental {x : ℝ} (lx : Liouville x) : Transcendental ℤ x :=
+protected theorem transcendental {x : ℝ} (lx : Liouville x) : Transcendental ℤ x :=
by
-- Proceed by contradiction: if `x` is algebraic, then `x` is the root (`ef0`) of a
-- non-zero (`f0`) polynomial `f`
mathlib commit https://github.com/leanprover-community/mathlib/commit/cca40788df1b8755d5baf17ab2f27dacc2e17acb
@@ -43,7 +43,7 @@ theorem irrational {x : ℝ} (h : Liouville x) : Irrational x :=
-- By contradiction, `x = a / b`, with `a ∈ ℤ`, `0 < b ∈ ℕ` is a Liouville number,
rintro ⟨⟨a, b, bN0, cop⟩, rfl⟩
-- clear up the mess of constructions of rationals
- rw [Rat.cast_mk', ← div_eq_mul_inv] at h
+ rw [Rat.cast_mk', ← div_eq_mul_inv] at h
-- Since `a / b` is a Liouville number, there are `p, q ∈ ℤ`, with `q1 : 1 < q`,
-- `a0 : a / b ≠ p / q` and `a1 : |a / b - p / q| < 1 / q ^ (b + 1)`
rcases h (b + 1) with ⟨p, q, q1, a0, a1⟩
@@ -59,14 +59,14 @@ theorem irrational {x : ℝ} (h : Liouville x) : Irrational x :=
←-- ... and revert to integers
Int.cast_pow,
← Int.cast_mul, ← Int.cast_ofNat, ← Int.cast_mul, ← Int.cast_mul, ← Int.cast_sub, ←
- Int.cast_abs, ← Int.cast_mul, Int.cast_lt] at a1
+ Int.cast_abs, ← Int.cast_mul, Int.cast_lt] at a1
-- At a0, clear denominators...
replace a0 : ¬a * q - ↑b * p = 0;
·
rwa [Ne.def, div_eq_div_iff b0 (ne_of_gt qR0), mul_comm ↑p, ← sub_eq_zero,
←-- ... and revert to integers
Int.cast_ofNat,
- ← Int.cast_mul, ← Int.cast_mul, ← Int.cast_sub, Int.cast_eq_zero] at a0
+ ← Int.cast_mul, ← Int.cast_mul, ← Int.cast_sub, Int.cast_eq_zero] at a0
-- Actually, `q` is a natural number
lift q to ℕ using (zero_lt_one.trans q1).le
-- Looks innocuous, but we now have an integer with non-zero absolute value: this is at
@@ -75,7 +75,7 @@ theorem irrational {x : ℝ} (h : Liouville x) : Irrational x :=
-- Actually, the absolute value of an integer is a natural number
lift |a * ↑q - ↑b * p| to ℕ using abs_nonneg (a * ↑q - ↑b * p)
-- At a1, revert to natural numbers
- rw [← Int.ofNat_mul, ← Int.coe_nat_pow, ← Int.ofNat_mul, Int.ofNat_lt] at a1
+ rw [← Int.ofNat_mul, ← Int.coe_nat_pow, ← Int.ofNat_mul, Int.ofNat_lt] at a1
-- Recall this is by contradiction: we obtained the inequality `b * q ≤ x * q ^ (b + 1)`, so
-- we are done.
exact not_le.mpr a1 (Nat.mul_lt_mul_pow_succ (int.coe_nat_pos.mp ap) (int.coe_nat_lt.mp q1)).le
@@ -151,7 +151,7 @@ theorem exists_pos_real_of_irrational_root {α : ℝ} (ha : Irrational α) {f :
@exists_closed_ball_inter_eq_singleton_of_discrete _ _ _ discrete_of_t1_of_finite _ ar
-- Since `fR` is continuous, it is bounded on the interval above.
obtain ⟨xm, -, hM⟩ :
- ∃ (xm : ℝ)(H : xm ∈ Icc (α - ζ) (α + ζ)),
+ ∃ (xm : ℝ) (H : xm ∈ Icc (α - ζ) (α + ζ)),
∀ y : ℝ, y ∈ Icc (α - ζ) (α + ζ) → |fR.derivative.eval y| ≤ |fR.derivative.eval xm| :=
IsCompact.exists_forall_ge is_compact_Icc
⟨α, (sub_lt_self α z0).le, (lt_add_of_pos_right α z0).le⟩
@@ -164,7 +164,7 @@ theorem exists_pos_real_of_irrational_root {α : ℝ} (ha : Irrational α) {f :
· 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;
· rw [mul_comm]
- rw [Real.closedBall_eq_Icc] at hy
+ rw [Real.closedBall_eq_Icc] at hy
-- apply the Mean Value Theorem: the bound on the derivative comes from differentiability.
refine'
Convex.norm_image_sub_le_of_norm_deriv_le (fun _ _ => fR.differentiable_at)
@@ -173,7 +173,7 @@ theorem exists_pos_real_of_irrational_root {α : ℝ} (ha : Irrational α) {f :
-- 3: the weird inequality of Liouville type with powers of the denominators.
· show 1 ≤ (a + 1 : ℝ) ^ f.nat_degree * |eval α fR - eval (z / (a + 1)) fR|
rw [fa, zero_sub, abs_neg]
- rw [show (a + 1 : ℝ) = ((a + 1 : ℕ) : ℤ) by norm_cast] at hq⊢
+ 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
refine' one_le_pow_mul_abs_eval_div (Int.coe_nat_succ_pos a) fun hy => _
@@ -194,7 +194,7 @@ theorem transcendental {x : ℝ} (lx : Liouville x) : Transcendental ℤ x :=
rintro ⟨f : ℤ[X], f0, ef0⟩
-- Change `aeval x f = 0` to `eval (map _ f) = 0`, who knew.
replace ef0 : (f.map (algebraMap ℤ ℝ)).eval x = 0;
- · rwa [aeval_def, ← eval_map] at ef0
+ · rwa [aeval_def, ← eval_map] at ef0
-- There is a "large" real number `A` such that `(b + 1) ^ (deg f) * |f (x - a / (b + 1))| * A`
-- is at least one. This is obtained from lemma `exists_pos_real_of_irrational_root`.
obtain ⟨A, hA, h⟩ :
@@ -211,7 +211,7 @@ theorem transcendental {x : ℝ} (lx : Liouville x) : Transcendental ℤ x :=
-- recall, this is a proof by contradiction!
refine' lt_irrefl ((b : ℝ) ^ f.nat_degree * |x - ↑a / ↑b|) _
-- clear denominators at `a1`
- rw [lt_div_iff' (pow_pos b0 _), pow_add, mul_assoc] at a1
+ rw [lt_div_iff' (pow_pos b0 _), pow_add, mul_assoc] at a1
-- split the inequality via `1 / A`.
refine' (_ : (b : ℝ) ^ f.nat_degree * |x - a / b| < 1 / A).trans_le _
-- This branch of the proof uses the Liouville condition and the Archimedean property
@@ -226,7 +226,7 @@ theorem transcendental {x : ℝ} (lx : Liouville x) : Transcendental ℤ x :=
· lift b to ℕ using zero_le_one.trans b1.le
specialize h a b.pred
rwa [← Nat.cast_succ, Nat.succ_pred_eq_of_pos (zero_lt_one.trans _), ← mul_assoc, ←
- div_le_iff hA] at h
+ div_le_iff hA] at h
exact int.coe_nat_lt.mp b1
#align liouville.transcendental Liouville.transcendental
mathlib commit https://github.com/leanprover-community/mathlib/commit/917c3c072e487b3cccdbfeff17e75b40e45f66cb
@@ -83,7 +83,7 @@ theorem irrational {x : ℝ} (h : Liouville x) : Irrational x :=
open Polynomial Metric Set Real RingHom
-open Polynomial
+open scoped Polynomial
/-- Let `Z, N` be types, let `R` be a metric space, let `α : R` be a point and let
`j : Z → N → R` be a function. We aim to estimate how close we can get to `α`, while staying
mathlib commit https://github.com/leanprover-community/mathlib/commit/917c3c072e487b3cccdbfeff17e75b40e45f66cb
@@ -168,10 +168,7 @@ theorem exists_pos_real_of_irrational_root {α : ℝ} (ha : Irrational α) {f :
-- apply the Mean Value Theorem: the bound on the derivative comes from differentiability.
refine'
Convex.norm_image_sub_le_of_norm_deriv_le (fun _ _ => fR.differentiable_at)
- (fun y h => by
- rw [fR.deriv]
- exact hM _ h)
- (convex_Icc _ _) hy (mem_Icc_iff_abs_le.mp _)
+ (fun y h => by rw [fR.deriv]; exact hM _ h) (convex_Icc _ _) hy (mem_Icc_iff_abs_le.mp _)
exact @mem_closed_ball_self ℝ _ α ζ (le_of_lt z0)
-- 3: the weird inequality of Liouville type with powers of the denominators.
· show 1 ≤ (a + 1 : ℝ) ^ f.nat_degree * |eval α fR - eval (z / (a + 1)) fR|
@@ -209,11 +206,7 @@ theorem transcendental {x : ℝ} (lx : Liouville x) : Transcendental ℤ x :=
-- Use the Liouville property, with exponent `r + deg f`.
obtain ⟨a, b, b1, -, a1⟩ :
∃ a b : ℤ, 1 < b ∧ x ≠ a / b ∧ |x - a / b| < 1 / b ^ (r + f.nat_degree) := lx (r + f.nat_degree)
- have b0 : (0 : ℝ) < b :=
- zero_lt_one.trans
- (by
- rw [← Int.cast_one]
- exact int.cast_lt.mpr b1)
+ 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!
refine' lt_irrefl ((b : ℝ) ^ f.nat_degree * |x - ↑a / ↑b|) _
mathlib commit https://github.com/leanprover-community/mathlib/commit/bd9851ca476957ea4549eb19b40e7b5ade9428cc
@@ -132,7 +132,7 @@ theorem exists_pos_real_of_irrational_root {α : ℝ} (ha : Irrational α) {f :
(fR0.trans (Polynomial.map_zero _).symm)
-- reformulating assumption `fa`: `α` is a root of `fR`.
have ar : α ∈ (fR.roots.toFinset : Set ℝ) :=
- Finset.mem_coe.mpr (Multiset.mem_toFinset.mpr ((mem_roots fR0).mpr (IsRoot.definition.mpr fa)))
+ 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.
obtain ⟨ζ, z0, U⟩ : ∃ ζ > 0, closedBall α ζ ∩ fR.roots.toFinset = {α} :=
@@ -170,7 +170,7 @@ theorem exists_pos_real_of_irrational_root {α : ℝ} (ha : Irrational α) {f :
refine' (irrational_iff_ne_rational α).mp ha z (a + 1) (mem_singleton_iff.mp _).symm
refine' U.subset _
refine' ⟨hq, Finset.mem_coe.mp (Multiset.mem_toFinset.mpr _)⟩
- exact (mem_roots fR0).mpr (IsRoot.definition.mpr hy)
+ exact (mem_roots fR0).mpr (IsRoot.def.mpr hy)
#align liouville.exists_pos_real_of_irrational_root Liouville.exists_pos_real_of_irrational_root
/-- **Liouville's Theorem** -/
@@ -68,7 +68,7 @@ protected theorem irrational {x : ℝ} (h : Liouville x) : Irrational x := by
rw [← Int.ofNat_mul, ← Int.coe_nat_pow, ← Int.ofNat_mul, Int.ofNat_lt] at a1
-- Recall this is by contradiction: we obtained the inequality `b * q ≤ x * q ^ (b + 1)`, so
-- we are done.
- exact not_le.mpr a1 (Nat.mul_lt_mul_pow_succ (Int.coe_nat_pos.mp ap) (Int.ofNat_lt.mp q1)).le
+ exact not_le.mpr a1 (Nat.mul_lt_mul_pow_succ (Int.natCast_pos.mp ap) (Int.ofNat_lt.mp q1)).le
#align liouville.irrational Liouville.irrational
open Polynomial Metric Set Real RingHom
@@ -163,7 +163,7 @@ theorem exists_pos_real_of_irrational_root {α : ℝ} (ha : Irrational α) {f :
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
- refine' one_le_pow_mul_abs_eval_div (Int.coe_nat_succ_pos a) fun hy => _
+ refine' one_le_pow_mul_abs_eval_div (Int.natCast_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.
Rat
internals in the definition of Field
(#11639)
Soon, there will be NNRat
analogs of the Rat
fields in the definition of Field
. NNRat
is less nicely a structure than Rat
, hence there is a need to reduce the dependency of Field
on the internals of Rat
.
This PR achieves this by restating Field.ratCast_mk'
in terms of Rat.num
, Rat.den
. This requires fixing a few downstream instances.
Reduce the diff of #11203.
Co-authored-by: Floris van Doorn <fpvdoorn@gmail.com>
@@ -40,7 +40,7 @@ protected theorem irrational {x : ℝ} (h : Liouville x) : Irrational x := by
-- By contradiction, `x = a / b`, with `a ∈ ℤ`, `0 < b ∈ ℕ` is a Liouville number,
rintro ⟨⟨a, b, bN0, cop⟩, rfl⟩
-- clear up the mess of constructions of rationals
- rw [Rat.cast_mk', ← div_eq_mul_inv] at h
+ rw [Rat.cast_mk'] at h
-- Since `a / b` is a Liouville number, there are `p, q ∈ ℤ`, with `q1 : 1 < q`,
-- `a0 : a / b ≠ p / q` and `a1 : |a / b - p / q| < 1 / q ^ (b + 1)`
rcases h (b + 1) with ⟨p, q, q1, a0, a1⟩
Data
(#11751)
Polynomial
and MvPolynomial
are algebraic objects, hence should be under Algebra
(or at least not under Data
)
@@ -3,9 +3,9 @@ Copyright (c) 2020 Jujian Zhang. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Authors: Damiano Testa, Jujian Zhang
-/
+import Mathlib.Algebra.Polynomial.DenomsClearable
import Mathlib.Analysis.Calculus.MeanValue
import Mathlib.Analysis.Calculus.Deriv.Polynomial
-import Mathlib.Data.Polynomial.DenomsClearable
import Mathlib.Data.Real.Irrational
import Mathlib.Topology.Algebra.Polynomial
@@ -55,7 +55,7 @@ protected theorem irrational {x : ℝ} (h : Liouville x) : Irrational x := by
exact mod_cast a1
-- At a0, clear denominators...
replace a0 : a * q - ↑b * p ≠ 0 := by
- rw [Ne.def, div_eq_div_iff b0 qR0.ne', mul_comm (p : ℝ), ← sub_eq_zero] at a0
+ rw [Ne, div_eq_div_iff b0 qR0.ne', mul_comm (p : ℝ), ← sub_eq_zero] at a0
exact mod_cast a0
-- Actually, `q` is a natural number
lift q to ℕ using (zero_lt_one.trans q1).le
@@ -132,7 +132,7 @@ theorem exists_pos_real_of_irrational_root {α : ℝ} (ha : Irrational α) {f :
(fR0.trans (Polynomial.map_zero _).symm)
-- reformulating assumption `fa`: `α` is a root of `fR`.
have ar : α ∈ (fR.roots.toFinset : Set ℝ) :=
- Finset.mem_coe.mpr (Multiset.mem_toFinset.mpr ((mem_roots fR0).mpr (IsRoot.def.mpr fa)))
+ Finset.mem_coe.mpr (Multiset.mem_toFinset.mpr ((mem_roots fR0).mpr (IsRoot.definition.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.
obtain ⟨ζ, z0, U⟩ : ∃ ζ > 0, closedBall α ζ ∩ fR.roots.toFinset = {α} :=
@@ -170,7 +170,7 @@ theorem exists_pos_real_of_irrational_root {α : ℝ} (ha : Irrational α) {f :
refine' (irrational_iff_ne_rational α).mp ha z (a + 1) (mem_singleton_iff.mp _).symm
refine' U.subset _
refine' ⟨hq, Finset.mem_coe.mp (Multiset.mem_toFinset.mpr _)⟩
- exact (mem_roots fR0).mpr (IsRoot.def.mpr hy)
+ exact (mem_roots fR0).mpr (IsRoot.definition.mpr hy)
#align liouville.exists_pos_real_of_irrational_root Liouville.exists_pos_real_of_irrational_root
/-- **Liouville's Theorem** -/
have
, replace
and suffices
(#10640)
No changes to tactic file, it's just boring fixes throughout the library.
This follows on from #6964.
Co-authored-by: sgouezel <sebastien.gouezel@univ-rennes1.fr> Co-authored-by: Eric Wieser <wieser.eric@gmail.com>
@@ -49,13 +49,13 @@ protected theorem irrational {x : ℝ} (h : Liouville x) : Irrational x := by
have b0 : (b : ℝ) ≠ 0 := Nat.cast_ne_zero.mpr bN0
have bq0 : (0 : ℝ) < b * q := mul_pos (Nat.cast_pos.mpr bN0.bot_lt) qR0
-- At a1, clear denominators...
- replace a1 : |a * q - b * p| * q ^ (b + 1) < b * q
- · rw [div_sub_div _ _ b0 qR0.ne', abs_div, div_lt_div_iff (abs_pos.mpr bq0.ne') (pow_pos qR0 _),
+ replace a1 : |a * q - b * p| * q ^ (b + 1) < b * q := by
+ 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
exact mod_cast a1
-- At a0, clear denominators...
- replace a0 : a * q - ↑b * p ≠ 0;
- · rw [Ne.def, div_eq_div_iff b0 qR0.ne', mul_comm (p : ℝ), ← sub_eq_zero] at a0
+ replace a0 : a * q - ↑b * p ≠ 0 := by
+ rw [Ne.def, div_eq_div_iff b0 qR0.ne', mul_comm (p : ℝ), ← sub_eq_zero] at a0
exact mod_cast a0
-- Actually, `q` is a natural number
lift q to ℕ using (zero_lt_one.trans q1).le
@@ -179,8 +179,8 @@ protected theorem transcendental {x : ℝ} (lx : Liouville x) : Transcendental
-- non-zero (`f0`) polynomial `f`
rintro ⟨f : ℤ[X], f0, ef0⟩
-- Change `aeval x f = 0` to `eval (map _ f) = 0`, who knew.
- replace ef0 : (f.map (algebraMap ℤ ℝ)).eval x = 0;
- · rwa [aeval_def, ← eval_map] at ef0
+ replace ef0 : (f.map (algebraMap ℤ ℝ)).eval x = 0 := by
+ rwa [aeval_def, ← eval_map] at ef0
-- There is a "large" real number `A` such that `(b + 1) ^ (deg f) * |f (x - a / (b + 1))| * A`
-- is at least one. This is obtained from lemma `exists_pos_real_of_irrational_root`.
obtain ⟨A, hA, h⟩ : ∃ A : ℝ, 0 < A ∧ ∀ (a : ℤ) (b : ℕ),
exact_mod_cast
tactic with mod_cast
elaborator where possible (#8404)
We still have the exact_mod_cast
tactic, used in a few places, which somehow (?) works a little bit harder to prevent the expected type influencing the elaboration of the term. I would like to get to the bottom of this, and it will be easier once the only usages of exact_mod_cast
are the ones that don't work using the term elaborator by itself.
Co-authored-by: Scott Morrison <scott.morrison@gmail.com>
@@ -52,11 +52,11 @@ protected theorem irrational {x : ℝ} (h : Liouville x) : Irrational x := by
replace a1 : |a * q - b * p| * q ^ (b + 1) < b * q
· 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
- exact_mod_cast a1
+ exact mod_cast a1
-- At a0, clear denominators...
replace a0 : a * q - ↑b * p ≠ 0;
· rw [Ne.def, div_eq_div_iff b0 qR0.ne', mul_comm (p : ℝ), ← sub_eq_zero] at a0
- exact_mod_cast a0
+ exact mod_cast a0
-- Actually, `q` is a natural number
lift q to ℕ using (zero_lt_one.trans q1).le
-- Looks innocuous, but we now have an integer with non-zero absolute value: this is at
Type _
and Sort _
(#6499)
We remove all possible occurences of Type _
and Sort _
in favor of Type*
and Sort*
.
This has nice performance benefits.
@@ -92,7 +92,7 @@ It is stated in more general form than needed: in the intended application, `Z =
root of `f`, `ε` is small, `M` is a bound on the Lipschitz constant of `f` near `α`, `n` is
the degree of the polynomial `f`.
-/
-theorem exists_one_le_pow_mul_dist {Z N R : Type _} [PseudoMetricSpace R] {d : N → ℝ}
+theorem exists_one_le_pow_mul_dist {Z N R : Type*} [PseudoMetricSpace R] {d : N → ℝ}
{j : Z → N → R} {f : R → R} {α : R} {ε M : ℝ}
-- denominators are positive
(d0 : ∀ a : N, 1 ≤ d a)
Analysis.Calculus.LocalExtr
(#5944)
Also make f
/f'
arguments implicit in all versions of Rolle's Theorem.
Fixes #4830
exists_Ioo_extr_on_Icc
:
f : ℝ → ℝ
to functions from a conditionally complete linear order
to a linear order.f
implicit;exists_local_extr_Ioo
:
exists_isLocalExtr_Ioo
;f
implicit;exists_isExtrOn_Ioo_of_tendsto
, exists_isLocalExtr_Ioo_of_tendsto
:
new lemmas extracted from the proof of exists_hasDerivAt_eq_zero'
;exists_hasDerivAt_eq_zero
, exists_hasDerivAt_eq_zero'
:
make f
and f'
implicit;exists_deriv_eq_zero
, exists_deriv_eq_zero'
:
make f
implicit.@@ -4,8 +4,10 @@ Released under Apache 2.0 license as described in the file LICENSE.
Authors: Damiano Testa, Jujian Zhang
-/
import Mathlib.Analysis.Calculus.MeanValue
+import Mathlib.Analysis.Calculus.Deriv.Polynomial
import Mathlib.Data.Polynomial.DenomsClearable
import Mathlib.Data.Real.Irrational
+import Mathlib.Topology.Algebra.Polynomial
#align_import number_theory.liouville.basic from "leanprover-community/mathlib"@"04e80bb7e8510958cd9aacd32fe2dc147af0b9f1"
@@ -2,16 +2,13 @@
Copyright (c) 2020 Jujian Zhang. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Authors: Damiano Testa, Jujian Zhang
-
-! This file was ported from Lean 3 source module number_theory.liouville.basic
-! leanprover-community/mathlib commit 04e80bb7e8510958cd9aacd32fe2dc147af0b9f1
-! Please do not edit these lines, except to modify the commit id
-! if you have ported upstream changes.
-/
import Mathlib.Analysis.Calculus.MeanValue
import Mathlib.Data.Polynomial.DenomsClearable
import Mathlib.Data.Real.Irrational
+#align_import number_theory.liouville.basic from "leanprover-community/mathlib"@"04e80bb7e8510958cd9aacd32fe2dc147af0b9f1"
+
/-!
# Liouville's theorem
@@ -89,7 +89,7 @@ involving the cost function `d`.
This lemma collects the properties used in the proof of `exists_pos_real_of_irrational_root`.
It is stated in more general form than needed: in the intended application, `Z = ℤ`, `N = ℕ`,
-`R = ℝ`, `d a = (a + 1) ^ f.nat_degree`, `j z a = z / (a + 1)`, `f ∈ ℤ[x]`, `α` is an irrational
+`R = ℝ`, `d a = (a + 1) ^ f.nat_degree`, `j z a = z / (a + 1)`, `f ∈ ℤ[x]`, `α` is an irrational
root of `f`, `ε` is small, `M` is a bound on the Lipschitz constant of `f` near `α`, `n` is
the degree of the polynomial `f`.
-/
@@ -189,7 +189,7 @@ protected theorem transcendental {x : ℝ} (lx : Liouville x) : Transcendental
exists_pos_real_of_irrational_root lx.irrational f0 ef0
-- Since the real numbers are Archimedean, a power of `2` exceeds `A`: `hn : A < 2 ^ r`.
rcases pow_unbounded_of_one_lt A (lt_add_one 1) with ⟨r, hn⟩
- -- Use the Liouville property, with exponent `r + deg f`.
+ -- Use the Liouville property, with exponent `r + deg f`.
obtain ⟨a, b, b1, -, a1⟩ : ∃ a b : ℤ, 1 < b ∧ x ≠ a / b ∧
|x - a / b| < 1 / (b : ℝ) ^ (r + f.natDegree) :=
lx (r + f.natDegree)
@@ -146,7 +146,7 @@ theorem exists_pos_real_of_irrational_root {α : ℝ} (ha : Irrational α) {f :
(continuous_abs.comp fR.derivative.continuous_aeval).continuousOn
-- Use the key lemma `exists_one_le_pow_mul_dist`: we are left to show that ...
refine'
- @exists_one_le_pow_mul_dist ℤ ℕ ℝ _ _ _ (fun y => fR.eval y) α ζ (|fR.derivative.eval xm|) _ z0
+ @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;
· exact fun a => one_le_pow_of_one_le ((le_add_iff_nonneg_left 1).mpr a.cast_nonneg) _
@@ -41,7 +41,7 @@ protected theorem irrational {x : ℝ} (h : Liouville x) : Irrational x := by
-- By contradiction, `x = a / b`, with `a ∈ ℤ`, `0 < b ∈ ℕ` is a Liouville number,
rintro ⟨⟨a, b, bN0, cop⟩, rfl⟩
-- clear up the mess of constructions of rationals
- rw [Rat.cast_mk', ← div_eq_mul_inv] at h
+ rw [Rat.cast_mk', ← div_eq_mul_inv] at h
-- Since `a / b` is a Liouville number, there are `p, q ∈ ℤ`, with `q1 : 1 < q`,
-- `a0 : a / b ≠ p / q` and `a1 : |a / b - p / q| < 1 / q ^ (b + 1)`
rcases h (b + 1) with ⟨p, q, q1, a0, a1⟩
@@ -66,7 +66,7 @@ protected theorem irrational {x : ℝ} (h : Liouville x) : Irrational x := by
-- Actually, the absolute value of an integer is a natural number
lift |a * ↑q - ↑b * p| to ℕ using abs_nonneg (a * ↑q - ↑b * p) with e he
-- At a1, revert to natural numbers
- rw [← Int.ofNat_mul, ← Int.coe_nat_pow, ← Int.ofNat_mul, Int.ofNat_lt] at a1
+ rw [← Int.ofNat_mul, ← Int.coe_nat_pow, ← Int.ofNat_mul, Int.ofNat_lt] at a1
-- Recall this is by contradiction: we obtained the inequality `b * q ≤ x * q ^ (b + 1)`, so
-- we are done.
exact not_le.mpr a1 (Nat.mul_lt_mul_pow_succ (Int.coe_nat_pos.mp ap) (Int.ofNat_lt.mp q1)).le
@@ -152,7 +152,7 @@ theorem exists_pos_real_of_irrational_root {α : ℝ} (ha : Irrational α) {f :
· 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;
· rw [mul_comm]
- rw [Real.closedBall_eq_Icc] at hy
+ rw [Real.closedBall_eq_Icc] at hy
-- apply the Mean Value Theorem: the bound on the derivative comes from differentiability.
refine'
Convex.norm_image_sub_le_of_norm_deriv_le (fun _ _ => fR.differentiableAt)
@@ -181,7 +181,7 @@ protected theorem transcendental {x : ℝ} (lx : Liouville x) : Transcendental
rintro ⟨f : ℤ[X], f0, ef0⟩
-- Change `aeval x f = 0` to `eval (map _ f) = 0`, who knew.
replace ef0 : (f.map (algebraMap ℤ ℝ)).eval x = 0;
- · rwa [aeval_def, ← eval_map] at ef0
+ · rwa [aeval_def, ← eval_map] at ef0
-- There is a "large" real number `A` such that `(b + 1) ^ (deg f) * |f (x - a / (b + 1))| * A`
-- is at least one. This is obtained from lemma `exists_pos_real_of_irrational_root`.
obtain ⟨A, hA, h⟩ : ∃ A : ℝ, 0 < A ∧ ∀ (a : ℤ) (b : ℕ),
@@ -198,23 +198,23 @@ protected theorem transcendental {x : ℝ} (lx : Liouville x) : Transcendental
-- recall, this is a proof by contradiction!
refine' lt_irrefl ((b : ℝ) ^ f.natDegree * |x - ↑a / ↑b|) _
-- clear denominators at `a1`
- rw [lt_div_iff' (pow_pos b0 _), pow_add, mul_assoc] at a1
+ rw [lt_div_iff' (pow_pos b0 _), pow_add, mul_assoc] at a1
-- split the inequality via `1 / A`.
refine' (_ : (b : ℝ) ^ f.natDegree * |x - a / b| < 1 / A).trans_le _
-- This branch of the proof uses the Liouville condition and the Archimedean property
· refine' (lt_div_iff' hA).mpr _
refine' lt_of_le_of_lt _ a1
- refine' mul_le_mul_of_nonneg_right _ (mul_nonneg (pow_nonneg b0.le _) (abs_nonneg _))
+ gcongr
refine' hn.le.trans _
rw [one_add_one_eq_two]
- refine' pow_le_pow_of_le_left zero_le_two _ _
+ gcongr
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.
· lift b to ℕ using zero_le_one.trans b1.le
specialize h a b.pred
rwa [← Nat.cast_succ, Nat.succ_pred_eq_of_pos (zero_lt_one.trans _), ← mul_assoc, ←
- div_le_iff hA] at h
+ div_le_iff hA] at h
exact Int.ofNat_lt.mp b1
#align liouville.transcendental Liouville.transcendental
The unported dependencies are
algebra.order.module
init.core
linear_algebra.free_module.finite.rank
algebra.order.monoid.cancel.defs
algebra.abs
algebra.group_power.lemmas
init.data.list.basic
linear_algebra.free_module.rank
algebra.order.monoid.cancel.basic
init.data.list.default
topology.subset_properties
init.logic
The following 1 dependencies have changed in mathlib3 since they were ported, which may complicate porting this file