11import 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
3325example : isMultiplyPrime 5 = false := by native_decide
3426example : isMultiplyPrime 30 = true := by native_decide
@@ -38,12 +30,13 @@ example : isMultiplyPrime 125 = true := by native_decide
3830example : isMultiplyPrime (3 * 5 * 7 ) = true := by native_decide
3931example : isMultiplyPrime (3 * 6 * 7 ) = false := by native_decide
4032example : 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
4237def 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-
4740def 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