From 9dd0d8425837a13ad908d3a40ba9cf2d5972e341 Mon Sep 17 00:00:00 2001 From: mindaugl Date: Sun, 13 Apr 2025 11:12:46 +0800 Subject: [PATCH 01/55] Add documentation and tests for the Euler project problem 95 solution. --- project_euler/problem_095/__init__.py | 0 project_euler/problem_095/sol1.py | 130 ++++++++++++++++++++++++++ 2 files changed, 130 insertions(+) create mode 100644 project_euler/problem_095/__init__.py create mode 100644 project_euler/problem_095/sol1.py diff --git a/project_euler/problem_095/__init__.py b/project_euler/problem_095/__init__.py new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/project_euler/problem_095/sol1.py b/project_euler/problem_095/sol1.py new file mode 100644 index 000000000000..6f5e44c9551b --- /dev/null +++ b/project_euler/problem_095/sol1.py @@ -0,0 +1,130 @@ +""" +Project Euler Problem 95: https://projecteuler.net/problem=95 + +Amicable Chains + +Solution is doing the following: +- Get relevant prime numbers +- Iterate over product combination of prime numbers to generate all non-prime +numbers up to max number, by keeping track of prime factors +- Calculate the sum of factors for each number +- Iterate over found some factors to find longest chain + +>>> solution(200000) +12496 + +""" + +from numpy import sqrt + + +def sum_primes(factor_d, num): + """ + Calculates the sum of factors from all prime exponents. + + >>> sum_primes({2: 1, 3: 1}, 6) + 6 + """ + tot = 1 + for p in factor_d: + comp = 0 + ex_factor = 1 + for _ in range(factor_d[p] + 1): + comp += ex_factor + ex_factor *= p + tot *= comp + return tot - num + + +def generate_primes(n: int): + """ + Calculates the list of primes up to and including n. + + >>> generate_primes(6) + [2, 3, 5] + """ + primes = [True] * (n + 1) + primes[0] = primes[1] = False + for i in range(2, int(sqrt(n + 1)) + 1): + if primes[i]: + j = i * i + while j <= n: + primes[j] = False + j += i + primes_list = [] + for i in range(2, len(primes)): + if primes[i]: + primes_list += [i] + return primes_list + + +def multiply(chain, primes, prime, prev_n, n_max, prev_sum, primes_d): + """ + Run over all prime combinations to generate non-prime numbers. + + >>> multiply([None] * 3, {2}, 2, 1, 2, 0, {}) + """ + + number = prev_n * prime + primes_d[prime] = primes_d.get(prime, 0) + 1 + if prev_n % prime != 0: + new_sum = prev_sum * (prime + 1) + prev_n + else: + new_sum = sum_primes(primes_d, number) + chain[number] = new_sum + for p in primes: + if p >= prime: + number_n = p * number + if number_n > n_max: + break + multiply(chain, primes, p, number, n_max, new_sum, primes_d.copy()) + + +def find_longest_chain(chain, n_max): + """ + Finds the smallest element and length of longest chain + + >>> find_longest_chain([0, 0, 0, 0, 0, 0, 6], 6) + (6, 1) + """ + + length_max = 0 + elem_max = 0 + for i in range(2, len(chain)): + start = i + length = 1 + el = chain[i] + visited = {i} + while el > 1 and el <= n_max and el not in visited: + length += 1 + visited.add(el) + el = chain[el] + + if el == start and length > length_max: + length_max = length + elem_max = start + + return elem_max, length_max + + +def solution(n_max: int = 1000000) -> int: + """ + Runs the calculation for numbers <= n_max. + + >>> solution(10) + 6 + """ + + primes = generate_primes(n_max) + chain = [0] * (n_max + 1) + for p in primes: + if p * p > n_max: + break + multiply(chain, primes, p, 1, n_max, 0, {}) + + chain_start, _ = find_longest_chain(chain, n_max) + return chain_start + + +if __name__ == "__main__": + print(f"{solution() = }") From 091b592df0eed897013dfb28a9508224b42dec89 Mon Sep 17 00:00:00 2001 From: Maxim Smolskiy Date: Tue, 6 May 2025 22:54:20 +0300 Subject: [PATCH 02/55] Update sol1.py --- project_euler/problem_095/sol1.py | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/project_euler/problem_095/sol1.py b/project_euler/problem_095/sol1.py index 6f5e44c9551b..52eab3099bca 100644 --- a/project_euler/problem_095/sol1.py +++ b/project_euler/problem_095/sol1.py @@ -3,16 +3,19 @@ Amicable Chains +The proper divisors of a number are all the divisors excluding the number itself. For example, the proper divisors of 28 are 1, 2, 4, 7, and 14. As the sum of these divisors is equal to 28, we call it a perfect number. +Interestingly the sum of the proper divisors of 220 is 284 and the sum of the proper divisors of 284 is 220, forming a chain of two numbers. For this reason, 220 and 284 are called an amicable pair. +Perhaps less well known are longer chains. For example, starting with $12496$, we form a chain of five numbers: +12496 -> 14288 -> 15472 -> 14536 -> 14264 (-> 12496 -> ...) +Since this chain returns to its starting point, it is called an amicable chain. +Find the smallest member of the longest amicable chain with no element exceeding one million. + Solution is doing the following: - Get relevant prime numbers - Iterate over product combination of prime numbers to generate all non-prime numbers up to max number, by keeping track of prime factors - Calculate the sum of factors for each number - Iterate over found some factors to find longest chain - ->>> solution(200000) -12496 - """ from numpy import sqrt @@ -113,6 +116,8 @@ def solution(n_max: int = 1000000) -> int: >>> solution(10) 6 + >>> solution(200000) + 12496 """ primes = generate_primes(n_max) From 2d04e70646b610d45cb216220a8f66b7188a8279 Mon Sep 17 00:00:00 2001 From: Maxim Smolskiy Date: Tue, 6 May 2025 22:58:25 +0300 Subject: [PATCH 03/55] Update sol1.py --- project_euler/problem_095/sol1.py | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/project_euler/problem_095/sol1.py b/project_euler/problem_095/sol1.py index 52eab3099bca..b733b1ea9c1a 100644 --- a/project_euler/problem_095/sol1.py +++ b/project_euler/problem_095/sol1.py @@ -3,17 +3,25 @@ Amicable Chains -The proper divisors of a number are all the divisors excluding the number itself. For example, the proper divisors of 28 are 1, 2, 4, 7, and 14. As the sum of these divisors is equal to 28, we call it a perfect number. -Interestingly the sum of the proper divisors of 220 is 284 and the sum of the proper divisors of 284 is 220, forming a chain of two numbers. For this reason, 220 and 284 are called an amicable pair. -Perhaps less well known are longer chains. For example, starting with $12496$, we form a chain of five numbers: -12496 -> 14288 -> 15472 -> 14536 -> 14264 (-> 12496 -> ...) +The proper divisors of a number are all the divisors excluding the number itself. +For example, the proper divisors of 28 are 1, 2, 4, 7, and 14. +As the sum of these divisors is equal to 28, we call it a perfect number. + +Interestingly the sum of the proper divisors of 220 is 284 and the sum of the proper divisors of 284 is 220, +forming a chain of two numbers. For this reason, 220 and 284 are called an amicable pair. + +Perhaps less well known are longer chains. +For example, starting with 12496, we form a chain of five numbers: + 12496 -> 14288 -> 15472 -> 14536 -> 14264 (-> 12496 -> ...) + Since this chain returns to its starting point, it is called an amicable chain. + Find the smallest member of the longest amicable chain with no element exceeding one million. Solution is doing the following: - Get relevant prime numbers - Iterate over product combination of prime numbers to generate all non-prime -numbers up to max number, by keeping track of prime factors + numbers up to max number, by keeping track of prime factors - Calculate the sum of factors for each number - Iterate over found some factors to find longest chain """ From 8b7e69e3057e085e152bebb08e4b5c4627ec452d Mon Sep 17 00:00:00 2001 From: Maxim Smolskiy Date: Tue, 6 May 2025 23:00:09 +0300 Subject: [PATCH 04/55] Update sol1.py --- project_euler/problem_095/sol1.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/project_euler/problem_095/sol1.py b/project_euler/problem_095/sol1.py index b733b1ea9c1a..d35b42c3d80e 100644 --- a/project_euler/problem_095/sol1.py +++ b/project_euler/problem_095/sol1.py @@ -7,8 +7,9 @@ For example, the proper divisors of 28 are 1, 2, 4, 7, and 14. As the sum of these divisors is equal to 28, we call it a perfect number. -Interestingly the sum of the proper divisors of 220 is 284 and the sum of the proper divisors of 284 is 220, -forming a chain of two numbers. For this reason, 220 and 284 are called an amicable pair. +Interestingly the sum of the proper divisors of 220 is 284 and +the sum of the proper divisors of 284 is 220, forming a chain of two numbers. +For this reason, 220 and 284 are called an amicable pair. Perhaps less well known are longer chains. For example, starting with 12496, we form a chain of five numbers: From 4b7893e0e2908f00c55ddff036e6554da635e4ee Mon Sep 17 00:00:00 2001 From: Maxim Smolskiy Date: Tue, 6 May 2025 23:01:33 +0300 Subject: [PATCH 05/55] Update sol1.py --- project_euler/problem_095/sol1.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/project_euler/problem_095/sol1.py b/project_euler/problem_095/sol1.py index d35b42c3d80e..3ec11f776310 100644 --- a/project_euler/problem_095/sol1.py +++ b/project_euler/problem_095/sol1.py @@ -17,7 +17,8 @@ Since this chain returns to its starting point, it is called an amicable chain. -Find the smallest member of the longest amicable chain with no element exceeding one million. +Find the smallest member of the longest amicable chain with +no element exceeding one million. Solution is doing the following: - Get relevant prime numbers From 88c438f739cf836c51226a79f82e760cde64dfdb Mon Sep 17 00:00:00 2001 From: Maxim Smolskiy Date: Tue, 6 May 2025 23:03:28 +0300 Subject: [PATCH 06/55] Update sol1.py --- project_euler/problem_095/sol1.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/project_euler/problem_095/sol1.py b/project_euler/problem_095/sol1.py index 3ec11f776310..3351c6c19b63 100644 --- a/project_euler/problem_095/sol1.py +++ b/project_euler/problem_095/sol1.py @@ -28,7 +28,7 @@ - Iterate over found some factors to find longest chain """ -from numpy import sqrt +from math import isqrt def sum_primes(factor_d, num): @@ -58,7 +58,7 @@ def generate_primes(n: int): """ primes = [True] * (n + 1) primes[0] = primes[1] = False - for i in range(2, int(sqrt(n + 1)) + 1): + for i in range(2, isqrt(n) + 1): if primes[i]: j = i * i while j <= n: From 70def15ce58fbb98120c5f3a22e2af2d50d3cebf Mon Sep 17 00:00:00 2001 From: Maxim Smolskiy Date: Tue, 6 May 2025 23:13:34 +0300 Subject: [PATCH 07/55] Update sol1.py --- project_euler/problem_095/sol1.py | 16 ++++------------ 1 file changed, 4 insertions(+), 12 deletions(-) diff --git a/project_euler/problem_095/sol1.py b/project_euler/problem_095/sol1.py index 3351c6c19b63..1ca14619b5a3 100644 --- a/project_euler/problem_095/sol1.py +++ b/project_euler/problem_095/sol1.py @@ -28,25 +28,17 @@ - Iterate over found some factors to find longest chain """ -from math import isqrt +from math import isqrt, prod -def sum_primes(factor_d, num): +def sum_primes(primes_degrees: dict[int, int], num: int) -> int: """ Calculates the sum of factors from all prime exponents. - >>> sum_primes({2: 1, 3: 1}, 6) + >>> sum_primes(primes_degrees={2: 1, 3: 1}, num=6) 6 """ - tot = 1 - for p in factor_d: - comp = 0 - ex_factor = 1 - for _ in range(factor_d[p] + 1): - comp += ex_factor - ex_factor *= p - tot *= comp - return tot - num + return prod((prime ** (degree + 1) - 1) // (prime - 1) for prime, degree in primes_degrees.items()) - num def generate_primes(n: int): From a5006956616f18170c17d1c361b0c7f5fef65fd3 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Tue, 6 May 2025 20:13:57 +0000 Subject: [PATCH 08/55] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- project_euler/problem_095/sol1.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/project_euler/problem_095/sol1.py b/project_euler/problem_095/sol1.py index 1ca14619b5a3..7caf70df22c9 100644 --- a/project_euler/problem_095/sol1.py +++ b/project_euler/problem_095/sol1.py @@ -38,7 +38,13 @@ def sum_primes(primes_degrees: dict[int, int], num: int) -> int: >>> sum_primes(primes_degrees={2: 1, 3: 1}, num=6) 6 """ - return prod((prime ** (degree + 1) - 1) // (prime - 1) for prime, degree in primes_degrees.items()) - num + return ( + prod( + (prime ** (degree + 1) - 1) // (prime - 1) + for prime, degree in primes_degrees.items() + ) + - num + ) def generate_primes(n: int): From a05f9a43bd9cf963bb97786ea69e319c53dc700e Mon Sep 17 00:00:00 2001 From: Maxim Smolskiy Date: Tue, 6 May 2025 23:23:26 +0300 Subject: [PATCH 09/55] Update sol1.py --- project_euler/problem_095/sol1.py | 25 ++++++++++--------------- 1 file changed, 10 insertions(+), 15 deletions(-) diff --git a/project_euler/problem_095/sol1.py b/project_euler/problem_095/sol1.py index 7caf70df22c9..6f29120ffb36 100644 --- a/project_euler/problem_095/sol1.py +++ b/project_euler/problem_095/sol1.py @@ -47,26 +47,21 @@ def sum_primes(primes_degrees: dict[int, int], num: int) -> int: ) -def generate_primes(n: int): +def generate_primes(num: int) -> list[int]: """ - Calculates the list of primes up to and including n. + Calculates the list of primes up to and including `num`. >>> generate_primes(6) [2, 3, 5] """ - primes = [True] * (n + 1) - primes[0] = primes[1] = False - for i in range(2, isqrt(n) + 1): - if primes[i]: - j = i * i - while j <= n: - primes[j] = False - j += i - primes_list = [] - for i in range(2, len(primes)): - if primes[i]: - primes_list += [i] - return primes_list + are_primes = [True] * (num + 1) + are_primes[0] = are_primes[1] = False + for i in range(start=2, stop=isqrt(num) + 1): + if are_primes[i]: + for j in range(start=i * i, stop=num + 1, step=i) + are_primes[j] = False + + return [prime for prime, is_prime in enumerate(are_primes_ if is_prime] def multiply(chain, primes, prime, prev_n, n_max, prev_sum, primes_d): From 28dfdb6530a04ac9d2aa245bf31a23cde7110147 Mon Sep 17 00:00:00 2001 From: Maxim Smolskiy Date: Tue, 6 May 2025 23:23:45 +0300 Subject: [PATCH 10/55] Update sol1.py --- project_euler/problem_095/sol1.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/project_euler/problem_095/sol1.py b/project_euler/problem_095/sol1.py index 6f29120ffb36..20b163439635 100644 --- a/project_euler/problem_095/sol1.py +++ b/project_euler/problem_095/sol1.py @@ -61,7 +61,7 @@ def generate_primes(num: int) -> list[int]: for j in range(start=i * i, stop=num + 1, step=i) are_primes[j] = False - return [prime for prime, is_prime in enumerate(are_primes_ if is_prime] + return [prime for prime, is_prime in enumerate(are_primes) if is_prime] def multiply(chain, primes, prime, prev_n, n_max, prev_sum, primes_d): From c2223f59f7f6defa40f19eed9d264b5607e1262c Mon Sep 17 00:00:00 2001 From: Maxim Smolskiy Date: Tue, 6 May 2025 23:24:34 +0300 Subject: [PATCH 11/55] Update sol1.py --- project_euler/problem_095/sol1.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/project_euler/problem_095/sol1.py b/project_euler/problem_095/sol1.py index 20b163439635..c7d2122400f3 100644 --- a/project_euler/problem_095/sol1.py +++ b/project_euler/problem_095/sol1.py @@ -58,7 +58,7 @@ def generate_primes(num: int) -> list[int]: are_primes[0] = are_primes[1] = False for i in range(start=2, stop=isqrt(num) + 1): if are_primes[i]: - for j in range(start=i * i, stop=num + 1, step=i) + for j in range(start=i * i, stop=num + 1, step=i): are_primes[j] = False return [prime for prime, is_prime in enumerate(are_primes) if is_prime] From bded10419793551686f124182fc220c9d46f66da Mon Sep 17 00:00:00 2001 From: Maxim Smolskiy Date: Tue, 6 May 2025 23:25:55 +0300 Subject: [PATCH 12/55] Update sol1.py --- project_euler/problem_095/sol1.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/project_euler/problem_095/sol1.py b/project_euler/problem_095/sol1.py index c7d2122400f3..287e66d4727c 100644 --- a/project_euler/problem_095/sol1.py +++ b/project_euler/problem_095/sol1.py @@ -56,9 +56,9 @@ def generate_primes(num: int) -> list[int]: """ are_primes = [True] * (num + 1) are_primes[0] = are_primes[1] = False - for i in range(start=2, stop=isqrt(num) + 1): + for i in range(2, isqrt(num) + 1): if are_primes[i]: - for j in range(start=i * i, stop=num + 1, step=i): + for j in range(i * i, num + 1, i): are_primes[j] = False return [prime for prime, is_prime in enumerate(are_primes) if is_prime] From b22afa5a2644f08dde6cd5a8ac5f0f6fac89f495 Mon Sep 17 00:00:00 2001 From: Maxim Smolskiy Date: Tue, 6 May 2025 23:30:51 +0300 Subject: [PATCH 13/55] Update sol1.py --- project_euler/problem_095/sol1.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/project_euler/problem_095/sol1.py b/project_euler/problem_095/sol1.py index 287e66d4727c..7c4105793d2e 100644 --- a/project_euler/problem_095/sol1.py +++ b/project_euler/problem_095/sol1.py @@ -86,9 +86,9 @@ def multiply(chain, primes, prime, prev_n, n_max, prev_sum, primes_d): multiply(chain, primes, p, number, n_max, new_sum, primes_d.copy()) -def find_longest_chain(chain, n_max): +def find_longest_chain(chain: list[int], max_num: int) -> tuple[int, int]: """ - Finds the smallest element and length of longest chain + Finds the greatest element and length of longest chain >>> find_longest_chain([0, 0, 0, 0, 0, 0, 6], 6) (6, 1) @@ -101,7 +101,7 @@ def find_longest_chain(chain, n_max): length = 1 el = chain[i] visited = {i} - while el > 1 and el <= n_max and el not in visited: + while el > 1 and el <= max_num and el not in visited: length += 1 visited.add(el) el = chain[el] @@ -113,9 +113,9 @@ def find_longest_chain(chain, n_max): return elem_max, length_max -def solution(n_max: int = 1000000) -> int: +def solution(max_num: int = 1000000) -> int: """ - Runs the calculation for numbers <= n_max. + Runs the calculation for numbers <= `max_num`. >>> solution(10) 6 From cfd347ca53dad3fb98ce9e6e23b9d4f384226f0e Mon Sep 17 00:00:00 2001 From: Maxim Smolskiy Date: Tue, 6 May 2025 23:32:49 +0300 Subject: [PATCH 14/55] Update sol1.py --- project_euler/problem_095/sol1.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/project_euler/problem_095/sol1.py b/project_euler/problem_095/sol1.py index 7c4105793d2e..2f67a413a585 100644 --- a/project_euler/problem_095/sol1.py +++ b/project_euler/problem_095/sol1.py @@ -64,7 +64,7 @@ def generate_primes(num: int) -> list[int]: return [prime for prime, is_prime in enumerate(are_primes) if is_prime] -def multiply(chain, primes, prime, prev_n, n_max, prev_sum, primes_d): +def multiply(chain: list, primes: set[int], prime: int, prev_n: int, n_max: int, prev_sum: int, primes_d: dict[int, int]) -> None: """ Run over all prime combinations to generate non-prime numbers. @@ -123,14 +123,14 @@ def solution(max_num: int = 1000000) -> int: 12496 """ - primes = generate_primes(n_max) - chain = [0] * (n_max + 1) + primes = generate_primes(max_num) + chain = [0] * (max_num + 1) for p in primes: - if p * p > n_max: + if p * p > max_num: break - multiply(chain, primes, p, 1, n_max, 0, {}) + multiply(chain, primes, p, 1, max_num, 0, {}) - chain_start, _ = find_longest_chain(chain, n_max) + chain_start, _ = find_longest_chain(chain, max_num) return chain_start From 7dbbf039d7e9aed7493716375183c9f526ec52b8 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Tue, 6 May 2025 20:33:16 +0000 Subject: [PATCH 15/55] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- project_euler/problem_095/sol1.py | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/project_euler/problem_095/sol1.py b/project_euler/problem_095/sol1.py index 2f67a413a585..9b4e973f40ac 100644 --- a/project_euler/problem_095/sol1.py +++ b/project_euler/problem_095/sol1.py @@ -64,7 +64,15 @@ def generate_primes(num: int) -> list[int]: return [prime for prime, is_prime in enumerate(are_primes) if is_prime] -def multiply(chain: list, primes: set[int], prime: int, prev_n: int, n_max: int, prev_sum: int, primes_d: dict[int, int]) -> None: +def multiply( + chain: list, + primes: set[int], + prime: int, + prev_n: int, + n_max: int, + prev_sum: int, + primes_d: dict[int, int], +) -> None: """ Run over all prime combinations to generate non-prime numbers. From 2d329107bb4e08d6c094759c07a3ad8457a87782 Mon Sep 17 00:00:00 2001 From: Maxim Smolskiy Date: Tue, 6 May 2025 23:39:19 +0300 Subject: [PATCH 16/55] Update sol1.py --- project_euler/problem_095/sol1.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/project_euler/problem_095/sol1.py b/project_euler/problem_095/sol1.py index 9b4e973f40ac..3329aa9d408d 100644 --- a/project_euler/problem_095/sol1.py +++ b/project_euler/problem_095/sol1.py @@ -66,7 +66,7 @@ def generate_primes(num: int) -> list[int]: def multiply( chain: list, - primes: set[int], + primes: list[int], prime: int, prev_n: int, n_max: int, @@ -76,7 +76,7 @@ def multiply( """ Run over all prime combinations to generate non-prime numbers. - >>> multiply([None] * 3, {2}, 2, 1, 2, 0, {}) + >>> multiply([None] * 3, [2], 2, 1, 2, 0, {}) """ number = prev_n * prime From 24c99a6b0fb197de40769724d7878918d2a4f735 Mon Sep 17 00:00:00 2001 From: Maxim Smolskiy Date: Tue, 6 May 2025 23:44:33 +0300 Subject: [PATCH 17/55] Update sol1.py --- project_euler/problem_095/sol1.py | 21 ++++++++++----------- 1 file changed, 10 insertions(+), 11 deletions(-) diff --git a/project_euler/problem_095/sol1.py b/project_euler/problem_095/sol1.py index 3329aa9d408d..47f60a8d2f39 100644 --- a/project_euler/problem_095/sol1.py +++ b/project_euler/problem_095/sol1.py @@ -47,18 +47,18 @@ def sum_primes(primes_degrees: dict[int, int], num: int) -> int: ) -def generate_primes(num: int) -> list[int]: +def generate_primes(max_num: int) -> list[int]: """ - Calculates the list of primes up to and including `num`. + Calculates the list of primes up to and including `max_num`. >>> generate_primes(6) [2, 3, 5] """ - are_primes = [True] * (num + 1) + are_primes = [True] * (max_num + 1) are_primes[0] = are_primes[1] = False - for i in range(2, isqrt(num) + 1): + for i in range(2, isqrt(max_num) + 1): if are_primes[i]: - for j in range(i * i, num + 1, i): + for j in range(i * i, max_num + 1, i): are_primes[j] = False return [prime for prime, is_prime in enumerate(are_primes) if is_prime] @@ -131,12 +131,11 @@ def solution(max_num: int = 1000000) -> int: 12496 """ - primes = generate_primes(max_num) - chain = [0] * (max_num + 1) - for p in primes: - if p * p > max_num: - break - multiply(chain, primes, p, 1, max_num, 0, {}) + isqrt_max_num = isqrt(max_num) + primes = generate_primes(isqrt_max_num) + chain = [0] * (isqrt_max_num + 1) + for prime in primes: + multiply(chain, primes, prime, 1, max_num, 0, {}) chain_start, _ = find_longest_chain(chain, max_num) return chain_start From 3ff43b900fc967e1743e652786f5c50682a56f71 Mon Sep 17 00:00:00 2001 From: Maxim Smolskiy Date: Tue, 6 May 2025 23:45:59 +0300 Subject: [PATCH 18/55] Update sol1.py --- project_euler/problem_095/sol1.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/project_euler/problem_095/sol1.py b/project_euler/problem_095/sol1.py index 47f60a8d2f39..ca274af32a76 100644 --- a/project_euler/problem_095/sol1.py +++ b/project_euler/problem_095/sol1.py @@ -131,9 +131,8 @@ def solution(max_num: int = 1000000) -> int: 12496 """ - isqrt_max_num = isqrt(max_num) - primes = generate_primes(isqrt_max_num) - chain = [0] * (isqrt_max_num + 1) + primes = generate_primes(isqrt(max_num)) + chain = [0] * (max_num + 1) for prime in primes: multiply(chain, primes, prime, 1, max_num, 0, {}) From 5e62ac6aee3bca4e2828ebae4ad8f5e562ae3ba5 Mon Sep 17 00:00:00 2001 From: Maxim Smolskiy Date: Tue, 6 May 2025 23:49:03 +0300 Subject: [PATCH 19/55] Update sol1.py --- project_euler/problem_095/sol1.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/project_euler/problem_095/sol1.py b/project_euler/problem_095/sol1.py index ca274af32a76..3a8b7032208f 100644 --- a/project_euler/problem_095/sol1.py +++ b/project_euler/problem_095/sol1.py @@ -131,9 +131,12 @@ def solution(max_num: int = 1000000) -> int: 12496 """ - primes = generate_primes(isqrt(max_num)) + primes = generate_primes(max_num) chain = [0] * (max_num + 1) for prime in primes: + if prime ** 2 > max_num: + break + multiply(chain, primes, prime, 1, max_num, 0, {}) chain_start, _ = find_longest_chain(chain, max_num) From 3953d1d7ccaf259d65c46b05158653d8e1d4c0d0 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Tue, 6 May 2025 20:49:51 +0000 Subject: [PATCH 20/55] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- project_euler/problem_095/sol1.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/project_euler/problem_095/sol1.py b/project_euler/problem_095/sol1.py index 3a8b7032208f..78707302ba51 100644 --- a/project_euler/problem_095/sol1.py +++ b/project_euler/problem_095/sol1.py @@ -134,7 +134,7 @@ def solution(max_num: int = 1000000) -> int: primes = generate_primes(max_num) chain = [0] * (max_num + 1) for prime in primes: - if prime ** 2 > max_num: + if prime**2 > max_num: break multiply(chain, primes, prime, 1, max_num, 0, {}) From e0f7394b7d7bdf0b472ceef7acb3fdcc05898dec Mon Sep 17 00:00:00 2001 From: Maxim Smolskiy Date: Tue, 6 May 2025 23:55:02 +0300 Subject: [PATCH 21/55] Update sol1.py --- project_euler/problem_095/sol1.py | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/project_euler/problem_095/sol1.py b/project_euler/problem_095/sol1.py index 78707302ba51..39d38ed5eea4 100644 --- a/project_euler/problem_095/sol1.py +++ b/project_euler/problem_095/sol1.py @@ -47,18 +47,18 @@ def sum_primes(primes_degrees: dict[int, int], num: int) -> int: ) -def generate_primes(max_num: int) -> list[int]: +def generate_primes(max_prime: int) -> list[int]: """ - Calculates the list of primes up to and including `max_num`. + Calculates the list of primes up to and including `max_prime`. >>> generate_primes(6) [2, 3, 5] """ - are_primes = [True] * (max_num + 1) + are_primes = [True] * (max_prime + 1) are_primes[0] = are_primes[1] = False - for i in range(2, isqrt(max_num) + 1): + for i in range(2, isqrt(max_prime) + 1): if are_primes[i]: - for j in range(i * i, max_num + 1, i): + for j in range(i * i, max_prime + 1, i): are_primes[j] = False return [prime for prime, is_prime in enumerate(are_primes) if is_prime] @@ -94,12 +94,12 @@ def multiply( multiply(chain, primes, p, number, n_max, new_sum, primes_d.copy()) -def find_longest_chain(chain: list[int], max_num: int) -> tuple[int, int]: +def find_longest_chain(chain: list[int], max_num: int) -> int: """ - Finds the greatest element and length of longest chain + Finds the smallest element of longest chain >>> find_longest_chain([0, 0, 0, 0, 0, 0, 6], 6) - (6, 1) + 6 """ length_max = 0 @@ -139,8 +139,7 @@ def solution(max_num: int = 1000000) -> int: multiply(chain, primes, prime, 1, max_num, 0, {}) - chain_start, _ = find_longest_chain(chain, max_num) - return chain_start + return find_longest_chain(chain, max_num) if __name__ == "__main__": From 9293662b631b199630e54a55e47f3e9315a229ef Mon Sep 17 00:00:00 2001 From: Maxim Smolskiy Date: Tue, 6 May 2025 23:55:24 +0300 Subject: [PATCH 22/55] Update sol1.py From ca6abd91d8edff52a0000c5fc63d97a25f934801 Mon Sep 17 00:00:00 2001 From: Maxim Smolskiy Date: Tue, 6 May 2025 23:56:37 +0300 Subject: [PATCH 23/55] Update sol1.py --- project_euler/problem_095/sol1.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/project_euler/problem_095/sol1.py b/project_euler/problem_095/sol1.py index 39d38ed5eea4..2f9bbc6a18f1 100644 --- a/project_euler/problem_095/sol1.py +++ b/project_euler/problem_095/sol1.py @@ -118,7 +118,7 @@ def find_longest_chain(chain: list[int], max_num: int) -> int: length_max = length elem_max = start - return elem_max, length_max + return elem_max def solution(max_num: int = 1000000) -> int: From 7c8138ee8a51d9ed72ec2c31e451c764161a41ef Mon Sep 17 00:00:00 2001 From: Maxim Smolskiy Date: Wed, 7 May 2025 00:03:15 +0300 Subject: [PATCH 24/55] Update sol1.py --- project_euler/problem_095/sol1.py | 24 +++++++++++++++--------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git a/project_euler/problem_095/sol1.py b/project_euler/problem_095/sol1.py index 2f9bbc6a18f1..52f1a5a3d796 100644 --- a/project_euler/problem_095/sol1.py +++ b/project_euler/problem_095/sol1.py @@ -69,29 +69,35 @@ def multiply( primes: list[int], prime: int, prev_n: int, - n_max: int, + max_num: int, prev_sum: int, - primes_d: dict[int, int], + primes_degrees: dict[int, int], ) -> None: """ Run over all prime combinations to generate non-prime numbers. - >>> multiply([None] * 3, [2], 2, 1, 2, 0, {}) + >>> chain = [0] * 3 + >>> primes_degrees = {} + >>> multiply(chain=chain, primes=[2], prime=2, prev_n=1, max_num=2, prev_sum=0, primes_degrees=primes_degrees) + >>> chain + [0, 0, 0] + >>> primes_degrees + {} """ - number = prev_n * prime + num = prev_n * prime primes_d[prime] = primes_d.get(prime, 0) + 1 if prev_n % prime != 0: new_sum = prev_sum * (prime + 1) + prev_n else: - new_sum = sum_primes(primes_d, number) - chain[number] = new_sum + new_sum = sum_primes(primes_d, num) + chain[num] = new_sum for p in primes: if p >= prime: number_n = p * number - if number_n > n_max: + if number_n > max_num: break - multiply(chain, primes, p, number, n_max, new_sum, primes_d.copy()) + multiply(chain=chain, primes=primes, prime=p, prev_n=num, max_num=max_num, prev_sum=new_sum, primes_degrees=primes_degrees.copy()) def find_longest_chain(chain: list[int], max_num: int) -> int: @@ -137,7 +143,7 @@ def solution(max_num: int = 1000000) -> int: if prime**2 > max_num: break - multiply(chain, primes, prime, 1, max_num, 0, {}) + multiply(chain=chain, primes=primes, prime=prime, prev_n=1, max_num=max_num, prev_sum=0, primes_degrees={}) return find_longest_chain(chain, max_num) From 475a907afccfd9ffcfbb8b6063820fa991b4e5b9 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Tue, 6 May 2025 21:03:39 +0000 Subject: [PATCH 25/55] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- project_euler/problem_095/sol1.py | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/project_euler/problem_095/sol1.py b/project_euler/problem_095/sol1.py index 52f1a5a3d796..c0b84563a3b3 100644 --- a/project_euler/problem_095/sol1.py +++ b/project_euler/problem_095/sol1.py @@ -97,7 +97,15 @@ def multiply( number_n = p * number if number_n > max_num: break - multiply(chain=chain, primes=primes, prime=p, prev_n=num, max_num=max_num, prev_sum=new_sum, primes_degrees=primes_degrees.copy()) + multiply( + chain=chain, + primes=primes, + prime=p, + prev_n=num, + max_num=max_num, + prev_sum=new_sum, + primes_degrees=primes_degrees.copy(), + ) def find_longest_chain(chain: list[int], max_num: int) -> int: @@ -143,7 +151,15 @@ def solution(max_num: int = 1000000) -> int: if prime**2 > max_num: break - multiply(chain=chain, primes=primes, prime=prime, prev_n=1, max_num=max_num, prev_sum=0, primes_degrees={}) + multiply( + chain=chain, + primes=primes, + prime=prime, + prev_n=1, + max_num=max_num, + prev_sum=0, + primes_degrees={}, + ) return find_longest_chain(chain, max_num) From 55e4081f1fd3ac9d6e7a239370b9581ca3ed0e05 Mon Sep 17 00:00:00 2001 From: Maxim Smolskiy Date: Wed, 7 May 2025 00:06:09 +0300 Subject: [PATCH 26/55] Update sol1.py --- project_euler/problem_095/sol1.py | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/project_euler/problem_095/sol1.py b/project_euler/problem_095/sol1.py index c0b84563a3b3..725b53281196 100644 --- a/project_euler/problem_095/sol1.py +++ b/project_euler/problem_095/sol1.py @@ -65,10 +65,10 @@ def generate_primes(max_prime: int) -> list[int]: def multiply( - chain: list, + chain: list[int], primes: list[int], prime: int, - prev_n: int, + prev_num: int, max_num: int, prev_sum: int, primes_degrees: dict[int, int], @@ -86,21 +86,21 @@ def multiply( """ num = prev_n * prime - primes_d[prime] = primes_d.get(prime, 0) + 1 - if prev_n % prime != 0: - new_sum = prev_sum * (prime + 1) + prev_n + primes_degrees[prime] = primes_degrees.get(prime, 0) + 1 + if prev_num % prime != 0: + new_sum = prev_sum * (prime + 1) + prev_num else: - new_sum = sum_primes(primes_d, num) + new_sum = sum_primes(primes_degrees=primes_degrees, num=num) chain[num] = new_sum - for p in primes: - if p >= prime: - number_n = p * number - if number_n > max_num: + for prime in primes: + if prime >= prime: + num_n = p * num + if num_n > max_num: break multiply( chain=chain, primes=primes, - prime=p, + prime=prime, prev_n=num, max_num=max_num, prev_sum=new_sum, @@ -155,13 +155,13 @@ def solution(max_num: int = 1000000) -> int: chain=chain, primes=primes, prime=prime, - prev_n=1, + prev_num=1, max_num=max_num, prev_sum=0, primes_degrees={}, ) - return find_longest_chain(chain, max_num) + return find_longest_chain(chain=chain, max_num=max_num) if __name__ == "__main__": From 0fa14b67bd215071a6b296b079b5239e7fcca884 Mon Sep 17 00:00:00 2001 From: Maxim Smolskiy Date: Wed, 7 May 2025 00:09:32 +0300 Subject: [PATCH 27/55] Update sol1.py --- project_euler/problem_095/sol1.py | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/project_euler/problem_095/sol1.py b/project_euler/problem_095/sol1.py index 725b53281196..c428ad2552e9 100644 --- a/project_euler/problem_095/sol1.py +++ b/project_euler/problem_095/sol1.py @@ -67,7 +67,7 @@ def generate_primes(max_prime: int) -> list[int]: def multiply( chain: list[int], primes: list[int], - prime: int, + min_prime: int, prev_num: int, max_num: int, prev_sum: int, @@ -78,30 +78,30 @@ def multiply( >>> chain = [0] * 3 >>> primes_degrees = {} - >>> multiply(chain=chain, primes=[2], prime=2, prev_n=1, max_num=2, prev_sum=0, primes_degrees=primes_degrees) + >>> multiply(chain=chain, primes=[2], min_prime=2, prev_n=1, max_num=2, prev_sum=0, primes_degrees=primes_degrees) >>> chain [0, 0, 0] >>> primes_degrees {} """ - num = prev_n * prime - primes_degrees[prime] = primes_degrees.get(prime, 0) + 1 - if prev_num % prime != 0: - new_sum = prev_sum * (prime + 1) + prev_num + num = prev_num * min_prime + primes_degrees[prime] = primes_degrees.get(min_prime, 0) + 1 + if prev_num % min_prime != 0: + new_sum = prev_sum * (min_prime + 1) + prev_num else: new_sum = sum_primes(primes_degrees=primes_degrees, num=num) chain[num] = new_sum for prime in primes: - if prime >= prime: - num_n = p * num + if prime >= min_prime: + num_n = prime * num if num_n > max_num: break multiply( chain=chain, primes=primes, - prime=prime, - prev_n=num, + min_prime=prime, + prev_num=num, max_num=max_num, prev_sum=new_sum, primes_degrees=primes_degrees.copy(), @@ -154,7 +154,7 @@ def solution(max_num: int = 1000000) -> int: multiply( chain=chain, primes=primes, - prime=prime, + min_prime=prime, prev_num=1, max_num=max_num, prev_sum=0, From e83668640b36ac965593024af63e60f58b3649bf Mon Sep 17 00:00:00 2001 From: Maxim Smolskiy Date: Wed, 7 May 2025 00:10:21 +0300 Subject: [PATCH 28/55] Update sol1.py --- project_euler/problem_095/sol1.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/project_euler/problem_095/sol1.py b/project_euler/problem_095/sol1.py index c428ad2552e9..9624cfebd599 100644 --- a/project_euler/problem_095/sol1.py +++ b/project_euler/problem_095/sol1.py @@ -86,7 +86,7 @@ def multiply( """ num = prev_num * min_prime - primes_degrees[prime] = primes_degrees.get(min_prime, 0) + 1 + primes_degrees[min_prime] = primes_degrees.get(min_prime, 0) + 1 if prev_num % min_prime != 0: new_sum = prev_sum * (min_prime + 1) + prev_num else: From 3887c77413f91238531fb00ad2dc6c797743d457 Mon Sep 17 00:00:00 2001 From: Maxim Smolskiy Date: Wed, 7 May 2025 00:12:59 +0300 Subject: [PATCH 29/55] Update sol1.py --- project_euler/problem_095/sol1.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/project_euler/problem_095/sol1.py b/project_euler/problem_095/sol1.py index 9624cfebd599..659addbc8842 100644 --- a/project_euler/problem_095/sol1.py +++ b/project_euler/problem_095/sol1.py @@ -78,7 +78,8 @@ def multiply( >>> chain = [0] * 3 >>> primes_degrees = {} - >>> multiply(chain=chain, primes=[2], min_prime=2, prev_n=1, max_num=2, prev_sum=0, primes_degrees=primes_degrees) + >>> multiply( + ... chain=chain, primes=[2], min_prime=2, prev_n=1, max_num=2, prev_sum=0, primes_degrees=primes_degrees) >>> chain [0, 0, 0] >>> primes_degrees From 11a8439315e4dabd8b1240e5eed5ee1ccd7ec417 Mon Sep 17 00:00:00 2001 From: Maxim Smolskiy Date: Wed, 7 May 2025 00:14:47 +0300 Subject: [PATCH 30/55] Update sol1.py --- project_euler/problem_095/sol1.py | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/project_euler/problem_095/sol1.py b/project_euler/problem_095/sol1.py index 659addbc8842..921a0be32b89 100644 --- a/project_euler/problem_095/sol1.py +++ b/project_euler/problem_095/sol1.py @@ -79,7 +79,14 @@ def multiply( >>> chain = [0] * 3 >>> primes_degrees = {} >>> multiply( - ... chain=chain, primes=[2], min_prime=2, prev_n=1, max_num=2, prev_sum=0, primes_degrees=primes_degrees) + ... chain=chain, + ... primes=[2], + ... min_prime=2 + ... prev_n=1, + ... max_num=2, + ... prev_sum=0, + ... primes_degrees=primes_degrees, + ... ) >>> chain [0, 0, 0] >>> primes_degrees @@ -113,7 +120,7 @@ def find_longest_chain(chain: list[int], max_num: int) -> int: """ Finds the smallest element of longest chain - >>> find_longest_chain([0, 0, 0, 0, 0, 0, 6], 6) + >>> find_longest_chain(chain=[0, 0, 0, 0, 0, 0, 6], max_num=6) 6 """ From 3522c2c04b8b48411ca459930a098753dad0bfee Mon Sep 17 00:00:00 2001 From: Maxim Smolskiy Date: Wed, 7 May 2025 00:17:58 +0300 Subject: [PATCH 31/55] Update sol1.py --- project_euler/problem_095/sol1.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/project_euler/problem_095/sol1.py b/project_euler/problem_095/sol1.py index 921a0be32b89..9bd894b348d4 100644 --- a/project_euler/problem_095/sol1.py +++ b/project_euler/problem_095/sol1.py @@ -81,7 +81,7 @@ def multiply( >>> multiply( ... chain=chain, ... primes=[2], - ... min_prime=2 + ... min_prime=2, ... prev_n=1, ... max_num=2, ... prev_sum=0, From 09c13a12fc43ed75fad33a52a8277464c79164b0 Mon Sep 17 00:00:00 2001 From: Maxim Smolskiy Date: Wed, 7 May 2025 00:21:20 +0300 Subject: [PATCH 32/55] Update sol1.py --- project_euler/problem_095/sol1.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/project_euler/problem_095/sol1.py b/project_euler/problem_095/sol1.py index 9bd894b348d4..76dd8abd0f35 100644 --- a/project_euler/problem_095/sol1.py +++ b/project_euler/problem_095/sol1.py @@ -82,7 +82,7 @@ def multiply( ... chain=chain, ... primes=[2], ... min_prime=2, - ... prev_n=1, + ... prev_num=1, ... max_num=2, ... prev_sum=0, ... primes_degrees=primes_degrees, From 5af164271a50606801b7c0c7d76fd1d3631221eb Mon Sep 17 00:00:00 2001 From: Maxim Smolskiy Date: Wed, 7 May 2025 00:25:07 +0300 Subject: [PATCH 33/55] Update sol1.py --- project_euler/problem_095/sol1.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/project_euler/problem_095/sol1.py b/project_euler/problem_095/sol1.py index 76dd8abd0f35..1826db6bdf07 100644 --- a/project_euler/problem_095/sol1.py +++ b/project_euler/problem_095/sol1.py @@ -88,7 +88,7 @@ def multiply( ... primes_degrees=primes_degrees, ... ) >>> chain - [0, 0, 0] + [0, 0, 1] >>> primes_degrees {} """ From ad68f4c452733f1660edace9398abbb1f0bf9fd4 Mon Sep 17 00:00:00 2001 From: Maxim Smolskiy Date: Wed, 7 May 2025 00:28:28 +0300 Subject: [PATCH 34/55] Update sol1.py --- project_euler/problem_095/sol1.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/project_euler/problem_095/sol1.py b/project_euler/problem_095/sol1.py index 1826db6bdf07..bdba6a0cf57d 100644 --- a/project_euler/problem_095/sol1.py +++ b/project_euler/problem_095/sol1.py @@ -90,7 +90,7 @@ def multiply( >>> chain [0, 0, 1] >>> primes_degrees - {} + {2: 1} """ num = prev_num * min_prime From 265ce55b2a377d0b752f7b2b4d96945b57223119 Mon Sep 17 00:00:00 2001 From: Maxim Smolskiy Date: Wed, 7 May 2025 00:32:07 +0300 Subject: [PATCH 35/55] Update sol1.py --- project_euler/problem_095/sol1.py | 36 +++++++++++++++---------------- 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/project_euler/problem_095/sol1.py b/project_euler/problem_095/sol1.py index bdba6a0cf57d..ecc411f74cf3 100644 --- a/project_euler/problem_095/sol1.py +++ b/project_euler/problem_095/sol1.py @@ -67,7 +67,7 @@ def generate_primes(max_prime: int) -> list[int]: def multiply( chain: list[int], primes: list[int], - min_prime: int, + min_prime_idx: int, prev_num: int, max_num: int, prev_sum: int, @@ -81,7 +81,7 @@ def multiply( >>> multiply( ... chain=chain, ... primes=[2], - ... min_prime=2, + ... min_prime_idx=0, ... prev_num=1, ... max_num=2, ... prev_sum=0, @@ -93,6 +93,7 @@ def multiply( {2: 1} """ + min_prime = primes[min_prime_idx] num = prev_num * min_prime primes_degrees[min_prime] = primes_degrees.get(min_prime, 0) + 1 if prev_num % min_prime != 0: @@ -100,20 +101,19 @@ def multiply( else: new_sum = sum_primes(primes_degrees=primes_degrees, num=num) chain[num] = new_sum - for prime in primes: - if prime >= min_prime: - num_n = prime * num - if num_n > max_num: - break - multiply( - chain=chain, - primes=primes, - min_prime=prime, - prev_num=num, - max_num=max_num, - prev_sum=new_sum, - primes_degrees=primes_degrees.copy(), - ) + for prime_idx in range(min_prime_idx, len(primes)): + num_n = primes[prime_idx] * num + if num_n > max_num: + break + multiply( + chain=chain, + primes=primes, + min_prime_idx=prime_idx, + prev_num=num, + max_num=max_num, + prev_sum=new_sum, + primes_degrees=primes_degrees.copy(), + ) def find_longest_chain(chain: list[int], max_num: int) -> int: @@ -155,14 +155,14 @@ def solution(max_num: int = 1000000) -> int: primes = generate_primes(max_num) chain = [0] * (max_num + 1) - for prime in primes: + for prime_idx, prime in enumerate(primes): if prime**2 > max_num: break multiply( chain=chain, primes=primes, - min_prime=prime, + min_prime_idx=prime_idx, prev_num=1, max_num=max_num, prev_sum=0, From ab032d68610f5682eaafd138c50be204301b1059 Mon Sep 17 00:00:00 2001 From: Maxim Smolskiy Date: Wed, 7 May 2025 00:35:06 +0300 Subject: [PATCH 36/55] Update sol1.py --- project_euler/problem_095/sol1.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/project_euler/problem_095/sol1.py b/project_euler/problem_095/sol1.py index ecc411f74cf3..5884a9bd518b 100644 --- a/project_euler/problem_095/sol1.py +++ b/project_euler/problem_095/sol1.py @@ -101,14 +101,14 @@ def multiply( else: new_sum = sum_primes(primes_degrees=primes_degrees, num=num) chain[num] = new_sum - for prime_idx in range(min_prime_idx, len(primes)): - num_n = primes[prime_idx] * num + for prime_idx, prime in primes[min_prime_idx:]: + num_n = prime * num if num_n > max_num: break multiply( chain=chain, primes=primes, - min_prime_idx=prime_idx, + min_prime_idx=min_prime_idx + prime_idx, prev_num=num, max_num=max_num, prev_sum=new_sum, From afb78f53c2638b03f8bd2d81881b7c7ed0d0c26e Mon Sep 17 00:00:00 2001 From: Maxim Smolskiy Date: Wed, 7 May 2025 00:36:25 +0300 Subject: [PATCH 37/55] Update sol1.py --- project_euler/problem_095/sol1.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/project_euler/problem_095/sol1.py b/project_euler/problem_095/sol1.py index 5884a9bd518b..48e9c6f59ad5 100644 --- a/project_euler/problem_095/sol1.py +++ b/project_euler/problem_095/sol1.py @@ -101,7 +101,7 @@ def multiply( else: new_sum = sum_primes(primes_degrees=primes_degrees, num=num) chain[num] = new_sum - for prime_idx, prime in primes[min_prime_idx:]: + for prime_idx, prime in enumerate(primes[min_prime_idx:]): num_n = prime * num if num_n > max_num: break From 7f6a6d8852063b35bf3387799d5384ba4d24bb48 Mon Sep 17 00:00:00 2001 From: Maxim Smolskiy Date: Wed, 7 May 2025 00:39:08 +0300 Subject: [PATCH 38/55] Update sol1.py --- project_euler/problem_095/sol1.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/project_euler/problem_095/sol1.py b/project_euler/problem_095/sol1.py index 48e9c6f59ad5..ecc411f74cf3 100644 --- a/project_euler/problem_095/sol1.py +++ b/project_euler/problem_095/sol1.py @@ -101,14 +101,14 @@ def multiply( else: new_sum = sum_primes(primes_degrees=primes_degrees, num=num) chain[num] = new_sum - for prime_idx, prime in enumerate(primes[min_prime_idx:]): - num_n = prime * num + for prime_idx in range(min_prime_idx, len(primes)): + num_n = primes[prime_idx] * num if num_n > max_num: break multiply( chain=chain, primes=primes, - min_prime_idx=min_prime_idx + prime_idx, + min_prime_idx=prime_idx, prev_num=num, max_num=max_num, prev_sum=new_sum, From 2375c33a8d56f35fd214c1491c962a1ab0214f29 Mon Sep 17 00:00:00 2001 From: Maxim Smolskiy Date: Thu, 8 May 2025 00:31:56 +0300 Subject: [PATCH 39/55] Update sol1.py --- project_euler/problem_095/sol1.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/project_euler/problem_095/sol1.py b/project_euler/problem_095/sol1.py index ecc411f74cf3..79c9c8c3f13d 100644 --- a/project_euler/problem_095/sol1.py +++ b/project_euler/problem_095/sol1.py @@ -95,7 +95,7 @@ def multiply( min_prime = primes[min_prime_idx] num = prev_num * min_prime - primes_degrees[min_prime] = primes_degrees.get(min_prime, 0) + 1 + primes_degrees[min_prime] = primes_degrees.get(key=min_prime, default=0) + 1 if prev_num % min_prime != 0: new_sum = prev_sum * (min_prime + 1) + prev_num else: From 05c2c51d626e77ef983f64017553eed648d5aef1 Mon Sep 17 00:00:00 2001 From: Maxim Smolskiy Date: Thu, 8 May 2025 00:33:32 +0300 Subject: [PATCH 40/55] Update sol1.py --- project_euler/problem_095/sol1.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/project_euler/problem_095/sol1.py b/project_euler/problem_095/sol1.py index 79c9c8c3f13d..ecc411f74cf3 100644 --- a/project_euler/problem_095/sol1.py +++ b/project_euler/problem_095/sol1.py @@ -95,7 +95,7 @@ def multiply( min_prime = primes[min_prime_idx] num = prev_num * min_prime - primes_degrees[min_prime] = primes_degrees.get(key=min_prime, default=0) + 1 + primes_degrees[min_prime] = primes_degrees.get(min_prime, 0) + 1 if prev_num % min_prime != 0: new_sum = prev_sum * (min_prime + 1) + prev_num else: From 41a91c7e2294cdaa4e74a0d6583681c0a3fad84e Mon Sep 17 00:00:00 2001 From: Maxim Smolskiy Date: Thu, 8 May 2025 00:41:48 +0300 Subject: [PATCH 41/55] Update sol1.py --- project_euler/problem_095/sol1.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/project_euler/problem_095/sol1.py b/project_euler/problem_095/sol1.py index ecc411f74cf3..dc83732b9c53 100644 --- a/project_euler/problem_095/sol1.py +++ b/project_euler/problem_095/sol1.py @@ -99,7 +99,8 @@ def multiply( if prev_num % min_prime != 0: new_sum = prev_sum * (min_prime + 1) + prev_num else: - new_sum = sum_primes(primes_degrees=primes_degrees, num=num) + new_sum = prev_sum * (min_prime + 1) + prev_num + assert new_sum == sum_primes(primes_degrees=primes_degrees, num=num) chain[num] = new_sum for prime_idx in range(min_prime_idx, len(primes)): num_n = primes[prime_idx] * num From e5a2fbf205e3efcd2f1014ac97b0d795c2f2291c Mon Sep 17 00:00:00 2001 From: Maxim Smolskiy Date: Thu, 8 May 2025 00:51:08 +0300 Subject: [PATCH 42/55] Update sol1.py --- project_euler/problem_095/sol1.py | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/project_euler/problem_095/sol1.py b/project_euler/problem_095/sol1.py index dc83732b9c53..756167f40c4a 100644 --- a/project_euler/problem_095/sol1.py +++ b/project_euler/problem_095/sol1.py @@ -95,13 +95,15 @@ def multiply( min_prime = primes[min_prime_idx] num = prev_num * min_prime - primes_degrees[min_prime] = primes_degrees.get(min_prime, 0) + 1 - if prev_num % min_prime != 0: - new_sum = prev_sum * (min_prime + 1) + prev_num - else: - new_sum = prev_sum * (min_prime + 1) + prev_num + + min_prime_degree = primes_degrees.get(min_prime, 0) + min_prime_degree += 1 + primes_degrees[min_prime] = min_prime_degree + + new_sum = (prev_sum * (min_prime ** (min_prime_degree + 1) - 1) + prev_num * (min_prime ** min_prime_degree - 1)) // (min_prime - 1) assert new_sum == sum_primes(primes_degrees=primes_degrees, num=num) chain[num] = new_sum + for prime_idx in range(min_prime_idx, len(primes)): num_n = primes[prime_idx] * num if num_n > max_num: From fe0b49365e8b1c896b83a901c637f7fe1899f2d6 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Wed, 7 May 2025 21:51:31 +0000 Subject: [PATCH 43/55] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- project_euler/problem_095/sol1.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/project_euler/problem_095/sol1.py b/project_euler/problem_095/sol1.py index 756167f40c4a..d4c418ea82fe 100644 --- a/project_euler/problem_095/sol1.py +++ b/project_euler/problem_095/sol1.py @@ -100,7 +100,10 @@ def multiply( min_prime_degree += 1 primes_degrees[min_prime] = min_prime_degree - new_sum = (prev_sum * (min_prime ** (min_prime_degree + 1) - 1) + prev_num * (min_prime ** min_prime_degree - 1)) // (min_prime - 1) + new_sum = ( + prev_sum * (min_prime ** (min_prime_degree + 1) - 1) + + prev_num * (min_prime**min_prime_degree - 1) + ) // (min_prime - 1) assert new_sum == sum_primes(primes_degrees=primes_degrees, num=num) chain[num] = new_sum From 1ba90a4f7bcfbfe03436d6ab76bab1108af02aed Mon Sep 17 00:00:00 2001 From: Maxim Smolskiy Date: Thu, 8 May 2025 00:53:36 +0300 Subject: [PATCH 44/55] Update sol1.py --- project_euler/problem_095/sol1.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/project_euler/problem_095/sol1.py b/project_euler/problem_095/sol1.py index d4c418ea82fe..33d9130bcda3 100644 --- a/project_euler/problem_095/sol1.py +++ b/project_euler/problem_095/sol1.py @@ -104,7 +104,7 @@ def multiply( prev_sum * (min_prime ** (min_prime_degree + 1) - 1) + prev_num * (min_prime**min_prime_degree - 1) ) // (min_prime - 1) - assert new_sum == sum_primes(primes_degrees=primes_degrees, num=num) + assert new_sum == sum_primes(primes_degrees=primes_degrees, num=num), f'{num} {primes_degrees} {prev_num} {min_prime} {prev_num} {new_sum} {sum_primes(primes_degrees=primes_degrees, num=num)}' chain[num] = new_sum for prime_idx in range(min_prime_idx, len(primes)): From 1500f9b93feebfa51968c5047a82452cb3ccae55 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Wed, 7 May 2025 21:53:59 +0000 Subject: [PATCH 45/55] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- project_euler/problem_095/sol1.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/project_euler/problem_095/sol1.py b/project_euler/problem_095/sol1.py index 33d9130bcda3..e1e2ce560c6e 100644 --- a/project_euler/problem_095/sol1.py +++ b/project_euler/problem_095/sol1.py @@ -104,7 +104,9 @@ def multiply( prev_sum * (min_prime ** (min_prime_degree + 1) - 1) + prev_num * (min_prime**min_prime_degree - 1) ) // (min_prime - 1) - assert new_sum == sum_primes(primes_degrees=primes_degrees, num=num), f'{num} {primes_degrees} {prev_num} {min_prime} {prev_num} {new_sum} {sum_primes(primes_degrees=primes_degrees, num=num)}' + assert new_sum == sum_primes(primes_degrees=primes_degrees, num=num), ( + f"{num} {primes_degrees} {prev_num} {min_prime} {prev_num} {new_sum} {sum_primes(primes_degrees=primes_degrees, num=num)}" + ) chain[num] = new_sum for prime_idx in range(min_prime_idx, len(primes)): From 1cf3b3123d4d9335249f9bfd7461dda6282116a0 Mon Sep 17 00:00:00 2001 From: Maxim Smolskiy Date: Thu, 8 May 2025 01:15:09 +0300 Subject: [PATCH 46/55] Update sol1.py --- project_euler/problem_095/sol1.py | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/project_euler/problem_095/sol1.py b/project_euler/problem_095/sol1.py index e1e2ce560c6e..008a361c5337 100644 --- a/project_euler/problem_095/sol1.py +++ b/project_euler/problem_095/sol1.py @@ -100,10 +100,7 @@ def multiply( min_prime_degree += 1 primes_degrees[min_prime] = min_prime_degree - new_sum = ( - prev_sum * (min_prime ** (min_prime_degree + 1) - 1) - + prev_num * (min_prime**min_prime_degree - 1) - ) // (min_prime - 1) + new_sum = prev_sum * min_prime + (prev_sum * (min_prime - 1) - prev_num // min_prime ** (min_prime_degree - 1) * (min_prime ** (min_prime_degree - 1) - 1)) // (min_prime ** min_prime_degree - 1) + prev_num // min_prime ** (min_prime_degree - 1) assert new_sum == sum_primes(primes_degrees=primes_degrees, num=num), ( f"{num} {primes_degrees} {prev_num} {min_prime} {prev_num} {new_sum} {sum_primes(primes_degrees=primes_degrees, num=num)}" ) From 01417b6b2f7773a585120aae525b7d4f985b7c42 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Wed, 7 May 2025 22:16:04 +0000 Subject: [PATCH 47/55] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- project_euler/problem_095/sol1.py | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/project_euler/problem_095/sol1.py b/project_euler/problem_095/sol1.py index 008a361c5337..f23c98b389b8 100644 --- a/project_euler/problem_095/sol1.py +++ b/project_euler/problem_095/sol1.py @@ -100,7 +100,17 @@ def multiply( min_prime_degree += 1 primes_degrees[min_prime] = min_prime_degree - new_sum = prev_sum * min_prime + (prev_sum * (min_prime - 1) - prev_num // min_prime ** (min_prime_degree - 1) * (min_prime ** (min_prime_degree - 1) - 1)) // (min_prime ** min_prime_degree - 1) + prev_num // min_prime ** (min_prime_degree - 1) + new_sum = ( + prev_sum * min_prime + + ( + prev_sum * (min_prime - 1) + - prev_num + // min_prime ** (min_prime_degree - 1) + * (min_prime ** (min_prime_degree - 1) - 1) + ) + // (min_prime**min_prime_degree - 1) + + prev_num // min_prime ** (min_prime_degree - 1) + ) assert new_sum == sum_primes(primes_degrees=primes_degrees, num=num), ( f"{num} {primes_degrees} {prev_num} {min_prime} {prev_num} {new_sum} {sum_primes(primes_degrees=primes_degrees, num=num)}" ) From 755cd55fc6532fa9ef676d7e2268b7bbff5639e1 Mon Sep 17 00:00:00 2001 From: Maxim Smolskiy Date: Thu, 8 May 2025 01:24:07 +0300 Subject: [PATCH 48/55] Update sol1.py --- project_euler/problem_095/sol1.py | 12 +----------- 1 file changed, 1 insertion(+), 11 deletions(-) diff --git a/project_euler/problem_095/sol1.py b/project_euler/problem_095/sol1.py index f23c98b389b8..095e68841068 100644 --- a/project_euler/problem_095/sol1.py +++ b/project_euler/problem_095/sol1.py @@ -100,17 +100,7 @@ def multiply( min_prime_degree += 1 primes_degrees[min_prime] = min_prime_degree - new_sum = ( - prev_sum * min_prime - + ( - prev_sum * (min_prime - 1) - - prev_num - // min_prime ** (min_prime_degree - 1) - * (min_prime ** (min_prime_degree - 1) - 1) - ) - // (min_prime**min_prime_degree - 1) - + prev_num // min_prime ** (min_prime_degree - 1) - ) + new_sum = prev_sum * min_prime + (prev_sum + prev_num) * (min_prime - 1) // (min_prime ** min_prime_degree - 1) assert new_sum == sum_primes(primes_degrees=primes_degrees, num=num), ( f"{num} {primes_degrees} {prev_num} {min_prime} {prev_num} {new_sum} {sum_primes(primes_degrees=primes_degrees, num=num)}" ) From ab9ae2e6643119a47cf6c537f6d17ae00ddcc2b2 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Wed, 7 May 2025 22:24:30 +0000 Subject: [PATCH 49/55] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- project_euler/problem_095/sol1.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/project_euler/problem_095/sol1.py b/project_euler/problem_095/sol1.py index 095e68841068..a0df68820a0b 100644 --- a/project_euler/problem_095/sol1.py +++ b/project_euler/problem_095/sol1.py @@ -100,7 +100,9 @@ def multiply( min_prime_degree += 1 primes_degrees[min_prime] = min_prime_degree - new_sum = prev_sum * min_prime + (prev_sum + prev_num) * (min_prime - 1) // (min_prime ** min_prime_degree - 1) + new_sum = prev_sum * min_prime + (prev_sum + prev_num) * (min_prime - 1) // ( + min_prime**min_prime_degree - 1 + ) assert new_sum == sum_primes(primes_degrees=primes_degrees, num=num), ( f"{num} {primes_degrees} {prev_num} {min_prime} {prev_num} {new_sum} {sum_primes(primes_degrees=primes_degrees, num=num)}" ) From 021ef257a2e38ff50122271776774c71ce638dc7 Mon Sep 17 00:00:00 2001 From: Maxim Smolskiy Date: Thu, 8 May 2025 01:25:40 +0300 Subject: [PATCH 50/55] Update sol1.py --- project_euler/problem_095/sol1.py | 19 ------------------- 1 file changed, 19 deletions(-) diff --git a/project_euler/problem_095/sol1.py b/project_euler/problem_095/sol1.py index a0df68820a0b..2810698c42f2 100644 --- a/project_euler/problem_095/sol1.py +++ b/project_euler/problem_095/sol1.py @@ -31,22 +31,6 @@ from math import isqrt, prod -def sum_primes(primes_degrees: dict[int, int], num: int) -> int: - """ - Calculates the sum of factors from all prime exponents. - - >>> sum_primes(primes_degrees={2: 1, 3: 1}, num=6) - 6 - """ - return ( - prod( - (prime ** (degree + 1) - 1) // (prime - 1) - for prime, degree in primes_degrees.items() - ) - - num - ) - - def generate_primes(max_prime: int) -> list[int]: """ Calculates the list of primes up to and including `max_prime`. @@ -103,9 +87,6 @@ def multiply( new_sum = prev_sum * min_prime + (prev_sum + prev_num) * (min_prime - 1) // ( min_prime**min_prime_degree - 1 ) - assert new_sum == sum_primes(primes_degrees=primes_degrees, num=num), ( - f"{num} {primes_degrees} {prev_num} {min_prime} {prev_num} {new_sum} {sum_primes(primes_degrees=primes_degrees, num=num)}" - ) chain[num] = new_sum for prime_idx in range(min_prime_idx, len(primes)): From 647d0ebc9d6094f737a92ab63558074892791a38 Mon Sep 17 00:00:00 2001 From: Maxim Smolskiy Date: Thu, 8 May 2025 01:27:01 +0300 Subject: [PATCH 51/55] Update sol1.py --- project_euler/problem_095/sol1.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/project_euler/problem_095/sol1.py b/project_euler/problem_095/sol1.py index 2810698c42f2..4dbf707677a1 100644 --- a/project_euler/problem_095/sol1.py +++ b/project_euler/problem_095/sol1.py @@ -28,7 +28,7 @@ - Iterate over found some factors to find longest chain """ -from math import isqrt, prod +from math import isqrt def generate_primes(max_prime: int) -> list[int]: From 256b67c0298b3aef8cde15dbcd375381c4a498db Mon Sep 17 00:00:00 2001 From: Maxim Smolskiy Date: Sat, 10 May 2025 14:02:41 +0300 Subject: [PATCH 52/55] Update sol1.py --- project_euler/problem_095/sol1.py | 25 ++++++++++++------------- 1 file changed, 12 insertions(+), 13 deletions(-) diff --git a/project_euler/problem_095/sol1.py b/project_euler/problem_095/sol1.py index 4dbf707677a1..162eb9824e32 100644 --- a/project_euler/problem_095/sol1.py +++ b/project_euler/problem_095/sol1.py @@ -112,23 +112,22 @@ def find_longest_chain(chain: list[int], max_num: int) -> int: 6 """ - length_max = 0 - elem_max = 0 - for i in range(2, len(chain)): - start = i + max_len = 0 + min_elem = 0 + for start in range(2, len(chain)): + elem = chain[start] length = 1 - el = chain[i] - visited = {i} - while el > 1 and el <= max_num and el not in visited: + visited = {start} + while elem > 1 and elem <= max_num and elem not in visited: length += 1 - visited.add(el) - el = chain[el] + visited.add(elem) + elem = chain[elem] - if el == start and length > length_max: - length_max = length - elem_max = start + if elem == start and length > max_len: + max_len = length + min_elem = start - return elem_max + return min_elem def solution(max_num: int = 1000000) -> int: From ff8f7311d7873182df8e1574981c8aacd42ba3c7 Mon Sep 17 00:00:00 2001 From: Maxim Smolskiy Date: Sat, 10 May 2025 14:05:22 +0300 Subject: [PATCH 53/55] Update sol1.py --- project_euler/problem_095/sol1.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/project_euler/problem_095/sol1.py b/project_euler/problem_095/sol1.py index 162eb9824e32..28308af23ee1 100644 --- a/project_euler/problem_095/sol1.py +++ b/project_euler/problem_095/sol1.py @@ -90,9 +90,9 @@ def multiply( chain[num] = new_sum for prime_idx in range(min_prime_idx, len(primes)): - num_n = primes[prime_idx] * num - if num_n > max_num: + if primes[prime_idx] * num > max_num: break + multiply( chain=chain, primes=primes, From c9d0f702fa629d332fc18a9c4bacb4e193dbf33e Mon Sep 17 00:00:00 2001 From: Maxim Smolskiy Date: Sat, 10 May 2025 14:08:32 +0300 Subject: [PATCH 54/55] Update sol1.py --- project_euler/problem_095/sol1.py | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/project_euler/problem_095/sol1.py b/project_euler/problem_095/sol1.py index 28308af23ee1..79e445caf409 100644 --- a/project_euler/problem_095/sol1.py +++ b/project_euler/problem_095/sol1.py @@ -31,18 +31,18 @@ from math import isqrt -def generate_primes(max_prime: int) -> list[int]: +def generate_primes(max_num: int) -> list[int]: """ - Calculates the list of primes up to and including `max_prime`. + Calculates the list of primes up to and including `max_num`. >>> generate_primes(6) [2, 3, 5] """ - are_primes = [True] * (max_prime + 1) + are_primes = [True] * (max_num + 1) are_primes[0] = are_primes[1] = False - for i in range(2, isqrt(max_prime) + 1): + for i in range(2, isqrt(max_num) + 1): if are_primes[i]: - for j in range(i * i, max_prime + 1, i): + for j in range(i * i, max_num + 1, i): are_primes[j] = False return [prime for prime, is_prime in enumerate(are_primes) if is_prime] @@ -118,10 +118,11 @@ def find_longest_chain(chain: list[int], max_num: int) -> int: elem = chain[start] length = 1 visited = {start} + while elem > 1 and elem <= max_num and elem not in visited: + elem = chain[elem] length += 1 visited.add(elem) - elem = chain[elem] if elem == start and length > max_len: max_len = length From 92a58d5ae01298c5969dd9a07d113b154a1a7e9c Mon Sep 17 00:00:00 2001 From: Maxim Smolskiy Date: Sat, 10 May 2025 14:10:32 +0300 Subject: [PATCH 55/55] Update sol1.py --- project_euler/problem_095/sol1.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/project_euler/problem_095/sol1.py b/project_euler/problem_095/sol1.py index 79e445caf409..82d84c5544de 100644 --- a/project_euler/problem_095/sol1.py +++ b/project_euler/problem_095/sol1.py @@ -115,14 +115,14 @@ def find_longest_chain(chain: list[int], max_num: int) -> int: max_len = 0 min_elem = 0 for start in range(2, len(chain)): + visited = {start} elem = chain[start] length = 1 - visited = {start} while elem > 1 and elem <= max_num and elem not in visited: + visited.add(elem) elem = chain[elem] length += 1 - visited.add(elem) if elem == start and length > max_len: max_len = length