Skip to content

Commit 62707fe

Browse files
committed
Shorten 24 proof
1 parent cb593b8 commit 62707fe

File tree

1 file changed

+20
-48
lines changed

1 file changed

+20
-48
lines changed

HumanEvalLean/HumanEval24.lean

Lines changed: 20 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -57,8 +57,9 @@ theorem Nat.lt_mul_iff {a b : Nat} : a < a * b ↔ 0 < a ∧ 1 < b := by
5757
· simp
5858
· simp [ha]
5959

60-
theorem helper {n i : Nat} (hn : 1 < n) (h : ∀ j, 2 ≤ j → j < i → n % j ≠ 0) (hi : n % i = 0)
61-
(k : Nat) (hk : n / i < k) (hk₁ : k < n) : n % k ≠ 0 := by
60+
theorem mod_ne_zero_of_forall_of_div_lt {n i : Nat} (hn : 1 < n)
61+
(h : ∀ j, 2 ≤ j → j < i → n % j ≠ 0) (hi : n % i = 0) (k : Nat) (hk : n / i < k) (hk₁ : k < n) :
62+
n % k ≠ 0 := by
6263
intro hk₂
6364
obtain ⟨d, rfl⟩ := Nat.dvd_of_mod_eq_zero hk₂
6465
rw [Nat.lt_mul_iff] at hk₁
@@ -72,8 +73,9 @@ theorem helper {n i : Nat} (hn : 1 < n) (h : ∀ j, 2 ≤ j → j < i → n % j
7273
· rw [Nat.div_lt_iff_lt_mul hi₀] at hk
7374
exact Nat.lt_of_mul_lt_mul_left hk
7475

75-
theorem similar_helper {n : Nat} (hn : 1 < n) (h : ∀ j, 2 ≤ j → j * j ≤ n → n % j ≠ 0)
76-
(k : Nat) (hk : n < k * k) (hk₁ : k < n) : n % k ≠ 0 := by
76+
theorem mod_ne_zero_of_forall_of_lt_mul_self {n : Nat} (hn : 1 < n)
77+
(h : ∀ j, 2 ≤ j → j * j ≤ n → n % j ≠ 0) (k : Nat) (hk : n < k * k) (hk₁ : k < n) :
78+
n % k ≠ 0 := by
7779
intro hk₂
7880
obtain ⟨d, rfl⟩ := Nat.dvd_of_mod_eq_zero hk₂
7981
rw [Nat.lt_mul_iff] at hk₁
@@ -82,53 +84,23 @@ theorem similar_helper {n : Nat} (hn : 1 < n) (h : ∀ j, 2 ≤ j → j * j ≤
8284
· refine Nat.mul_le_mul_right _ (Nat.le_of_lt ?_)
8385
exact Nat.lt_of_mul_lt_mul_left hk
8486

85-
theorem largestDivisorSpec_iff {n i : Nat} (hn : 1 < n) :
86-
LargestDivisorSpec n i ↔ i < n ∧ n % i = 0 ∧ ∀ j, j < n → n % j = 0 → j ≤ i := by
87-
constructor
88-
· rintro (h|h)
89-
· refine ⟨hn, Nat.mod_one _, fun j hj hj₁ => Nat.not_lt.1 (fun hj₂ => ?_)⟩
90-
by_cases hj₃ : j * j ≤ n
91-
· exact h j (by omega) hj₃ hj₁
92-
· exact similar_helper hn h j (by omega) hj hj₁
93-
· rename_i i hi hi'
94-
refine ⟨?_, ?_, fun j hj hj₁ => ?_⟩
95-
· apply Nat.div_lt_self <;> omega
96-
· exact Nat.mod_eq_zero_of_dvd (Nat.div_dvd_of_dvd (Nat.dvd_of_mod_eq_zero hi'))
97-
· exact Nat.not_lt.1 (fun hj₂ => helper hn h hi' j hj₂ hj hj₁)
98-
· rintro ⟨hi₁, hi₂, hi₃⟩
99-
obtain (h|rfl|h) := Nat.lt_trichotomy i 1
100-
· obtain rfl : i = 0 := by omega
101-
omega
102-
· refine LargestDivisorSpec.one (fun j hj hj₁ hj₂ => absurd (hi₃ j ?_ hj₂) (by omega))
103-
exact Nat.lt_of_lt_of_le (Nat.lt_mul_self_iff.2 (by omega)) hj₁
104-
· obtain ⟨d, rfl⟩ := Nat.dvd_of_mod_eq_zero hi₂
105-
have hd : 0 < d := Nat.pos_iff_ne_zero.2 (fun hd => by simp [hd] at hn)
106-
rw (occs := [2]) [← Nat.mul_div_cancel (m := i) (n := d) hd]
107-
refine LargestDivisorSpec.div ?_ ?_ (by simp)
108-
· intro j hj₁ hj₂ hj₃
109-
have : ¬ i * d / j ≤ i := by
110-
rw [Nat.not_le, Nat.lt_div_iff_mul_lt_of_dvd (by omega) (Nat.dvd_of_mod_eq_zero hj₃)]
111-
exact Nat.mul_lt_mul_of_pos_left hj₂ (by omega)
112-
refine absurd (hi₃ _ ?_ ?_) this
113-
· apply Nat.div_lt_self (by omega) (by omega)
114-
· exact Nat.mod_eq_zero_of_dvd (Nat.div_dvd_of_dvd (Nat.dvd_of_mod_eq_zero hj₃))
115-
· rw [Nat.lt_mul_iff] at hi₁
116-
omega
117-
118-
theorem largestDivisorSpec_unique {n i k : Nat} (hn : 1 < n)
119-
(hi : LargestDivisorSpec n i) (hk : LargestDivisorSpec n k) : i = k := by
120-
simp only [largestDivisorSpec_iff hn] at hi hk
121-
apply Nat.le_antisymm
122-
· apply hk.2.2 _ hi.1 hi.2.1
123-
· apply hi.2.2 _ hk.1 hk.2.1
87+
theorem largestDivisorSpec.out {n i : Nat} (hn : 1 < n) :
88+
LargestDivisorSpec n i → i < n ∧ n % i = 0 ∧ ∀ j, j < n → n % j = 0 → j ≤ i := by
89+
rintro (h|h)
90+
· refine ⟨hn, Nat.mod_one _, fun j hj hj₁ => Nat.not_lt.1 (fun hj₂ => ?_)⟩
91+
by_cases hj₃ : j * j ≤ n
92+
· exact h j (by omega) hj₃ hj₁
93+
· exact mod_ne_zero_of_forall_of_lt_mul_self hn h j (by omega) hj hj₁
94+
· rename_i i hi hi'
95+
refine ⟨?_, ?_, fun j hj hj₁ => ?_⟩
96+
· apply Nat.div_lt_self <;> omega
97+
· exact Nat.mod_eq_zero_of_dvd (Nat.div_dvd_of_dvd (Nat.dvd_of_mod_eq_zero hi'))
98+
· exact Nat.not_lt.1 (fun hj₂ => mod_ne_zero_of_forall_of_div_lt hn h hi' j hj₂ hj hj₁)
12499

125100
theorem largestDivisor_eq_iff {n i : Nat} (hn : 1 < n) :
126101
largestDivisor n = i ↔ i < n ∧ n % i = 0 ∧ ∀ j, j < n → n % j = 0 → j ≤ i := by
127-
rw [← largestDivisorSpec_iff hn]
128-
refine ⟨?_, fun hi => ?_⟩
129-
· rintro rfl
130-
apply largestDivisorSpec_largestDivisor
131-
· apply largestDivisorSpec_unique hn largestDivisorSpec_largestDivisor hi
102+
have h := largestDivisorSpec.out hn (by exact largestDivisorSpec_largestDivisor)
103+
exact ⟨fun h' => h' ▸ h, fun hi => Nat.le_antisymm (hi.2.2 _ h.1 h.2.1) (h.2.2 _ hi.1 hi.2.1)⟩
132104

133105
/-!
134106
## Prompt

0 commit comments

Comments
 (0)