From 1e3b3b3d1135abcac0f7489cee5826d73538a2ed Mon Sep 17 00:00:00 2001 From: formal-acc Date: Mon, 5 Oct 2020 21:47:00 +0530 Subject: [PATCH 1/6] Added Solution to Euler50 --- project_euler/problem_50/__init__.py | 0 project_euler/problem_50/solution_50.py | 66 +++++++++++++++++++++++++ 2 files changed, 66 insertions(+) create mode 100644 project_euler/problem_50/__init__.py create mode 100644 project_euler/problem_50/solution_50.py diff --git a/project_euler/problem_50/__init__.py b/project_euler/problem_50/__init__.py new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/project_euler/problem_50/solution_50.py b/project_euler/problem_50/solution_50.py new file mode 100644 index 000000000000..735689179ed5 --- /dev/null +++ b/project_euler/problem_50/solution_50.py @@ -0,0 +1,66 @@ +#!/usr/bin/env python3 + +""" +Consecutive prime sum +Problem 50 + +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 1 million, can be written as the sum of the most consecutive primes? +""" + + +def solution() -> int: + """ + Returns solution to problem. + + Algorithm: + > Construct a "Sieve of Eratosthenes" to get all primes till million + (This will also serve as O(1) primality check later) + > Now make the largest size window and slide over primes, + until we encounter the sum of slide being a prime. + + >>> solution() + 997651 + """ + + # To avoid redundant exponentiation + million = 10 ** 6 + # Sieve of primes initalising all numbers less than million as prime + sieve = [True] * million + + primes = [] + # Creation of Sieve + for number in range(2, million): + if sieve[number]: + primes.append(number) + for multiple in range(number * number, million, number): + sieve[multiple] = False + + cumulative_sum = [2] + for i in range(1, len(primes)): + cumulative_sum.append(cumulative_sum[i - 1] + primes[i]) + + largest_size = 0 + while cumulative_sum[largest_size] < million: + largest_size += 1 + + for size in range(largest_size, 1, -1): + for start in range(0, len(primes) - size + 1): + # Sum over window of size 'size' from index 'start' + prime_sum = ( + cumulative_sum[start + size - 1] - cumulative_sum[start] + primes[start] + ) + + if prime_sum < million and sieve[prime_sum]: + return prime_sum + + +if __name__ == "__main__": + print(solution()) From aff145c92e32f10bc60a30bdf3c2ab39ca01fd12 Mon Sep 17 00:00:00 2001 From: formal-acc Date: Mon, 5 Oct 2020 22:17:39 +0530 Subject: [PATCH 2/6] Rectified spelling and improved comments --- project_euler/problem_50/solution_50.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/project_euler/problem_50/solution_50.py b/project_euler/problem_50/solution_50.py index 735689179ed5..712e47c6a9ea 100644 --- a/project_euler/problem_50/solution_50.py +++ b/project_euler/problem_50/solution_50.py @@ -32,9 +32,8 @@ def solution() -> int: # To avoid redundant exponentiation million = 10 ** 6 - # Sieve of primes initalising all numbers less than million as prime - sieve = [True] * million + sieve = [True] * million primes = [] # Creation of Sieve for number in range(2, million): @@ -43,10 +42,12 @@ def solution() -> int: for multiple in range(number * number, million, number): sieve[multiple] = False + # Cumulative sum of primes for increased efficiency when calculating sum over window cumulative_sum = [2] for i in range(1, len(primes)): cumulative_sum.append(cumulative_sum[i - 1] + primes[i]) + # Find size of largest window with smallest primes adding to more than million largest_size = 0 while cumulative_sum[largest_size] < million: largest_size += 1 From b3f3764f1f3fda5e72339736f8f9e56da93143df Mon Sep 17 00:00:00 2001 From: formal-acc <56290744+sarthaka1310@users.noreply.github.com> Date: Sun, 11 Oct 2020 22:56:03 +0530 Subject: [PATCH 3/6] Added doctests --- .../problem_50/{solution_50.py => sol1.py} | 35 ++++++++++--------- 1 file changed, 19 insertions(+), 16 deletions(-) rename project_euler/problem_50/{solution_50.py => sol1.py} (66%) diff --git a/project_euler/problem_50/solution_50.py b/project_euler/problem_50/sol1.py similarity index 66% rename from project_euler/problem_50/solution_50.py rename to project_euler/problem_50/sol1.py index 712e47c6a9ea..bd2aae338bc9 100644 --- a/project_euler/problem_50/solution_50.py +++ b/project_euler/problem_50/sol1.py @@ -1,8 +1,6 @@ -#!/usr/bin/env python3 - """ Consecutive prime sum -Problem 50 +Problem 50: https://projecteuler.net/problem=50 The prime 41, can be written as the sum of six consecutive primes: @@ -16,40 +14,45 @@ """ -def solution() -> int: +def solution(n: int = 10 ** 6) -> int: """ Returns solution to problem. Algorithm: - > Construct a "Sieve of Eratosthenes" to get all primes till million + 1. Construct a "Sieve of Eratosthenes" to get all primes till n (This will also serve as O(1) primality check later) - > Now make the largest size window and slide over primes, + https://en.wikipedia.org/wiki/Sieve_of_Eratosthenes#Pseudocode + + 2. Now make the largest size window and slide over primes, until we encounter the sum of slide being a prime. - >>> solution() - 997651 + >>> solution(100) + 41 + + >>> solution(1000) + 953 """ - # To avoid redundant exponentiation - million = 10 ** 6 + if n < 1: + raise ValueError("Please enter a natural number") - sieve = [True] * million + sieve = [True] * n primes = [] # Creation of Sieve - for number in range(2, million): + for number in range(2, n): if sieve[number]: primes.append(number) - for multiple in range(number * number, million, number): + for multiple in range(number * number, n, number): sieve[multiple] = False - # Cumulative sum of primes for increased efficiency when calculating sum over window + # Cumulative sum of primes for efficiency when calculating sum over window cumulative_sum = [2] for i in range(1, len(primes)): cumulative_sum.append(cumulative_sum[i - 1] + primes[i]) # Find size of largest window with smallest primes adding to more than million largest_size = 0 - while cumulative_sum[largest_size] < million: + while cumulative_sum[largest_size] < n: largest_size += 1 for size in range(largest_size, 1, -1): @@ -59,7 +62,7 @@ def solution() -> int: cumulative_sum[start + size - 1] - cumulative_sum[start] + primes[start] ) - if prime_sum < million and sieve[prime_sum]: + if prime_sum < n and sieve[prime_sum]: return prime_sum From ebc6d935612db7ea10c02c21ca606c9bad0aa843 Mon Sep 17 00:00:00 2001 From: sarthaka1310 <56290744+sarthaka1310@users.noreply.github.com> Date: Sun, 11 Oct 2020 23:27:14 +0530 Subject: [PATCH 4/6] Edited exception --- project_euler/problem_50/sol1.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/project_euler/problem_50/sol1.py b/project_euler/problem_50/sol1.py index bd2aae338bc9..5f96cd667f82 100644 --- a/project_euler/problem_50/sol1.py +++ b/project_euler/problem_50/sol1.py @@ -34,7 +34,7 @@ def solution(n: int = 10 ** 6) -> int: """ if n < 1: - raise ValueError("Please enter a natural number") + raise ValueError("Please enter an integer greater than 0") sieve = [True] * n primes = [] From 89a2aa7b4776ccefd60f503e5fe335fc4040a299 Mon Sep 17 00:00:00 2001 From: sarthaka1310 <56290744+sarthaka1310@users.noreply.github.com> Date: Mon, 19 Oct 2020 20:29:04 +0530 Subject: [PATCH 5/6] Rename folder for init file --- project_euler/problem_050/__init__.py | 1 + project_euler/problem_50/__init__.py | 0 2 files changed, 1 insertion(+) create mode 100644 project_euler/problem_050/__init__.py delete mode 100644 project_euler/problem_50/__init__.py diff --git a/project_euler/problem_050/__init__.py b/project_euler/problem_050/__init__.py new file mode 100644 index 000000000000..d3f5a12faa99 --- /dev/null +++ b/project_euler/problem_050/__init__.py @@ -0,0 +1 @@ + diff --git a/project_euler/problem_50/__init__.py b/project_euler/problem_50/__init__.py deleted file mode 100644 index e69de29bb2d1..000000000000 From 56f680da8a582775a6a633967a87e43457852272 Mon Sep 17 00:00:00 2001 From: sarthaka1310 <56290744+sarthaka1310@users.noreply.github.com> Date: Mon, 19 Oct 2020 20:30:38 +0530 Subject: [PATCH 6/6] Renamed problem directory --- project_euler/{problem_50 => problem_050}/sol1.py | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename project_euler/{problem_50 => problem_050}/sol1.py (100%) diff --git a/project_euler/problem_50/sol1.py b/project_euler/problem_050/sol1.py similarity index 100% rename from project_euler/problem_50/sol1.py rename to project_euler/problem_050/sol1.py