Skip to content

Commit 66d2aa5

Browse files
author
oxe-i
committed
add nth-prime
1 parent ca90bbf commit 66d2aa5

File tree

13 files changed

+432
-0
lines changed

13 files changed

+432
-0
lines changed

config.json

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,14 @@
117117
"practices": [],
118118
"prerequisites": [],
119119
"difficulty": 4
120+
},
121+
{
122+
"slug": "nth-prime",
123+
"name": "Nth Prime",
124+
"uuid": "5ff6afa5-aaca-4cdb-84cf-844f4ef64591",
125+
"practices": [],
126+
"prerequisites": [],
127+
"difficulty": 5
120128
}
121129
]
122130
},
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
# Instructions
2+
3+
Given a number n, determine what the nth prime is.
4+
5+
By listing the first six prime numbers: 2, 3, 5, 7, 11, and 13, we can see that the 6th prime is 13.
6+
7+
If your language provides methods in the standard library to deal with prime numbers, pretend they don't exist and implement them yourself.
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
namespace NthPrime
2+
3+
def updateTable (index : Nat) (increment : Nat) (table : Array Bool) : Array Bool :=
4+
if positiveIncrement : increment > 0 then
5+
if validIndex : index < table.size then
6+
updateTable (index + increment) increment (table.set index false)
7+
else table
8+
else table
9+
10+
def prime' (remaining : Nat) (index : Nat) (table : Array Bool) : Option Nat :=
11+
if valuesLeft : remaining > 0 then
12+
if validIndex : index < table.size then
13+
if table[index] then
14+
if remaining == 1 then some index
15+
else prime' (remaining - 1) (index + 1) (updateTable (index * index) index table)
16+
else prime' remaining (index + 1) table
17+
else none
18+
else none
19+
20+
def prime (n : Nat) : Option Nat :=
21+
let logn := n.log2
22+
let loglogn := logn.log2
23+
let upperBound := n * (logn + loglogn) + 3
24+
let firstPrime := 2
25+
prime' n firstPrime (Array.replicate upperBound true)
26+
27+
end NthPrime
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
{
2+
"authors": [
3+
"oxe-i"
4+
],
5+
"files": {
6+
"solution": [
7+
"NthPrime.lean"
8+
],
9+
"test": [
10+
"NthPrimeTest.lean"
11+
],
12+
"example": [
13+
".meta/Example.lean"
14+
]
15+
},
16+
"blurb": "Given a number n, determine what the nth prime is.",
17+
"source": "A variation on Problem 7 at Project Euler",
18+
"source_url": "https://projecteuler.net/problem=7"
19+
}
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
# This is an auto-generated file.
2+
#
3+
# Regenerating this file via `configlet sync` will:
4+
# - Recreate every `description` key/value pair
5+
# - Recreate every `reimplements` key/value pair, where they exist in problem-specifications
6+
# - Remove any `include = true` key/value pair (an omitted `include` key implies inclusion)
7+
# - Preserve any other key/value pair
8+
#
9+
# As user-added comments (using the # character) will be removed when this file
10+
# is regenerated, comments can be added via a `comment` key.
11+
12+
[75c65189-8aef-471a-81de-0a90c728160c]
13+
description = "first prime"
14+
15+
[2c38804c-295f-4701-b728-56dea34fd1a0]
16+
description = "second prime"
17+
18+
[56692534-781e-4e8c-b1f9-3e82c1640259]
19+
description = "sixth prime"
20+
21+
[fce1e979-0edb-412d-93aa-2c744e8f50ff]
22+
description = "big prime"
23+
24+
[bd0a9eae-6df7-485b-a144-80e13c7d55b2]
25+
description = "there is no zeroth prime"
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
namespace NthPrime
2+
3+
def prime (n : Nat) : Option Nat :=
4+
sorry
5+
6+
end NthPrime
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
import LeanTest
2+
import NthPrime
3+
4+
open LeanTest
5+
6+
def nthPrimeTests : TestSuite :=
7+
(TestSuite.empty "NthPrime")
8+
|>.addTest "first prime" (do
9+
return assertEqual (some 2) (NthPrime.prime 1))
10+
|>.addTest "second prime" (do
11+
return assertEqual (some 3) (NthPrime.prime 2))
12+
|>.addTest "sixth prime" (do
13+
return assertEqual (some 13) (NthPrime.prime 6))
14+
|>.addTest "big prime" (do
15+
return assertEqual (some 104743) (NthPrime.prime 10001))
16+
|>.addTest "there is no zeroth prime" (do
17+
return assertEqual none (NthPrime.prime 0))
18+
|>.addTest "very big prime" (do
19+
return assertEqual (some 821647) (NthPrime.prime 65537))
20+
21+
def main : IO UInt32 := do
22+
runTestSuitesWithExitCode [nthPrimeTests]
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
name = "nth-prime"
2+
version = "0.1.0"
3+
defaultTargets = ["NthPrimeTest"]
4+
testDriver = "NthPrimeTest"
5+
6+
[[lean_lib]]
7+
name = "LeanTest"
8+
srcDir = "vendor/LeanTest"
9+
10+
[[lean_lib]]
11+
name = "NthPrime"
12+
13+
[[lean_exe]]
14+
name = "NthPrimeTest"
15+
root = "NthPrimeTest"
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
leanprover/lean4:v4.25.2
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
-- This module serves as the root of the `LeanTest` library.
2+
-- Import modules here that should be built as part of the library.
3+
import LeanTest.Assertions
4+
import LeanTest.Test
5+
import LeanTest.Basic

0 commit comments

Comments
 (0)