Skip to main content

Posts

Consecutive Prime Sum (Project Euler - Problem 50)

Problem

The prime 41, can be written as the sum of six consecutive primes:
41 = 2 + 3 + 5 + 7 + 11 + 13
This is the longest sum of consecutive primes that adds to a prime below one-hundred.
The longest sum of consecutive primes below one-thousand that adds to a prime, contains 21 terms, and is equal to 953.
Which prime, below one-million, can be written as the sum of the most consecutive primes?
Note
Some libraries used in this code are F# modules I use, but have also published as a Nuget library, such as EulerLib.GetPrimes() and EulerLib.isPrime(). You need to reference the NuGetLibrary to use this code as is.
Solution

#load "Stat.fs" #load "Print.fs" #load "EulerLib.fs" open Stat open Print open EulerLib open System let rec FindLongestPrimeSequenceSum (primeList:list) (nextItem:int) lessThanValue (primeArray:list) bestPrime (correctArray:list) = if List.sum(primeArray) + pr…
Recent posts

Champernowne's Constant - Project Euler Problem 40

Problem 

An irrational decimal fraction is created by concatenating the positive integers:
0.123456789101112131415161718192021...
It can be seen that the 12th digit of the fractional part is 1.
If dn represents the nth digit of the fractional part, find the value of the following expression.
d1 × d10 × d100 × d1000 × d10000 × d100000 × d1000000Original Problem Source

Solution

//speed depends on using StringBuilder, non-idiomatic since it is mutable let rec NumArray start max maxLength (numString:System.Text.StringBuilder) = if start = max || numString.Length >= maxLength then numString.Append(start.ToString()) else let newString = numString.Append(start.ToString()) let nextNum = start + 1 NumArray nextNum max maxLength newString //cast string to int let convertStringToInt32 (value:string) = let mutable result = 0 let found = System.Int32.TryParse(value, &…

Coin Sums (Project Euler Problem 31)

Problem

In England the currency is made up of pound, £, and pence, p, and there are eight coins in general circulation: 1p, 2p, 5p, 10p, 20p, 50p, £1 (100p) and £2 (200p). It is possible to make £2 in the following way: 1×£1 + 1×50p + 2×20p + 1×5p + 1×2p + 3×1p How many different ways can £2 be made using any number of coins?
Original problem description...

Note

This is a clean, although slow, solution, taking longer than one minute to complete.

Solution


// code for finding result, returned as a sequence let sumCurrencies ones twos fives tens twenties fifties oneHundreds twoHundreds limit = //seq{ [let counter = 0 for twoHundred in twoHundreds do for oneHundred in oneHundreds do for fifty in fifties do for twenty in twenties do for ten in tens do for five in fives do for …

Integer Right Triangles (Project Euler Problem 39)

Poblem

If p is the perimeter of a right angle triangle with integral length sides, {a,b,c}, there are exactly three solutions for p = 120.

{20,48,52}, {24,45,51}, {30,40,50}

For which value of p ≤ 1000, is the number of solutions maximised?

Link to original problem description

Solution

open System let buildArrays xs ys zs limits = seq{ for x in xs do for y in ys do if x < y then for z in zs do if (x*x + y*y = z*z) then for limit in limits do if (x + y + z = limit) then yield limit, x, y, z} let First (a,b,c,d) = a let pyhtosArrays = buildArrays [1..999] [1..999] [1..999] [1..999] |> Seq.toList |> List.map (fun x -> First x) let results = pyhtosArrays |> Seq.countBy id |> Se…

Digit cancelling fractions (Project Euler Problem 33)

Problem

The fraction 49/98 is a curious fraction, as an inexperienced mathematician in attempting to simplify it may incorrectly believe that 49/98 = 4/8, which is correct, is obtained by cancelling the 9s.

We shall consider fractions like, 30/50 = 3/5, to be trivial examples.

There are exactly four non-trivial examples of this type of fraction, less than one in value, and containing two digits in the numerator and denominator. If the product of these four fractions is given in its lowest common terms, find the value of the denominator.

(link to Problem 33 on the Project Euler site)

Note

This is a somewhat crude solution, since I am only just getting back into solving these problems, or working with F#, but there are several similar problems for which I can develop properly factored, reusable functions.

Solution

open System let product xs ys = seq{for x in xs do for y in ys do let a = float x % float 10 let b = System.Math…

Published Mathematical Librabry on NuGet

I recently published a library of mine to NuGet, as Mathematical Library. It is a library for functions used in solving Project Euler problems along with some basic statistical functions, coded in F#. The Project Euler functions cover primes, factorials, narcissism, random numbers, arrays and series/sequences (Collatz, Terra, Fibonacci).  The statistical functions cover variance, standard deviation, and sum of squares.

Greetings

For Visitors

I have not worked on this site for over two (2) years, but it covers many of the basics of F#, while trying to be idiomatically-correct and algorithmically efficient, solving mathematical problems functionally:

Functions (non-state, no side effects)Tail recursionNon-mutable variablesCurryingLambda notationPattern matchingSequences, arrays, lists, and tuplesArray slicing
Additionally, some solutions are improved upon using .NET components to speed the process, e.g., parallel processing.

Also, you might find these interesting, additional work done in F#:


Basic Statistical Functions, a very basic F# class for performing standard deviation and variance calculations.


Various Number Functions, a collection of basic mathematical functions written in F# as part of my learning via Project Euler. This module has functions for creating arrays or calculating values for the following:
PrimesFactorialsNarcissismCollatz SequenceTerra SequenceFibonnaciDistinct PrimesRandom Numbers and A…