/-
Copyright 2025 The Formal Conjectures Authors.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
https://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-/
import FormalConjecturesUtilErdős Problem 304
open Asymptotics Filter
namespace Erdos304
The set of k for which a / b can be expressed as a sum of k distinct unit fractions.
def unitFractionExpressible (a b : ℕ) : Set ℕ :=
{k | ∃ s : Finset ℕ, s.card = k ∧ (∀ n ∈ s, n > 1) ∧ (a / b : ℚ) = ∑ n ∈ s, (n : ℚ)⁻¹}
@[category API, simp, AMS 11]
lemma zero_mem_unitFractionExpressible_iff {a b : ℕ} :
0 ∈ unitFractionExpressible a b ↔ a = 0 ∨ b = 0 := a:ℕb:ℕ⊢ 0 ∈ unitFractionExpressible a b ↔ a = 0 ∨ b = 0
All goals completed! 🐙
@[category API, AMS 11]
lemma unitFractionExpressible_of_zero {a b : ℕ} (h : a = 0 ∨ b = 0) :
unitFractionExpressible a b = {0} := a:ℕb:ℕh:a = 0 ∨ b = 0⊢ unitFractionExpressible a b = {0}
a:ℕb:ℕh:a = 0 ∨ b = 0⊢ True ∧ ∀ x ∈ unitFractionExpressible a b, x = 0
have : (a / b : ℚ) = 0 := a:ℕb:ℕh:a = 0 ∨ b = 0⊢ unitFractionExpressible a b = {0} All goals completed! 🐙
a:ℕb:ℕh:a = 0 ∨ b = 0this:↑a / ↑b = 0 := Eq.mpr (id (Eq.trans div_eq_zero_iff._simp_1 (congr (congrArg Or Nat.cast_eq_zero._simp_1) Nat.cast_eq_zero._simp_1))) h⊢ ∀ (x : ℕ) (x_1 : Finset ℕ), x_1.card = x → (∀ n ∈ x_1, 1 < n) → 0 = ∑ n ∈ x_1, (↑n)⁻¹ → x = 0
a:ℕb:ℕh✝:a = 0 ∨ b = 0this:↑a / ↑b = 0 := Eq.mpr (id (Eq.trans div_eq_zero_iff._simp_1 (congr (congrArg Or Nat.cast_eq_zero._simp_1) Nat.cast_eq_zero._simp_1))) hs:Finset ℕhs:∀ n ∈ s, 1 < nh:0 = ∑ n ∈ s, (↑n)⁻¹⊢ s.card = 0
a:ℕb:ℕh✝:a = 0 ∨ b = 0this:↑a / ↑b = 0 := Eq.mpr (id (Eq.trans div_eq_zero_iff._simp_1 (congr (congrArg Or Nat.cast_eq_zero._simp_1) Nat.cast_eq_zero._simp_1))) hs:Finset ℕhs:∀ n ∈ s, 1 < nh:∀ i ∈ s, (↑i)⁻¹ = 0⊢ s.card = 0
a:ℕb:ℕh✝:a = 0 ∨ b = 0this:↑a / ↑b = 0 := Eq.mpr (id (Eq.trans div_eq_zero_iff._simp_1 (congr (congrArg Or Nat.cast_eq_zero._simp_1) Nat.cast_eq_zero._simp_1))) hs:Finset ℕhs:∀ n ∈ s, 1 < nh:∀ i ∈ s, i = 0⊢ s.card = 0
a:ℕb:ℕh✝:a = 0 ∨ b = 0this:↑a / ↑b = 0 := Eq.mpr (id (Eq.trans div_eq_zero_iff._simp_1 (congr (congrArg Or Nat.cast_eq_zero._simp_1) Nat.cast_eq_zero._simp_1))) hs:Finset ℕhs:∀ n ∈ s, 1 < nh:∀ i ∈ s, i = 0⊢ ∀ (x : ℕ), x ∉ s
intro i a:ℕb:ℕh✝:a = 0 ∨ b = 0this:↑a / ↑b = 0 := Eq.mpr (id (Eq.trans div_eq_zero_iff._simp_1 (congr (congrArg Or Nat.cast_eq_zero._simp_1) Nat.cast_eq_zero._simp_1))) hs:Finset ℕhs:∀ n ∈ s, 1 < nh:∀ i ∈ s, i = 0i:ℕhi:i ∈ s⊢ False
All goals completed! 🐙
@[category API, AMS 11]
lemma unitFractionExpressible_zero_left {b : ℕ} :
unitFractionExpressible 0 b = {0} := unitFractionExpressible_of_zero (b:ℕ⊢ 0 = 0 ∨ b = 0 All goals completed! 🐙)
@[category API, AMS 11]
lemma unitFractionExpressible_zero_right {a : ℕ} :
unitFractionExpressible a 0 = {0} := unitFractionExpressible_of_zero (a:ℕ⊢ a = 0 ∨ 0 = 0 All goals completed! 🐙)
@[category API, AMS 11]
lemma zero_notMem_unitFractionExpressible {a b : ℕ} :
0 ∉ unitFractionExpressible a b ↔ a ≠ 0 ∧ b ≠ 0 := a:ℕb:ℕ⊢ 0 ∉ unitFractionExpressible a b ↔ a ≠ 0 ∧ b ≠ 0
All goals completed! 🐙
@[category API, AMS 11]
lemma eq_inv_of_one_mem_unitFractionExpressible {a b : ℕ}
(h : 1 ∈ unitFractionExpressible a b) : ∃ m : ℕ, 1 < m ∧ (a / b : ℚ) = (m : ℚ)⁻¹ := a:ℕb:ℕh:1 ∈ unitFractionExpressible a b⊢ ∃ m, 1 < m ∧ ↑a / ↑b = (↑m)⁻¹
a:ℕb:ℕh:∃ s, (∃ a, s = {a}) ∧ (∀ n ∈ s, 1 < n) ∧ ↑a / ↑b = ∑ n ∈ s, (↑n)⁻¹⊢ ∃ m, 1 < m ∧ ↑a / ↑b = (↑m)⁻¹
a:ℕb:ℕm:ℕh₁:∀ n ∈ {m}, 1 < nh₂:↑a / ↑b = ∑ n ∈ {m}, (↑n)⁻¹⊢ ∃ m, 1 < m ∧ ↑a / ↑b = (↑m)⁻¹
a:ℕb:ℕm:ℕh₁:1 < mh₂:↑a / ↑b = (↑m)⁻¹⊢ ∃ m, 1 < m ∧ ↑a / ↑b = (↑m)⁻¹
All goals completed! 🐙
@[category API, AMS 11]
lemma dvd_of_one_mem_unitFractionExpressible {a b : ℕ}
(h : 1 ∈ unitFractionExpressible a b) : a ∣ b := a:ℕb:ℕh:1 ∈ unitFractionExpressible a b⊢ a ∣ b
a:ℕb:ℕh:1 ∈ unitFractionExpressible a bm:ℕhm₁:1 < mhm:↑a / ↑b = (↑m)⁻¹⊢ a ∣ b
have : b ≠ 0 := a:ℕb:ℕh:1 ∈ unitFractionExpressible a b⊢ a ∣ b
a:ℕm:ℕhm₁:1 < mh:1 ∈ unitFractionExpressible a 0hm:↑a / ↑0 = (↑m)⁻¹⊢ False
a:ℕm:ℕhm₁:1 < mh:1 ∈ unitFractionExpressible a 0hm:m = 0⊢ False
All goals completed! 🐙
a:ℕb:ℕh:1 ∈ unitFractionExpressible a bm:ℕhm₁:1 < mhm:↑a / ↑b = (↑m)⁻¹this:b ≠ 0 :=
fun a_1 =>
Eq.ndrec (motive := fun {b} => 1 ∈ unitFractionExpressible a b → ↑a / ↑b = (↑m)⁻¹ → False)
(fun h hm =>
dvd_of_one_mem_unitFractionExpressible._proof_1 m hm₁
(Eq.mp
(Eq.trans
(Eq.trans
(congrArg (fun x => x = (↑m)⁻¹)
(Eq.trans (congrArg (HDiv.hDiv ↑a) (CharP.cast_eq_zero ℚ 0)) (div_zero ↑a)))
dvd_of_one_mem_unitFractionExpressible._simp_1)
(Eq.trans inv_eq_zero._simp_1 Nat.cast_eq_zero._simp_1))
hm))
(Eq.symm a_1) h hm⊢ b = a * m
a:ℕb:ℕh:1 ∈ unitFractionExpressible a bm:ℕhm₁:1 < mthis:b ≠ 0 :=
fun a_1 =>
Eq.ndrec (motive := fun {b} => 1 ∈ unitFractionExpressible a b → ↑a / ↑b = (↑m)⁻¹ → False)
(fun h hm =>
dvd_of_one_mem_unitFractionExpressible._proof_1 m hm₁
(Eq.mp
(Eq.trans
(Eq.trans
(congrArg (fun x => x = (↑m)⁻¹)
(Eq.trans (congrArg (HDiv.hDiv ↑a) (CharP.cast_eq_zero ℚ 0)) (div_zero ↑a)))
dvd_of_one_mem_unitFractionExpressible._simp_1)
(Eq.trans inv_eq_zero._simp_1 Nat.cast_eq_zero._simp_1))
hm))
(Eq.symm a_1) h hmhm:↑a * ↑m = ↑b⊢ b = a * m
All goals completed! 🐙
Let $$N(a, b)$$, denoted here by smallestCollection a b be the minimal k such that there
exist integers $1 < n_1 < n_2 < \dots < n_k$ with
$$\frac{a}{b} = \sum_{i=1}^k \frac{1}{n_i}$$
noncomputable def smallestCollection (a b : ℕ) : ℕ := sInf (unitFractionExpressible a b)
-- in fact `(unitFractionExpressible a b).Nonempty` should always be true, but we do not prove it
-- for now
@[category API, AMS 11]
lemma smallestCollection_pos {a b : ℕ} (ha : a ≠ 0) (hb : b ≠ 0)
(h : (unitFractionExpressible a b).Nonempty) :
0 < smallestCollection a b := a:ℕb:ℕha:a ≠ 0hb:b ≠ 0h:(unitFractionExpressible a b).Nonempty⊢ 0 < smallestCollection a b
suffices smallestCollection a b ≠ 0 a:ℕb:ℕha:a ≠ 0hb:b ≠ 0h:(unitFractionExpressible a b).Nonemptythis:smallestCollection a b ≠ 0 := ?m.16⊢ 0 < smallestCollection a b All goals completed! 🐙
a:ℕb:ℕha:a ≠ 0hb:b ≠ 0h:(unitFractionExpressible a b).Nonemptyh':smallestCollection a b = 0⊢ False
a:ℕb:ℕha:a ≠ 0hb:b ≠ 0h:(unitFractionExpressible a b).Nonemptyh':smallestCollection a b = 0this:0 ∈ unitFractionExpressible a b := h' ▸ Nat.sInf_mem h⊢ False
All goals completed! 🐙
@[category API, AMS 11]
lemma smallestCollection_left_one (b : ℕ) (hb : 1 < b) : smallestCollection 1 b = 1 := b:ℕhb:1 < b⊢ smallestCollection 1 b = 1
have : 1 ∈ unitFractionExpressible 1 b := ⟨{b}, b:ℕhb:1 < b⊢ {b}.card = 1 ∧ (∀ n ∈ {b}, n > 1) ∧ ↑1 / ↑b = ∑ n ∈ {b}, (↑n)⁻¹ All goals completed! 🐙⟩
b:ℕhb:1 < bthis✝:1 ∈ unitFractionExpressible 1 b :=
Exists.intro {b}
(Eq.mpr
(id
(Eq.trans
(congr (congrArg And (Eq.trans (congrArg (fun x => x = 1) (Finset.card_singleton b)) (eq_self 1)))
(Eq.trans
(congr
(congrArg And
(Eq.trans (forall_congr fun n => implies_congr Finset.mem_singleton._simp_1 gt_iff_lt._simp_1)
forall_eq._simp_1))
(Eq.trans
(congr (congrArg Eq (Eq.trans (congrArg (fun x => x / ↑b) Nat.cast_one) (one_div ↑b)))
(Finset.sum_singleton (fun x => (↑x)⁻¹) b))
(eq_self (↑b)⁻¹)))
(and_true (1 < b))))
(true_and (1 < b))))
hb)this:smallestCollection 1 b ≤ 1 := Nat.sInf_le this✝⊢ smallestCollection 1 b = 1
have : 0 ∉ unitFractionExpressible 1 b := b:ℕhb:1 < b⊢ smallestCollection 1 b = 1 b:ℕhb:1 < bthis✝:1 ∈ unitFractionExpressible 1 b :=
Exists.intro {b}
(Eq.mpr
(id
(Eq.trans
(congr (congrArg And (Eq.trans (congrArg (fun x => x = 1) (Finset.card_singleton b)) (eq_self 1)))
(Eq.trans
(congr
(congrArg And
(Eq.trans (forall_congr fun n => implies_congr Finset.mem_singleton._simp_1 gt_iff_lt._simp_1)
forall_eq._simp_1))
(Eq.trans
(congr (congrArg Eq (Eq.trans (congrArg (fun x => x / ↑b) Nat.cast_one) (one_div ↑b)))
(Finset.sum_singleton (fun x => (↑x)⁻¹) b))
(eq_self (↑b)⁻¹)))
(and_true (1 < b))))
(true_and (1 < b))))
hb)this:smallestCollection 1 b ≤ 1 := Nat.sInf_le this✝⊢ ¬b = 0; All goals completed! 🐙
b:ℕhb:1 < bthis✝²:1 ∈ unitFractionExpressible 1 b :=
Exists.intro {b}
(Eq.mpr
(id
(Eq.trans
(congr (congrArg And (Eq.trans (congrArg (fun x => x = 1) (Finset.card_singleton b)) (eq_self 1)))
(Eq.trans
(congr
(congrArg And
(Eq.trans (forall_congr fun n => implies_congr Finset.mem_singleton._simp_1 gt_iff_lt._simp_1)
forall_eq._simp_1))
(Eq.trans
(congr (congrArg Eq (Eq.trans (congrArg (fun x => x / ↑b) Nat.cast_one) (one_div ↑b)))
(Finset.sum_singleton (fun x => (↑x)⁻¹) b))
(eq_self (↑b)⁻¹)))
(and_true (1 < b))))
(true_and (1 < b))))
hb)this✝¹:smallestCollection 1 b ≤ 1 := Nat.sInf_le this✝this✝:0 ∉ unitFractionExpressible 1 b :=
Eq.mpr
(id
(congrArg Not
(Eq.trans zero_mem_unitFractionExpressible_iff._simp_1
(Eq.trans (congrArg (fun x => x ∨ b = 0) one_ne_zero._simp_1) (false_or (b = 0))))))
fun a => dvd_of_one_mem_unitFractionExpressible._proof_1 b hb athis:smallestCollection 1 b ≠ 0 := ne_of_mem_of_not_mem (Nat.sInf_mem (Exists.intro 1 this✝²)) this✝⊢ smallestCollection 1 b = 1
All goals completed! 🐙
@[category API, AMS 11]
lemma eq_one_of_smallestCollection_eq_one {a b : ℕ}
(h : smallestCollection a b = 1) : ∃ m : ℕ, 1 < m ∧ (a / b : ℚ) = (m : ℚ)⁻¹ := a:ℕb:ℕh:smallestCollection a b = 1⊢ ∃ m, 1 < m ∧ ↑a / ↑b = (↑m)⁻¹
a:ℕb:ℕh:smallestCollection a b = 1this:1 ∈ unitFractionExpressible a b := h ▸ Nat.sInf_mem (Nat.nonempty_of_sInf_eq_succ h)⊢ ∃ m, 1 < m ∧ ↑a / ↑b = (↑m)⁻¹
All goals completed! 🐙
@[category API, AMS 11]
lemma dvd_of_smallestCollection_eq_one {a b : ℕ}
(h : smallestCollection a b = 1) : a ∣ b := a:ℕb:ℕh:smallestCollection a b = 1⊢ a ∣ b
a:ℕb:ℕh:smallestCollection a b = 1this:1 ∈ unitFractionExpressible a b := h ▸ Nat.sInf_mem (Nat.nonempty_of_sInf_eq_succ h)⊢ a ∣ b
All goals completed! 🐙
@[category test, AMS 11]
lemma smallestCollection_two_fifteen : smallestCollection 2 15 = 2 := ⊢ smallestCollection 2 15 = 2
have h : 2 ∈ unitFractionExpressible 2 15 := ⊢ smallestCollection 2 15 = 2
⊢ {10, 30}.card = 2 ∧ (∀ n ∈ {10, 30}, n > 1) ∧ ↑2 / ↑15 = ∑ n ∈ {10, 30}, (↑n)⁻¹
All goals completed! 🐙
h:2 ∈ unitFractionExpressible 2 15 :=
Exists.intro {10, 30}
(of_eq_true
(Eq.trans
(Eq.trans
(congr
(congrArg And
(Eq.trans
(Eq.trans
(congrArg (fun x => x = 2)
(Eq.trans
(Finset.card_insert_of_notMem
(of_eq_true
(Eq.trans
(Eq.trans
(congrArg Not
(Eq.trans
(Eq.trans
(congrArg (Membership.mem {30})
(Mathlib.Meta.NormNum.IsNat.to_eq (Mathlib.Meta.NormNum.isNat_ofNat ℕ (Eq.refl 10))
(Eq.refl 10)))
Finset.mem_singleton._simp_1)
(eq_false
(Mathlib.Meta.NormNum.isNat_eq_false (Mathlib.Meta.NormNum.isNat_ofNat ℕ (Eq.refl 10))
(Mathlib.Meta.NormNum.isNat_ofNat ℕ (Eq.refl 30)) (Eq.refl false)))))
not_false_eq_true)
(eq_true True.intro))))
(Eq.trans (congrArg (fun x => x + 1) (Finset.card_singleton 30))
(Mathlib.Meta.NormNum.IsNat.to_eq
(Mathlib.Meta.NormNum.isNat_add (Eq.refl HAdd.hAdd)
(Mathlib.Meta.NormNum.isNat_ofNat ℕ (Eq.refl 1))
(Mathlib.Meta.NormNum.isNat_ofNat ℕ (Eq.refl 1)) (Eq.refl 2))
(Eq.refl 2)))))
(eq_self 2))
(eq_true True.intro)))
(Eq.trans
(Eq.trans
(congr
(congrArg And
(Eq.trans
(Eq.trans
(forall_congr fun n =>
implies_congr
(Eq.trans Finset.mem_insert._simp_1 (congrArg (Or (n = 10)) Finset.mem_singleton._simp_1))
gt_iff_lt._simp_1)
forall_eq_or_imp._simp_1)
(Eq.trans
(Eq.trans
(congr
(congrArg And
(eq_true
(Mathlib.Meta.NormNum.isNat_lt_true (Mathlib.Meta.NormNum.isNat_ofNat ℕ (Eq.refl 1))
(Mathlib.Meta.NormNum.isNat_ofNat ℕ (Eq.refl 10)) (Eq.refl false))))
(Eq.trans forall_eq._simp_1
(eq_true
(Mathlib.Meta.NormNum.isNat_lt_true (Mathlib.Meta.NormNum.isNat_ofNat ℕ (Eq.refl 1))
(Mathlib.Meta.NormNum.isNat_ofNat ℕ (Eq.refl 30)) (Eq.refl false)))))
(and_self True))
(eq_true True.intro))))
(Eq.trans
(Eq.trans
(congr
(congrArg Eq
(Mathlib.Meta.NormNum.IsNNRat.to_eq
(Mathlib.Meta.NormNum.isNNRat_div
(Mathlib.Meta.NormNum.isNNRat_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsNat.to_isNNRat
(Mathlib.Meta.NormNum.isNat_natCast 2 2
(Mathlib.Meta.NormNum.isNat_ofNat ℕ (Eq.refl 2))))
(Mathlib.Meta.NormNum.isNNRat_inv_pos
(Mathlib.Meta.NormNum.IsNat.to_isNNRat
(Mathlib.Meta.NormNum.isNat_natCast 15 15
(Mathlib.Meta.NormNum.isNat_ofNat ℕ (Eq.refl 15)))))
(Eq.refl (Nat.mul 2 1)) (Eq.refl 15)))
(Eq.refl 2) (Eq.refl 15)))
(Eq.trans
(Finset.sum_insert
(of_eq_true
(Eq.trans
(Eq.trans
(congrArg Not
(Eq.trans
(Eq.trans
(congrArg (Membership.mem {30})
(Mathlib.Meta.NormNum.IsNat.to_eq
(Mathlib.Meta.NormNum.isNat_ofNat ℕ (Eq.refl 10)) (Eq.refl 10)))
Finset.mem_singleton._simp_1)
(eq_false
(Mathlib.Meta.NormNum.isNat_eq_false
(Mathlib.Meta.NormNum.isNat_ofNat ℕ (Eq.refl 10))
(Mathlib.Meta.NormNum.isNat_ofNat ℕ (Eq.refl 30)) (Eq.refl false)))))
not_false_eq_true)
(eq_true True.intro))))
(Eq.trans
(congr
(congrArg HAdd.hAdd
(Mathlib.Meta.NormNum.IsNNRat.to_eq
(Mathlib.Meta.NormNum.isNNRat_inv_pos
(Mathlib.Meta.NormNum.IsNat.to_isNNRat
(Mathlib.Meta.NormNum.isNat_natCast 10 10
(Mathlib.Meta.NormNum.isNat_ofNat ℕ (Eq.refl 10)))))
(Eq.refl 1) (Eq.refl 10)))
(Eq.trans (Finset.sum_singleton (fun x => (↑x)⁻¹) 30)
(Mathlib.Meta.NormNum.IsNNRat.to_eq
(Mathlib.Meta.NormNum.isNNRat_inv_pos
(Mathlib.Meta.NormNum.IsNat.to_isNNRat
(Mathlib.Meta.NormNum.isNat_natCast 30 30
(Mathlib.Meta.NormNum.isNat_ofNat ℕ (Eq.refl 30)))))
(Eq.refl 1) (Eq.refl 30))))
(Mathlib.Meta.NormNum.IsNNRat.to_eq
(Mathlib.Meta.NormNum.isNNRat_add (Eq.refl HAdd.hAdd)
(Mathlib.Meta.NormNum.isNNRat_div
(Mathlib.Meta.NormNum.isNNRat_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsNat.to_isNNRat
(Mathlib.Meta.NormNum.isNat_ofNat ℚ (Eq.refl 1)))
(Mathlib.Meta.NormNum.isNNRat_inv_pos
(Mathlib.Meta.NormNum.IsNat.to_isNNRat
(Mathlib.Meta.NormNum.isNat_ofNat ℚ (Eq.refl 10))))
(Eq.refl (Nat.mul 1 1)) (Eq.refl 10)))
(Mathlib.Meta.NormNum.isNNRat_div
(Mathlib.Meta.NormNum.isNNRat_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsNat.to_isNNRat
(Mathlib.Meta.NormNum.isNat_ofNat ℚ (Eq.refl 1)))
(Mathlib.Meta.NormNum.isNNRat_inv_pos
(Mathlib.Meta.NormNum.IsNat.to_isNNRat
(Mathlib.Meta.NormNum.isNat_ofNat ℚ (Eq.refl 30))))
(Eq.refl (Nat.mul 1 1)) (Eq.refl 30)))
(Eq.refl 40) (Eq.refl 300))
(Eq.refl 2) (Eq.refl 15)))))
(eq_self (2 / 15)))
(eq_true True.intro)))
(and_self True))
(eq_true True.intro)))
(and_self True))
(eq_true True.intro)))this:smallestCollection 2 15 ≤ 2 := Nat.sInf_le h⊢ smallestCollection 2 15 = 2
have : 0 < smallestCollection 2 15 := smallestCollection_pos (h:2 ∈ unitFractionExpressible 2 15 :=
Exists.intro {10, 30}
(of_eq_true
(Eq.trans
(Eq.trans
(congr
(congrArg And
(Eq.trans
(Eq.trans
(congrArg (fun x => x = 2)
(Eq.trans
(Finset.card_insert_of_notMem
(of_eq_true
(Eq.trans
(Eq.trans
(congrArg Not
(Eq.trans
(Eq.trans
(congrArg (Membership.mem {30})
(Mathlib.Meta.NormNum.IsNat.to_eq (Mathlib.Meta.NormNum.isNat_ofNat ℕ (Eq.refl 10))
(Eq.refl 10)))
Finset.mem_singleton._simp_1)
(eq_false
(Mathlib.Meta.NormNum.isNat_eq_false (Mathlib.Meta.NormNum.isNat_ofNat ℕ (Eq.refl 10))
(Mathlib.Meta.NormNum.isNat_ofNat ℕ (Eq.refl 30)) (Eq.refl false)))))
not_false_eq_true)
(eq_true True.intro))))
(Eq.trans (congrArg (fun x => x + 1) (Finset.card_singleton 30))
(Mathlib.Meta.NormNum.IsNat.to_eq
(Mathlib.Meta.NormNum.isNat_add (Eq.refl HAdd.hAdd)
(Mathlib.Meta.NormNum.isNat_ofNat ℕ (Eq.refl 1))
(Mathlib.Meta.NormNum.isNat_ofNat ℕ (Eq.refl 1)) (Eq.refl 2))
(Eq.refl 2)))))
(eq_self 2))
(eq_true True.intro)))
(Eq.trans
(Eq.trans
(congr
(congrArg And
(Eq.trans
(Eq.trans
(forall_congr fun n =>
implies_congr
(Eq.trans Finset.mem_insert._simp_1 (congrArg (Or (n = 10)) Finset.mem_singleton._simp_1))
gt_iff_lt._simp_1)
forall_eq_or_imp._simp_1)
(Eq.trans
(Eq.trans
(congr
(congrArg And
(eq_true
(Mathlib.Meta.NormNum.isNat_lt_true (Mathlib.Meta.NormNum.isNat_ofNat ℕ (Eq.refl 1))
(Mathlib.Meta.NormNum.isNat_ofNat ℕ (Eq.refl 10)) (Eq.refl false))))
(Eq.trans forall_eq._simp_1
(eq_true
(Mathlib.Meta.NormNum.isNat_lt_true (Mathlib.Meta.NormNum.isNat_ofNat ℕ (Eq.refl 1))
(Mathlib.Meta.NormNum.isNat_ofNat ℕ (Eq.refl 30)) (Eq.refl false)))))
(and_self True))
(eq_true True.intro))))
(Eq.trans
(Eq.trans
(congr
(congrArg Eq
(Mathlib.Meta.NormNum.IsNNRat.to_eq
(Mathlib.Meta.NormNum.isNNRat_div
(Mathlib.Meta.NormNum.isNNRat_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsNat.to_isNNRat
(Mathlib.Meta.NormNum.isNat_natCast 2 2
(Mathlib.Meta.NormNum.isNat_ofNat ℕ (Eq.refl 2))))
(Mathlib.Meta.NormNum.isNNRat_inv_pos
(Mathlib.Meta.NormNum.IsNat.to_isNNRat
(Mathlib.Meta.NormNum.isNat_natCast 15 15
(Mathlib.Meta.NormNum.isNat_ofNat ℕ (Eq.refl 15)))))
(Eq.refl (Nat.mul 2 1)) (Eq.refl 15)))
(Eq.refl 2) (Eq.refl 15)))
(Eq.trans
(Finset.sum_insert
(of_eq_true
(Eq.trans
(Eq.trans
(congrArg Not
(Eq.trans
(Eq.trans
(congrArg (Membership.mem {30})
(Mathlib.Meta.NormNum.IsNat.to_eq
(Mathlib.Meta.NormNum.isNat_ofNat ℕ (Eq.refl 10)) (Eq.refl 10)))
Finset.mem_singleton._simp_1)
(eq_false
(Mathlib.Meta.NormNum.isNat_eq_false
(Mathlib.Meta.NormNum.isNat_ofNat ℕ (Eq.refl 10))
(Mathlib.Meta.NormNum.isNat_ofNat ℕ (Eq.refl 30)) (Eq.refl false)))))
not_false_eq_true)
(eq_true True.intro))))
(Eq.trans
(congr
(congrArg HAdd.hAdd
(Mathlib.Meta.NormNum.IsNNRat.to_eq
(Mathlib.Meta.NormNum.isNNRat_inv_pos
(Mathlib.Meta.NormNum.IsNat.to_isNNRat
(Mathlib.Meta.NormNum.isNat_natCast 10 10
(Mathlib.Meta.NormNum.isNat_ofNat ℕ (Eq.refl 10)))))
(Eq.refl 1) (Eq.refl 10)))
(Eq.trans (Finset.sum_singleton (fun x => (↑x)⁻¹) 30)
(Mathlib.Meta.NormNum.IsNNRat.to_eq
(Mathlib.Meta.NormNum.isNNRat_inv_pos
(Mathlib.Meta.NormNum.IsNat.to_isNNRat
(Mathlib.Meta.NormNum.isNat_natCast 30 30
(Mathlib.Meta.NormNum.isNat_ofNat ℕ (Eq.refl 30)))))
(Eq.refl 1) (Eq.refl 30))))
(Mathlib.Meta.NormNum.IsNNRat.to_eq
(Mathlib.Meta.NormNum.isNNRat_add (Eq.refl HAdd.hAdd)
(Mathlib.Meta.NormNum.isNNRat_div
(Mathlib.Meta.NormNum.isNNRat_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsNat.to_isNNRat
(Mathlib.Meta.NormNum.isNat_ofNat ℚ (Eq.refl 1)))
(Mathlib.Meta.NormNum.isNNRat_inv_pos
(Mathlib.Meta.NormNum.IsNat.to_isNNRat
(Mathlib.Meta.NormNum.isNat_ofNat ℚ (Eq.refl 10))))
(Eq.refl (Nat.mul 1 1)) (Eq.refl 10)))
(Mathlib.Meta.NormNum.isNNRat_div
(Mathlib.Meta.NormNum.isNNRat_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsNat.to_isNNRat
(Mathlib.Meta.NormNum.isNat_ofNat ℚ (Eq.refl 1)))
(Mathlib.Meta.NormNum.isNNRat_inv_pos
(Mathlib.Meta.NormNum.IsNat.to_isNNRat
(Mathlib.Meta.NormNum.isNat_ofNat ℚ (Eq.refl 30))))
(Eq.refl (Nat.mul 1 1)) (Eq.refl 30)))
(Eq.refl 40) (Eq.refl 300))
(Eq.refl 2) (Eq.refl 15)))))
(eq_self (2 / 15)))
(eq_true True.intro)))
(and_self True))
(eq_true True.intro)))
(and_self True))
(eq_true True.intro)))this:smallestCollection 2 15 ≤ 2 := Nat.sInf_le h⊢ 2 ≠ 0 All goals completed! 🐙) (h:2 ∈ unitFractionExpressible 2 15 :=
Exists.intro {10, 30}
(of_eq_true
(Eq.trans
(Eq.trans
(congr
(congrArg And
(Eq.trans
(Eq.trans
(congrArg (fun x => x = 2)
(Eq.trans
(Finset.card_insert_of_notMem
(of_eq_true
(Eq.trans
(Eq.trans
(congrArg Not
(Eq.trans
(Eq.trans
(congrArg (Membership.mem {30})
(Mathlib.Meta.NormNum.IsNat.to_eq (Mathlib.Meta.NormNum.isNat_ofNat ℕ (Eq.refl 10))
(Eq.refl 10)))
Finset.mem_singleton._simp_1)
(eq_false
(Mathlib.Meta.NormNum.isNat_eq_false (Mathlib.Meta.NormNum.isNat_ofNat ℕ (Eq.refl 10))
(Mathlib.Meta.NormNum.isNat_ofNat ℕ (Eq.refl 30)) (Eq.refl false)))))
not_false_eq_true)
(eq_true True.intro))))
(Eq.trans (congrArg (fun x => x + 1) (Finset.card_singleton 30))
(Mathlib.Meta.NormNum.IsNat.to_eq
(Mathlib.Meta.NormNum.isNat_add (Eq.refl HAdd.hAdd)
(Mathlib.Meta.NormNum.isNat_ofNat ℕ (Eq.refl 1))
(Mathlib.Meta.NormNum.isNat_ofNat ℕ (Eq.refl 1)) (Eq.refl 2))
(Eq.refl 2)))))
(eq_self 2))
(eq_true True.intro)))
(Eq.trans
(Eq.trans
(congr
(congrArg And
(Eq.trans
(Eq.trans
(forall_congr fun n =>
implies_congr
(Eq.trans Finset.mem_insert._simp_1 (congrArg (Or (n = 10)) Finset.mem_singleton._simp_1))
gt_iff_lt._simp_1)
forall_eq_or_imp._simp_1)
(Eq.trans
(Eq.trans
(congr
(congrArg And
(eq_true
(Mathlib.Meta.NormNum.isNat_lt_true (Mathlib.Meta.NormNum.isNat_ofNat ℕ (Eq.refl 1))
(Mathlib.Meta.NormNum.isNat_ofNat ℕ (Eq.refl 10)) (Eq.refl false))))
(Eq.trans forall_eq._simp_1
(eq_true
(Mathlib.Meta.NormNum.isNat_lt_true (Mathlib.Meta.NormNum.isNat_ofNat ℕ (Eq.refl 1))
(Mathlib.Meta.NormNum.isNat_ofNat ℕ (Eq.refl 30)) (Eq.refl false)))))
(and_self True))
(eq_true True.intro))))
(Eq.trans
(Eq.trans
(congr
(congrArg Eq
(Mathlib.Meta.NormNum.IsNNRat.to_eq
(Mathlib.Meta.NormNum.isNNRat_div
(Mathlib.Meta.NormNum.isNNRat_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsNat.to_isNNRat
(Mathlib.Meta.NormNum.isNat_natCast 2 2
(Mathlib.Meta.NormNum.isNat_ofNat ℕ (Eq.refl 2))))
(Mathlib.Meta.NormNum.isNNRat_inv_pos
(Mathlib.Meta.NormNum.IsNat.to_isNNRat
(Mathlib.Meta.NormNum.isNat_natCast 15 15
(Mathlib.Meta.NormNum.isNat_ofNat ℕ (Eq.refl 15)))))
(Eq.refl (Nat.mul 2 1)) (Eq.refl 15)))
(Eq.refl 2) (Eq.refl 15)))
(Eq.trans
(Finset.sum_insert
(of_eq_true
(Eq.trans
(Eq.trans
(congrArg Not
(Eq.trans
(Eq.trans
(congrArg (Membership.mem {30})
(Mathlib.Meta.NormNum.IsNat.to_eq
(Mathlib.Meta.NormNum.isNat_ofNat ℕ (Eq.refl 10)) (Eq.refl 10)))
Finset.mem_singleton._simp_1)
(eq_false
(Mathlib.Meta.NormNum.isNat_eq_false
(Mathlib.Meta.NormNum.isNat_ofNat ℕ (Eq.refl 10))
(Mathlib.Meta.NormNum.isNat_ofNat ℕ (Eq.refl 30)) (Eq.refl false)))))
not_false_eq_true)
(eq_true True.intro))))
(Eq.trans
(congr
(congrArg HAdd.hAdd
(Mathlib.Meta.NormNum.IsNNRat.to_eq
(Mathlib.Meta.NormNum.isNNRat_inv_pos
(Mathlib.Meta.NormNum.IsNat.to_isNNRat
(Mathlib.Meta.NormNum.isNat_natCast 10 10
(Mathlib.Meta.NormNum.isNat_ofNat ℕ (Eq.refl 10)))))
(Eq.refl 1) (Eq.refl 10)))
(Eq.trans (Finset.sum_singleton (fun x => (↑x)⁻¹) 30)
(Mathlib.Meta.NormNum.IsNNRat.to_eq
(Mathlib.Meta.NormNum.isNNRat_inv_pos
(Mathlib.Meta.NormNum.IsNat.to_isNNRat
(Mathlib.Meta.NormNum.isNat_natCast 30 30
(Mathlib.Meta.NormNum.isNat_ofNat ℕ (Eq.refl 30)))))
(Eq.refl 1) (Eq.refl 30))))
(Mathlib.Meta.NormNum.IsNNRat.to_eq
(Mathlib.Meta.NormNum.isNNRat_add (Eq.refl HAdd.hAdd)
(Mathlib.Meta.NormNum.isNNRat_div
(Mathlib.Meta.NormNum.isNNRat_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsNat.to_isNNRat
(Mathlib.Meta.NormNum.isNat_ofNat ℚ (Eq.refl 1)))
(Mathlib.Meta.NormNum.isNNRat_inv_pos
(Mathlib.Meta.NormNum.IsNat.to_isNNRat
(Mathlib.Meta.NormNum.isNat_ofNat ℚ (Eq.refl 10))))
(Eq.refl (Nat.mul 1 1)) (Eq.refl 10)))
(Mathlib.Meta.NormNum.isNNRat_div
(Mathlib.Meta.NormNum.isNNRat_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsNat.to_isNNRat
(Mathlib.Meta.NormNum.isNat_ofNat ℚ (Eq.refl 1)))
(Mathlib.Meta.NormNum.isNNRat_inv_pos
(Mathlib.Meta.NormNum.IsNat.to_isNNRat
(Mathlib.Meta.NormNum.isNat_ofNat ℚ (Eq.refl 30))))
(Eq.refl (Nat.mul 1 1)) (Eq.refl 30)))
(Eq.refl 40) (Eq.refl 300))
(Eq.refl 2) (Eq.refl 15)))))
(eq_self (2 / 15)))
(eq_true True.intro)))
(and_self True))
(eq_true True.intro)))
(and_self True))
(eq_true True.intro)))this:smallestCollection 2 15 ≤ 2 := Nat.sInf_le h⊢ 15 ≠ 0 All goals completed! 🐙) ⟨_, h⟩
have : smallestCollection 2 15 ≠ 1 := ⊢ smallestCollection 2 15 = 2
h:2 ∈ unitFractionExpressible 2 15 :=
Exists.intro {10, 30}
(of_eq_true
(Eq.trans
(Eq.trans
(congr
(congrArg And
(Eq.trans
(Eq.trans
(congrArg (fun x => x = 2)
(Eq.trans
(Finset.card_insert_of_notMem
(of_eq_true
(Eq.trans
(Eq.trans
(congrArg Not
(Eq.trans
(Eq.trans
(congrArg (Membership.mem {30})
(Mathlib.Meta.NormNum.IsNat.to_eq (Mathlib.Meta.NormNum.isNat_ofNat ℕ (Eq.refl 10))
(Eq.refl 10)))
Finset.mem_singleton._simp_1)
(eq_false
(Mathlib.Meta.NormNum.isNat_eq_false (Mathlib.Meta.NormNum.isNat_ofNat ℕ (Eq.refl 10))
(Mathlib.Meta.NormNum.isNat_ofNat ℕ (Eq.refl 30)) (Eq.refl false)))))
not_false_eq_true)
(eq_true True.intro))))
(Eq.trans (congrArg (fun x => x + 1) (Finset.card_singleton 30))
(Mathlib.Meta.NormNum.IsNat.to_eq
(Mathlib.Meta.NormNum.isNat_add (Eq.refl HAdd.hAdd)
(Mathlib.Meta.NormNum.isNat_ofNat ℕ (Eq.refl 1))
(Mathlib.Meta.NormNum.isNat_ofNat ℕ (Eq.refl 1)) (Eq.refl 2))
(Eq.refl 2)))))
(eq_self 2))
(eq_true True.intro)))
(Eq.trans
(Eq.trans
(congr
(congrArg And
(Eq.trans
(Eq.trans
(forall_congr fun n =>
implies_congr
(Eq.trans Finset.mem_insert._simp_1 (congrArg (Or (n = 10)) Finset.mem_singleton._simp_1))
gt_iff_lt._simp_1)
forall_eq_or_imp._simp_1)
(Eq.trans
(Eq.trans
(congr
(congrArg And
(eq_true
(Mathlib.Meta.NormNum.isNat_lt_true (Mathlib.Meta.NormNum.isNat_ofNat ℕ (Eq.refl 1))
(Mathlib.Meta.NormNum.isNat_ofNat ℕ (Eq.refl 10)) (Eq.refl false))))
(Eq.trans forall_eq._simp_1
(eq_true
(Mathlib.Meta.NormNum.isNat_lt_true (Mathlib.Meta.NormNum.isNat_ofNat ℕ (Eq.refl 1))
(Mathlib.Meta.NormNum.isNat_ofNat ℕ (Eq.refl 30)) (Eq.refl false)))))
(and_self True))
(eq_true True.intro))))
(Eq.trans
(Eq.trans
(congr
(congrArg Eq
(Mathlib.Meta.NormNum.IsNNRat.to_eq
(Mathlib.Meta.NormNum.isNNRat_div
(Mathlib.Meta.NormNum.isNNRat_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsNat.to_isNNRat
(Mathlib.Meta.NormNum.isNat_natCast 2 2
(Mathlib.Meta.NormNum.isNat_ofNat ℕ (Eq.refl 2))))
(Mathlib.Meta.NormNum.isNNRat_inv_pos
(Mathlib.Meta.NormNum.IsNat.to_isNNRat
(Mathlib.Meta.NormNum.isNat_natCast 15 15
(Mathlib.Meta.NormNum.isNat_ofNat ℕ (Eq.refl 15)))))
(Eq.refl (Nat.mul 2 1)) (Eq.refl 15)))
(Eq.refl 2) (Eq.refl 15)))
(Eq.trans
(Finset.sum_insert
(of_eq_true
(Eq.trans
(Eq.trans
(congrArg Not
(Eq.trans
(Eq.trans
(congrArg (Membership.mem {30})
(Mathlib.Meta.NormNum.IsNat.to_eq
(Mathlib.Meta.NormNum.isNat_ofNat ℕ (Eq.refl 10)) (Eq.refl 10)))
Finset.mem_singleton._simp_1)
(eq_false
(Mathlib.Meta.NormNum.isNat_eq_false
(Mathlib.Meta.NormNum.isNat_ofNat ℕ (Eq.refl 10))
(Mathlib.Meta.NormNum.isNat_ofNat ℕ (Eq.refl 30)) (Eq.refl false)))))
not_false_eq_true)
(eq_true True.intro))))
(Eq.trans
(congr
(congrArg HAdd.hAdd
(Mathlib.Meta.NormNum.IsNNRat.to_eq
(Mathlib.Meta.NormNum.isNNRat_inv_pos
(Mathlib.Meta.NormNum.IsNat.to_isNNRat
(Mathlib.Meta.NormNum.isNat_natCast 10 10
(Mathlib.Meta.NormNum.isNat_ofNat ℕ (Eq.refl 10)))))
(Eq.refl 1) (Eq.refl 10)))
(Eq.trans (Finset.sum_singleton (fun x => (↑x)⁻¹) 30)
(Mathlib.Meta.NormNum.IsNNRat.to_eq
(Mathlib.Meta.NormNum.isNNRat_inv_pos
(Mathlib.Meta.NormNum.IsNat.to_isNNRat
(Mathlib.Meta.NormNum.isNat_natCast 30 30
(Mathlib.Meta.NormNum.isNat_ofNat ℕ (Eq.refl 30)))))
(Eq.refl 1) (Eq.refl 30))))
(Mathlib.Meta.NormNum.IsNNRat.to_eq
(Mathlib.Meta.NormNum.isNNRat_add (Eq.refl HAdd.hAdd)
(Mathlib.Meta.NormNum.isNNRat_div
(Mathlib.Meta.NormNum.isNNRat_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsNat.to_isNNRat
(Mathlib.Meta.NormNum.isNat_ofNat ℚ (Eq.refl 1)))
(Mathlib.Meta.NormNum.isNNRat_inv_pos
(Mathlib.Meta.NormNum.IsNat.to_isNNRat
(Mathlib.Meta.NormNum.isNat_ofNat ℚ (Eq.refl 10))))
(Eq.refl (Nat.mul 1 1)) (Eq.refl 10)))
(Mathlib.Meta.NormNum.isNNRat_div
(Mathlib.Meta.NormNum.isNNRat_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsNat.to_isNNRat
(Mathlib.Meta.NormNum.isNat_ofNat ℚ (Eq.refl 1)))
(Mathlib.Meta.NormNum.isNNRat_inv_pos
(Mathlib.Meta.NormNum.IsNat.to_isNNRat
(Mathlib.Meta.NormNum.isNat_ofNat ℚ (Eq.refl 30))))
(Eq.refl (Nat.mul 1 1)) (Eq.refl 30)))
(Eq.refl 40) (Eq.refl 300))
(Eq.refl 2) (Eq.refl 15)))))
(eq_self (2 / 15)))
(eq_true True.intro)))
(and_self True))
(eq_true True.intro)))
(and_self True))
(eq_true True.intro)))this✝:smallestCollection 2 15 ≤ 2 := Nat.sInf_le hthis:0 < smallestCollection 2 15 :=
smallestCollection_pos (of_eq_true (Eq.trans (congrArg Not (OfNat.ofNat_ne_zero._simp_1 2)) not_false_eq_true))
(of_eq_true (Eq.trans (congrArg Not (OfNat.ofNat_ne_zero._simp_1 15)) not_false_eq_true)) (Exists.intro 2 h)h':smallestCollection 2 15 = 1⊢ False
h:2 ∈ unitFractionExpressible 2 15 :=
Exists.intro {10, 30}
(of_eq_true
(Eq.trans
(Eq.trans
(congr
(congrArg And
(Eq.trans
(Eq.trans
(congrArg (fun x => x = 2)
(Eq.trans
(Finset.card_insert_of_notMem
(of_eq_true
(Eq.trans
(Eq.trans
(congrArg Not
(Eq.trans
(Eq.trans
(congrArg (Membership.mem {30})
(Mathlib.Meta.NormNum.IsNat.to_eq (Mathlib.Meta.NormNum.isNat_ofNat ℕ (Eq.refl 10))
(Eq.refl 10)))
Finset.mem_singleton._simp_1)
(eq_false
(Mathlib.Meta.NormNum.isNat_eq_false (Mathlib.Meta.NormNum.isNat_ofNat ℕ (Eq.refl 10))
(Mathlib.Meta.NormNum.isNat_ofNat ℕ (Eq.refl 30)) (Eq.refl false)))))
not_false_eq_true)
(eq_true True.intro))))
(Eq.trans (congrArg (fun x => x + 1) (Finset.card_singleton 30))
(Mathlib.Meta.NormNum.IsNat.to_eq
(Mathlib.Meta.NormNum.isNat_add (Eq.refl HAdd.hAdd)
(Mathlib.Meta.NormNum.isNat_ofNat ℕ (Eq.refl 1))
(Mathlib.Meta.NormNum.isNat_ofNat ℕ (Eq.refl 1)) (Eq.refl 2))
(Eq.refl 2)))))
(eq_self 2))
(eq_true True.intro)))
(Eq.trans
(Eq.trans
(congr
(congrArg And
(Eq.trans
(Eq.trans
(forall_congr fun n =>
implies_congr
(Eq.trans Finset.mem_insert._simp_1 (congrArg (Or (n = 10)) Finset.mem_singleton._simp_1))
gt_iff_lt._simp_1)
forall_eq_or_imp._simp_1)
(Eq.trans
(Eq.trans
(congr
(congrArg And
(eq_true
(Mathlib.Meta.NormNum.isNat_lt_true (Mathlib.Meta.NormNum.isNat_ofNat ℕ (Eq.refl 1))
(Mathlib.Meta.NormNum.isNat_ofNat ℕ (Eq.refl 10)) (Eq.refl false))))
(Eq.trans forall_eq._simp_1
(eq_true
(Mathlib.Meta.NormNum.isNat_lt_true (Mathlib.Meta.NormNum.isNat_ofNat ℕ (Eq.refl 1))
(Mathlib.Meta.NormNum.isNat_ofNat ℕ (Eq.refl 30)) (Eq.refl false)))))
(and_self True))
(eq_true True.intro))))
(Eq.trans
(Eq.trans
(congr
(congrArg Eq
(Mathlib.Meta.NormNum.IsNNRat.to_eq
(Mathlib.Meta.NormNum.isNNRat_div
(Mathlib.Meta.NormNum.isNNRat_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsNat.to_isNNRat
(Mathlib.Meta.NormNum.isNat_natCast 2 2
(Mathlib.Meta.NormNum.isNat_ofNat ℕ (Eq.refl 2))))
(Mathlib.Meta.NormNum.isNNRat_inv_pos
(Mathlib.Meta.NormNum.IsNat.to_isNNRat
(Mathlib.Meta.NormNum.isNat_natCast 15 15
(Mathlib.Meta.NormNum.isNat_ofNat ℕ (Eq.refl 15)))))
(Eq.refl (Nat.mul 2 1)) (Eq.refl 15)))
(Eq.refl 2) (Eq.refl 15)))
(Eq.trans
(Finset.sum_insert
(of_eq_true
(Eq.trans
(Eq.trans
(congrArg Not
(Eq.trans
(Eq.trans
(congrArg (Membership.mem {30})
(Mathlib.Meta.NormNum.IsNat.to_eq
(Mathlib.Meta.NormNum.isNat_ofNat ℕ (Eq.refl 10)) (Eq.refl 10)))
Finset.mem_singleton._simp_1)
(eq_false
(Mathlib.Meta.NormNum.isNat_eq_false
(Mathlib.Meta.NormNum.isNat_ofNat ℕ (Eq.refl 10))
(Mathlib.Meta.NormNum.isNat_ofNat ℕ (Eq.refl 30)) (Eq.refl false)))))
not_false_eq_true)
(eq_true True.intro))))
(Eq.trans
(congr
(congrArg HAdd.hAdd
(Mathlib.Meta.NormNum.IsNNRat.to_eq
(Mathlib.Meta.NormNum.isNNRat_inv_pos
(Mathlib.Meta.NormNum.IsNat.to_isNNRat
(Mathlib.Meta.NormNum.isNat_natCast 10 10
(Mathlib.Meta.NormNum.isNat_ofNat ℕ (Eq.refl 10)))))
(Eq.refl 1) (Eq.refl 10)))
(Eq.trans (Finset.sum_singleton (fun x => (↑x)⁻¹) 30)
(Mathlib.Meta.NormNum.IsNNRat.to_eq
(Mathlib.Meta.NormNum.isNNRat_inv_pos
(Mathlib.Meta.NormNum.IsNat.to_isNNRat
(Mathlib.Meta.NormNum.isNat_natCast 30 30
(Mathlib.Meta.NormNum.isNat_ofNat ℕ (Eq.refl 30)))))
(Eq.refl 1) (Eq.refl 30))))
(Mathlib.Meta.NormNum.IsNNRat.to_eq
(Mathlib.Meta.NormNum.isNNRat_add (Eq.refl HAdd.hAdd)
(Mathlib.Meta.NormNum.isNNRat_div
(Mathlib.Meta.NormNum.isNNRat_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsNat.to_isNNRat
(Mathlib.Meta.NormNum.isNat_ofNat ℚ (Eq.refl 1)))
(Mathlib.Meta.NormNum.isNNRat_inv_pos
(Mathlib.Meta.NormNum.IsNat.to_isNNRat
(Mathlib.Meta.NormNum.isNat_ofNat ℚ (Eq.refl 10))))
(Eq.refl (Nat.mul 1 1)) (Eq.refl 10)))
(Mathlib.Meta.NormNum.isNNRat_div
(Mathlib.Meta.NormNum.isNNRat_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsNat.to_isNNRat
(Mathlib.Meta.NormNum.isNat_ofNat ℚ (Eq.refl 1)))
(Mathlib.Meta.NormNum.isNNRat_inv_pos
(Mathlib.Meta.NormNum.IsNat.to_isNNRat
(Mathlib.Meta.NormNum.isNat_ofNat ℚ (Eq.refl 30))))
(Eq.refl (Nat.mul 1 1)) (Eq.refl 30)))
(Eq.refl 40) (Eq.refl 300))
(Eq.refl 2) (Eq.refl 15)))))
(eq_self (2 / 15)))
(eq_true True.intro)))
(and_self True))
(eq_true True.intro)))
(and_self True))
(eq_true True.intro)))this✝¹:smallestCollection 2 15 ≤ 2 := Nat.sInf_le hthis✝:0 < smallestCollection 2 15 :=
smallestCollection_pos (of_eq_true (Eq.trans (congrArg Not (OfNat.ofNat_ne_zero._simp_1 2)) not_false_eq_true))
(of_eq_true (Eq.trans (congrArg Not (OfNat.ofNat_ne_zero._simp_1 15)) not_false_eq_true)) (Exists.intro 2 h)h':smallestCollection 2 15 = 1this:2 ∣ 15 := dvd_of_smallestCollection_eq_one h'⊢ False
All goals completed! 🐙
All goals completed! 🐙Write $$N(b) = max_{1 \leq a < b} N(a, b)$$.
noncomputable def smallestCollectionTo (b : ℕ) : ℕ :=
sSup {smallestCollection a b | a ∈ Finset.Ico 1 b}
In 1950, Erdős [Er50c] proved the upper bound $$N(b) \ll \log b / \log \log b$$. [Er50c] Erdős, P., Az ${1}/{x_1} + {1}/{x_2} + \ldots + {1}/{x_n} =A/B$ egyenlet eg'{E}sz sz'{A}m'{u} megold'{A}sairól. Mat. Lapok (1950), 192-210.
@[category research solved, AMS 11]
theorem erdos_304.variants.upper_1950 :
(fun b => (smallestCollectionTo b : ℝ)) =O[atTop]
(fun b => Real.log b / Real.log (Real.log b)) := ⊢ (fun b => ↑(smallestCollectionTo b)) =O[atTop] fun b => Real.log ↑b / Real.log (Real.log ↑b)
All goals completed! 🐙
In 1950, Erdős [Er50c] proved the lower bound $$\log \log b \ll N(b)$$. [Er50c] Erdős, P., Az ${1}/{x_1} + {1}/{x_2} + \ldots + {1}/{x_n} =A/B$ egyenlet eg'{E}sz sz'{A}m'{u} megold'{A}sairól. Mat. Lapok (1950), 192-210.
@[category research solved, AMS 11]
theorem erdos_304.variants.lower_1950 :
(fun b : ℕ => Real.log (Real.log b)) =O[atTop]
(fun b => (smallestCollectionTo b : ℝ)) := ⊢ (fun b => Real.log (Real.log ↑b)) =O[atTop] fun b => ↑(smallestCollectionTo b)
All goals completed! 🐙
In 1985 Vose [Vo85] proved the upper bound $$N(b) \ll \sqrt{\log b}$$. [Vo85] Vose, Michael D., Egyptian fractions. Bull. London Math. Soc. (1985), 21-24.
@[category research solved, AMS 11]
theorem erdos_304.variants.upper_1985 :
(fun b => (smallestCollectionTo b : ℝ)) =O[atTop]
(fun b => Real.sqrt (Real.log b)) := ⊢ (fun b => ↑(smallestCollectionTo b)) =O[atTop] fun b => √(Real.log ↑b)
All goals completed! 🐙
Is it true that $$N(b) \ll \log \log b$$?
@[category research open, AMS 11]
theorem upper_bound : answer(sorry) ↔
(fun b : ℕ => (smallestCollectionTo b : ℝ)) =O[atTop] (fun b : ℕ => Real.log (Real.log b)) := ⊢ True ↔ (fun b => ↑(smallestCollectionTo b)) =O[atTop] fun b => Real.log (Real.log ↑b)
All goals completed! 🐙
end Erdos304