Problems / erdos-402 / variant-9724698e
Graham's bound for |A| = 13
variant-9724698e
proved
A partial route to the problem.
$\displaystyle \forall A \subset \mathbb{N}\ \text{finite}:\ 0 \notin A,\ |A| = 13 \Rightarrow \exists\, a, b \in A:\ \gcd(a,b) \le \frac{a}{|A|}$
Every set A of exactly thirteen positive integers has a, b ∈ A (possibly equal) with gcd(a, b) ≤ a/|A|. The division is in ℚ.
Lean
theorem Opn.erdos_402_card_thirteen :
∀ (A : Finset ℕ), 0 ∉ A → A.card = 13 → ∃ a ∈ A, ∃ b ∈ A, a.gcd b ≤ (a / A.card : ℚ) := by
sorryWhy does it end in sorry?
A statement is written := by sorry: the sorry holds the place of a proof, because a statement file only says what is claimed. A proof the gate checked is its own file, Proof.lean. How to read a proof page →
How it was proved
Proved by Proof.lean, checked by the kernel. Its attestation, 000304, records the gate’s run.
The proof step by step (outline)
Checked by the kernel — an outline of the attested proof below: attestations/000304.json, merge commit 9732d83fda9e.
Outline of Proof.lean, extracted by the gate at 82834c4684b8 from the proof’s elaboration: each step is a claim the proof establishes and the goal it leaves. Open a step for what it uses and its Lean lines.
hposhave(0 : ℕ) < A.cardroutine: omegaLeaves
∃ a ∈ A, ∃ b ∈ A, (↑(a.gcd b) : ℚ) ≤ (↑a : ℚ) / (↑A.card : ℚ), withhpos : (0 : ℕ) < A.card.Lean, line 14
have hpos : 0 < A.card := by omega
targets/erdos-402/nodes/variant-9724698e/Proof.lean, line 14 at
9732d83fda9e↗hnehaveA.NonemptyLeaves
∃ a ∈ A, ∃ b ∈ A, (↑(a.gcd b) : ℚ) ≤ (↑a : ℚ) / (↑A.card : ℚ), withhne : A.Nonempty.Uses library
Finset.card_pos.Lean, line 15
have hne : A.Nonempty := Finset.card_pos.mp hpos
targets/erdos-402/nodes/variant-9724698e/Proof.lean, line 15 at
9732d83fda9e↗keyhave∀ (a b : ℕ), a.gcd b * A.card ≤ a → (↑(a.gcd b) : ℚ) ≤ (↑a : ℚ) / (↑A.card : ℚ)Leaves
∃ a ∈ A, ∃ b ∈ A, (↑(a.gcd b) : ℚ) ≤ (↑a : ℚ) / (↑A.card : ℚ), withkey : ∀ (a b : ℕ), a.gcd b * A.card ≤ a → (↑(a.gcd b) : ℚ) ≤ (↑a : ℚ) / (↑A.card : ℚ).Uses library
le_div_iff₀Seele_div_iff₀'for a version with multiplication on the other side. .Lean, lines 16–19
have key : ∀ a b : ℕ, a.gcd b * A.card ≤ a → (a.gcd b : ℚ) ≤ (a / A.card : ℚ) := by intro a b h rw [le_div_iff₀ (by exact_mod_cast hpos)] exact_mod_cast htargets/erdos-402/nodes/variant-9724698e/Proof.lean, lines 16–19 at
9732d83fda9e↗s4obtain∃ (M : ℕ), M = A.max' hneLeaves
∃ a ∈ A, ∃ b ∈ A, (↑(a.gcd b) : ℚ) ≤ (↑a : ℚ) / (↑A.card : ℚ), withM : ℕ,hMdef : M = A.max' hne.Uses library
Exists.introExistential introduction. ,rflrfl : a = ais the unique constructor of the equality type. .Lean, line 20
obtain ⟨M, hMdef⟩ : ∃ M, M = A.max' hne := ⟨_, rfl⟩
targets/erdos-402/nodes/variant-9724698e/Proof.lean, line 20 at
9732d83fda9e↗hMhaveM ∈ ALeaves
∃ a ∈ A, ∃ b ∈ A, (↑(a.gcd b) : ℚ) ≤ (↑a : ℚ) / (↑A.card : ℚ), withhM : M ∈ A.Uses library
Finset.max'_mem.Lean, line 21
have hM : M ∈ A := by rw [hMdef]; exact Finset.max'_mem A hne
targets/erdos-402/nodes/variant-9724698e/Proof.lean, line 21 at
9732d83fda9e↗hlehave∀ x ∈ A, x ≤ MLeaves
∃ a ∈ A, ∃ b ∈ A, (↑(a.gcd b) : ℚ) ≤ (↑a : ℚ) / (↑A.card : ℚ), withhle : ∀ x ∈ A, x ≤ M.Uses library
Finset.le_max'.Lean, lines 22–25
have hle : ∀ x ∈ A, x ≤ M := by intro x hx rw [hMdef] exact Finset.le_max' A x hxtargets/erdos-402/nodes/variant-9724698e/Proof.lean, lines 22–25 at
9732d83fda9e↗hMposhave(0 : ℕ) < MLeaves
∃ a ∈ A, ∃ b ∈ A, (↑(a.gcd b) : ℚ) ≤ (↑a : ℚ) / (↑A.card : ℚ), withhMpos : (0 : ℕ) < M.Uses library
Nat.pos_of_ne_zero.Lean, line 26
have hMpos : 0 < M := Nat.pos_of_ne_zero (fun h => hA (h ▸ hM))
targets/erdos-402/nodes/variant-9724698e/Proof.lean, line 26 at
9732d83fda9e↗s8caseLeaves
∃ a ∈ A, ∃ b ∈ A, (↑(a.gcd b) : ℚ) ≤ (↑a : ℚ) / (↑A.card : ℚ).Uses library
Exists.introExistential introduction. .Lean, lines 28–29
· obtain ⟨x, hx, h⟩ := hw exact ⟨M, hM, x, hx, key M x (by rw [hn]; exact h)⟩targets/erdos-402/nodes/variant-9724698e/Proof.lean, lines 28–29 at
9732d83fda9e↗s8.s1obtain∃ x ∈ A, M.gcd x * (13 : ℕ) ≤ MLeaves
∃ a ∈ A, ∃ b ∈ A, (↑(a.gcd b) : ℚ) ≤ (↑a : ℚ) / (↑A.card : ℚ), withx : ℕ,hx : x ∈ A,h : M.gcd x * (13 : ℕ) ≤ M.Lean, line 28
· obtain ⟨x, hx, h⟩ := hw
targets/erdos-402/nodes/variant-9724698e/Proof.lean, line 28 at
9732d83fda9e↗
s9obtain∃ (S : List ℕ), S = let y := let y := let y := [(23760 : ℕ), (24255 : ℕ), (24640 : ℕ), (24948 : ℕ), (25200 : ℕ), (25410 : ℕ)]; (20160 : ℕ) :: (20790 : ℕ) :: (21560 : ℕ) :: (22176 : ℕ) :: (22680 : ℕ) :: (23100 : ℕ) :: y; let y := (16632 : ℕ) :: (17325 : ℕ) :: (17640 : ℕ) :: (18480 : ℕ) :: (19404 : ℕ) :: (19800 : ℕ) :: y; (13860 : ℕ) :: (15120 : ℕ) :: (15400 : ℕ) :: (15840 : ℕ) :: (16170 : ℕ) :: y; let y := let y := (10395 : ℕ) :: (11088 : ℕ) :: (11550 : ℕ) :: (11880 : ℕ) :: (12320 : ℕ) :: (12600 : ℕ) :: y; (7560 : ℕ) :: (7920 : ℕ) :: (8316 : ℕ) :: (9240 : ℕ) :: (10080 : ℕ) :: y; let y := (3960 : ℕ) :: (4620 : ℕ) :: (5040 : ℕ) :: (5544 : ℕ) :: (6160 : ℕ) :: (6930 : ℕ) :: y; (2310 : ℕ) :: (2520 : ℕ) :: (2772 : ℕ) :: (3080 : ℕ) :: (3465 : ℕ) :: yLeaves
∃ a ∈ A, ∃ b ∈ A, (↑(a.gcd b) : ℚ) ≤ (↑a : ℚ) / (↑A.card : ℚ), withS : List ℕ,hS : S = let y := let y := let y := [(23760 : ℕ), (24255 : ℕ), (24640 : ℕ), (24948 : ℕ), (25200 : ℕ), (25410 : ℕ)]; (20160 : ℕ) :: (20790 : ℕ) :: (21560 : ℕ) :: (22176 : ℕ) :: (22680 : ℕ) :: (23100 : ℕ) :: y; let y := (16632 : ℕ) :: (17325 : ℕ) :: (17640 : ℕ) :: (18480 : ℕ) :: (19404 : ℕ) :: (19800 : ℕ) :: y; (13860 : ℕ) :: (15120 : ℕ) :: (15400 : ℕ) :: (15840 : ℕ) :: (16170 : ℕ) :: y; let y := let y := (10395 : ℕ) :: (11088 : ℕ) :: (11550 : ℕ) :: (11880 : ℕ) :: (12320 : ℕ) :: (12600 : ℕ) :: y; (7560 : ℕ) :: (7920 : ℕ) :: (8316 : ℕ) :: (9240 : ℕ) :: (10080 : ℕ) :: y; let y := (3960 : ℕ) :: (4620 : ℕ) :: (5040 : ℕ) :: (5544 : ℕ) :: (6160 : ℕ) :: (6930 : ℕ) :: y; (2310 : ℕ) :: (2520 : ℕ) :: (2772 : ℕ) :: (3080 : ℕ) :: (3465 : ℕ) :: y.Uses library
ListLinked lists: ordered lists, in which each element has a reference to the next element. ,Exists.introExistential introduction. ,rflrfl : a = ais the unique constructor of the equality type. .Lean, line 31
obtain ⟨S, hS⟩ : ∃ S : List ℕ, S = [2310, 2520, 2772, 3080, 3465, 3960, 4620, 5040, 5544, 6160, 6930, 7560, 7920, 8316, 9240, 10080, 10395, 11088, 11550, 11880, 12320, 12600, 13860, 15120, 15400, 15840, 16170, 16632, 17325, 17640, 18480, 19404, 19800, 20160, 20790, 21560, 22176, 22680, 23100, 23760, 24255, 24640, 24948, 25200, 25410] := ⟨_, rfl⟩
targets/erdos-402/nodes/variant-9724698e/Proof.lean, line 31 at
9732d83fda9e↗s10obtain∃ (C : List (List ℕ)), C = [[(13860 : ℕ), (17640 : ℕ), (24640 : ℕ)], [(9240 : ℕ), (15120 : ℕ), (17325 : ℕ), (24948 : ℕ)], [(6930 : ℕ), (15400 : ℕ), (22176 : ℕ), (22680 : ℕ), (23760 : ℕ)], [(3465 : ℕ), (7560 : ℕ), (18480 : ℕ), (19404 : ℕ), (19800 : ℕ)], [(4620 : ℕ), (12600 : ℕ), (15840 : ℕ), (16632 : ℕ), (21560 : ℕ)], [(3960 : ℕ), (11088 : ℕ), (20160 : ℕ), (20790 : ℕ)], [(2310 : ℕ), (5040 : ℕ), (8316 : ℕ), (12320 : ℕ), (24255 : ℕ)], [(5544 : ℕ), (10080 : ℕ), (11550 : ℕ), (11880 : ℕ)], [(2520 : ℕ), (6160 : ℕ), (10395 : ℕ), (23100 : ℕ)], [(2772 : ℕ), (7920 : ℕ), (16170 : ℕ), (25200 : ℕ)], [(3080 : ℕ), (25410 : ℕ)]]Leaves
∃ a ∈ A, ∃ b ∈ A, (↑(a.gcd b) : ℚ) ≤ (↑a : ℚ) / (↑A.card : ℚ), withC : List (List ℕ),hC : C = [[(13860 : ℕ), (17640 : ℕ), (24640 : ℕ)], [(9240 : ℕ), (15120 : ℕ), (17325 : ℕ), (24948 : ℕ)], [(6930 : ℕ), (15400 : ℕ), (22176 : ℕ), (22680 : ℕ), (23760 : ℕ)], [(3465 : ℕ), (7560 : ℕ), (18480 : ℕ), (19404 : ℕ), (19800 : ℕ)], [(4620 : ℕ), (12600 : ℕ), (15840 : ℕ), (16632 : ℕ), (21560 : ℕ)], [(3960 : ℕ), (11088 : ℕ), (20160 : ℕ), (20790 : ℕ)], [(2310 : ℕ), (5040 : ℕ), (8316 : ℕ), (12320 : ℕ), (24255 : ℕ)], [(5544 : ℕ), (10080 : ℕ), (11550 : ℕ), (11880 : ℕ)], [(2520 : ℕ), (6160 : ℕ), (10395 : ℕ), (23100 : ℕ)], [(2772 : ℕ), (7920 : ℕ), (16170 : ℕ), (25200 : ℕ)], [(3080 : ℕ), (25410 : ℕ)]].Uses library
ListLinked lists: ordered lists, in which each element has a reference to the next element. ,Exists.introExistential introduction. ,rflrfl : a = ais the unique constructor of the equality type. .Lean, line 32
obtain ⟨C, hC⟩ : ∃ C : List (List ℕ), C = [[13860, 17640, 24640], [9240, 15120, 17325, 24948], [6930, 15400, 22176, 22680, 23760], [3465, 7560, 18480, 19404, 19800], [4620, 12600, 15840, 16632, 21560], [3960, 11088, 20160, 20790], [2310, 5040, 8316, 12320, 24255], [5544, 10080, 11550, 11880], [2520, 6160, 10395, 23100], [2772, 7920, 16170, 25200], [3080, 25410]] := ⟨_, rfl⟩
targets/erdos-402/nodes/variant-9724698e/Proof.lean, line 32 at
9732d83fda9e↗P1have∀ k < (13 : ℕ), ∀ j < k, (0 : ℕ) < j → k ∣ (27720 : ℕ) ∧ (27720 : ℕ) / k * j ∈ SLeaves
∃ a ∈ A, ∃ b ∈ A, (↑(a.gcd b) : ℚ) ≤ (↑a : ℚ) / (↑A.card : ℚ), withP1 : ∀ k < (13 : ℕ), ∀ j < k, (0 : ℕ) < j → k ∣ (27720 : ℕ) ∧ (27720 : ℕ) / k * j ∈ S.Lean, lines 33–35
have P1 : ∀ k, k < 13 → ∀ j, j < k → 0 < j → k ∣ 27720 ∧ 27720 / k * j ∈ S := by subst hS decidetargets/erdos-402/nodes/variant-9724698e/Proof.lean, lines 33–35 at
9732d83fda9e↗P3have∀ a ∈ S, List.findIdx (fun (l : List ℕ) => l.contains a) C < (11 : ℕ) ∧ a ∈ C.getD (List.findIdx (fun (l : List ℕ) => l.contains a) C) []Leaves
∃ a ∈ A, ∃ b ∈ A, (↑(a.gcd b) : ℚ) ≤ (↑a : ℚ) / (↑A.card : ℚ), withP3 : ∀ a ∈ S, List.findIdx (fun (l : List ℕ) => l.contains a) C < (11 : ℕ) ∧ a ∈ C.getD (List.findIdx (fun (l : List ℕ) => l.contains a) C) [].Lean, lines 36–39
have P3 : ∀ a ∈ S, C.findIdx (fun l => l.contains a) < 11 ∧ a ∈ C.getD (C.findIdx (fun l => l.contains a)) [] := by subst hS hC decidetargets/erdos-402/nodes/variant-9724698e/Proof.lean, lines 36–39 at
9732d83fda9e↗P2have∀ i < (11 : ℕ), ∀ a ∈ C.getD i [], ∀ b ∈ C.getD i [], a ≠ b → (13 : ℕ) * a.gcd b ≤ a ∨ (13 : ℕ) * a.gcd b ≤ bLeaves
∃ a ∈ A, ∃ b ∈ A, (↑(a.gcd b) : ℚ) ≤ (↑a : ℚ) / (↑A.card : ℚ), withP2 : ∀ i < (11 : ℕ), ∀ a ∈ C.getD i [], ∀ b ∈ C.getD i [], a ≠ b → (13 : ℕ) * a.gcd b ≤ a ∨ (13 : ℕ) * a.gcd b ≤ b.Lean, lines 40–43
have P2 : ∀ i, i < 11 → ∀ a ∈ C.getD i [], ∀ b ∈ C.getD i [], a ≠ b → 13 * a.gcd b ≤ a ∨ 13 * a.gcd b ≤ b := by subst hC decidetargets/erdos-402/nodes/variant-9724698e/Proof.lean, lines 40–43 at
9732d83fda9e↗formshave∀ x ∈ A.erase M, ∃ a ∈ S, (27720 : ℕ) * x = a * MLeaves
∃ a ∈ A, ∃ b ∈ A, (↑(a.gcd b) : ℚ) ≤ (↑a : ℚ) / (↑A.card : ℚ), withforms : ∀ x ∈ A.erase M, ∃ a ∈ S, (27720 : ℕ) * x = a * M.Uses library
Finset.mem_erase,Exists.introExistential introduction. ,Nat.mul_div_cancel_left.Lean, lines 44–76
have forms : ∀ x ∈ A.erase M, ∃ a ∈ S, 27720 * x = a * M := by intro x hx rw [Finset.mem_erase] at hx have hxpos : 0 < x := Nat.pos_of_ne_zero (fun h => hA (h ▸ hx.2)) have hlt : x < M := lt_of_le_of_ne (hle x hx.2) hx.1 have hg := hw x hx.2 have hd1 := Nat.gcd_dvd_left M x have hd2 := Nat.gcd_dvd_right M x have hgpos : 0 < M.gcd x := Nat.gcd_pos_of_pos_right _ hxpos generalize M.gcd x = g at hg hd1 hd2 hgpos obtain ⟨k, hk⟩ := hd1 obtain ⟨j, hj⟩ := hd2 have hk13 : k < 13 := by by_contra hh push Not at hh have := Nat.mul_le_mul_left g hh omega have hjk : j < k := by by_contra hh push Not at hh have := Nat.mul_le_mul_left g hh omega have hj1 : 0 < j := by rcases Nat.eq_zero_or_pos j with h | h · subst h omega · exact h obtain ⟨hdvd, hmem⟩ := P1 k hk13 j hjk hj1 refine ⟨27720 / k * j, hmem, ?_⟩ obtain ⟨q, hq⟩ := hdvd have hkpos : 0 < k := by omega rw [hq, Nat.mul_div_cancel_left q hkpos, hk, hj] ringtargets/erdos-402/nodes/variant-9724698e/Proof.lean, lines 44–76 at
9732d83fda9e↗forms.hxposhave(0 : ℕ) < xLeaves
∃ a ∈ S, (27720 : ℕ) * x = a * M, withhxpos : (0 : ℕ) < x.Uses library
Nat.pos_of_ne_zero.Lean, line 47
have hxpos : 0 < x := Nat.pos_of_ne_zero (fun h => hA (h ▸ hx.2))
targets/erdos-402/nodes/variant-9724698e/Proof.lean, line 47 at
9732d83fda9e↗forms.hlthavex < MLeaves
∃ a ∈ S, (27720 : ℕ) * x = a * M, withhlt : x < M.Uses library
lt_of_le_of_ne.Lean, line 48
have hlt : x < M := lt_of_le_of_ne (hle x hx.2) hx.1
targets/erdos-402/nodes/variant-9724698e/Proof.lean, line 48 at
9732d83fda9e↗forms.hghaveM < M.gcd x * (13 : ℕ)Leaves
∃ a ∈ S, (27720 : ℕ) * x = a * M, withhg : M < M.gcd x * (13 : ℕ).Lean, line 49
have hg := hw x hx.2
targets/erdos-402/nodes/variant-9724698e/Proof.lean, line 49 at
9732d83fda9e↗forms.hd1haveM.gcd x ∣ MLeaves
∃ a ∈ S, (27720 : ℕ) * x = a * M, withhd1 : M.gcd x ∣ M.Uses library
Nat.gcd_dvd_left.Lean, line 50
have hd1 := Nat.gcd_dvd_left M x
targets/erdos-402/nodes/variant-9724698e/Proof.lean, line 50 at
9732d83fda9e↗forms.hd2haveM.gcd x ∣ xLeaves
∃ a ∈ S, (27720 : ℕ) * x = a * M, withhd2 : M.gcd x ∣ x.Uses library
Nat.gcd_dvd_right.Lean, line 51
have hd2 := Nat.gcd_dvd_right M x
targets/erdos-402/nodes/variant-9724698e/Proof.lean, line 51 at
9732d83fda9e↗forms.hgposhave(0 : ℕ) < M.gcd xLeaves
∃ a ∈ S, (27720 : ℕ) * x = a * M, withhgpos : (0 : ℕ) < M.gcd x.Uses library
Nat.gcd_pos_of_pos_right.Lean, line 52
have hgpos : 0 < M.gcd x := Nat.gcd_pos_of_pos_right _ hxpos
targets/erdos-402/nodes/variant-9724698e/Proof.lean, line 52 at
9732d83fda9e↗forms.s7obtaing ∣ MLeaves
∃ a ∈ S, (27720 : ℕ) * x = a * M, withk : ℕ,hk : M = g * k.Lean, line 54
obtain ⟨k, hk⟩ := hd1
targets/erdos-402/nodes/variant-9724698e/Proof.lean, line 54 at
9732d83fda9e↗forms.s8obtaing ∣ xLeaves
∃ a ∈ S, (27720 : ℕ) * x = a * M, withj : ℕ,hj : x = g * j.Lean, line 55
obtain ⟨j, hj⟩ := hd2
targets/erdos-402/nodes/variant-9724698e/Proof.lean, line 55 at
9732d83fda9e↗forms.hk13havek < (13 : ℕ)Leaves
∃ a ∈ S, (27720 : ℕ) * x = a * M, withhk13 : k < (13 : ℕ).Uses library
NotNot p, or¬p, is the negation ofp. .Lean, lines 56–60
have hk13 : k < 13 := by by_contra hh push Not at hh have := Nat.mul_le_mul_left g hh omegatargets/erdos-402/nodes/variant-9724698e/Proof.lean, lines 56–60 at
9732d83fda9e↗forms.hk13.thishaveg * (13 : ℕ) ≤ g * kLeaves
False, withthis : g * (13 : ℕ) ≤ g * k.Uses library
Nat.mul_le_mul_left.Lean, line 59
have := Nat.mul_le_mul_left g hh
targets/erdos-402/nodes/variant-9724698e/Proof.lean, line 59 at
9732d83fda9e↗
forms.hjkhavej < kLeaves
∃ a ∈ S, (27720 : ℕ) * x = a * M, withhjk : j < k.Uses library
NotNot p, or¬p, is the negation ofp. .Lean, lines 61–65
have hjk : j < k := by by_contra hh push Not at hh have := Nat.mul_le_mul_left g hh omegatargets/erdos-402/nodes/variant-9724698e/Proof.lean, lines 61–65 at
9732d83fda9e↗forms.hjk.thishaveg * k ≤ g * jLeaves
False, withthis : g * k ≤ g * j.Uses library
Nat.mul_le_mul_left.Lean, line 64
have := Nat.mul_le_mul_left g hh
targets/erdos-402/nodes/variant-9724698e/Proof.lean, line 64 at
9732d83fda9e↗
forms.hj1have(0 : ℕ) < jLeaves
∃ a ∈ S, (27720 : ℕ) * x = a * M, withhj1 : (0 : ℕ) < j.Uses library
Nat.eq_zero_or_pos.Lean, lines 66–70
have hj1 : 0 < j := by rcases Nat.eq_zero_or_pos j with h | h · subst h omega · exact htargets/erdos-402/nodes/variant-9724698e/Proof.lean, lines 66–70 at
9732d83fda9e↗forms.hj1.s1caseLeaves
(0 : ℕ) < j.Lean, lines 68–69
· subst h omegatargets/erdos-402/nodes/variant-9724698e/Proof.lean, lines 68–69 at
9732d83fda9e↗forms.hj1.s2caseLeaves
(0 : ℕ) < j.Lean, line 70
· exact h
targets/erdos-402/nodes/variant-9724698e/Proof.lean, line 70 at
9732d83fda9e↗
forms.s12obtaink ∣ (27720 : ℕ) ∧ (27720 : ℕ) / k * j ∈ SLeaves
∃ a ∈ S, (27720 : ℕ) * x = a * M, withhdvd : k ∣ (27720 : ℕ),hmem : (27720 : ℕ) / k * j ∈ S.Lean, line 71
obtain ⟨hdvd, hmem⟩ := P1 k hk13 j hjk hj1
targets/erdos-402/nodes/variant-9724698e/Proof.lean, line 71 at
9732d83fda9e↗forms.s13obtaink ∣ (27720 : ℕ)Leaves
(27720 : ℕ) * x = (27720 : ℕ) / k * j * M, withq : ℕ,hq : (27720 : ℕ) = k * q.Lean, line 73
obtain ⟨q, hq⟩ := hdvd
targets/erdos-402/nodes/variant-9724698e/Proof.lean, line 73 at
9732d83fda9e↗forms.hkposhave(0 : ℕ) < kroutine: omegaLeaves
(27720 : ℕ) * x = (27720 : ℕ) / k * j * M, withhkpos : (0 : ℕ) < k.Lean, line 74
have hkpos : 0 < k := by omega
targets/erdos-402/nodes/variant-9724698e/Proof.lean, line 74 at
9732d83fda9e↗
hcardhave(A.erase M).card = (12 : ℕ)Leaves
∃ a ∈ A, ∃ b ∈ A, (↑(a.gcd b) : ℚ) ≤ (↑a : ℚ) / (↑A.card : ℚ), withhcard : (A.erase M).card = (12 : ℕ).Uses library
Finset.card_erase_of_mem$\#(s \setminus \{a\}) = \#s - 1$ if $a \in s$. .Lean, lines 77–78
have hcard : (A.erase M).card = 12 := by rw [Finset.card_erase_of_mem hM, hn]targets/erdos-402/nodes/variant-9724698e/Proof.lean, lines 77–78 at
9732d83fda9e↗hmapshave∀ x ∈ A.erase M, List.findIdx (fun (l : List ℕ) => l.contains ((27720 : ℕ) * x / M)) C ∈ Finset.range (11 : ℕ)Leaves
∃ a ∈ A, ∃ b ∈ A, (↑(a.gcd b) : ℚ) ≤ (↑a : ℚ) / (↑A.card : ℚ), withhmaps : ∀ x ∈ A.erase M, List.findIdx (fun (l : List ℕ) => l.contains ((27720 : ℕ) * x / M)) C ∈ Finset.range (11 : ℕ).Uses library
Finset.rangerange nis the set of natural numbers less thann. ,Finset.mem_range,Nat.mul_div_cancel.Lean, lines 79–83
have hmaps : ∀ x ∈ A.erase M, C.findIdx (fun l => l.contains (27720 * x / M)) ∈ Finset.range 11 := by intro x hx obtain ⟨a, ha, hax⟩ := forms x hx rw [Finset.mem_range, hax, Nat.mul_div_cancel _ hMpos] exact (P3 a ha).1targets/erdos-402/nodes/variant-9724698e/Proof.lean, lines 79–83 at
9732d83fda9e↗hmaps.s1obtain∃ a ∈ S, (27720 : ℕ) * x = a * MLeaves
List.findIdx (fun (l : List ℕ) => l.contains ((27720 : ℕ) * x / M)) C ∈ Finset.range (11 : ℕ), witha : ℕ,ha : a ∈ S,hax : (27720 : ℕ) * x = a * M.Lean, line 81
obtain ⟨a, ha, hax⟩ := forms x hx
targets/erdos-402/nodes/variant-9724698e/Proof.lean, line 81 at
9732d83fda9e↗
s17obtain∃ x ∈ A.erase M, ∃ y ∈ A.erase M, x ≠ y ∧ List.findIdx (fun (l : List ℕ) => l.contains ((27720 : ℕ) * x / M)) C = List.findIdx (fun (l : List ℕ) => l.contains ((27720 : ℕ) * y / M)) CLeaves
∃ a ∈ A, ∃ b ∈ A, (↑(a.gcd b) : ℚ) ≤ (↑a : ℚ) / (↑A.card : ℚ), withx : ℕ,hx : x ∈ A.erase M,y : ℕ,hy : y ∈ A.erase M,hxy : x ≠ y,hc : List.findIdx (fun (l : List ℕ) => l.contains ((27720 : ℕ) * x / M)) C = List.findIdx (fun (l : List ℕ) => l.contains ((27720 : ℕ) * y / M)) C.Uses library
Finset.exists_ne_map_eq_of_card_lt_of_maps_toIf there are more pigeons than pigeonholes, then there are two pigeons in the same pigeonhole. ,Finset.card_range.Lean, lines 84–85
obtain ⟨x, hx, y, hy, hxy, hc⟩ := Finset.exists_ne_map_eq_of_card_lt_of_maps_to (by rw [hcard, Finset.card_range]; norm_num) hmapstargets/erdos-402/nodes/variant-9724698e/Proof.lean, lines 84–85 at
9732d83fda9e↗s18obtain∃ a ∈ S, (27720 : ℕ) * x = a * MLeaves
∃ a ∈ A, ∃ b ∈ A, (↑(a.gcd b) : ℚ) ≤ (↑a : ℚ) / (↑A.card : ℚ), witha : ℕ,ha : a ∈ S,hax : (27720 : ℕ) * x = a * M.Lean, line 86
obtain ⟨a, ha, hax⟩ := forms x hx
targets/erdos-402/nodes/variant-9724698e/Proof.lean, line 86 at
9732d83fda9e↗s19obtain∃ a ∈ S, (27720 : ℕ) * y = a * MLeaves
∃ a ∈ A, ∃ b ∈ A, (↑(a.gcd b) : ℚ) ≤ (↑a : ℚ) / (↑A.card : ℚ), withb : ℕ,hb : b ∈ S,hby : (27720 : ℕ) * y = b * M.Lean, line 87
obtain ⟨b, hb, hby⟩ := forms y hy
targets/erdos-402/nodes/variant-9724698e/Proof.lean, line 87 at
9732d83fda9e↗habhavea ≠ bLeaves
∃ a ∈ A, ∃ b ∈ A, (↑(a.gcd b) : ℚ) ≤ (↑a : ℚ) / (↑A.card : ℚ), withhab : a ≠ b.Lean, lines 89–93
have hab : a ≠ b := by intro h subst h apply hxy omegatargets/erdos-402/nodes/variant-9724698e/Proof.lean, lines 89–93 at
9732d83fda9e↗s21obtainList.findIdx (fun (l : List ℕ) => l.contains a) C < (11 : ℕ) ∧ a ∈ C.getD (List.findIdx (fun (l : List ℕ) => l.contains a) C) []Leaves
∃ a ∈ A, ∃ b ∈ A, (↑(a.gcd b) : ℚ) ≤ (↑a : ℚ) / (↑A.card : ℚ), withhi : List.findIdx (fun (l : List ℕ) => l.contains a) C < (11 : ℕ),hai : a ∈ C.getD (List.findIdx (fun (l : List ℕ) => l.contains a) C) [].Lean, line 94
obtain ⟨hi, hai⟩ := P3 a ha
targets/erdos-402/nodes/variant-9724698e/Proof.lean, line 94 at
9732d83fda9e↗s22obtainList.findIdx (fun (l : List ℕ) => l.contains b) C < (11 : ℕ) ∧ b ∈ C.getD (List.findIdx (fun (l : List ℕ) => l.contains b) C) []Leaves
∃ a ∈ A, ∃ b ∈ A, (↑(a.gcd b) : ℚ) ≤ (↑a : ℚ) / (↑A.card : ℚ), withleft✝ : List.findIdx (fun (l : List ℕ) => l.contains b) C < (11 : ℕ),hbi : b ∈ C.getD (List.findIdx (fun (l : List ℕ) => l.contains b) C) [].Lean, line 95
obtain ⟨_, hbi⟩ := P3 b hb
targets/erdos-402/nodes/variant-9724698e/Proof.lean, line 95 at
9732d83fda9e↗hgcdhavea.gcd b * M = (27720 : ℕ) * x.gcd yLeaves
∃ a ∈ A, ∃ b ∈ A, (↑(a.gcd b) : ℚ) ≤ (↑a : ℚ) / (↑A.card : ℚ), withhgcd : a.gcd b * M = (27720 : ℕ) * x.gcd y.Uses library
Nat.gcd_mul_right.Lean, lines 97–100
have hgcd : a.gcd b * M = 27720 * x.gcd y := by have h1 : Nat.gcd (27720 * x) (27720 * y) = 27720 * x.gcd y := Nat.gcd_mul_left 27720 x y rw [hax, hby, Nat.gcd_mul_right] at h1 exact h1targets/erdos-402/nodes/variant-9724698e/Proof.lean, lines 97–100 at
9732d83fda9e↗hgcd.h1have((27720 : ℕ) * x).gcd ((27720 : ℕ) * y) = (27720 : ℕ) * x.gcd yLeaves
a.gcd b * M = (27720 : ℕ) * x.gcd y, withh1 : ((27720 : ℕ) * x).gcd ((27720 : ℕ) * y) = (27720 : ℕ) * x.gcd y.Uses library
Nat.gcdComputes the greatest common divisor of two natural numbers. ,Nat.gcd_mul_left.Lean, line 98
have h1 : Nat.gcd (27720 * x) (27720 * y) = 27720 * x.gcd y := Nat.gcd_mul_left 27720 x y
targets/erdos-402/nodes/variant-9724698e/Proof.lean, line 98 at
9732d83fda9e↗
hxAhavex ∈ ALeaves
∃ a ∈ A, ∃ b ∈ A, (↑(a.gcd b) : ℚ) ≤ (↑a : ℚ) / (↑A.card : ℚ), withhxA : x ∈ A.Uses library
Finset.mem_erase.Lean, line 101
have hxA := (Finset.mem_erase.mp hx).2
targets/erdos-402/nodes/variant-9724698e/Proof.lean, line 101 at
9732d83fda9e↗hyAhavey ∈ ALeaves
∃ a ∈ A, ∃ b ∈ A, (↑(a.gcd b) : ℚ) ≤ (↑a : ℚ) / (↑A.card : ℚ), withhyA : y ∈ A.Uses library
Finset.mem_erase.Lean, line 102
have hyA := (Finset.mem_erase.mp hy).2
targets/erdos-402/nodes/variant-9724698e/Proof.lean, line 102 at
9732d83fda9e↗s26caseLeaves
∃ a ∈ A, ∃ b ∈ A, (↑(a.gcd b) : ℚ) ≤ (↑a : ℚ) / (↑A.card : ℚ).Uses library
Exists.introExistential introduction. ,Nat.le_of_mul_le_mul_right.Lean, lines 104–108
· refine ⟨x, hxA, y, hyA, key x y ?_⟩ rw [hn] have h2 := Nat.mul_le_mul_right M h have h3 : x.gcd y * 13 * 27720 ≤ x * 27720 := by nlinarith exact Nat.le_of_mul_le_mul_right h3 (by norm_num)targets/erdos-402/nodes/variant-9724698e/Proof.lean, lines 104–108 at
9732d83fda9e↗s26.h2have(13 : ℕ) * a.gcd b * M ≤ a * MLeaves
x.gcd y * (13 : ℕ) ≤ x, withh2 : (13 : ℕ) * a.gcd b * M ≤ a * M.Uses library
Nat.mul_le_mul_right.Lean, line 106
have h2 := Nat.mul_le_mul_right M h
targets/erdos-402/nodes/variant-9724698e/Proof.lean, line 106 at
9732d83fda9e↗s26.h3havex.gcd y * (13 : ℕ) * (27720 : ℕ) ≤ x * (27720 : ℕ)routine: nlinarithLeaves
x.gcd y * (13 : ℕ) ≤ x, withh3 : x.gcd y * (13 : ℕ) * (27720 : ℕ) ≤ x * (27720 : ℕ).Lean, line 107
have h3 : x.gcd y * 13 * 27720 ≤ x * 27720 := by nlinarith
targets/erdos-402/nodes/variant-9724698e/Proof.lean, line 107 at
9732d83fda9e↗
s27caseLeaves
∃ a ∈ A, ∃ b ∈ A, (↑(a.gcd b) : ℚ) ≤ (↑a : ℚ) / (↑A.card : ℚ).Uses library
Exists.introExistential introduction. ,Nat.gcd_comm,Nat.le_of_mul_le_mul_right.Lean, lines 109–113
· refine ⟨y, hyA, x, hxA, key y x ?_⟩ rw [hn, Nat.gcd_comm] have h2 := Nat.mul_le_mul_right M h have h3 : x.gcd y * 13 * 27720 ≤ y * 27720 := by nlinarith exact Nat.le_of_mul_le_mul_right h3 (by norm_num)targets/erdos-402/nodes/variant-9724698e/Proof.lean, lines 109–113 at
9732d83fda9e↗s27.h2have(13 : ℕ) * a.gcd b * M ≤ b * MLeaves
x.gcd y * (13 : ℕ) ≤ y, withh2 : (13 : ℕ) * a.gcd b * M ≤ b * M.Uses library
Nat.mul_le_mul_right.Lean, line 111
have h2 := Nat.mul_le_mul_right M h
targets/erdos-402/nodes/variant-9724698e/Proof.lean, line 111 at
9732d83fda9e↗s27.h3havex.gcd y * (13 : ℕ) * (27720 : ℕ) ≤ y * (27720 : ℕ)routine: nlinarithLeaves
x.gcd y * (13 : ℕ) ≤ y, withh3 : x.gcd y * (13 : ℕ) * (27720 : ℕ) ≤ y * (27720 : ℕ).Lean, line 112
have h3 : x.gcd y * 13 * 27720 ≤ y * 27720 := by nlinarith
targets/erdos-402/nodes/variant-9724698e/Proof.lean, line 112 at
9732d83fda9e↗
The proof in Lean (Proof.lean)
Checked by the kernel — these bytes are the ones its attestation names: attestations/000304.json, merge commit 9732d83fda9e.
artifact_hash of the attestation below, so these are the bytes the gate checked. Rendered from targets/erdos-402/nodes/variant-9724698e/Proof.lean, sha256 895d575caea1.import Mathlib
import Nodes.«variant-9724698e».Context
/-! Graham's gcd conjecture (Erdős problem 402) for thirteen-element sets. Let M be the largest
element. If some x has gcd(M, x) ≤ M/13 the pair (M, x) works; otherwise each of the other twelve
elements is x = (j/k)·M with 1 ≤ j < k ≤ 12, so v(x) = 27720·x/M (27720 = lcm(1..12)) is one of 45
integers. Those 45 values split into 11 classes in each of which any two distinct values c, d have
13·gcd(c, d) ≤ c or ≤ d. Twelve elements in eleven classes put two in one class, and
gcd(x, y)·27720 = gcd(v(x), v(y))·M carries the bound back to x and y. -/
theorem Opn.erdos_402_card_thirteen :
∀ (A : Finset ℕ), 0 ∉ A → A.card = 13 → ∃ a ∈ A, ∃ b ∈ A, a.gcd b ≤ (a / A.card : ℚ) := by
intro A hA hn
have hpos : 0 < A.card := by omega
have hne : A.Nonempty := Finset.card_pos.mp hpos
have key : ∀ a b : ℕ, a.gcd b * A.card ≤ a → (a.gcd b : ℚ) ≤ (a / A.card : ℚ) := by
intro a b h
rw [le_div_iff₀ (by exact_mod_cast hpos)]
exact_mod_cast h
obtain ⟨M, hMdef⟩ : ∃ M, M = A.max' hne := ⟨_, rfl⟩
have hM : M ∈ A := by rw [hMdef]; exact Finset.max'_mem A hne
have hle : ∀ x ∈ A, x ≤ M := by
intro x hx
rw [hMdef]
exact Finset.le_max' A x hx
have hMpos : 0 < M := Nat.pos_of_ne_zero (fun h => hA (h ▸ hM))
by_cases hw : ∃ x ∈ A, M.gcd x * 13 ≤ M
· obtain ⟨x, hx, h⟩ := hw
exact ⟨M, hM, x, hx, key M x (by rw [hn]; exact h)⟩
push Not at hw
obtain ⟨S, hS⟩ : ∃ S : List ℕ, S = [2310, 2520, 2772, 3080, 3465, 3960, 4620, 5040, 5544, 6160, 6930, 7560, 7920, 8316, 9240, 10080, 10395, 11088, 11550, 11880, 12320, 12600, 13860, 15120, 15400, 15840, 16170, 16632, 17325, 17640, 18480, 19404, 19800, 20160, 20790, 21560, 22176, 22680, 23100, 23760, 24255, 24640, 24948, 25200, 25410] := ⟨_, rfl⟩
obtain ⟨C, hC⟩ : ∃ C : List (List ℕ), C = [[13860, 17640, 24640], [9240, 15120, 17325, 24948], [6930, 15400, 22176, 22680, 23760], [3465, 7560, 18480, 19404, 19800], [4620, 12600, 15840, 16632, 21560], [3960, 11088, 20160, 20790], [2310, 5040, 8316, 12320, 24255], [5544, 10080, 11550, 11880], [2520, 6160, 10395, 23100], [2772, 7920, 16170, 25200], [3080, 25410]] := ⟨_, rfl⟩
have P1 : ∀ k, k < 13 → ∀ j, j < k → 0 < j → k ∣ 27720 ∧ 27720 / k * j ∈ S := by
subst hS
decide
have P3 : ∀ a ∈ S, C.findIdx (fun l => l.contains a) < 11 ∧
a ∈ C.getD (C.findIdx (fun l => l.contains a)) [] := by
subst hS hC
decide
have P2 : ∀ i, i < 11 → ∀ a ∈ C.getD i [], ∀ b ∈ C.getD i [], a ≠ b →
13 * a.gcd b ≤ a ∨ 13 * a.gcd b ≤ b := by
subst hC
decide
have forms : ∀ x ∈ A.erase M, ∃ a ∈ S, 27720 * x = a * M := by
intro x hx
rw [Finset.mem_erase] at hx
have hxpos : 0 < x := Nat.pos_of_ne_zero (fun h => hA (h ▸ hx.2))
have hlt : x < M := lt_of_le_of_ne (hle x hx.2) hx.1
have hg := hw x hx.2
have hd1 := Nat.gcd_dvd_left M x
have hd2 := Nat.gcd_dvd_right M x
have hgpos : 0 < M.gcd x := Nat.gcd_pos_of_pos_right _ hxpos
generalize M.gcd x = g at hg hd1 hd2 hgpos
obtain ⟨k, hk⟩ := hd1
obtain ⟨j, hj⟩ := hd2
have hk13 : k < 13 := by
by_contra hh
push Not at hh
have := Nat.mul_le_mul_left g hh
omega
have hjk : j < k := by
by_contra hh
push Not at hh
have := Nat.mul_le_mul_left g hh
omega
have hj1 : 0 < j := by
rcases Nat.eq_zero_or_pos j with h | h
· subst h
omega
· exact h
obtain ⟨hdvd, hmem⟩ := P1 k hk13 j hjk hj1
refine ⟨27720 / k * j, hmem, ?_⟩
obtain ⟨q, hq⟩ := hdvd
have hkpos : 0 < k := by omega
rw [hq, Nat.mul_div_cancel_left q hkpos, hk, hj]
ring
have hcard : (A.erase M).card = 12 := by
rw [Finset.card_erase_of_mem hM, hn]
have hmaps : ∀ x ∈ A.erase M, C.findIdx (fun l => l.contains (27720 * x / M)) ∈ Finset.range 11 := by
intro x hx
obtain ⟨a, ha, hax⟩ := forms x hx
rw [Finset.mem_range, hax, Nat.mul_div_cancel _ hMpos]
exact (P3 a ha).1
obtain ⟨x, hx, y, hy, hxy, hc⟩ :=
Finset.exists_ne_map_eq_of_card_lt_of_maps_to (by rw [hcard, Finset.card_range]; norm_num) hmaps
obtain ⟨a, ha, hax⟩ := forms x hx
obtain ⟨b, hb, hby⟩ := forms y hy
simp only [hax, hby, Nat.mul_div_cancel _ hMpos] at hc
have hab : a ≠ b := by
intro h
subst h
apply hxy
omega
obtain ⟨hi, hai⟩ := P3 a ha
obtain ⟨_, hbi⟩ := P3 b hb
rw [← hc] at hbi
have hgcd : a.gcd b * M = 27720 * x.gcd y := by
have h1 : Nat.gcd (27720 * x) (27720 * y) = 27720 * x.gcd y := Nat.gcd_mul_left 27720 x y
rw [hax, hby, Nat.gcd_mul_right] at h1
exact h1
have hxA := (Finset.mem_erase.mp hx).2
have hyA := (Finset.mem_erase.mp hy).2
rcases P2 _ hi a hai b hbi hab with h | h
· refine ⟨x, hxA, y, hyA, key x y ?_⟩
rw [hn]
have h2 := Nat.mul_le_mul_right M h
have h3 : x.gcd y * 13 * 27720 ≤ x * 27720 := by nlinarith
exact Nat.le_of_mul_le_mul_right h3 (by norm_num)
· refine ⟨y, hyA, x, hxA, key y x ?_⟩
rw [hn, Nat.gcd_comm]
have h2 := Nat.mul_le_mul_right M h
have h3 : x.gcd y * 13 * 27720 ≤ y * 27720 := by nlinarith
exact Nat.le_of_mul_le_mul_right h3 (by norm_num)What is known
Work on it
No explainer yet. This proof written as a journal would print it, labelled unverified, is the next thing a writer could add, by pull request (D-3, D-36; the guide shows how).
How to contribute → · Pull requests in flight ↗ · See it in the problem’s graph →
Record
Statement: the Lean file and its words (1 version)
Statement not audited — only a problem’s root statement is audited for fidelity (D-9); the kernel checks a proof against this Lean as written.
import Mathlib
import Nodes.«variant-9724698e».Context
/-! Graham's gcd conjecture (Erdős problem 402) for thirteen-element sets. Let M be the largest
element. If some x has gcd(M, x) ≤ M/13 the pair (M, x) works; otherwise each of the other twelve
elements is x = (j/k)·M with 1 ≤ j < k ≤ 12, so v(x) = 27720·x/M (27720 = lcm(1..12)) is one of 45
integers. Those 45 values split into 11 classes in each of which any two distinct values c, d have
13·gcd(c, d) ≤ c or ≤ d. Twelve elements in eleven classes put two in one class, and
gcd(x, y)·27720 = gcd(v(x), v(y))·M carries the bound back to x and y. -/
theorem Opn.erdos_402_card_thirteen :
∀ (A : Finset ℕ), 0 ∉ A → A.card = 13 → ∃ a ∈ A, ∃ b ∈ A, a.gcd b ≤ (a / A.card : ℚ) := by
sorryA statement is written := by sorry: the sorry holds the place of a proof, because a statement file only says what is claimed. A proof the gate checked is its own file, Proof.lean. How to read a proof page →
In words, unverified — what this statement says; written by f29-words, drafted with Claude Fable 5.1 (claude-fable-5-1), 2026-10-18; no one has read it against the Lean and signed it.
Draft · drafted, by the model named above
$\displaystyle \forall A \subset \mathbb{N}\ \text{finite}:\ 0 \notin A,\ |A| = 13 \Rightarrow \exists\, a, b \in A:\ \gcd(a,b) \le \frac{a}{|A|}$
Every set A of exactly thirteen positive integers has a, b ∈ A (possibly equal) with gcd(a, b) ≤ a/|A|. The division is in ℚ.
Rendered from gloss/98d1dea5de03….md · Improve these words →
Rendered from targets/erdos-402/nodes/variant-9724698e/Statement.lean. Origin: variant (partial).
Attestation: pass, 7 of 7 checks
Checked by the kernel — the gate’s record of the run: attestations/000304.json, merge commit 9732d83fda9e.
Verdict pass, from attestations/000304.json.
- Submitter
t0929-5- Toolchain
- leanprover/lean4:v4.33.1 (hash
f54d0bc916bf76a7fae460ce9d078ccd1f74aeb4fd12c4b6546bca28b6aa1c63) - Mathlib
- 0df444a360eaa60ab8c11dca51a86af692955474
- Reviewer
- none needed (calibration)
| Step | Check | Result |
|---|---|---|
| 1 | toolchain | pass |
| 2 | paths | pass |
| 4 | kernel-replay | pass |
| 5 | axioms | pass |
| 6 | hazards | pass |
| 7 | witness | pass |
| 8 | deps | pass |
Witness
Checked by the kernel — step 7 passed in the run its attestation records: attestations/000304.json, merge commit 9732d83fda9e.
219526a7d17d.import Mathlib theorem witness : ∃ A : Finset ℕ, 0 ∉ A ∧ A.card = 13 := ⟨Finset.Icc 1 13, by simp, by simp⟩
No gloss yet: no one has written in words what this witness says (D-3 v3.30); the Lean above is the witness. How to write one →
Relation to the problem’s statement
Checked by the kernel — checked at admission (D-30); no proof of the node is implied.
cfbce74fb04c.-- relation: partial
import Mathlib
theorem relation :
(∀ (A : Finset ℕ), 0 ∉ A → A.Nonempty → ∃ᵉ (a ∈ A) (b ∈ A), a.gcd b ≤ (a / A.card : ℚ)) →
(∀ (A : Finset ℕ), 0 ∉ A → A.card = 13 → ∃ a ∈ A, ∃ b ∈ A, a.gcd b ≤ (a / A.card : ℚ)) :=
fun h A hA hn => h A hA (Finset.card_pos.mp (by omega))No gloss yet: no one has written in words what this relation says (D-3 v3.30); the Lean above is the relation. How to write one →
Acknowledged findings (1)
Untrusted contributor text — the prover’s justification for a finding.
Untrusted: acknowledgment of a div-zero finding at ↑a / ↑A.card
A.card = 13 is a hypothesis, so the rational division is by 13, never by zero.