Skip to content

Commit 684f35a

Browse files
committed
Simplify algorithm:
- Find smallest prime 3 times and check that it was enough
1 parent d43470f commit 684f35a

File tree

1 file changed

+22
-29
lines changed

1 file changed

+22
-29
lines changed

HumanEvalLean/HumanEval75.lean

Lines changed: 22 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -1,34 +1,26 @@
11
import Std.Tactic.Do
22

3-
def isPrime (n : Nat) : Bool := Id.run do
4-
let mut i := 2
5-
while i * i ≤ n do
3+
def smallestPrimeFactor (n : Nat) : Nat := Id.run do
4+
for i in [2:n] do
5+
if i * i > n then
6+
break
67
if i ∣ n then
8+
return i
9+
n
10+
11+
def isMultiplyPrime (a : Nat) : Bool := Id.run do
12+
let mut primes := (∅ : Array Nat)
13+
let mut a := a
14+
for _ in [0:3] do
15+
16+
if a ≤ 1 then
717
return false
8-
else
9-
i := i + 1
10-
return 1 < n
11-
12-
def isMultipleOf2Primes (a : Nat) : Bool := Id.run do
13-
let mut i := 2
14-
while i * i ≤ a do
15-
if i ∣ a then
16-
return isPrime (a / i)
17-
else
18-
i := i + 1
19-
return false
20-
21-
def isMultipleOf3Primes (a : Nat) : Bool := Id.run do
22-
let mut i := 2
23-
while i * i * i ≤ a do
24-
if i ∣ a then
25-
return isMultipleOf2Primes (a / i)
26-
else
27-
i := i + 1
28-
return false
29-
30-
def isMultiplyPrime (a : Nat) : Bool :=
31-
isMultipleOf3Primes a
18+
19+
let p := smallestPrimeFactor a
20+
a := a / p
21+
primes := primes.push p
22+
23+
primes.size == 3 && a == 1
3224

3325
example : isMultiplyPrime 5 = false := by native_decide
3426
example : isMultiplyPrime 30 = true := by native_decide
@@ -38,12 +30,13 @@ example : isMultiplyPrime 125 = true := by native_decide
3830
example : isMultiplyPrime (3 * 5 * 7) = true := by native_decide
3931
example : isMultiplyPrime (3 * 6 * 7) = false := by native_decide
4032
example : isMultiplyPrime (9 * 9 * 9) = false := by native_decide
33+
example : isMultiplyPrime (11 * 9 * 9) = false := by native_decide
34+
example : isMultiplyPrime (11 * 13 * 7) = true := by native_decide
35+
4136

4237
def Nat.IsPrime (n : Nat) : Prop :=
4338
n > 1 ∧ ∀ m, m ∣ n → m = 1 ∨ m = n
4439

45-
theorem isPrime_is_correct (n : Nat) : isPrime n ↔ Nat.IsPrime n := by sorry
46-
4740
def IsMultiplyPrimeIff (solution : Nat → Bool) : Prop :=
4841
(a : Nat) → solution a ↔ ∃ (p₁ p₂ p₃ : Nat), p₁ * p₂ * p₃ = a ∧ Nat.IsPrime p₁ ∧ Nat.IsPrime p₂ ∧ Nat.IsPrime p₃
4942

0 commit comments

Comments
 (0)