Issues (956)

solutions/problem30.py (1 issue)

1
"""
2
Project Euler Problem 30: Digit Fifth Powers
3
============================================
4
5
.. module:: solutions.problem30
6
   :synopsis: My solution to problem #30.
7
8
The source code for this problem can be
9
`found here <https://bitbucket.org/nekedome/project-euler/src/master/solutions/problem30.py>`_.
10
11
Problem Statement
12
#################
13
14
Surprisingly there are only three numbers that can be written as the sum of fourth powers of their digits:
15
16
.. math::
17
18
    1634 = 1^4 + 6^4 + 3^4 + 4^4 \\\\
19
    8208 = 8^4 + 2^4 + 0^4 + 8^4 \\\\
20
    9474 = 9^4 + 4^4 + 7^4 + 4^4
21
22
As :math:`1 = 1^4` is not a sum it is not included.
23
24
The sum of these numbers is :math:`1634 + 8208 + 9474 = 19316`.
25
26
Find the sum of all the numbers that can be written as the sum of fifth powers of their digits.
27
28
Solution Discussion
29
###################
30
31
First, we need to establish a constraint on the size of the numbers we'll consider.
32
33
Consider the number :math:`9 \\dots 9`, by summing the fifth powers of the decimal digits within this number, we get
34
:math:`n \\times 9^5`, where :math:`n` is the number of digits. We also need the same :math:`n`-digit number to
35
**potentially** equal :math:`n \\times 9 ^ 5`. To find the search limit, find an :math:`n` where this is not possible:
36
37
.. math::
38
39
    n = 1 \\Rightarrow & 1 \\times 9^5 = 59049 \\\\
40
    n = 2 \\Rightarrow & 2 \\times 9^5 = 118098 \\\\
41
    n = 3 \\Rightarrow & 3 \\times 9^5 = 177147 \\\\
42
    n = 4 \\Rightarrow & 4 \\times 9^5 = 236196 \\\\
43
    n = 5 \\Rightarrow & 5 \\times 9^5 = 295245 \\\\
44
    n = 6 \\Rightarrow & 6 \\times 9^5 = 354294 \\\\
45
    n = 7 \\Rightarrow & 7 \\times 9^5 = 413343
46
47
Since no seven digit number can be mapped to anything greater than :math:`413343`, we can use the upper bound
48
:math:`n \\le 10^6`.
49
50
The problem states that :math:`1 = 1^4` is invalid as it is a trivial sum of one term. We will assume that
51
:math:`1 = 1^5` is similarly invalid. Observe that for any other one digit decimal number :math:`d`, its fifth power
52
exceeds itself (i.e. :math:`d^5 \\gt d \\mbox{ } \\forall d \\in [2, 9]`).
53
54
Therefore, we only need consider the range :math:`10^1 \\le n \\lt 10^6`.
55
56
Finally, observe that the mapping in this problem is commutative. That is, the order of the digits does not matter.
57
For example, consider the two numbers :math:`123,321` and apply the mapping:
58
59
.. math::
60
61
    123 \\rightarrow 1^5 + 2^5 + 3^5 = 1 + 32 + 243 = 276 \\\\
62
    321 \\rightarrow 3^5 + 2^5 + 1^5 = 243 + 32 + 1 = 276
63
64
So, we need only consider all possible combinations of decimal digits (with replacement) for numbers of lengths
65
:math:`2` through :math:`7`.
66
67
Solution Implementation
68
#######################
69
70
.. literalinclude:: ../../solutions/problem30.py
71
   :language: python
72
   :lines: 75-
73
"""
74
75
from itertools import combinations_with_replacement
76
77
from lib.digital import digits_of, num_digits
78
79
80
def solve():
81
    """ Compute the answer to Project Euler's problem #30 """
82
    answer = 0
83
    power = 5
84
    for n in range(2, 6+1):
85
        for digits in combinations_with_replacement(range(10), n):
86
            mapped_value = sum((digit ** power for digit in digits))
0 ignored issues
show
The variable digit does not seem to be defined in case the for loop on line 84 is not entered. Are you sure this can never be the case?
Loading history...
87
            if tuple(sorted(digits_of(mapped_value))) == digits and num_digits(mapped_value) == n:
88
                answer += mapped_value
89
    return answer
90
91
92
expected_answer = 443839
93