@@ -3,37 +3,69 @@ import HumanEvalLean.ProvedElsewhere
33
44set_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
1025theorem Nat.relativePrimeTo2 (p : Nat) (hp : 2 ≤ p) : Nat.relativePrime p 2 := by
1126 simp [Nat.relativePrime, hp]
1227 grind
1328
1429theorem 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
3870def 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
85128theorem testCase1 : eratosthenes_sieve 5 = [2 , 3 ] := by native_decide
86129theorem testCase2 : eratosthenes_sieve 6 = [2 , 3 , 5 ] := by native_decide
0 commit comments