I was exploring Jupyter notebooks , that combines live code, markdown and data, through Microsoft's implementation, known as MS Azure Notebooks , putting together a small library of R and F# notebooks . As Microsoft's FAQ for the service describes it as : ...a multi-lingual REPL on steroids. This is a free service that provides Jupyter notebooks along with supporting packages for R, Python and F# as a service. This means you can just login and get going since no installation/setup is necessary. Typical usage includes schools/instruction, giving webinars, learning languages, sharing ideas, etc. Feel free to clone and comment... In R Azure Workbook for R - Memoisation and Vectorization Charting Correlation Matrices in R In F# Charnownes Constant in FSharp.ipynb Project Euler - Problems 18 and 67 - FSharp using Dynamic Programming
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) + primeList.[nextItem] >= lessThanValue then
(bestPrime, correctArray.Length)
else
let newArray = List.append primeArray [primeList.[nextItem]]
let nextCounter = nextItem + 1
let testNum = List.sum newArray
if EulerLib.IsPrime(testNum) then
FindLongestPrimeSequenceSum
primeList
nextCounter
lessThanValue
newArray
testNum
newArray
else
FindLongestPrimeSequenceSum
primeList
nextCounter
lessThanValue
newArray
bestPrime
correctArray
let primeStart2 = Seq.toList(EulerLib.GetPrimes(1000000))
let primeStart3 = [for i = 1 to primeStart2.Length - 1 do yield primeStart2.[i] ]
let primeStart4 = [for i = 1 to primeStart3.Length - 1 do yield primeStart3.[i] ]
let primeStart5 = [for i = 1 to primeStart4.Length - 1 do yield primeStart4.[i] ]
let primeStart6 = [for i = 1 to primeStart5.Length - 1 do yield primeStart5.[i] ]
let result2 = FindLongestPrimeSequenceSum primeStart2 0 1000000 [] 0 []
let result3 = FindLongestPrimeSequenceSum primeStart3 0 1000000 [] 0 []
let result4 = FindLongestPrimeSequenceSum primeStart4 0 1000000 [] 0 []
let result5 = FindLongestPrimeSequenceSum primeStart5 0 1000000 [] 0 []
let result6 = FindLongestPrimeSequenceSum primeStart6 0 1000000 [] 0 []
Comments
Post a Comment