1
0
www.mikescher.com/www/statics/euler/Euler_Problem-050_explanation.md

39 lines
2.1 KiB
Markdown

My first approach here was a simple brute force algorithm, but that one was *far* too slow. So I needed an more intelligent algorithm. And I have to say the one I came up is pretty quick and I like the concept that lies behind it.
First I calculated the primes from `0` to `1 000 000`.
Next I calculated the maximum chain *(starting by the first prime `2`)* with a sum less than one million.
Now think of all the primes laid down in an array side by side:
**1)** We move our chain from left to right until the sum exceeds one million (the movement is a really cheap operation: take the previous sum, subtract the most left prime and add the new prime from the reight side).
**2)** Then we shorten the chain length by one as we remove the most left prime.
**3)** After that we do the movement back wards (from right to left) until we end up at the left end of our prime array.
**4)** Then we again shorten the chain *(this time by removing the right tail)* and start over again (by moving right).
**X)** In every step we test if the current sum is a prime number and if so we print it and terminate the program.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
OOOOOOOOOOOOO // the prime array
#####OOOOOOOO // our chain
O#####OOOOOOO // move right
OO#####OOOOOO
OOO#####OOOOO // until sum > MAX_VALUE
OOOO####OOOOO // shorten left
OOO####OOOOOO // move left
OO####OOOOOOO
O####OOOOOOOO
####OOOOOOOOO // until left side is hit
###OOOOOOOOOO // shorten right
O###OOOOOOOOO // repeat until prime is found
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
This algorithm works because we first test every possibility with maximum chain length, and then every with length = `maximum - 1` and so on and so on. So the first prime that we find is from the longest possible chain.
There are two nice things about this algorithm:
- We don't need to calculate an extreme amount of prime sums. The step from the sum of one chain to the next is literally only an addition and an subtraction
- Because we start with the longest chain and reduce its length in every step, the first prime we find is directly our optimal result.