Refactor with itertools

This commit is contained in:
2026-04-11 15:27:41 +02:00
parent 24fb140672
commit 8c3da33225

View File

@@ -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__":