Skip to main content

Problem 51 Project Euler Solution with python

Prime digit replacements

By replacing the 1st digit of the 2-digit number *3, it turns out that six of the nine possible values: 13, 23, 43, 53, 73, and 83, are all prime.
By replacing the 3rd and 4th digits of 56**3 with the same digit, this 5-digit number is the first example having seven primes among the ten generated numbers, yielding the family: 56003, 56113, 56333, 56443, 56663, 56773, and 56993. Consequently 56003, being the first member of this family, is the smallest prime with this property.
Find the smallest prime which, by replacing part of the number (not necessarily adjacent digits) with the same digit, is part of an eight prime value family.


This problem again depends on both mathematics and programming. According to me this problem gives more weight-age for mathematics than for programming.

Okay lets get started. There is one thing which I wanted to explain but, I think it will be better if I will link you to a stack answer where one guy has explained it very nicely.


Solution written by Mr.Alex has a lot of algebra and I recommend you take some example number(like 56003/56113/...) and substitute the values in the variables and you'll for sure understand the explanation given in the question.

Algorithm based on which the program has been written can be given in steps as follows:

1) Generate prime numbers upto 1 million, preferably using Sieve of Eratosthenes. I have used the modified sieve algorithm which we have created in Problem 37 Project Euler Solution with python.

2) As per the answer given by Alex, take the list from Step 1(prime numbers list), we will only retain prime numbers, in which we are having three or more repeated digits.(Even though 4 is not required, when I tried using this condition, the program lost its speed.) To be simple we will use only primes that have more than or equal to 3 digits that have been repeated. For example 56663 etc.

3) Create a list checked to store all the checked numbers(Numbers generated in Step 5) in each every iteration.

4) Start iterations and, for each and every prime number, check whether it is not in checked list, and proceed further.

5) Find all the replacements for the given number, if you are given a number 566003, then you should be able to generate [[566003,566113,566223,566333,566443,566553,566663,566773,566883,566993],[500003,511003,522003,533003,544003,555003,566003,577003,588003,599003]]

6) As you can see we are having nested lists returned from Step 5, so take a list, add all the items to the checked list. Take the list and remove all the non-prime numbers. Now return the modified list(list without prime numbers) to step 7.

7) Take the modified list and check if its length is 8, if the length is 8 then print the first element in the list and break all the loops, if the length is not 8, then start again from Step 5 with the next prime number.

I don't have any explanation for why I have used Sieve with upper bound 1 million, I just have assumed it, this has been done to speed up the program, you can use your own prime generating function to get the solution. There is no need for assuming 1 million if you are not satisfied.

If you have already seen the program, steps which we have discussed above has been directly used in the program in form of functions. Have a look at the program if you haven't yet.

Program


I have imported the Counter from collections in order to find the duplicates in the given prime numbers. You can see more from Find duplicates words in a text.

sieve function
We have discussed about this function earlier, if you don't know about Sieving then you can have a look at Problem 37 project Euler Solution with python.

len(str(x)) - len(set(str(x))) >= 3
This one is used for checking for duplicates in a given string(here it is number). For example len('56003') = 5, len(set('56003')) = len(set('5','6','0','3')) = 4, so there is one duplicated thing in the given string.

pdr function.
This function is the heart of this question(Prime Digit Replacements), it will take a number and will return the family of the number. This function accomplishes the task stated in Step 5.

checked = []
As discussed in Step 6.

check function.
This function will take a list, add all the items in the list to checked list. It will also delete all non-prime numbers in the list. Finally at the end of all the iterations it will return the list with only prime numbers. As discussed in Step 6.

while flag:
 I have used a while loop because I wanted to break out of two loops, after I have found the answer. 

All the remaining code has been explained in the algorithm.

You can download the source code from Github Gist pep51.py

Output


Summary

I personally liked this problem because it made me think bigger when compared to previous problems. At first I had execution time of around 10 seconds, but using the condition stated by Alex I have been able to reduce the execution time considerably. One thing I wanted to share is, that using Sieve of Atkins, execution time increased when compared to Sieve of Eratosthenes. I don't know the reason for this kind of behavior. This problem demanded a lot of mathematical approach when compared to programming approach. Anyways what ever it might be, with the help of stack overflow I was able to solve this problem with an optimized program. I am satisfied with the execution time. But one can still improve the program, I am sure that there still is scope for improvement. I myself have found some code block which can be improved, but I am leaving it to you. 

Please excuse me and correct me if my grammar in this post is not understandable or is an ambiguous manner.

As always, you can comment in the comment box below if you have any doubt or haven't understood anything. I will be glad to help you.

Please do comment in the comment box below, if you have found a typo or have a better program or have 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