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

Making a quiz web app with python and flask

Edit : When you are creating a web app with h tml templates, then y ou will have to sa ve the html file in templates folder in the Current Wor ki ng Directory( CWD). If you save the file in the C W D directl y you will get a TemplateNotFound error. Thank you Udhay for pointing it out.   In this post we will create a quiz website using python . I will be using the flask framework . After reading this tutorial you will learn form submission , flask templates , python code in flask templates , shuffling the questions and options with the random module and few others.  Please note that this tutorial is not big as it seems to be. Some of the code has been rewritten to maintain consistency and also font size is somewhat big so that your eyes won't get stressed reading this tutorial. Also the content has not occupied the full width of the page. In this tutorial I am assuming that you are having a very basic understanding of the flask framework . Please refer the documentation

Problem 11 Project Euler Solution with python

Largest product in a grid In the 20×20 grid below, four numbers along a diagonal line have been marked in red. 08 02 22 97 38 15 00 40 00 75 04 05 07 78 52 12 50 77 91 08 49 49 99 40 17 81 18 57 60 87 17 40 98 43 69 48 04 56 62 00 81 49 31 73 55 79 14 29 93 71 40 67 53 88 30 03 49 13 36 65 52 70 95 23 04 60 11 42 69 24 68 56 01 32 56 71 37 02 36 91 22 31 16 71 51 67 63 89 41 92 36 54 22 40 40 28 66 33 13 80 24 47 32 60 99 03 45 02 44 75 33 53 78 36 84 20 35 17 12 50 32 98 81 28 64 23 67 10 26 38 40 67 59 54 70 66 18 38 64 70 67 26 20 68 02 62 12 20 95 63 94 39 63 08 40 91 66 49 94 21 24 55 58 05 66 73 99 26 97 17 78 78 96 83 14 88 34 89 63 72 21 36 23 09 75 00 76 44 20 45 35 14 00 61 33 97 34 31 33 95 78 17 53 28 22 75 31 67 15 94 03 80 04 62 16 14 09 53 56 92 16 39 05 42 96 35 31 47 55 58 88 24 00 17 54 24 36 29 85 57 86 56 00 48 35 71 89 07 05 44 44 37 44 60 21 58 51 54 17 58 19 80 81 68 05 94 47 69 28 73 92 13 86 52 17 77 04 89 55 40 04 52 08 83 97 35 99 16 07

Problem 60 Project Euler Solution with python

Prime pair sets The primes 3, 7, 109, and 673, are quite remarkable. By taking any two primes and concatenating them in any order the result will always be prime. For example, taking 7 and 109, both 7109 and 1097 are prime. The sum of these four primes, 792, represents the lowest sum for a set of four primes with this property. Find the lowest sum for a set of five primes for which any two primes concatenate to produce another prime. This problem is j u st a brute force problem. If you have come here because you don't know the limit upto which you will h ave to gener ate the prime numbers t hen go ahe ad and t r y with 10,000 . When I first start ed solving the problem I chose 1 million(beca use most of the problem s on project E uler have this limit ), but it took very long for the computer to fin d the solution. After searching on the internet then I found many people choosing 10, 000 so I have changed my in put f rom 1 million to 10000 and the output was f ast. He