From 207331ae6dd0908f46e0355d32d9ae2d122fc775 Mon Sep 17 00:00:00 2001 From: Freddy Pringle Date: Fri, 9 Oct 2020 21:40:35 +0200 Subject: [PATCH 1/2] Added solution for Project Euler problem 87. Fixes: #2695 --- project_euler/problem_87/__init__.py | 0 project_euler/problem_87/sol1.py | 50 ++++++++++++++++++++++++++++ 2 files changed, 50 insertions(+) create mode 100644 project_euler/problem_87/__init__.py create mode 100644 project_euler/problem_87/sol1.py diff --git a/project_euler/problem_87/__init__.py b/project_euler/problem_87/__init__.py new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/project_euler/problem_87/sol1.py b/project_euler/problem_87/sol1.py new file mode 100644 index 000000000000..dc42f8a46bda --- /dev/null +++ b/project_euler/problem_87/sol1.py @@ -0,0 +1,50 @@ +""" +The smallest number expressible as the sum of a prime square, prime cube, and prime +fourth power is 28. In fact, there are exactly four numbers below fifty that can be +expressed in such a way: + +28 = 22 + 23 + 24 +33 = 32 + 23 + 24 +49 = 52 + 23 + 24 +47 = 22 + 33 + 24 + +How many numbers below fifty million can be expressed as the sum of a prime square, +prime cube, and prime fourth power? +""" + + +def solution(limit: int = 50000000) -> int: + """ + Return the number of integers less than limit which can be expressed as the sum + of a prime square, prime cube, and prime fourth power. + >>> solution(50) + 4 + """ + ret = set() + prime_square_limit = int((limit - 24) ** (1 / 2)) + + primes = set(range(3, prime_square_limit + 1, 2)) + primes.add(2) + for p in range(3, prime_square_limit + 1, 2): + if p not in primes: + continue + primes.difference_update(set(range(p * p, prime_square_limit + 1, p))) + + for prime1 in primes: + square = prime1 * prime1 + for prime2 in primes: + cube = prime2 * prime2 * prime2 + if square + cube >= limit - 16: + break + for prime3 in primes: + tetr = prime3 * prime3 * prime3 * prime3 + total = square + cube + tetr + if total >= limit: + break + ret.add(total) + + return len(ret) + + +if __name__ == "__main__": + print(solution()) From 07afdeaf0f5bdf0c5ca0f0f3c597beb6e71a3f88 Mon Sep 17 00:00:00 2001 From: Freddy Pringle Date: Thu, 15 Oct 2020 11:02:25 +0200 Subject: [PATCH 2/2] Update docstring and 0-padding in directory name. Reference: #3256 --- project_euler/{problem_87 => problem_087}/__init__.py | 0 project_euler/{problem_87 => problem_087}/sol1.py | 4 +++- 2 files changed, 3 insertions(+), 1 deletion(-) rename project_euler/{problem_87 => problem_087}/__init__.py (100%) rename project_euler/{problem_87 => problem_087}/sol1.py (93%) diff --git a/project_euler/problem_87/__init__.py b/project_euler/problem_087/__init__.py similarity index 100% rename from project_euler/problem_87/__init__.py rename to project_euler/problem_087/__init__.py diff --git a/project_euler/problem_87/sol1.py b/project_euler/problem_087/sol1.py similarity index 93% rename from project_euler/problem_87/sol1.py rename to project_euler/problem_087/sol1.py index dc42f8a46bda..f444481c17ac 100644 --- a/project_euler/problem_87/sol1.py +++ b/project_euler/problem_087/sol1.py @@ -1,4 +1,6 @@ """ +Project Euler Problem 87: https://projecteuler.net/problem=87 + The smallest number expressible as the sum of a prime square, prime cube, and prime fourth power is 28. In fact, there are exactly four numbers below fifty that can be expressed in such a way: @@ -47,4 +49,4 @@ def solution(limit: int = 50000000) -> int: if __name__ == "__main__": - print(solution()) + print(f"{solution() = }")