# Project Euler – Problem 28 Solution

#### Problem

Starting with the number 1 and moving to the right in a clockwise direction a 5 by 5 spiral is formed as follows: It can be verified that the sum of the numbers on the diagonals is 101.

What is the sum of the numbers on the diagonals in a 1001 by 1001 spiral formed in the same way?

#### Solution

```let rec sumDiagonals n m total max =
match n with
| 1 -> sumDiagonals (n+1) m 1 1
| _ when n > m -> total
| _ when n % 2 = 0 -> sumDiagonals (n+1) m total max
| _ ->
let newValues = [1..4] |> List.map (fun x -> max + x * (n-1))
let newMax = newValues |> List.max
let newTotal = total + (newValues |> List.sum)
sumDiagonals (n+1) m newTotal newMax

let answer = sumDiagonals 1 1001 0 0
```

As you’ve probably noticed already, there’s a pattern in the sequence 1, 3, 5, 7, 9, 13, 17, 21, 25, … generated by the spiral in the problem brief. As the dimension goes up by 2 at a time, all odd numbers, 4 new numbers are added to the sequence:

 Dimension (d) Numbers on the edge of the square Max number from last dimension 1 1 3 3, 5, 7, 9 1 5 13, 17, 21, 25 9

Looking at the above table, it quickly becomes clear that the new numbers that are added to the diagonals when you expand the dimension by 2 can be calculated as:

max number from last dimension + (d-1) * i (where i is a number from 1 to 4)

My solution simply wraps this logic in a recursive function whilst keeping a running total of all the numbers that have been generated.