diff --git a/src/project_euler_python/problems_001_050/Problem023.py b/src/project_euler_python/problems_001_050/Problem023.py index 016efa2..60ca3fa 100644 --- a/src/project_euler_python/problems_001_050/Problem023.py +++ b/src/project_euler_python/problems_001_050/Problem023.py @@ -9,9 +9,21 @@ Solution for problem 023 of Project Euler https://projecteuler.net/problem=23 """ +from itertools import combinations_with_replacement + from project_euler_python.utils import timeit +def _get_abundant_numbers(limit): + divisor_sums = [0 for _ in range(limit)] + + for divisor in range(1, limit): + for multiple in range(divisor * 2, limit, divisor): + divisor_sums[multiple] += divisor + + return [number for number in range(1, limit) if divisor_sums[number] > number] + + @timeit("Problem 023") def compute(): """ @@ -35,25 +47,19 @@ def compute(): sum of two abundant numbers. """ - limit = 28124 - divisor_sum = [0] * limit - for i in range(1, limit): - for j in range(i * 2, limit, i): - divisor_sum[j] += i + limit = 28123 + 1 + abundant_numbers = _get_abundant_numbers(limit) - abundant_nums = [i for (i, x) in enumerate(divisor_sum) if x > i] + expressible_sums = { + first + second + for first, second in combinations_with_replacement( + abundant_numbers, + 2, + ) + if first + second < limit + } - expressible = [False] * limit - for i in abundant_nums: - for j in abundant_nums: - if i + j < limit: - expressible[i + j] = True - else: - break - - ans = sum(i for (i, x) in enumerate(expressible) if not x) - - return ans + return sum(number for number in range(1, limit) if number not in expressible_sums) if __name__ == "__main__":