Skip to main content

Problem 50 Project Euler Solution with python

Consecutive prime sum

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?


A very good problem, took 2 days for me to get a very good algorithm. I am assuming that this post will be a bit long, read the whole post to understand the program better. 

Before we start solving the question we will first have to understand the question properly. As some of you might think that the consecutive primes means 2,3,5,7,.... but consecutive primes also mean 3,5,7,... or 11,13,17,19,.... also. For example(given in the question), consider the longest sum of consecutive primes below one-thousand, which is equal to 953 but the sum is:
[7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89]

The consecutiveness starts from 7 but not 2 or 3. Hope you have understood the question correctly. 

So we will have to find a largest sub list of consecutive prime numbers. As we know that we can create sub lists using list slicing, we can use two for loops in which the iterator in the first for loop will indicate the start and the second for loop's iterator will indicate the end. Example primes[i:j], where primes is the list and i is the iterator of first for loop, j is the iterator of second for loop.

Consider an example. Consider the primes below 100, they are :
[2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97]

As you know we will start with 2 and sum up all the primes until we reach the sum less than 100,
2+3+5+7+11+13+17+19+23 = 100, At this stage(at 23) the loop will break, as we don't need any numbers whose value will make the sum greater than 100(for our present example).

In the next iteration, the maximum end we can reach will be:
3+5+7+11+13+17+19+23+29 = 127, at this stage we can break the loop for the same condition.

In next iteration, the loop will end at:
5+7+11+13+17+19+23+29 = 124, at this stage the loop will break.

In next iteration, 7+11+13+17+19+23+29 = 119, the loop breaks.

But from our above sequences we cannot see any trend, but we can come to a conclusion to reduce the number of iterations the second loop will have to forego. We can find the maximum value of the second for loop iterator, by making a conclusion.
Let us say that in a loop we will hit the sum of 100 at n, then the maximum value that the next loop will hit the sum of 100 will be at n+1.
In this way we don't need to loop till the end of the primes list.

Hope you have understood the conclusion. If not try to read the further part even if it doesn't make any sense. Finally try to understand the program. If you still don't understand the program comment or contact me. I will for sure help you.

Now we will see the algorithm step by step and I am sure this will make sense even if you are confused till now.

1) Make a list of prime numbers upto 1 million.

2) Create a variable to store length, consecutive prime sum and maximum value the second for loop iterator can take. Lets call them length, largest, lastj respectively.

3) Start a for loop(call this loop first for loop) and the maximum value upto which it can loop will be upto the length of the prime numbers list generated in Step 1

4*) Start another for loop(call this loop second for loop) nested in the for loop of Step 3, and set the start value of the for loop as iterator value of first for loop added with the previous length of the largest consecutive prime sum.

5) Find the sum of the prime numbers after slicing the list with the values of the iterator. Example: primes[i:j]

6) Check if the sum of the primes in of the sub list is less than 1 million. If the value is less than 1 million then continue for Step 7, otherwise change the value of the lastj to the value of j+1 and break the second for loop.

7) Check if the sum of the primes is a prime number and if it is a prime number, then change the value of length, to the length of the list generated in Step 5 and the value of largest to the sum of the primes sub list.

8) Continue for the next iteration after this iteration is over. Finally print the value of largest to find the answer.

*We are starting with a minimum length of the previously calculated largest consecutive length because, it is unnecessary to calculate for values less than the previously known number. In fact we can start with some known number if we can prove the minimum length of the largest consecutive prime sum will be.

You can see the program and I recommend you to start with substituting some values in the variables and understand what's happening behind the scenes.

Program


sieve function
We are using prime sieve to generate prime numbers. Note that we have used the modified sieve function, from Problem 35 Project Euler Solution with python. You can learn more about Prime sieve from here: 

primes = sieve(1000000)
This is the Step 1 which we have already discussed above.

lastj = len(primes) 
We have used len in built method, to calculate the length of the primes list.

Line 42- Line 53 - Step 4 to Step 8

You can download the above source code from Github Gist pep50.py

Output


Summary

Even though, this problems took a few days for me to solve, the first time I wrote a solution for this problem had an execution time of around 300 seconds, as I was not satisfied with the results and wanted a more faster solution, I started thinking about this problem in such a way that I even had a dream about this problem. Anyways at last I have completed this problem with flying colors and the present solution as you can see, runs in less than a second. One thing I want to state is that, number of iterations happening in the above program is around 600 which is far distant from 78000(approx. number of prime numbers below 1 million). I am satisfied with the solution I have written and if you know any way where we can still optimize the code then please do comment.

As always comment in the comment box below if you have any doubt or didn't understand anything. I will be glad to help you.

Please do comment in the comment box below if you have found any typo or have a better program or a different program or have a suggestion. I will be very happy to view each of them.

You can also contact me.

Thank you. Have a nice day😃!

Popular posts from this blog

Project Euler Problem 67 Solution with Python

Maximum path sum II By starting at the top of the triangle below and moving to adjacent numbers on the row below, the maximum total from top to bottom is 23. 3 7 4 2 4 6 8 5 9 3 That is, 3 + 7 + 4 + 9 = 23. Find the maximum total from top to bottom in triangle.txt (right click and 'Save Link/Target As...'), a 15K text file containing a triangle with one-hundred rows.

Problem 43 Project Euler Solution with python

Sub-string divisibility The number, 1406357289, is a 0 to 9 pandigital number because it is made up of each of the digits 0 to 9 in some order, but it also has a rather interesting sub-string divisibility property. Let d 1 be the 1 st digit, d 2 be the 2 nd digit, and so on. In this way, we note the following: d 2 d 3 d 4 =406 is divisible by 2 d 3 d 4 d 5 =063 is divisible by 3 d 4 d 5 d 6 =635 is divisible by 5 d 5 d 6 d 7 =357 is divisible by 7 d 6 d 7 d 8 =572 is divisible by 11 d 7 d 8 d 9 =728 is divisible by 13 d 8 d 9 d 10 =289 is divisible by 17 Find the sum of all 0 to 9 pandigital numbers with this property. One might write a simple solution using direct if else statements for this problem. Using if else statements, the execution time may be a few seconds. But this is not a very good approach. I too had written a program with if else statement which will take each and every permutation of the 0-9 Pandigital and check for the conditions given in the qu...

Add/Embed SVG to Blogger website

In this post I will tell you my method(trick) of adding SVG images in a blogger website or blog. Before starting , the first thin g I am assu m ing is that you are aware of SVG if you are here. If not please see S calable V ec tor G raphics Recently when I tried to embed a SVG image for a post on pygal, I tried uploading the SVG file and blogger Image uploader came up with an error, because of which I had to find some other way.  SVG File upload Error in Blogger  I started sea rc hing Google " Embed SVG in Blogger " . I found blogorrhea , w h ich gave some i nformatio n on add ing SVG directly as a markup , which worked , but I faced another problem using this . Also th is guy has used lot of Javascript which was confusin g for me, being new to using SVG.   So I first t houg ht of learning on h ow to embed SVG in HTML and t his on e worked out. Actually we can embed SVG in HTML i n following ways: Using Object tag Using Iframe tag Using embed...