Problem
The prime factors of 13195 are 5, 7, 13 and 29.
What is the largest prime factor of the number 600851475143 ?
Solution
open System
let findFactorsOf(n:int64) =
let upperBound = int64(Math.Sqrt(double(n)))
[2L..upperBound] |> Seq.filter (fun x -> n % x = 0L)
let isPrime(n:int64) = findFactorsOf(n) |> Seq.length = 0
let findMaxPrimeFactorOf(n:int64) =
let upperBound = int64(Math.Sqrt(double(n)))
[2L..upperBound]
|> Seq.filter (fun x -> n % x = 0L)
|> Seq.filter isPrime
|> Seq.max
let maxPrime = findMaxPrimeFactorOf(600851475143L)
As this solution requires a bit more work, I created two helper functions findFactorsOf and isPrime, and as you’ve probably noticed, I had explicitly declare that the value n should be a int64 type:
let findFactorsOf(n:int64)
That’s because the number 600851475143 in the problem is outside of the range of the int32 type so all the functions must be able to work with a int64 type. This is one of few cases where you can’t just rely on the type inference in F#.
Another thing you might have noticed is that the syntax for casting in F# is type(value), e.g.
int64(n)
as opposed to the syntax in C#:
(long)n
And did you notice that I used the Math.Sqrt method in my solution? That’s right, you can use any CLR types in F# just as you can in C#! In order to import a namespace in F#, you need to use the open keyword:
open System
which is equivalent to the using directive in C#:
using System




[…] 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 […]
[…] related problem, and I’ve borrowed the findFactorsOf and isPrime functions from the problem 3 solution […]
[…] then created a modified version of the findFactorsOf function I first used in the problem 3 solution to find ALL the factors of a number including 1 and […]