Skip to content

Commit 32018d0

Browse files
committed
Results on relative primes
1 parent d90b44b commit 32018d0

File tree

1 file changed

+60
-17
lines changed

1 file changed

+60
-17
lines changed

HumanEvalLean/HumanEval96.lean

Lines changed: 60 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -3,37 +3,69 @@ import HumanEvalLean.ProvedElsewhere
33

44
set_option grind.warning false
55

6-
def Nat.Prime (p : Nat) : Prop := 2 ≤ p ∧ ∀ (m : Nat), m < p → 2 ≤ m → ¬ m ∣ p
6+
theorem Nat.dvd_def (n m : Nat) : n ∣ m ↔ ∃ c, m = n * c := by rfl
77

8-
def Nat.relativePrime (p n : Nat) : Prop := 2 ≤ p ∧ ∀ (m : Nat), m < p → m < n → 2 ≤ m → ¬ m ∣ p
8+
theorem Nat.not_dvd_of_lt_and_pos (n m : Nat) (h : n < m) (h' : 0 < n): ¬ m ∣ n := by
9+
simp [Nat.dvd_def]
10+
intro x
11+
cases x with
12+
| zero => grind
13+
| succ y =>
14+
have : m * (y + 1) = m*y + m := by rfl
15+
grind
16+
17+
def Nat.Prime (p : Nat) : Prop := 2 ≤ p ∧ ∀ (m : Nat), 2 ≤ m → m ≠ p → ¬ m ∣ p
18+
19+
def Nat.Prime_ge_2 (p : Nat) (hp : Nat.Prime p) : 2 ≤ p := by
20+
simp [Nat.Prime] at hp
21+
grind
22+
23+
def Nat.relativePrime (p n : Nat) : Prop := 2 ≤ p ∧ ∀ (m : Nat), m < n → 2 ≤ m → m ≠ p → ¬ m ∣ p
924

1025
theorem Nat.relativePrimeTo2 (p : Nat) (hp : 2 ≤ p) : Nat.relativePrime p 2 := by
1126
simp [Nat.relativePrime, hp]
1227
grind
1328

1429
theorem Nat.relativePrime_succ (p n : Nat) (hn₁ : 2 ≤ n) :
15-
Nat.relativePrime p n ∧ p % n 0 ↔ Nat.relativePrime p (n + 1) := by
30+
Nat.relativePrime p n ∧ (¬ n ∣ p ∨ n = p) ↔ Nat.relativePrime p (n + 1) := by
1631
simp [relativePrime]
1732
constructor
1833
· intro h
1934
rcases h with ⟨h₁, h₃⟩
2035
rcases h₁ with ⟨h₁, h₂⟩
2136
apply And.intro h₁
22-
intro m hmp hmn h2m
37+
intro m hmn h2m hmp
2338
have : m < n ∨ m = n := by grind
2439
cases this with
2540
| inl h' =>
26-
apply h₂ m hmp h' h2m
41+
apply h₂ m h' h2m hmp
2742
| inr h' =>
28-
simp [h', Nat.dvd_iff_mod_eq_zero, h₃]
43+
grind
2944
· intro h
3045
rcases h with ⟨h₁, h₂⟩
3146
constructor
3247
· apply And.intro h₁
33-
intro m hmp hmn h2m
34-
apply h₂ m hmp (by omega) h2m
35-
· rw [← Nat.dvd_iff_mod_eq_zero]
36-
sorry
48+
intro m hmn h2m hmp
49+
apply h₂ m (by omega) h2m hmp
50+
· by_cases h: n = p
51+
· simp [h]
52+
· simp [h]
53+
apply h₂ _ (by omega) hn₁ h
54+
55+
theorem Nat.prime_iff_relative_prime_of_le (p n : Nat) (h : p ≤ n) :
56+
Nat.Prime p ↔ Nat.relativePrime p n := by
57+
simp only [Prime, relativePrime]
58+
constructor
59+
· grind
60+
· intro h'
61+
rcases h' with ⟨h₁, h₂⟩
62+
apply And.intro h₁
63+
intro m h2m hmp
64+
by_cases h' : m < p
65+
· grind
66+
· apply not_dvd_of_lt_and_pos
67+
· grind
68+
· grind
3769

3870
def fillSieve (n : Nat) : Std.HashSet Nat := Std.HashSet.ofList (List.range' 2 (n-2))
3971

@@ -62,25 +94,36 @@ theorem mem_eratosthenes_sieve_iff_prime_and_less_than (n m : Nat) :
6294
m ∈ eratosthenes_sieve n ↔ m.Prime ∧ m < n := by
6395
simp only [eratosthenes_sieve]
6496
split
65-
· admit
97+
· simp
98+
intro h
99+
have := Nat.Prime_ge_2 m h
100+
grind
66101
· simp only [List.mem_mergeSort, Std.HashSet.mem_toList]
67-
suffices ∀ (n curr : Nat) (sieve : Std.HashSet Nat), (∀ (k : Nat), 2 ≤ k → (k ∈ sieve ↔ Nat.relativePrime k curr ∧ k < n)) → curr ≤ n →
102+
suffices ∀ (n curr : Nat) (sieve : Std.HashSet Nat), (∀ (k : Nat), (k ∈ sieve ↔ Nat.relativePrime k curr ∧ k < n)) → curr ≤ n →
68103
(m ∈ eratosthenes_sieve.go n sieve curr ↔ m.Prime ∧ m < n) by
69104
apply this n 2 (fillSieve n)
70-
· intro k hk
71-
simp [mem_fillSieve, Nat.relativePrimeTo2, hk]
105+
· intro k
106+
simp only [mem_fillSieve, ge_iff_le, Nat.relativePrime]
107+
grind
72108
· omega
73109
intro n curr sieve h₁ h₂
74110
fun_induction eratosthenes_sieve.go with
75111
| case1 sieve curr h₄ h₅ ih =>
76112
unfold eratosthenes_sieve.go
77-
sorry
113+
simp [h₄, h₅]
114+
simp at ih
115+
apply ih
116+
· simp [Std.HashSet.get_eq]
117+
admit
118+
· grind
78119
| case2 sieve curr h₄ h₅ ih =>
79120
sorry
80121
| case3 sieve curr h =>
81122
unfold eratosthenes_sieve.go
82-
simp [h]
83-
sorry
123+
simp [h, h₁]
124+
intro hmn
125+
rw [Nat.prime_iff_relative_prime_of_le m curr]
126+
grind
84127

85128
theorem testCase1 : eratosthenes_sieve 5 = [2, 3] := by native_decide
86129
theorem testCase2 : eratosthenes_sieve 6 = [2, 3, 5] := by native_decide

0 commit comments

Comments
 (0)