Project Euler — Problem 73 Solution

Problem

Con­sid­er the frac­tion, n/d, where n and d are pos­i­tive inte­gers. If n<d and HCF(n,d)=1, it is called a reduced prop­er frac­tion.

If we list the set of reduced prop­er frac­tions for d <= 8 in ascend­ing order of size, we get:

1/8, 1/7, 1/6, 1/5, 1/4, 2/7, 1/3, 3/8, 2/5, 3/7, 1/2, 4/7, 3/5, 5/8, 2/3, 5/7, 3/4, 4/5, 5/6, 6/7, 7/8

It can be seen that there are 3 frac­tions between 1/3 and 1/2.

How many frac­tions lie between 1/3 and 1/2 in the sort­ed set of reduced prop­er frac­tions for d ? 12,000?

Note: The upper lim­it has been changed recent­ly.

Solution

open System.Numerics

// for each d, get the number of proper fractions that lie between 1/3 and 1/2
let getFractionsCount d =
    [1I..d-1I]
    |> Seq.skipWhile (fun n -> n * 3I <= d)
    |> Seq.takeWhile (fun n -> n * 2I < d)
    |> Seq.filter (fun n -> BigInteger.GreatestCommonDivisor(n, d) = 1I)
    |> Seq.length

// ignoring 1-4, get the number of desired fractions for each dand add them up
let answer = [4I..12000I] |> List.map getFractionsCount |> List.sum