Yan Cui
I help clients go faster for less using serverless technologies.
This article is brought to you by
MongoDB 8.0 is here to change the game. Faster reads and inserts, and brand-new vector search to support modern AI-powered apps.
Problem
The first two consecutive numbers to have two distinct prime factors are:
14 = 2 x 7
15 = 3 x 5
The first three consecutive numbers to have three distinct prime factors are:
644 = 2² x 7 x 23
645 = 3 x 5 x 43
646 = 2 x 17 x 19
Find the first four consecutive integers to have four distinct primes factors. What is the first of these numbers?
Solution
let hasDivisor(n) = let upperBound = bigint(sqrt(double(n))) [2I..upperBound] |> Seq.exists (fun x -> n % x = 0I) let isPrime(n) = if n = 1I then false else not(hasDivisor(n)) let naturalNumbers = Seq.unfold (fun state -> Some(state, state+1I)) 1I // define the sequence of prime numbers let primeSeq = naturalNumbers |> Seq.filter isPrime |> Seq.cache // recursive function to find the prime denominators for a number n let rec getPrimeFactors denominators n = if n = 1I then denominators else let denominator = primeSeq |> Seq.filter (fun x -> n % x = 0I) |> Seq.head getPrimeFactors (denominators @ [denominator]) (n/denominator) // curry the getPrimeDenominators function to start with an empty list let primeFactors = getPrimeFactors [] // function to get the number of distinct prime factors a number has let distinctPrimeFactorsCount n = primeFactors n |> Seq.distinct |> Seq.length // define the sequence of numbers with exactly 4 distinct prime factors let seq = naturalNumbers |> Seq.filter (fun n -> distinctPrimeFactorsCount n = 4) |> Seq.cache let answer = seq |> Seq.windowed 4 |> Seq.filter (fun l -> Seq.max (l) - Seq.min (l) = 3I) |> Seq.head |> Seq.head
Whilst on the surface this isn’t a very difficult problem to solve, the biggest challenge I had was in making sure the solution runs in a reasonable time hence note the various places where I used Seq.cache to help improve the performance of this code.
Whenever you’re ready, here are 3 ways I can help you:
- Production-Ready Serverless: Join 20+ AWS Heroes & Community Builders and 1000+ other students in levelling up your serverless game. This is your one-stop shop for quickly levelling up your serverless skills.
- I help clients launch product ideas, improve their development processes and upskill their teams. If you’d like to work together, then let’s get in touch.
- Join my community on Discord, ask questions, and join the discussion on all things AWS and Serverless.