Posts

Showing posts from January, 2012

Project Euler - Problem 30 Redux (using Parallel)

The original post Project Euler - Problem 30 was done some time ago, and I recently read about using parallel methods to improve performance, and in this case, Parallel reduces execution time by 33%.


Description


Surprisingly there are only three numbers that can be written as the sum of fourth powers of their digits.  Find the sum of all the numbers that can be written as the sum of fifth powers of their digits.


Solution (using Parallel)



open System
open System.Threading
open System.Threading.Tasks


let isNarcissistic num power =
    let numAsString = num.ToString()
    let arr = [for i=0 to (numAsString.Length - 1) do
                yield (float(numAsString.Chars(i).ToString()))**power]
    if num = int(List.sum arr) then
        num
    else
        0


let GetAllNarcissistic2_Start = System.DateTime.UtcNow


let GetAllNarcissistic2 =
    [|2..999999|]
    |> Array.Parallel.map (fun x -> isNarcissistic x 5.0)
    |> Array.sum


printfn "%f" ((System.DateTime.UtcNow).Subtract(GetAllNarcissi…

Project Euler - Problem 26 Redux (using Parallel)

The original post Project Euler - Problem 26 was done some time ago, and I recently read about using parallel methods to improve performance, and in this case, Parallel reduces execution time by 25%.


Description



A unit fraction contains 1 in the numerator. The decimal representation of the unit fractions with denominators 2 to 10 are given:


1/2 = 0.5
1/3 = 0.(3)
1/4 = 0.25
1/5 = 0.2
1/6 = 0.1(6)
1/7 = 0.(142857)
1/8 = 0.125
1/9 = 0.(1)
1/10 = 0.1


Where 0.1(6) means 0.166666..., and has a 1-digit recurring cycle. It can be seen that 1/7 has a 6-digit recurring cycle.


Find the value of d < 1000 for which 1/d contains the longest recurring cycle in its decimal fraction part.


Solution (using Parallel) 


open System
open System.Threading
open System.Threading.Tasks


let rec remainders (num:int) (rem:int) (arr:list) =     
     let filteredList = arr |> List.filter (fun x -> x = num)
     if filteredList.Length > 1 || num = 0 then
          arr.Length - 1
     elif (num*10) < rem then
          remai…