Project Euler – Problem 7 Solution

Problem

By listing the first six prime numbers: 2, 3, 5, 7, 11, and 13, we can see that the 6th prime is 13.

What is the 10001st prime number?

Solution

open System

let findFactorsOf(n) =
    let upperBound = int32(Math.Sqrt(double(n)))
    [2..upperBound]
    |> Seq.filter (fun x -> n % x = 0)

let isPrime(n) = findFactorsOf(n) |> Seq.length = 0
let primeNumbers = Seq.unfold (fun x -> Some(x, x + 1)) 2 |> Seq.filter isPrime
let p = primeNumbers |> Seq.nth(10000)

Here I borrowed the findFactors and isPrime functions I first used in the problem 3 solution, except this time they don’t have to be constrained to work int64 types.

The rest of the solution’s pretty straight forward too, to find the 10001st prime number I first need to generate the sequence of all prime numbers. I did so by using Seq.unfold to generate the list of all natural numbers equal or greater than 2 (the first prime number), coupled with the isPrime predicate:

let primeNumbers = Seq.unfold (fun x -> Some(x, x + 1)) 2 |> Seq.filter isPrime

With the sequence of all prime numbers at hand, Seq.nth is used to find the element at the index position 10000 (sequences are zero-indexed like arrays, so this is actually the 10001st element in the sequence) to get our answer!


Yan Cui

I’m an AWS Serverless Hero and the author of Production-Ready Serverless. I have run production workload at scale in AWS for nearly 10 years and I have been an architect or principal engineer with a variety of industries ranging from banking, e-commerce, sports streaming to mobile gaming. I currently work as an independent consultant focused on AWS and serverless.

You can contact me via Email, Twitter and LinkedIn.

Hire me.