number_theory.bertrand
⟷
Mathlib.NumberTheory.Bertrand
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)
(last sync)
mathlib commit https://github.com/leanprover-community/mathlib/commit/65a1391a0106c9204fe45bc73a039f056558cb83
@@ -139,7 +139,7 @@ theorem centralBinom_factorization_small (n : ℕ) (n_large : 2 < n)
rw [Finset.mem_range, lt_succ_iff] at hx h2x
rw [not_le, div_lt_iff_lt_mul' three_pos, mul_comm x] at h2x
replace no_prime := not_exists.mp no_prime x
- rw [← and_assoc', not_and', not_and_or, not_lt] at no_prime
+ rw [← and_assoc, not_and', not_and_or, not_lt] at no_prime
cases' no_prime hx with h h
· rw [factorization_eq_zero_of_non_prime n.central_binom h, pow_zero]
· rw [factorization_central_binom_of_two_mul_self_lt_three_mul n_large h h2x, pow_zero]
mathlib commit https://github.com/leanprover-community/mathlib/commit/65a1391a0106c9204fe45bc73a039f056558cb83
@@ -110,7 +110,7 @@ theorem bertrand_main_inequality {n : ℕ} (n_large : 512 ≤ n) :
n * (2 * n) ^ sqrt (2 * n) * 4 ^ (2 * n / 3) ≤ 4 ^ n :=
by
rw [← @cast_le ℝ]
- simp only [cast_bit0, cast_add, cast_one, cast_mul, cast_pow, ← Real.rpow_nat_cast]
+ simp only [cast_bit0, cast_add, cast_one, cast_mul, cast_pow, ← Real.rpow_natCast]
have n_pos : 0 < n := (by decide : 0 < 512).trans_le n_large
have n2_pos : 1 ≤ 2 * n := mul_pos (by decide) n_pos
refine' trans (mul_le_mul _ _ _ _) (Bertrand.real_main_inequality (by exact_mod_cast n_large))
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: Patrick Stevens, Bolton Bailey
-/
import Data.Nat.Choose.Factorization
-import Data.Nat.PrimeNormNum
+import Tactic.NormNum.Prime
import NumberTheory.Primorial
import Analysis.Convex.SpecificFunctions.Basic
import Analysis.Convex.SpecificFunctions.Deriv
mathlib commit https://github.com/leanprover-community/mathlib/commit/65a1391a0106c9204fe45bc73a039f056558cb83
@@ -136,10 +136,10 @@ theorem centralBinom_factorization_small (n : ℕ) (n_large : 2 < n)
apply Finset.prod_subset
· exact Finset.range_subset.2 (add_le_add_right (Nat.div_le_self _ _) _)
intro x hx h2x
- rw [Finset.mem_range, lt_succ_iff] at hx h2x
- rw [not_le, div_lt_iff_lt_mul' three_pos, mul_comm x] at h2x
+ rw [Finset.mem_range, lt_succ_iff] at hx h2x
+ rw [not_le, div_lt_iff_lt_mul' three_pos, mul_comm x] at h2x
replace no_prime := not_exists.mp no_prime x
- rw [← and_assoc', not_and', not_and_or, not_lt] at no_prime
+ rw [← and_assoc', not_and', not_and_or, not_lt] at no_prime
cases' no_prime hx with h h
· rw [factorization_eq_zero_of_non_prime n.central_binom h, pow_zero]
· rw [factorization_central_binom_of_two_mul_self_lt_three_mul n_large h h2x, pow_zero]
@@ -206,7 +206,7 @@ theorem exists_prime_lt_and_le_two_mul_eventually (n : ℕ) (n_big : 512 ≤ n)
Nat.four_pow_lt_mul_centralBinom n (le_trans (by norm_num1) n_big)
have H3 : n.central_binom ≤ (2 * n) ^ sqrt (2 * n) * 4 ^ (2 * n / 3) :=
centralBinom_le_of_no_bertrand_prime n (lt_of_lt_of_le (by norm_num1) n_big) no_prime
- rw [mul_assoc] at H1 ; exact not_le.2 H2 ((mul_le_mul_left' H3 n).trans H1)
+ rw [mul_assoc] at H1; exact not_le.2 H2 ((mul_le_mul_left' H3 n).trans H1)
#align nat.exists_prime_lt_and_le_two_mul_eventually Nat.exists_prime_lt_and_le_two_mul_eventually
-/
@@ -240,6 +240,7 @@ theorem exists_prime_lt_and_le_two_mul (n : ℕ) (hn0 : n ≠ 0) :
· exact exists_prime_lt_and_le_two_mul_eventually n h
replace h : n < 521 := h.trans_lt (by norm_num1)
revert h
+ -- For small `n`, supply a list of primes to cover the initial cases.
run_tac
[317, 163, 83, 43, 23, 13, 7, 5, 3, 2].mapM' fun n => sorry
exact fun h2 => ⟨2, prime_two, h2, Nat.mul_le_mul_left 2 (Nat.pos_of_ne_zero hn0)⟩
mathlib commit https://github.com/leanprover-community/mathlib/commit/65a1391a0106c9204fe45bc73a039f056558cb83
@@ -118,9 +118,9 @@ theorem bertrand_main_inequality {n : ℕ} (n_large : 512 ≤ n) :
refine' Real.rpow_le_rpow_of_exponent_le (by exact_mod_cast n2_pos) _
exact_mod_cast Real.nat_sqrt_le_real_sqrt
· exact Real.rpow_le_rpow_of_exponent_le (by norm_num1) (cast_div_le.trans (by norm_cast))
- · exact Real.rpow_nonneg_of_nonneg (by norm_num1) _
+ · exact Real.rpow_nonneg (by norm_num1) _
· refine' mul_nonneg (Nat.cast_nonneg _) _
- exact Real.rpow_nonneg_of_nonneg (mul_nonneg zero_le_two (Nat.cast_nonneg _)) _
+ exact Real.rpow_nonneg (mul_nonneg zero_le_two (Nat.cast_nonneg _)) _
#align bertrand_main_inequality bertrand_main_inequality
-/
mathlib commit https://github.com/leanprover-community/mathlib/commit/65a1391a0106c9204fe45bc73a039f056558cb83
@@ -175,7 +175,7 @@ theorem centralBinom_le_of_no_bertrand_prime (n : ℕ) (n_big : 2 < n)
· exact pow_factorization_choose_le (mul_pos two_pos n_pos)
have : (Finset.Icc 1 (sqrt (2 * n))).card = sqrt (2 * n) := by rw [card_Icc, Nat.add_sub_cancel]
rw [Finset.prod_const]
- refine' pow_le_pow_right n2_pos ((Finset.card_le_of_subset fun x hx => _).trans this.le)
+ refine' pow_le_pow_right n2_pos ((Finset.card_le_card fun x hx => _).trans this.le)
obtain ⟨h1, h2⟩ := Finset.mem_filter.1 hx
exact finset.mem_Icc.mpr ⟨(Finset.mem_filter.1 h1).2.one_lt.le, h2⟩
· refine' le_trans _ (primorial_le_4_pow (2 * n / 3))
mathlib commit https://github.com/leanprover-community/mathlib/commit/65a1391a0106c9204fe45bc73a039f056558cb83
@@ -175,13 +175,13 @@ theorem centralBinom_le_of_no_bertrand_prime (n : ℕ) (n_big : 2 < n)
· exact pow_factorization_choose_le (mul_pos two_pos n_pos)
have : (Finset.Icc 1 (sqrt (2 * n))).card = sqrt (2 * n) := by rw [card_Icc, Nat.add_sub_cancel]
rw [Finset.prod_const]
- refine' pow_le_pow n2_pos ((Finset.card_le_of_subset fun x hx => _).trans this.le)
+ refine' pow_le_pow_right n2_pos ((Finset.card_le_of_subset fun x hx => _).trans this.le)
obtain ⟨h1, h2⟩ := Finset.mem_filter.1 hx
exact finset.mem_Icc.mpr ⟨(Finset.mem_filter.1 h1).2.one_lt.le, h2⟩
· refine' le_trans _ (primorial_le_4_pow (2 * n / 3))
refine' (Finset.prod_le_prod' fun p hp => (_ : f p ≤ p)).trans _
· obtain ⟨h1, h2⟩ := Finset.mem_filter.1 hp
- refine' (pow_le_pow (Finset.mem_filter.1 h1).2.one_lt.le _).trans (pow_one p).le
+ refine' (pow_le_pow_right (Finset.mem_filter.1 h1).2.one_lt.le _).trans (pow_one p).le
exact Nat.factorization_choose_le_one (sqrt_lt'.mp <| not_le.1 h2)
refine' Finset.prod_le_prod_of_subset_of_one_le' (Finset.filter_subset _ _) _
exact fun p hp _ => (Finset.mem_filter.1 hp).2.one_lt.le
mathlib commit https://github.com/leanprover-community/mathlib/commit/65a1391a0106c9204fe45bc73a039f056558cb83
@@ -240,7 +240,6 @@ theorem exists_prime_lt_and_le_two_mul (n : ℕ) (hn0 : n ≠ 0) :
· exact exists_prime_lt_and_le_two_mul_eventually n h
replace h : n < 521 := h.trans_lt (by norm_num1)
revert h
- -- For small `n`, supply a list of primes to cover the initial cases.
run_tac
[317, 163, 83, 43, 23, 13, 7, 5, 3, 2].mapM' fun n => sorry
exact fun h2 => ⟨2, prime_two, h2, Nat.mul_le_mul_left 2 (Nat.pos_of_ne_zero hn0)⟩
mathlib commit https://github.com/leanprover-community/mathlib/commit/ce64cd319bb6b3e82f31c2d38e79080d377be451
@@ -3,11 +3,11 @@ Copyright (c) 2020 Patrick Stevens. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Authors: Patrick Stevens, Bolton Bailey
-/
-import Mathbin.Data.Nat.Choose.Factorization
-import Mathbin.Data.Nat.PrimeNormNum
-import Mathbin.NumberTheory.Primorial
-import Mathbin.Analysis.Convex.SpecificFunctions.Basic
-import Mathbin.Analysis.Convex.SpecificFunctions.Deriv
+import Data.Nat.Choose.Factorization
+import Data.Nat.PrimeNormNum
+import NumberTheory.Primorial
+import Analysis.Convex.SpecificFunctions.Basic
+import Analysis.Convex.SpecificFunctions.Deriv
#align_import number_theory.bertrand from "leanprover-community/mathlib"@"08b63ab58a6ec1157ebeafcbbe6c7a3fb3c9f6d5"
@@ -224,7 +224,7 @@ theorem exists_prime_lt_and_le_two_mul_succ {n} (q) {p : ℕ} (prime_p : Nat.Pri
#align nat.exists_prime_lt_and_le_two_mul_succ Nat.exists_prime_lt_and_le_two_mul_succ
-/
-/- ./././Mathport/Syntax/Translate/Expr.lean:336:4: warning: unsupported (TODO): `[tacs] -/
+/- ./././Mathport/Syntax/Translate/Expr.lean:337:4: warning: unsupported (TODO): `[tacs] -/
#print Nat.exists_prime_lt_and_le_two_mul /-
/--
**Bertrand's Postulate**: For any positive natural number, there is a prime which is greater than
mathlib commit https://github.com/leanprover-community/mathlib/commit/32a7e535287f9c73f2e4d2aef306a39190f0b504
@@ -247,7 +247,7 @@ theorem exists_prime_lt_and_le_two_mul (n : ℕ) (hn0 : n ≠ 0) :
#align nat.exists_prime_lt_and_le_two_mul Nat.exists_prime_lt_and_le_two_mul
-/
-alias Nat.exists_prime_lt_and_le_two_mul ← bertrand
+alias bertrand := Nat.exists_prime_lt_and_le_two_mul
#align nat.bertrand Nat.bertrand
end Nat
mathlib commit https://github.com/leanprover-community/mathlib/commit/8ea5598db6caeddde6cb734aa179cc2408dbd345
@@ -2,11 +2,6 @@
Copyright (c) 2020 Patrick Stevens. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Authors: Patrick Stevens, Bolton Bailey
-
-! This file was ported from Lean 3 source module number_theory.bertrand
-! leanprover-community/mathlib commit 08b63ab58a6ec1157ebeafcbbe6c7a3fb3c9f6d5
-! Please do not edit these lines, except to modify the commit id
-! if you have ported upstream changes.
-/
import Mathbin.Data.Nat.Choose.Factorization
import Mathbin.Data.Nat.PrimeNormNum
@@ -14,6 +9,8 @@ import Mathbin.NumberTheory.Primorial
import Mathbin.Analysis.Convex.SpecificFunctions.Basic
import Mathbin.Analysis.Convex.SpecificFunctions.Deriv
+#align_import number_theory.bertrand from "leanprover-community/mathlib"@"08b63ab58a6ec1157ebeafcbbe6c7a3fb3c9f6d5"
+
/-!
# Bertrand's Postulate
mathlib commit https://github.com/leanprover-community/mathlib/commit/9240e8be927a0955b9a82c6c85ef499ee3a626b8
@@ -4,7 +4,7 @@ Released under Apache 2.0 license as described in the file LICENSE.
Authors: Patrick Stevens, Bolton Bailey
! This file was ported from Lean 3 source module number_theory.bertrand
-! leanprover-community/mathlib commit a16665637b378379689c566204817ae792ac8b39
+! leanprover-community/mathlib commit 08b63ab58a6ec1157ebeafcbbe6c7a3fb3c9f6d5
! Please do not edit these lines, except to modify the commit id
! if you have ported upstream changes.
-/
@@ -17,6 +17,9 @@ import Mathbin.Analysis.Convex.SpecificFunctions.Deriv
/-!
# Bertrand's Postulate
+> THIS FILE IS SYNCHRONIZED WITH MATHLIB4.
+> Any changes to this file require a corresponding PR to mathlib4.
+
This file contains a proof of Bertrand's postulate: That between any positive number and its
double there is a prime.
mathlib commit https://github.com/leanprover-community/mathlib/commit/fdc286cc6967a012f41b87f76dcd2797b53152af
@@ -51,6 +51,7 @@ open Real
namespace Bertrand
+#print Bertrand.real_main_inequality /-
/-- A reified version of the `bertrand.main_inequality` below.
This is not best possible: it actually holds for 464 ≤ x.
-/
@@ -92,6 +93,7 @@ theorem real_main_inequality {x : ℝ} (n_large : (512 : ℝ) ≤ x) :
rpow_le_rpow_iff _ (rpow_pos_of_pos four_pos _).le three_pos, ← rpow_mul] <;>
norm_num1
#align bertrand.real_main_inequality Bertrand.real_main_inequality
+-/
end Bertrand
@@ -101,6 +103,7 @@ section Nat
open Nat
+#print bertrand_main_inequality /-
/-- The inequality which contradicts Bertrand's postulate, for large enough `n`.
-/
theorem bertrand_main_inequality {n : ℕ} (n_large : 512 ≤ n) :
@@ -119,7 +122,9 @@ theorem bertrand_main_inequality {n : ℕ} (n_large : 512 ≤ n) :
· refine' mul_nonneg (Nat.cast_nonneg _) _
exact Real.rpow_nonneg_of_nonneg (mul_nonneg zero_le_two (Nat.cast_nonneg _)) _
#align bertrand_main_inequality bertrand_main_inequality
+-/
+#print centralBinom_factorization_small /-
/-- A lemma that tells us that, in the case where Bertrand's postulate does not hold, the prime
factorization of the central binomial coefficent only has factors at most `2 * n / 3 + 1`.
-/
@@ -139,7 +144,9 @@ theorem centralBinom_factorization_small (n : ℕ) (n_large : 2 < n)
· rw [factorization_eq_zero_of_non_prime n.central_binom h, pow_zero]
· rw [factorization_central_binom_of_two_mul_self_lt_three_mul n_large h h2x, pow_zero]
#align central_binom_factorization_small centralBinom_factorization_small
+-/
+#print centralBinom_le_of_no_bertrand_prime /-
/-- An upper bound on the central binomial coefficient used in the proof of Bertrand's postulate.
The bound splits the prime factors of `central_binom n` into those
1. At most `sqrt (2 * n)`, which contribute at most `2 * n` for each such prime.
@@ -179,9 +186,11 @@ theorem centralBinom_le_of_no_bertrand_prime (n : ℕ) (n_big : 2 < n)
refine' Finset.prod_le_prod_of_subset_of_one_le' (Finset.filter_subset _ _) _
exact fun p hp _ => (Finset.mem_filter.1 hp).2.one_lt.le
#align central_binom_le_of_no_bertrand_prime centralBinom_le_of_no_bertrand_prime
+-/
namespace Nat
+#print Nat.exists_prime_lt_and_le_two_mul_eventually /-
/-- Proves that Bertrand's postulate holds for all sufficiently large `n`.
-/
theorem exists_prime_lt_and_le_two_mul_eventually (n : ℕ) (n_big : 512 ≤ n) :
@@ -199,7 +208,9 @@ theorem exists_prime_lt_and_le_two_mul_eventually (n : ℕ) (n_big : 512 ≤ n)
centralBinom_le_of_no_bertrand_prime n (lt_of_lt_of_le (by norm_num1) n_big) no_prime
rw [mul_assoc] at H1 ; exact not_le.2 H2 ((mul_le_mul_left' H3 n).trans H1)
#align nat.exists_prime_lt_and_le_two_mul_eventually Nat.exists_prime_lt_and_le_two_mul_eventually
+-/
+#print Nat.exists_prime_lt_and_le_two_mul_succ /-
/-- Proves that Bertrand's postulate holds over all positive naturals less than n by identifying a
descending list of primes, each no more than twice the next, such that the list contains a witness
for each number ≤ n.
@@ -211,8 +222,10 @@ theorem exists_prime_lt_and_le_two_mul_succ {n} (q) {p : ℕ} (prime_p : Nat.Pri
by_cases p ≤ 2 * n; · exact ⟨p, prime_p, hn, h⟩
exact H (lt_of_mul_lt_mul_left' (lt_of_lt_of_le (not_le.1 h) covering))
#align nat.exists_prime_lt_and_le_two_mul_succ Nat.exists_prime_lt_and_le_two_mul_succ
+-/
/- ./././Mathport/Syntax/Translate/Expr.lean:336:4: warning: unsupported (TODO): `[tacs] -/
+#print Nat.exists_prime_lt_and_le_two_mul /-
/--
**Bertrand's Postulate**: For any positive natural number, there is a prime which is greater than
it, but no more than twice as large.
@@ -232,6 +245,7 @@ theorem exists_prime_lt_and_le_two_mul (n : ℕ) (hn0 : n ≠ 0) :
[317, 163, 83, 43, 23, 13, 7, 5, 3, 2].mapM' fun n => sorry
exact fun h2 => ⟨2, prime_two, h2, Nat.mul_le_mul_left 2 (Nat.pos_of_ne_zero hn0)⟩
#align nat.exists_prime_lt_and_le_two_mul Nat.exists_prime_lt_and_le_two_mul
+-/
alias Nat.exists_prime_lt_and_le_two_mul ← bertrand
#align nat.bertrand Nat.bertrand
mathlib commit https://github.com/leanprover-community/mathlib/commit/a3e83f0fa4391c8740f7d773a7a9b74e311ae2a3
@@ -156,7 +156,7 @@ theorem centralBinom_le_of_no_bertrand_prime (n : ℕ) (n_big : 2 < n)
have n2_pos : 1 ≤ 2 * n := mul_pos (zero_lt_two' ℕ) n_pos
let S := (Finset.range (2 * n / 3 + 1)).filterₓ Nat.Prime
let f x := x ^ n.central_binom.factorization x
- have : (∏ x : ℕ in S, f x) = ∏ x : ℕ in Finset.range (2 * n / 3 + 1), f x :=
+ have : ∏ x : ℕ in S, f x = ∏ x : ℕ in Finset.range (2 * n / 3 + 1), f x :=
by
refine' Finset.prod_filter_of_ne fun p hp h => _
contrapose! h; dsimp only [f]
mathlib commit https://github.com/leanprover-community/mathlib/commit/7e5137f579de09a059a5ce98f364a04e221aabf0
@@ -212,7 +212,7 @@ theorem exists_prime_lt_and_le_two_mul_succ {n} (q) {p : ℕ} (prime_p : Nat.Pri
exact H (lt_of_mul_lt_mul_left' (lt_of_lt_of_le (not_le.1 h) covering))
#align nat.exists_prime_lt_and_le_two_mul_succ Nat.exists_prime_lt_and_le_two_mul_succ
-/- ./././Mathport/Syntax/Translate/Expr.lean:330:4: warning: unsupported (TODO): `[tacs] -/
+/- ./././Mathport/Syntax/Translate/Expr.lean:336:4: warning: unsupported (TODO): `[tacs] -/
/--
**Bertrand's Postulate**: For any positive natural number, there is a prime which is greater than
it, but no more than twice as large.
mathlib commit https://github.com/leanprover-community/mathlib/commit/5f25c089cb34db4db112556f23c50d12da81b297
@@ -4,13 +4,14 @@ Released under Apache 2.0 license as described in the file LICENSE.
Authors: Patrick Stevens, Bolton Bailey
! This file was ported from Lean 3 source module number_theory.bertrand
-! leanprover-community/mathlib commit 8f9fea08977f7e450770933ee6abb20733b47c92
+! leanprover-community/mathlib commit a16665637b378379689c566204817ae792ac8b39
! Please do not edit these lines, except to modify the commit id
! if you have ported upstream changes.
-/
import Mathbin.Data.Nat.Choose.Factorization
import Mathbin.Data.Nat.PrimeNormNum
import Mathbin.NumberTheory.Primorial
+import Mathbin.Analysis.Convex.SpecificFunctions.Basic
import Mathbin.Analysis.Convex.SpecificFunctions.Deriv
/-!
mathlib commit https://github.com/leanprover-community/mathlib/commit/cca40788df1b8755d5baf17ab2f27dacc2e17acb
@@ -130,10 +130,10 @@ theorem centralBinom_factorization_small (n : ℕ) (n_large : 2 < n)
apply Finset.prod_subset
· exact Finset.range_subset.2 (add_le_add_right (Nat.div_le_self _ _) _)
intro x hx h2x
- rw [Finset.mem_range, lt_succ_iff] at hx h2x
- rw [not_le, div_lt_iff_lt_mul' three_pos, mul_comm x] at h2x
+ rw [Finset.mem_range, lt_succ_iff] at hx h2x
+ rw [not_le, div_lt_iff_lt_mul' three_pos, mul_comm x] at h2x
replace no_prime := not_exists.mp no_prime x
- rw [← and_assoc', not_and', not_and_or, not_lt] at no_prime
+ rw [← and_assoc', not_and', not_and_or, not_lt] at no_prime
cases' no_prime hx with h h
· rw [factorization_eq_zero_of_non_prime n.central_binom h, pow_zero]
· rw [factorization_central_binom_of_two_mul_self_lt_three_mul n_large h h2x, pow_zero]
@@ -196,7 +196,7 @@ theorem exists_prime_lt_and_le_two_mul_eventually (n : ℕ) (n_big : 512 ≤ n)
Nat.four_pow_lt_mul_centralBinom n (le_trans (by norm_num1) n_big)
have H3 : n.central_binom ≤ (2 * n) ^ sqrt (2 * n) * 4 ^ (2 * n / 3) :=
centralBinom_le_of_no_bertrand_prime n (lt_of_lt_of_le (by norm_num1) n_big) no_prime
- rw [mul_assoc] at H1; exact not_le.2 H2 ((mul_le_mul_left' H3 n).trans H1)
+ rw [mul_assoc] at H1 ; exact not_le.2 H2 ((mul_le_mul_left' H3 n).trans H1)
#align nat.exists_prime_lt_and_le_two_mul_eventually Nat.exists_prime_lt_and_le_two_mul_eventually
/-- Proves that Bertrand's postulate holds over all positive naturals less than n by identifying a
mathlib commit https://github.com/leanprover-community/mathlib/commit/917c3c072e487b3cccdbfeff17e75b40e45f66cb
@@ -42,7 +42,7 @@ Bertrand, prime, binomial coefficients
-/
-open BigOperators
+open scoped BigOperators
section Real
mathlib commit https://github.com/leanprover-community/mathlib/commit/917c3c072e487b3cccdbfeff17e75b40e45f66cb
@@ -158,8 +158,7 @@ theorem centralBinom_le_of_no_bertrand_prime (n : ℕ) (n_big : 2 < n)
have : (∏ x : ℕ in S, f x) = ∏ x : ℕ in Finset.range (2 * n / 3 + 1), f x :=
by
refine' Finset.prod_filter_of_ne fun p hp h => _
- contrapose! h
- dsimp only [f]
+ contrapose! h; dsimp only [f]
rw [factorization_eq_zero_of_non_prime n.central_binom h, pow_zero]
rw [centralBinom_factorization_small n n_big no_prime, ← this, ←
Finset.prod_filter_mul_prod_filter_not S (· ≤ sqrt (2 * n))]
mathlib commit https://github.com/leanprover-community/mathlib/commit/95a87616d63b3cb49d3fe678d416fbe9c4217bf4
@@ -4,14 +4,14 @@ Released under Apache 2.0 license as described in the file LICENSE.
Authors: Patrick Stevens, Bolton Bailey
! This file was ported from Lean 3 source module number_theory.bertrand
-! leanprover-community/mathlib commit 4fa54b337f7d52805480306db1b1439c741848c8
+! leanprover-community/mathlib commit 8f9fea08977f7e450770933ee6abb20733b47c92
! Please do not edit these lines, except to modify the commit id
! if you have ported upstream changes.
-/
import Mathbin.Data.Nat.Choose.Factorization
import Mathbin.Data.Nat.PrimeNormNum
import Mathbin.NumberTheory.Primorial
-import Mathbin.Analysis.Convex.SpecificFunctions
+import Mathbin.Analysis.Convex.SpecificFunctions.Deriv
/-!
# Bertrand's Postulate
mathlib commit https://github.com/leanprover-community/mathlib/commit/f8c79b0a623404854a2902b836eac32156fd7712
@@ -4,7 +4,7 @@ Released under Apache 2.0 license as described in the file LICENSE.
Authors: Patrick Stevens, Bolton Bailey
! This file was ported from Lean 3 source module number_theory.bertrand
-! leanprover-community/mathlib commit 0b9eaaa7686280fad8cce467f5c3c57ee6ce77f8
+! leanprover-community/mathlib commit 4fa54b337f7d52805480306db1b1439c741848c8
! Please do not edit these lines, except to modify the commit id
! if you have ported upstream changes.
-/
@@ -12,7 +12,6 @@ import Mathbin.Data.Nat.Choose.Factorization
import Mathbin.Data.Nat.PrimeNormNum
import Mathbin.NumberTheory.Primorial
import Mathbin.Analysis.Convex.SpecificFunctions
-import Mathbin.Analysis.SpecialFunctions.Pow.Tactic
/-!
# Bertrand's Postulate
mathlib commit https://github.com/leanprover-community/mathlib/commit/0b9eaaa7686280fad8cce467f5c3c57ee6ce77f8
@@ -4,7 +4,7 @@ Released under Apache 2.0 license as described in the file LICENSE.
Authors: Patrick Stevens, Bolton Bailey
! This file was ported from Lean 3 source module number_theory.bertrand
-! leanprover-community/mathlib commit 824f9ae93a4f5174d2ea948e2d75843dd83447bb
+! leanprover-community/mathlib commit 0b9eaaa7686280fad8cce467f5c3c57ee6ce77f8
! Please do not edit these lines, except to modify the commit id
! if you have ported upstream changes.
-/
@@ -12,6 +12,7 @@ import Mathbin.Data.Nat.Choose.Factorization
import Mathbin.Data.Nat.PrimeNormNum
import Mathbin.NumberTheory.Primorial
import Mathbin.Analysis.Convex.SpecificFunctions
+import Mathbin.Analysis.SpecialFunctions.Pow.Tactic
/-!
# Bertrand's Postulate
mathlib commit https://github.com/leanprover-community/mathlib/commit/4c586d291f189eecb9d00581aeb3dd998ac34442
@@ -212,7 +212,7 @@ theorem exists_prime_lt_and_le_two_mul_succ {n} (q) {p : ℕ} (prime_p : Nat.Pri
exact H (lt_of_mul_lt_mul_left' (lt_of_lt_of_le (not_le.1 h) covering))
#align nat.exists_prime_lt_and_le_two_mul_succ Nat.exists_prime_lt_and_le_two_mul_succ
-/- ./././Mathport/Syntax/Translate/Expr.lean:334:4: warning: unsupported (TODO): `[tacs] -/
+/- ./././Mathport/Syntax/Translate/Expr.lean:330:4: warning: unsupported (TODO): `[tacs] -/
/--
**Bertrand's Postulate**: For any positive natural number, there is a prime which is greater than
it, but no more than twice as large.
mathlib commit https://github.com/leanprover-community/mathlib/commit/9da1b3534b65d9661eb8f42443598a92bbb49211
@@ -4,7 +4,7 @@ Released under Apache 2.0 license as described in the file LICENSE.
Authors: Patrick Stevens, Bolton Bailey
! This file was ported from Lean 3 source module number_theory.bertrand
-! leanprover-community/mathlib commit 10b4e499f43088dd3bb7b5796184ad5216648ab1
+! leanprover-community/mathlib commit 824f9ae93a4f5174d2ea948e2d75843dd83447bb
! Please do not edit these lines, except to modify the commit id
! if you have ported upstream changes.
-/
@@ -164,7 +164,7 @@ theorem centralBinom_le_of_no_bertrand_prime (n : ℕ) (n_big : 2 < n)
rw [centralBinom_factorization_small n n_big no_prime, ← this, ←
Finset.prod_filter_mul_prod_filter_not S (· ≤ sqrt (2 * n))]
apply mul_le_mul'
- · refine' (Finset.prod_le_prod'' fun p hp => (_ : f p ≤ 2 * n)).trans _
+ · refine' (Finset.prod_le_prod' fun p hp => (_ : f p ≤ 2 * n)).trans _
· exact pow_factorization_choose_le (mul_pos two_pos n_pos)
have : (Finset.Icc 1 (sqrt (2 * n))).card = sqrt (2 * n) := by rw [card_Icc, Nat.add_sub_cancel]
rw [Finset.prod_const]
mathlib commit https://github.com/leanprover-community/mathlib/commit/bd9851ca476957ea4549eb19b40e7b5ade9428cc
@@ -69,20 +69,20 @@ theorem real_main_inequality {x : ℝ} (x_large : (512 : ℝ) ≤ x) :
-- porting note (#11083): the proof was rewritten, because it was too slow
have h : ConcaveOn ℝ (Set.Ioi 0.5) f := by
apply ConcaveOn.sub
- apply ConcaveOn.add
- exact strictConcaveOn_log_Ioi.concaveOn.subset
- (Set.Ioi_subset_Ioi (by norm_num)) (convex_Ioi 0.5)
- convert ((strictConcaveOn_sqrt_mul_log_Ioi.concaveOn.comp_linearMap
- ((2 : ℝ) • LinearMap.id))) using 1
- · ext x
+ · apply ConcaveOn.add
+ · exact strictConcaveOn_log_Ioi.concaveOn.subset
+ (Set.Ioi_subset_Ioi (by norm_num)) (convex_Ioi 0.5)
+ convert ((strictConcaveOn_sqrt_mul_log_Ioi.concaveOn.comp_linearMap
+ ((2 : ℝ) • LinearMap.id))) using 1
+ ext x
simp only [Set.mem_Ioi, Set.mem_preimage, LinearMap.smul_apply,
LinearMap.id_coe, id_eq, smul_eq_mul]
rw [← mul_lt_mul_left (two_pos)]
norm_num1
rfl
apply ConvexOn.smul
- refine div_nonneg (log_nonneg (by norm_num1)) (by norm_num1)
- exact convexOn_id (convex_Ioi (0.5 : ℝ))
+ · refine div_nonneg (log_nonneg (by norm_num1)) (by norm_num1)
+ · exact convexOn_id (convex_Ioi (0.5 : ℝ))
suffices ∃ x1 x2, 0.5 < x1 ∧ x1 < x2 ∧ x2 ≤ x ∧ 0 ≤ f x1 ∧ f x2 ≤ 0 by
obtain ⟨x1, x2, h1, h2, h0, h3, h4⟩ := this
exact (h.right_le_of_le_left'' h1 ((h1.trans h2).trans_le h0) h2 h0 (h4.trans h3)).trans h4
@@ -100,7 +100,7 @@ theorem real_main_inequality {x : ℝ} (x_large : (512 : ℝ) ≤ x) :
rw [rpow_natCast, ← pow_mul, ← pow_add]
conv in 4 => equals 2 ^ (2 : ℝ) => rw [rpow_two]; norm_num1
rw [← rpow_mul, ← rpow_natCast]
- apply rpow_le_rpow_of_exponent_le
+ on_goal 1 => apply rpow_le_rpow_of_exponent_le
all_goals norm_num1
#align bertrand.real_main_inequality Bertrand.real_main_inequality
@@ -118,7 +118,7 @@ theorem bertrand_main_inequality {n : ℕ} (n_large : 512 ≤ n) :
n * (2 * n) ^ sqrt (2 * n) * 4 ^ (2 * n / 3) ≤ 4 ^ n := by
rw [← @cast_le ℝ]
simp only [cast_add, cast_one, cast_mul, cast_pow, ← Real.rpow_natCast]
- refine' _root_.trans ?_ (Bertrand.real_main_inequality (by exact_mod_cast n_large))
+ refine _root_.trans ?_ (Bertrand.real_main_inequality (by exact_mod_cast n_large))
gcongr
· have n2_pos : 0 < 2 * n := by positivity
exact mod_cast n2_pos
nat_cast
/int_cast
/rat_cast
to natCast
/intCast
/ratCast
(#11486)
Now that I am defining NNRat.cast
, I want a definitive answer to this naming issue. Plenty of lemmas in mathlib already use natCast
/intCast
/ratCast
over nat_cast
/int_cast
/rat_cast
, and this matches with the general expectation that underscore-separated name parts correspond to a single declaration.
@@ -97,9 +97,9 @@ theorem real_main_inequality {x : ℝ} (x_large : (512 : ℝ) ≤ x) :
conv in 512 => equals 2 ^ 9 => norm_num1
conv in 2 * 512 => equals 2 ^ 10 => norm_num1
conv in 32 => rw [← Nat.cast_ofNat]
- rw [rpow_nat_cast, ← pow_mul, ← pow_add]
+ rw [rpow_natCast, ← pow_mul, ← pow_add]
conv in 4 => equals 2 ^ (2 : ℝ) => rw [rpow_two]; norm_num1
- rw [← rpow_mul, ← rpow_nat_cast]
+ rw [← rpow_mul, ← rpow_natCast]
apply rpow_le_rpow_of_exponent_le
all_goals norm_num1
#align bertrand.real_main_inequality Bertrand.real_main_inequality
@@ -117,7 +117,7 @@ open Nat
theorem bertrand_main_inequality {n : ℕ} (n_large : 512 ≤ n) :
n * (2 * n) ^ sqrt (2 * n) * 4 ^ (2 * n / 3) ≤ 4 ^ n := by
rw [← @cast_le ℝ]
- simp only [cast_add, cast_one, cast_mul, cast_pow, ← Real.rpow_nat_cast]
+ simp only [cast_add, cast_one, cast_mul, cast_pow, ← Real.rpow_natCast]
refine' _root_.trans ?_ (Bertrand.real_main_inequality (by exact_mod_cast n_large))
gcongr
· have n2_pos : 0 < 2 * n := by positivity
This adds the notation √r
for Real.sqrt r
. The precedence is such that √x⁻¹
is parsed as √(x⁻¹)
; not because this is particularly desirable, but because it's the default and the choice doesn't really matter.
This is extracted from #7907, which adds a more general nth root typeclass.
The idea is to perform all the boring substitutions downstream quickly, so that we can play around with custom elaborators with a much slower rate of code-rot.
This PR also won't rot as quickly, as it does not forbid writing x.sqrt
as that PR does.
While perhaps claiming √
for Real.sqrt
is greedy; it:
NNReal.sqrt
and Nat.sqrt
sqrt
on Float
Co-authored-by: Yury G. Kudryashov <urkud@urkud.name>
@@ -52,14 +52,14 @@ namespace Bertrand
This is not best possible: it actually holds for 464 ≤ x.
-/
theorem real_main_inequality {x : ℝ} (x_large : (512 : ℝ) ≤ x) :
- x * (2 * x) ^ sqrt (2 * x) * 4 ^ (2 * x / 3) ≤ 4 ^ x := by
- let f : ℝ → ℝ := fun x => log x + sqrt (2 * x) * log (2 * x) - log 4 / 3 * x
- have hf' : ∀ x, 0 < x → 0 < x * (2 * x) ^ sqrt (2 * x) / 4 ^ (x / 3) := fun x h =>
+ x * (2 * x) ^ √(2 * x) * 4 ^ (2 * x / 3) ≤ 4 ^ x := by
+ let f : ℝ → ℝ := fun x => log x + √(2 * x) * log (2 * x) - log 4 / 3 * x
+ have hf' : ∀ x, 0 < x → 0 < x * (2 * x) ^ √(2 * x) / 4 ^ (x / 3) := fun x h =>
div_pos (mul_pos h (rpow_pos_of_pos (mul_pos two_pos h) _)) (rpow_pos_of_pos four_pos _)
- have hf : ∀ x, 0 < x → f x = log (x * (2 * x) ^ sqrt (2 * x) / 4 ^ (x / 3)) := by
+ have hf : ∀ x, 0 < x → f x = log (x * (2 * x) ^ √(2 * x) / 4 ^ (x / 3)) := by
intro x h5
have h6 := mul_pos (zero_lt_two' ℝ) h5
- have h7 := rpow_pos_of_pos h6 (sqrt (2 * x))
+ have h7 := rpow_pos_of_pos h6 (√(2 * x))
rw [log_div (mul_pos h5 h7).ne' (rpow_pos_of_pos four_pos _).ne', log_mul h5.ne' h7.ne',
log_rpow h6, log_rpow zero_lt_four, ← mul_div_right_comm, ← mul_div, mul_comm x]
have h5 : 0 < x := lt_of_lt_of_le (by norm_num1) x_large
@@ -87,10 +87,10 @@ theorem real_main_inequality {x : ℝ} (x_large : (512 : ℝ) ≤ x) :
obtain ⟨x1, x2, h1, h2, h0, h3, h4⟩ := this
exact (h.right_le_of_le_left'' h1 ((h1.trans h2).trans_le h0) h2 h0 (h4.trans h3)).trans h4
refine' ⟨18, 512, by norm_num1, by norm_num1, x_large, _, _⟩
- · have : sqrt (2 * 18) = 6 := (sqrt_eq_iff_mul_self_eq_of_pos (by norm_num1)).mpr (by norm_num1)
+ · have : √(2 * 18 : ℝ) = 6 := (sqrt_eq_iff_mul_self_eq_of_pos (by norm_num1)).mpr (by norm_num1)
rw [hf _ (by norm_num1), log_nonneg_iff (by positivity), this, one_le_div (by norm_num1)]
norm_num1
- · have : sqrt (2 * 512) = 32 :=
+ · have : √(2 * 512) = 32 :=
(sqrt_eq_iff_mul_self_eq_of_pos (by norm_num1)).mpr (by norm_num1)
rw [hf _ (by norm_num1), log_nonpos_iff (hf' _ (by norm_num1)), this,
div_le_one (by positivity)]
slow / slower
porting notes (#11084)
Classifies by adding issue number #11083 to porting notes claiming anything semantically equivalent to:
attribute
because it caused extremely slow tactic
"@@ -66,7 +66,7 @@ theorem real_main_inequality {x : ℝ} (x_large : (512 : ℝ) ≤ x) :
rw [← div_le_one (rpow_pos_of_pos four_pos x), ← div_div_eq_mul_div, ← rpow_sub four_pos, ←
mul_div 2 x, mul_div_left_comm, ← mul_one_sub, (by norm_num1 : (1 : ℝ) - 2 / 3 = 1 / 3),
mul_one_div, ← log_nonpos_iff (hf' x h5), ← hf x h5]
- -- porting note: the proof was rewritten, because it was too slow
+ -- porting note (#11083): the proof was rewritten, because it was too slow
have h : ConcaveOn ℝ (Set.Ioi 0.5) f := by
apply ConcaveOn.sub
apply ConcaveOn.add
@@ -163,7 +163,7 @@ theorem centralBinom_le_of_no_bertrand_prime (n : ℕ) (n_large : 2 < n)
let f x := x ^ n.centralBinom.factorization x
have : ∏ x : ℕ in S, f x = ∏ x : ℕ in Finset.range (2 * n / 3 + 1), f x := by
refine' Finset.prod_filter_of_ne fun p _ h => _
- contrapose! h; dsimp only
+ contrapose! h; dsimp only [f]
rw [factorization_eq_zero_of_non_prime n.centralBinom h, _root_.pow_zero]
rw [centralBinom_factorization_small n n_large no_prime, ← this, ←
Finset.prod_filter_mul_prod_filter_not S (· ≤ sqrt (2 * n))]
@@ -137,7 +137,7 @@ theorem centralBinom_factorization_small (n : ℕ) (n_large : 2 < n)
apply Finset.prod_subset
· exact Finset.range_subset.2 (add_le_add_right (Nat.div_le_self _ _) _)
intro x hx h2x
- rw [Finset.mem_range, lt_succ_iff] at hx h2x
+ rw [Finset.mem_range, Nat.lt_succ_iff] at hx h2x
rw [not_le, div_lt_iff_lt_mul' three_pos, mul_comm x] at h2x
replace no_prime := not_exists.mp no_prime x
rw [← and_assoc, not_and', not_and_or, not_lt] at no_prime
@@ -51,7 +51,7 @@ namespace Bertrand
/-- A reified version of the `Bertrand.main_inequality` below.
This is not best possible: it actually holds for 464 ≤ x.
-/
-theorem real_main_inequality {x : ℝ} (n_large : (512 : ℝ) ≤ x) :
+theorem real_main_inequality {x : ℝ} (x_large : (512 : ℝ) ≤ x) :
x * (2 * x) ^ sqrt (2 * x) * 4 ^ (2 * x / 3) ≤ 4 ^ x := by
let f : ℝ → ℝ := fun x => log x + sqrt (2 * x) * log (2 * x) - log 4 / 3 * x
have hf' : ∀ x, 0 < x → 0 < x * (2 * x) ^ sqrt (2 * x) / 4 ^ (x / 3) := fun x h =>
@@ -62,7 +62,7 @@ theorem real_main_inequality {x : ℝ} (n_large : (512 : ℝ) ≤ x) :
have h7 := rpow_pos_of_pos h6 (sqrt (2 * x))
rw [log_div (mul_pos h5 h7).ne' (rpow_pos_of_pos four_pos _).ne', log_mul h5.ne' h7.ne',
log_rpow h6, log_rpow zero_lt_four, ← mul_div_right_comm, ← mul_div, mul_comm x]
- have h5 : 0 < x := lt_of_lt_of_le (by norm_num1) n_large
+ have h5 : 0 < x := lt_of_lt_of_le (by norm_num1) x_large
rw [← div_le_one (rpow_pos_of_pos four_pos x), ← div_div_eq_mul_div, ← rpow_sub four_pos, ←
mul_div 2 x, mul_div_left_comm, ← mul_one_sub, (by norm_num1 : (1 : ℝ) - 2 / 3 = 1 / 3),
mul_one_div, ← log_nonpos_iff (hf' x h5), ← hf x h5]
@@ -86,7 +86,7 @@ theorem real_main_inequality {x : ℝ} (n_large : (512 : ℝ) ≤ x) :
suffices ∃ x1 x2, 0.5 < x1 ∧ x1 < x2 ∧ x2 ≤ x ∧ 0 ≤ f x1 ∧ f x2 ≤ 0 by
obtain ⟨x1, x2, h1, h2, h0, h3, h4⟩ := this
exact (h.right_le_of_le_left'' h1 ((h1.trans h2).trans_le h0) h2 h0 (h4.trans h3)).trans h4
- refine' ⟨18, 512, by norm_num1, by norm_num1, n_large, _, _⟩
+ refine' ⟨18, 512, by norm_num1, by norm_num1, x_large, _, _⟩
· have : sqrt (2 * 18) = 6 := (sqrt_eq_iff_mul_self_eq_of_pos (by norm_num1)).mpr (by norm_num1)
rw [hf _ (by norm_num1), log_nonneg_iff (by positivity), this, one_le_div (by norm_num1)]
norm_num1
@@ -154,10 +154,10 @@ The bound splits the prime factors of `centralBinom n` into those
4. Between `n` and `2 * n`, which would not exist in the case where Bertrand's postulate is false.
5. Above `2 * n`, which do not exist.
-/
-theorem centralBinom_le_of_no_bertrand_prime (n : ℕ) (n_big : 2 < n)
+theorem centralBinom_le_of_no_bertrand_prime (n : ℕ) (n_large : 2 < n)
(no_prime : ¬∃ p : ℕ, Nat.Prime p ∧ n < p ∧ p ≤ 2 * n) :
centralBinom n ≤ (2 * n) ^ sqrt (2 * n) * 4 ^ (2 * n / 3) := by
- have n_pos : 0 < n := (Nat.zero_le _).trans_lt n_big
+ have n_pos : 0 < n := (Nat.zero_le _).trans_lt n_large
have n2_pos : 1 ≤ 2 * n := mul_pos (zero_lt_two' ℕ) n_pos
let S := (Finset.range (2 * n / 3 + 1)).filter Nat.Prime
let f x := x ^ n.centralBinom.factorization x
@@ -165,7 +165,7 @@ theorem centralBinom_le_of_no_bertrand_prime (n : ℕ) (n_big : 2 < n)
refine' Finset.prod_filter_of_ne fun p _ h => _
contrapose! h; dsimp only
rw [factorization_eq_zero_of_non_prime n.centralBinom h, _root_.pow_zero]
- rw [centralBinom_factorization_small n n_big no_prime, ← this, ←
+ rw [centralBinom_factorization_small n n_large no_prime, ← this, ←
Finset.prod_filter_mul_prod_filter_not S (· ≤ sqrt (2 * n))]
apply mul_le_mul'
· refine' (Finset.prod_le_prod' fun p _ => (_ : f p ≤ 2 * n)).trans _
@@ -188,18 +188,18 @@ namespace Nat
/-- Proves that **Bertrand's postulate** holds for all sufficiently large `n`.
-/
-theorem exists_prime_lt_and_le_two_mul_eventually (n : ℕ) (n_big : 512 ≤ n) :
+theorem exists_prime_lt_and_le_two_mul_eventually (n : ℕ) (n_large : 512 ≤ n) :
∃ p : ℕ, p.Prime ∧ n < p ∧ p ≤ 2 * n := by
-- Assume there is no prime in the range.
by_contra no_prime
-- Then we have the above sub-exponential bound on the size of this central binomial coefficient.
-- We now couple this bound with an exponential lower bound on the central binomial coefficient,
-- yielding an inequality which we have seen is false for large enough n.
- have H1 : n * (2 * n) ^ sqrt (2 * n) * 4 ^ (2 * n / 3) ≤ 4 ^ n := bertrand_main_inequality n_big
+ have H1 : n * (2 * n) ^ sqrt (2 * n) * 4 ^ (2 * n / 3) ≤ 4 ^ n := bertrand_main_inequality n_large
have H2 : 4 ^ n < n * n.centralBinom :=
- Nat.four_pow_lt_mul_centralBinom n (le_trans (by norm_num1) n_big)
+ Nat.four_pow_lt_mul_centralBinom n (le_trans (by norm_num1) n_large)
have H3 : n.centralBinom ≤ (2 * n) ^ sqrt (2 * n) * 4 ^ (2 * n / 3) :=
- centralBinom_le_of_no_bertrand_prime n (lt_of_lt_of_le (by norm_num1) n_big) no_prime
+ centralBinom_le_of_no_bertrand_prime n (lt_of_lt_of_le (by norm_num1) n_large) no_prime
rw [mul_assoc] at H1; exact not_le.2 H2 ((mul_le_mul_left' H3 n).trans H1)
#align nat.exists_prime_lt_and_le_two_mul_eventually Nat.exists_prime_lt_and_le_two_mul_eventually
a ^ b
where a
and b
are reals. Unlike in the mathlib3 version, there is no restriction on the positivity of a
.Co-authored-by: Eric Wieser <wieser.eric@gmail.com>
@@ -88,26 +88,20 @@ theorem real_main_inequality {x : ℝ} (n_large : (512 : ℝ) ≤ x) :
exact (h.right_le_of_le_left'' h1 ((h1.trans h2).trans_le h0) h2 h0 (h4.trans h3)).trans h4
refine' ⟨18, 512, by norm_num1, by norm_num1, n_large, _, _⟩
· have : sqrt (2 * 18) = 6 := (sqrt_eq_iff_mul_self_eq_of_pos (by norm_num1)).mpr (by norm_num1)
- rw [hf, log_nonneg_iff, this]
- rw [one_le_div] <;> norm_num1
- apply le_trans _ (le_mul_of_one_le_left _ _) <;> norm_num1
- apply Real.rpow_le_rpow <;> norm_num1
- apply rpow_nonneg; norm_num1
- apply rpow_pos_of_pos; norm_num1
- apply hf' 18; norm_num1
+ rw [hf _ (by norm_num1), log_nonneg_iff (by positivity), this, one_le_div (by norm_num1)]
norm_num1
· have : sqrt (2 * 512) = 32 :=
(sqrt_eq_iff_mul_self_eq_of_pos (by norm_num1)).mpr (by norm_num1)
- rw [hf, log_nonpos_iff (hf' _ _), this, div_le_one] <;> norm_num1
- · conv in 512 => equals 2 ^ 9 => norm_num1
- conv in 1024 => equals 2 ^ 10 => norm_num1
- conv in 32 => rw [← Nat.cast_ofNat]
- rw [rpow_nat_cast, ← pow_mul, ← pow_add]
- conv in 4 => equals 2 ^ (2 : ℝ) => rw [rpow_two]; norm_num1
- rw [← rpow_mul, ← rpow_nat_cast]
- apply rpow_le_rpow_of_exponent_le
- all_goals norm_num1
- · apply rpow_pos_of_pos four_pos
+ rw [hf _ (by norm_num1), log_nonpos_iff (hf' _ (by norm_num1)), this,
+ div_le_one (by positivity)]
+ conv in 512 => equals 2 ^ 9 => norm_num1
+ conv in 2 * 512 => equals 2 ^ 10 => norm_num1
+ conv in 32 => rw [← Nat.cast_ofNat]
+ rw [rpow_nat_cast, ← pow_mul, ← pow_add]
+ conv in 4 => equals 2 ^ (2 : ℝ) => rw [rpow_two]; norm_num1
+ rw [← rpow_mul, ← rpow_nat_cast]
+ apply rpow_le_rpow_of_exponent_le
+ all_goals norm_num1
#align bertrand.real_main_inequality Bertrand.real_main_inequality
end Bertrand
@@ -4,10 +4,10 @@ Released under Apache 2.0 license as described in the file LICENSE.
Authors: Patrick Stevens, Bolton Bailey
-/
import Mathlib.Data.Nat.Choose.Factorization
-import Mathlib.Data.Nat.PrimeNormNum
import Mathlib.NumberTheory.Primorial
import Mathlib.Analysis.Convex.SpecificFunctions.Basic
import Mathlib.Analysis.Convex.SpecificFunctions.Deriv
+import Mathlib.Tactic.NormNum.Prime
#align_import number_theory.bertrand from "leanprover-community/mathlib"@"a16665637b378379689c566204817ae792ac8b39"
rpow_nonneg_of_nonneg
to rpow_nonneg
(#9518)
This better matches other lemma names.
From LeanAPAP
@@ -92,7 +92,7 @@ theorem real_main_inequality {x : ℝ} (n_large : (512 : ℝ) ≤ x) :
rw [one_le_div] <;> norm_num1
apply le_trans _ (le_mul_of_one_le_left _ _) <;> norm_num1
apply Real.rpow_le_rpow <;> norm_num1
- apply rpow_nonneg_of_nonneg; norm_num1
+ apply rpow_nonneg; norm_num1
apply rpow_pos_of_pos; norm_num1
apply hf' 18; norm_num1
norm_num1
Finset
lemma names (#8894)
Change a few lemma names that have historically bothered me.
Finset.card_le_of_subset
→ Finset.card_le_card
Multiset.card_le_of_le
→ Multiset.card_le_card
Multiset.card_lt_of_lt
→ Multiset.card_lt_card
Set.ncard_le_of_subset
→ Set.ncard_le_ncard
Finset.image_filter
→ Finset.filter_image
CompleteLattice.finset_sup_compact_of_compact
→ CompleteLattice.isCompactElement_finset_sup
@@ -178,7 +178,7 @@ theorem centralBinom_le_of_no_bertrand_prime (n : ℕ) (n_big : 2 < n)
· exact pow_factorization_choose_le (mul_pos two_pos n_pos)
have : (Finset.Icc 1 (sqrt (2 * n))).card = sqrt (2 * n) := by rw [card_Icc, Nat.add_sub_cancel]
rw [Finset.prod_const]
- refine' pow_le_pow_right n2_pos ((Finset.card_le_of_subset fun x hx => _).trans this.le)
+ refine' pow_le_pow_right n2_pos ((Finset.card_le_card fun x hx => _).trans this.le)
obtain ⟨h1, h2⟩ := Finset.mem_filter.1 hx
exact Finset.mem_Icc.mpr ⟨(Finset.mem_filter.1 h1).2.one_lt.le, h2⟩
· refine' le_trans _ (primorial_le_4_pow (2 * n / 3))
The names for lemmas about monotonicity of (a ^ ·)
and (· ^ n)
were a mess. This PR tidies up everything related by following the naming convention for (a * ·)
and (· * b)
. Namely, (a ^ ·)
is pow_right
and (· ^ n)
is pow_left
in lemma names. All lemma renames follow the corresponding multiplication lemma names closely.
Algebra.GroupPower.Order
pow_mono
→ pow_right_mono
pow_le_pow
→ pow_le_pow_right
pow_le_pow_of_le_left
→ pow_le_pow_left
pow_lt_pow_of_lt_left
→ pow_lt_pow_left
strictMonoOn_pow
→ pow_left_strictMonoOn
pow_strictMono_right
→ pow_right_strictMono
pow_lt_pow
→ pow_lt_pow_right
pow_lt_pow_iff
→ pow_lt_pow_iff_right
pow_le_pow_iff
→ pow_le_pow_iff_right
self_lt_pow
→ lt_self_pow
strictAnti_pow
→ pow_right_strictAnti
pow_lt_pow_iff_of_lt_one
→ pow_lt_pow_iff_right_of_lt_one
pow_lt_pow_of_lt_one
→ pow_lt_pow_right_of_lt_one
lt_of_pow_lt_pow
→ lt_of_pow_lt_pow_left
le_of_pow_le_pow
→ le_of_pow_le_pow_left
pow_lt_pow₀
→ pow_lt_pow_right₀
Algebra.GroupPower.CovariantClass
pow_le_pow_of_le_left'
→ pow_le_pow_left'
nsmul_le_nsmul_of_le_right
→ nsmul_le_nsmul_right
pow_lt_pow'
→ pow_lt_pow_right'
nsmul_lt_nsmul
→ nsmul_lt_nsmul_left
pow_strictMono_left
→ pow_right_strictMono'
nsmul_strictMono_right
→ nsmul_left_strictMono
StrictMono.pow_right'
→ StrictMono.pow_const
StrictMono.nsmul_left
→ StrictMono.const_nsmul
pow_strictMono_right'
→ pow_left_strictMono
nsmul_strictMono_left
→ nsmul_right_strictMono
Monotone.pow_right
→ Monotone.pow_const
Monotone.nsmul_left
→ Monotone.const_nsmul
lt_of_pow_lt_pow'
→ lt_of_pow_lt_pow_left'
lt_of_nsmul_lt_nsmul
→ lt_of_nsmul_lt_nsmul_right
pow_le_pow'
→ pow_le_pow_right'
nsmul_le_nsmul
→ nsmul_le_nsmul_left
pow_le_pow_of_le_one'
→ pow_le_pow_right_of_le_one'
nsmul_le_nsmul_of_nonpos
→ nsmul_le_nsmul_left_of_nonpos
le_of_pow_le_pow'
→ le_of_pow_le_pow_left'
le_of_nsmul_le_nsmul'
→ le_of_nsmul_le_nsmul_right'
pow_le_pow_iff'
→ pow_le_pow_iff_right'
nsmul_le_nsmul_iff
→ nsmul_le_nsmul_iff_left
pow_lt_pow_iff'
→ pow_lt_pow_iff_right'
nsmul_lt_nsmul_iff
→ nsmul_lt_nsmul_iff_left
Data.Nat.Pow
Nat.pow_lt_pow_of_lt_left
→ Nat.pow_lt_pow_left
Nat.pow_le_iff_le_left
→ Nat.pow_le_pow_iff_left
Nat.pow_lt_iff_lt_left
→ Nat.pow_lt_pow_iff_left
pow_le_pow_iff_left
pow_lt_pow_iff_left
pow_right_injective
pow_right_inj
Nat.pow_le_pow_left
to have the correct name since Nat.pow_le_pow_of_le_left
is in Std.Nat.pow_le_pow_right
to have the correct name since Nat.pow_le_pow_of_le_right
is in Std.self_le_pow
was a duplicate of le_self_pow
.Nat.pow_lt_pow_of_lt_right
is defeq to pow_lt_pow_right
.Nat.pow_right_strictMono
is defeq to pow_right_strictMono
.Nat.pow_le_iff_le_right
is defeq to pow_le_pow_iff_right
.Nat.pow_lt_iff_lt_right
is defeq to pow_lt_pow_iff_right
.0 < n
or 1 ≤ n
to n ≠ 0
.Nat
lemmas have been protected
.@@ -178,13 +178,13 @@ theorem centralBinom_le_of_no_bertrand_prime (n : ℕ) (n_big : 2 < n)
· exact pow_factorization_choose_le (mul_pos two_pos n_pos)
have : (Finset.Icc 1 (sqrt (2 * n))).card = sqrt (2 * n) := by rw [card_Icc, Nat.add_sub_cancel]
rw [Finset.prod_const]
- refine' pow_le_pow n2_pos ((Finset.card_le_of_subset fun x hx => _).trans this.le)
+ refine' pow_le_pow_right n2_pos ((Finset.card_le_of_subset fun x hx => _).trans this.le)
obtain ⟨h1, h2⟩ := Finset.mem_filter.1 hx
exact Finset.mem_Icc.mpr ⟨(Finset.mem_filter.1 h1).2.one_lt.le, h2⟩
· refine' le_trans _ (primorial_le_4_pow (2 * n / 3))
refine' (Finset.prod_le_prod' fun p hp => (_ : f p ≤ p)).trans _
· obtain ⟨h1, h2⟩ := Finset.mem_filter.1 hp
- refine' (pow_le_pow (Finset.mem_filter.1 h1).2.one_lt.le _).trans (pow_one p).le
+ refine' (pow_le_pow_right (Finset.mem_filter.1 h1).2.one_lt.le _).trans (pow_one p).le
exact Nat.factorization_choose_le_one (sqrt_lt'.mp <| not_le.1 h2)
refine' Finset.prod_le_prod_of_subset_of_one_le' (Finset.filter_subset _ _) _
exact fun p hp _ => (Finset.mem_filter.1 hp).2.one_lt.le
@@ -192,7 +192,7 @@ theorem centralBinom_le_of_no_bertrand_prime (n : ℕ) (n_big : 2 < n)
namespace Nat
-/-- Proves that Bertrand's postulate holds for all sufficiently large `n`.
+/-- Proves that **Bertrand's postulate** holds for all sufficiently large `n`.
-/
theorem exists_prime_lt_and_le_two_mul_eventually (n : ℕ) (n_big : 512 ≤ n) :
∃ p : ℕ, p.Prime ∧ n < p ∧ p ≤ 2 * n := by
Following on from previous gcongr
golfing PRs #4702 and #4784.
This is a replacement for #7901: this round of golfs, first introduced there, there exposed some performance issues in gcongr
, hopefully fixed by #8731, and I am opening a new PR so that the performance can be checked against current master rather than master at the time of #7901.
@@ -124,17 +124,13 @@ theorem bertrand_main_inequality {n : ℕ} (n_large : 512 ≤ n) :
n * (2 * n) ^ sqrt (2 * n) * 4 ^ (2 * n / 3) ≤ 4 ^ n := by
rw [← @cast_le ℝ]
simp only [cast_add, cast_one, cast_mul, cast_pow, ← Real.rpow_nat_cast]
- have n_pos : 0 < n := (by decide : 0 < 512).trans_le n_large
- have n2_pos : 1 ≤ 2 * n := mul_pos (by decide) n_pos
- refine' _root_.trans (mul_le_mul _ _ _ _)
- (Bertrand.real_main_inequality (mod_cast n_large))
- · refine' mul_le_mul_of_nonneg_left _ (Nat.cast_nonneg _)
- refine' Real.rpow_le_rpow_of_exponent_le (mod_cast n2_pos) _
- exact mod_cast Real.nat_sqrt_le_real_sqrt
- · exact Real.rpow_le_rpow_of_exponent_le (by norm_num1) (cast_div_le.trans (by norm_cast))
- · exact Real.rpow_nonneg_of_nonneg (by norm_num1) _
- · refine' mul_nonneg (Nat.cast_nonneg _) _
- exact Real.rpow_nonneg_of_nonneg (mul_nonneg zero_le_two (Nat.cast_nonneg _)) _
+ refine' _root_.trans ?_ (Bertrand.real_main_inequality (by exact_mod_cast n_large))
+ gcongr
+ · have n2_pos : 0 < 2 * n := by positivity
+ exact mod_cast n2_pos
+ · exact_mod_cast Real.nat_sqrt_le_real_sqrt
+ · norm_num1
+ · exact cast_div_le.trans (by norm_cast)
#align bertrand_main_inequality bertrand_main_inequality
/-- A lemma that tells us that, in the case where Bertrand's postulate does not hold, the prime
I've also got a change to make this required, but I'd like to land this first.
@@ -220,7 +220,7 @@ for each number ≤ n.
theorem exists_prime_lt_and_le_two_mul_succ {n} (q) {p : ℕ} (prime_p : Nat.Prime p)
(covering : p ≤ 2 * q) (H : n < q → ∃ p : ℕ, p.Prime ∧ n < p ∧ p ≤ 2 * n) (hn : n < p) :
∃ p : ℕ, p.Prime ∧ n < p ∧ p ≤ 2 * n := by
- by_cases p ≤ 2 * n; · exact ⟨p, prime_p, hn, h⟩
+ by_cases h : p ≤ 2 * n; · exact ⟨p, prime_p, hn, h⟩
exact H (lt_of_mul_lt_mul_left' (lt_of_lt_of_le (not_le.1 h) covering))
#align nat.exists_prime_lt_and_le_two_mul_succ Nat.exists_prime_lt_and_le_two_mul_succ
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>
@@ -127,10 +127,10 @@ theorem bertrand_main_inequality {n : ℕ} (n_large : 512 ≤ n) :
have n_pos : 0 < n := (by decide : 0 < 512).trans_le n_large
have n2_pos : 1 ≤ 2 * n := mul_pos (by decide) n_pos
refine' _root_.trans (mul_le_mul _ _ _ _)
- (Bertrand.real_main_inequality (by exact_mod_cast n_large))
+ (Bertrand.real_main_inequality (mod_cast n_large))
· refine' mul_le_mul_of_nonneg_left _ (Nat.cast_nonneg _)
- refine' Real.rpow_le_rpow_of_exponent_le (by exact_mod_cast n2_pos) _
- exact_mod_cast Real.nat_sqrt_le_real_sqrt
+ refine' Real.rpow_le_rpow_of_exponent_le (mod_cast n2_pos) _
+ exact mod_cast Real.nat_sqrt_le_real_sqrt
· exact Real.rpow_le_rpow_of_exponent_le (by norm_num1) (cast_div_le.trans (by norm_cast))
· exact Real.rpow_nonneg_of_nonneg (by norm_num1) _
· refine' mul_nonneg (Nat.cast_nonneg _) _
This is the supremum of
along with some minor fixes from failures on nightly-testing as Mathlib master
is merged into it.
Note that some PRs for changes that are already compatible with the current toolchain and will be necessary have already been split out: #8380.
I am hopeful that in future we will be able to progressively merge adaptation PRs into a bump/v4.X.0
branch, so we never end up with a "big merge" like this. However one of these adaptation PRs (#8056) predates my new scheme for combined CI, and it wasn't possible to keep that PR viable in the meantime.
In particular this includes adjustments for the Lean PRs
We can get rid of all the
local macro_rules | `($x ^ $y) => `(HPow.hPow $x $y) -- Porting note: See issue [lean4#2220](https://github.com/leanprover/lean4/pull/2220)
macros across Mathlib (and in any projects that want to write natural number powers of reals).
Changes the default behaviour of simp
to (config := {decide := false})
. This makes simp
(and consequentially norm_num
) less powerful, but also more consistent, and less likely to blow up in long failures. This requires a variety of changes: changing some previously by simp
or norm_num
to decide
or rfl
, or adding (config := {decide := true})
.
This changed the behaviour of simp
so that simp [f]
will only unfold "fully applied" occurrences of f
. The old behaviour can be recovered with simp (config := { unfoldPartialApp := true })
. We may in future add a syntax for this, e.g. simp [!f]
; please provide feedback! In the meantime, we have made the following changes:
(config := { unfoldPartialApp := true })
in some places, to recover the old behaviour@[eqns]
to manually adjust the equation lemmas for a particular definition, recovering the old behaviour just for that definition. See #8371, where we do this for Function.comp
and Function.flip
.This change in Lean may require further changes down the line (e.g. adding the !f
syntax, and/or upstreaming the special treatment for Function.comp
and Function.flip
, and/or removing this special treatment). Please keep an open and skeptical mind about these changes!
Co-authored-by: leanprover-community-mathlib4-bot <leanprover-community-mathlib4-bot@users.noreply.github.com> Co-authored-by: Scott Morrison <scott.morrison@gmail.com> Co-authored-by: Eric Wieser <wieser.eric@gmail.com> Co-authored-by: Mauricio Collares <mauricio@collares.org>
@@ -99,17 +99,15 @@ theorem real_main_inequality {x : ℝ} (n_large : (512 : ℝ) ≤ x) :
· have : sqrt (2 * 512) = 32 :=
(sqrt_eq_iff_mul_self_eq_of_pos (by norm_num1)).mpr (by norm_num1)
rw [hf, log_nonpos_iff (hf' _ _), this, div_le_one] <;> norm_num1
- have : (512 : ℝ) = 2 ^ (9 : ℕ)
- · rw [rpow_nat_cast 2 9]; norm_num1
- conv_lhs => rw [this]
- have : (1024 : ℝ) = 2 ^ (10 : ℕ)
- · rw [rpow_nat_cast 2 10]; norm_num1
- rw [this, ← rpow_mul, ← rpow_add] <;> norm_num1
- have : (4 : ℝ) = 2 ^ (2 : ℕ)
- · rw [rpow_nat_cast 2 2]; norm_num1
- rw [this, ← rpow_mul] <;> norm_num1
- apply rpow_le_rpow_of_exponent_le <;> norm_num1
- apply rpow_pos_of_pos four_pos
+ · conv in 512 => equals 2 ^ 9 => norm_num1
+ conv in 1024 => equals 2 ^ 10 => norm_num1
+ conv in 32 => rw [← Nat.cast_ofNat]
+ rw [rpow_nat_cast, ← pow_mul, ← pow_add]
+ conv in 4 => equals 2 ^ (2 : ℝ) => rw [rpow_two]; norm_num1
+ rw [← rpow_mul, ← rpow_nat_cast]
+ apply rpow_le_rpow_of_exponent_le
+ all_goals norm_num1
+ · apply rpow_pos_of_pos four_pos
#align bertrand.real_main_inequality Bertrand.real_main_inequality
end Bertrand
@@ -249,7 +249,7 @@ theorem exists_prime_lt_and_le_two_mul (n : ℕ) (hn0 : n ≠ 0) :
exact fun h2 => ⟨2, prime_two, h2, Nat.mul_le_mul_left 2 (Nat.pos_of_ne_zero hn0)⟩
#align nat.exists_prime_lt_and_le_two_mul Nat.exists_prime_lt_and_le_two_mul
-alias Nat.exists_prime_lt_and_le_two_mul ← bertrand
+alias bertrand := Nat.exists_prime_lt_and_le_two_mul
#align nat.bertrand Nat.bertrand
end Nat
@@ -2,11 +2,6 @@
Copyright (c) 2020 Patrick Stevens. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Authors: Patrick Stevens, Bolton Bailey
-
-! This file was ported from Lean 3 source module number_theory.bertrand
-! leanprover-community/mathlib commit a16665637b378379689c566204817ae792ac8b39
-! Please do not edit these lines, except to modify the commit id
-! if you have ported upstream changes.
-/
import Mathlib.Data.Nat.Choose.Factorization
import Mathlib.Data.Nat.PrimeNormNum
@@ -14,6 +9,8 @@ import Mathlib.NumberTheory.Primorial
import Mathlib.Analysis.Convex.SpecificFunctions.Basic
import Mathlib.Analysis.Convex.SpecificFunctions.Deriv
+#align_import number_theory.bertrand from "leanprover-community/mathlib"@"a16665637b378379689c566204817ae792ac8b39"
+
/-!
# Bertrand's Postulate
Co-authored-by: Komyyy <pol_tta@outlook.jp> Co-authored-by: Scott Morrison <scott.morrison@gmail.com> Co-authored-by: Scott Morrison <scott.morrison@anu.edu.au> Co-authored-by: Ruben Van de Velde <65514131+Ruben-VandeVelde@users.noreply.github.com> Co-authored-by: Mario Carneiro <di.gama@gmail.com>
@@ -247,8 +247,8 @@ theorem exists_prime_lt_and_le_two_mul (n : ℕ) (hn0 : n ≠ 0) :
run_tac do
for i in [317, 163, 83, 43, 23, 13, 7, 5, 3, 2] do
let i : Term := quote i
- evalTactic
- (← `(tactic| refine' exists_prime_lt_and_le_two_mul_succ $i (by norm_num) (by norm_num) _))
+ evalTactic <| ←
+ `(tactic| refine' exists_prime_lt_and_le_two_mul_succ $i (by norm_num1) (by norm_num1) _)
exact fun h2 => ⟨2, prime_two, h2, Nat.mul_le_mul_left 2 (Nat.pos_of_ne_zero hn0)⟩
#align nat.exists_prime_lt_and_le_two_mul Nat.exists_prime_lt_and_le_two_mul
This is the second half of the changes originally in #5699, removing all occurrences of ;
after a space and implementing a linter rule to enforce it.
In most cases this 2-character substring has a space after it, so the following command was run first:
find . -type f -name "*.lean" -exec sed -i -E 's/ ; /; /g' {} \;
The remaining cases were few enough in number that they were done manually.
@@ -95,21 +95,21 @@ theorem real_main_inequality {x : ℝ} (n_large : (512 : ℝ) ≤ x) :
rw [one_le_div] <;> norm_num1
apply le_trans _ (le_mul_of_one_le_left _ _) <;> norm_num1
apply Real.rpow_le_rpow <;> norm_num1
- apply rpow_nonneg_of_nonneg ; norm_num1
- apply rpow_pos_of_pos ; norm_num1
- apply hf' 18 ; norm_num1
+ apply rpow_nonneg_of_nonneg; norm_num1
+ apply rpow_pos_of_pos; norm_num1
+ apply hf' 18; norm_num1
norm_num1
· have : sqrt (2 * 512) = 32 :=
(sqrt_eq_iff_mul_self_eq_of_pos (by norm_num1)).mpr (by norm_num1)
rw [hf, log_nonpos_iff (hf' _ _), this, div_le_one] <;> norm_num1
have : (512 : ℝ) = 2 ^ (9 : ℕ)
- · rw [rpow_nat_cast 2 9] ; norm_num1
+ · rw [rpow_nat_cast 2 9]; norm_num1
conv_lhs => rw [this]
have : (1024 : ℝ) = 2 ^ (10 : ℕ)
- · rw [rpow_nat_cast 2 10] ; norm_num1
+ · rw [rpow_nat_cast 2 10]; norm_num1
rw [this, ← rpow_mul, ← rpow_add] <;> norm_num1
have : (4 : ℝ) = 2 ^ (2 : ℕ)
- · rw [rpow_nat_cast 2 2] ; norm_num1
+ · rw [rpow_nat_cast 2 2]; norm_num1
rw [this, ← rpow_mul] <;> norm_num1
apply rpow_le_rpow_of_exponent_le <;> norm_num1
apply rpow_pos_of_pos four_pos
@@ -215,7 +215,7 @@ theorem exists_prime_lt_and_le_two_mul_eventually (n : ℕ) (n_big : 512 ≤ n)
Nat.four_pow_lt_mul_centralBinom n (le_trans (by norm_num1) n_big)
have H3 : n.centralBinom ≤ (2 * n) ^ sqrt (2 * n) * 4 ^ (2 * n / 3) :=
centralBinom_le_of_no_bertrand_prime n (lt_of_lt_of_le (by norm_num1) n_big) no_prime
- rw [mul_assoc] at H1 ; exact not_le.2 H2 ((mul_le_mul_left' H3 n).trans H1)
+ rw [mul_assoc] at H1; exact not_le.2 H2 ((mul_le_mul_left' H3 n).trans H1)
#align nat.exists_prime_lt_and_le_two_mul_eventually Nat.exists_prime_lt_and_le_two_mul_eventually
/-- Proves that Bertrand's postulate holds over all positive naturals less than n by identifying a
This PR is the result of running
find . -type f -name "*.lean" -exec sed -i -E 's/^( +)\. /\1· /' {} \;
find . -type f -name "*.lean" -exec sed -i -E 'N;s/^( +·)\n +(.*)$/\1 \2/;P;D' {} \;
which firstly replaces .
focusing dots with ·
and secondly removes isolated instances of such dots, unifying them with the following line. A new rule is placed in the style linter to verify this.
@@ -77,7 +77,7 @@ theorem real_main_inequality {x : ℝ} (n_large : (512 : ℝ) ≤ x) :
(Set.Ioi_subset_Ioi (by norm_num)) (convex_Ioi 0.5)
convert ((strictConcaveOn_sqrt_mul_log_Ioi.concaveOn.comp_linearMap
((2 : ℝ) • LinearMap.id))) using 1
- . ext x
+ · ext x
simp only [Set.mem_Ioi, Set.mem_preimage, LinearMap.smul_apply,
LinearMap.id_coe, id_eq, smul_eq_mul]
rw [← mul_lt_mul_left (two_pos)]
@@ -90,7 +90,7 @@ theorem real_main_inequality {x : ℝ} (n_large : (512 : ℝ) ≤ x) :
obtain ⟨x1, x2, h1, h2, h0, h3, h4⟩ := this
exact (h.right_le_of_le_left'' h1 ((h1.trans h2).trans_le h0) h2 h0 (h4.trans h3)).trans h4
refine' ⟨18, 512, by norm_num1, by norm_num1, n_large, _, _⟩
- . have : sqrt (2 * 18) = 6 := (sqrt_eq_iff_mul_self_eq_of_pos (by norm_num1)).mpr (by norm_num1)
+ · have : sqrt (2 * 18) = 6 := (sqrt_eq_iff_mul_self_eq_of_pos (by norm_num1)).mpr (by norm_num1)
rw [hf, log_nonneg_iff, this]
rw [one_le_div] <;> norm_num1
apply le_trans _ (le_mul_of_one_le_left _ _) <;> norm_num1
@@ -99,17 +99,17 @@ theorem real_main_inequality {x : ℝ} (n_large : (512 : ℝ) ≤ x) :
apply rpow_pos_of_pos ; norm_num1
apply hf' 18 ; norm_num1
norm_num1
- . have : sqrt (2 * 512) = 32 :=
+ · have : sqrt (2 * 512) = 32 :=
(sqrt_eq_iff_mul_self_eq_of_pos (by norm_num1)).mpr (by norm_num1)
rw [hf, log_nonpos_iff (hf' _ _), this, div_le_one] <;> norm_num1
have : (512 : ℝ) = 2 ^ (9 : ℕ)
- . rw [rpow_nat_cast 2 9] ; norm_num1
+ · rw [rpow_nat_cast 2 9] ; norm_num1
conv_lhs => rw [this]
have : (1024 : ℝ) = 2 ^ (10 : ℕ)
- . rw [rpow_nat_cast 2 10] ; norm_num1
+ · rw [rpow_nat_cast 2 10] ; norm_num1
rw [this, ← rpow_mul, ← rpow_add] <;> norm_num1
have : (4 : ℝ) = 2 ^ (2 : ℕ)
- . rw [rpow_nat_cast 2 2] ; norm_num1
+ · rw [rpow_nat_cast 2 2] ; norm_num1
rw [this, ← rpow_mul] <;> norm_num1
apply rpow_le_rpow_of_exponent_le <;> norm_num1
apply rpow_pos_of_pos four_pos
∑'
precedence (#5615)
∑
, ∏
and variants).([^a-zA-Zα-ωΑ-Ω'𝓝ℳ₀𝕂ₛ)]) \(([∑∏][^()∑∏]*,[^()∑∏:]*)\) ([⊂⊆=<≤])
replaced by $1 $2 $3
@@ -176,7 +176,7 @@ theorem centralBinom_le_of_no_bertrand_prime (n : ℕ) (n_big : 2 < n)
have n2_pos : 1 ≤ 2 * n := mul_pos (zero_lt_two' ℕ) n_pos
let S := (Finset.range (2 * n / 3 + 1)).filter Nat.Prime
let f x := x ^ n.centralBinom.factorization x
- have : (∏ x : ℕ in S, f x) = ∏ x : ℕ in Finset.range (2 * n / 3 + 1), f x := by
+ have : ∏ x : ℕ in S, f x = ∏ x : ℕ in Finset.range (2 * n / 3 + 1), f x := by
refine' Finset.prod_filter_of_ne fun p _ h => _
contrapose! h; dsimp only
rw [factorization_eq_zero_of_non_prime n.centralBinom h, _root_.pow_zero]
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