From 0af87f8afec29e461e05ce66975436c26fbc63d4 Mon Sep 17 00:00:00 2001 From: Manpreet Singh <63737630+ManpreetSingh2004@users.noreply.github.com> Date: Wed, 18 Oct 2023 17:30:09 +0530 Subject: [PATCH 1/4] Fix integer overflow on windows --- project_euler/problem_072/sol1.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/project_euler/problem_072/sol1.py b/project_euler/problem_072/sol1.py index 5a28be564556..9390ce9f658c 100644 --- a/project_euler/problem_072/sol1.py +++ b/project_euler/problem_072/sol1.py @@ -36,7 +36,7 @@ def solution(limit: int = 1_000_000) -> int: """ # generating an array from -1 to limit - phi = np.arange(-1, limit) + phi = np.arange(-1, limit, dtype=np.int64) for i in range(2, limit + 1): if phi[i] == i - 1: From 89bdb64f15442501277d282532c49afe66e6c614 Mon Sep 17 00:00:00 2001 From: Manpreet Singh <63737630+ManpreetSingh2004@users.noreply.github.com> Date: Wed, 18 Oct 2023 17:49:32 +0530 Subject: [PATCH 2/4] Use slicing for element selection --- project_euler/problem_072/sol1.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/project_euler/problem_072/sol1.py b/project_euler/problem_072/sol1.py index 9390ce9f658c..ed079efe7d05 100644 --- a/project_euler/problem_072/sol1.py +++ b/project_euler/problem_072/sol1.py @@ -18,7 +18,7 @@ function, phi(n). So, the answer is simply the sum of phi(n) for 2 <= n <= 1,000,000 Sum of phi(d), for all d|n = n. This result can be used to find phi(n) using a sieve. -Time: 1 sec +Time: 0.4 sec """ import numpy as np @@ -40,8 +40,7 @@ def solution(limit: int = 1_000_000) -> int: for i in range(2, limit + 1): if phi[i] == i - 1: - ind = np.arange(2 * i, limit + 1, i) # indexes for selection - phi[ind] -= phi[ind] // i + phi[2 * i :: i] -= phi[2 * i :: i] // i return np.sum(phi[2 : limit + 1]) From 0e3ad313672c6d61a84b41bdd99f4ab04a5985ca Mon Sep 17 00:00:00 2001 From: Manpreet Singh <63737630+ManpreetSingh2004@users.noreply.github.com> Date: Wed, 18 Oct 2023 17:56:15 +0530 Subject: [PATCH 3/4] Add runtime in sol2.py --- project_euler/problem_072/sol2.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/project_euler/problem_072/sol2.py b/project_euler/problem_072/sol2.py index 08e92c18bb3a..631d68e31130 100644 --- a/project_euler/problem_072/sol2.py +++ b/project_euler/problem_072/sol2.py @@ -20,6 +20,9 @@ def solution(limit: int = 1000000) -> int: """ Return the number of reduced proper fractions with denominator less than limit. + + Time: 1 sec + >>> solution(8) 21 >>> solution(1000) From a4ab0c7756d5c8d1ed9293bde6f0f75be43637be Mon Sep 17 00:00:00 2001 From: Manpreet Singh <63737630+ManpreetSingh2004@users.noreply.github.com> Date: Wed, 18 Oct 2023 18:06:24 +0530 Subject: [PATCH 4/4] Separate out prime number generator from solution2 --- project_euler/problem_072/sol2.py | 31 +++++++++++++++++++++++++------ 1 file changed, 25 insertions(+), 6 deletions(-) diff --git a/project_euler/problem_072/sol2.py b/project_euler/problem_072/sol2.py index 631d68e31130..2b4fb6b994da 100644 --- a/project_euler/problem_072/sol2.py +++ b/project_euler/problem_072/sol2.py @@ -17,6 +17,30 @@ """ +def set_generate_primes(limit: int) -> set: + """ + Returns prime numbers below max_number. + + >>> set_generate_primes(10) + {2, 3, 5, 7} + >>> set_generate_primes(2) + set() + """ + + if limit <= 2: + return set() + + primes = set(range(3, limit, 2)) + primes.add(2) + + for p in range(3, limit, 2): + if p not in primes: + continue + primes.difference_update(set(range(p * p, limit, p))) + + return primes + + def solution(limit: int = 1000000) -> int: """ Return the number of reduced proper fractions with denominator less than limit. @@ -28,13 +52,8 @@ def solution(limit: int = 1000000) -> int: >>> solution(1000) 304191 """ - primes = set(range(3, limit, 2)) - primes.add(2) - for p in range(3, limit, 2): - if p not in primes: - continue - primes.difference_update(set(range(p * p, limit, p))) + primes = set_generate_primes(limit) phi = [float(n) for n in range(limit + 1)] for p in primes: