Project Euler – Problem 41 Solution


We shall say that an n-digit number is pandigital if it makes use of all the digits 1 to n exactly once. For example, 2143 is a 4-digit pandigital and is also prime.

What is the largest n-digit pandigital prime that exists?


let rec distribute e = function
    | [] -> [[e]]
    | x::xs' as xs -> (e::xs)::[for xs in distribute e xs' -> x::xs]
let rec permute = function
    | [] -> [[]]
    | e::xs -> List.collect (distribute e) (permute xs)

let hasDivisor(n) =
    let upperBound = int64(sqrt(double(n)))
    [2L..upperBound] |> Seq.exists (fun x -> n % x = 0L)
let isPrime(n) = if n = 1L then false else not(hasDivisor(n))

let answer =
    |> List.collect (fun m -> [1..m] |> permute)
    |> (fun l -> l |> string |> List.reduce (fun acc item -> acc + item))
    |> int64
    |> List.filter isPrime
    |> List.max

This is a simple brute force solution which for n = 1..9 generates all permutations of 1..n, for each permutation the digits are merged into a number, e.g. [1; 4; 8; 7] –> 1487, and the max prime number is returned.

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.