-
Notifications
You must be signed in to change notification settings - Fork 0
/
problem_23.py
89 lines (61 loc) · 2.19 KB
/
problem_23.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
# A perfect number is a number for which the sum of its proper
# divisors is exactly equal to the number. For example, the sum
# of the proper divisors of 28 would be 1 + 2 + 4 + 7 + 14 = 28,
# which means that 28 is a perfect number.
#
# A number n is called deficient if the sum of its proper divisors
# is less than n and it is called abundant if this sum exceeds n.
#
# As 12 is the smallest abundant number, 1 + 2 + 3 + 4 + 6 = 16,
# the smallest number that can be written as the sum of two abundant
# numbers is 24. By mathematical analysis, it can be shown that all
# integers greater than 28123 can be written as the sum of two
# abundant numbers. However, this upper limit cannot be reduced any
# further by analysis even though it is known that the greatest
# number that cannot be expressed as the sum of two abundant numbers
# is less than this limit.
#
# Find the sum of all the positive integers which cannot be written
# as the sum of two abundant numbers.
# This program is essentially n^3 in the search and n^2 for the divisor count,
# so it runs reaalllyy slowly
import math
import pickle
def get_divisor_sum(input):
divisor_sum = 0
cutoff = math.ceil(input / 2)
for idx, val in enumerate(range(cutoff), 1):
if input % idx == 0:
divisor_sum += idx
return divisor_sum
def get_abundants():
list = []
for i in range(28123):
sum = get_divisor_sum(i)
if sum > i:
list.append(i)
with open('assets/outfile', 'wb') as fp:
pickle.dump(list, fp)
return list
# uncomment on any subsiquent runs to retrieve the cached data
# with open('assets/outfile', 'rb') as fp:
# abundant_list = pickle.load(fp)
# comment this line out after the first run
abundant_list = get_abundants()
abundant_list.sort()
seen = {}
abundant_list = [seen.setdefault(x, x) for x in abundant_list if x not in seen]
summation = 0
for i in range(28123):
found = False
for first_number in abundant_list:
if first_number > i:
break
search = i - first_number
if search in abundant_list:
found = True
break
if not found:
summation += i
print(summation)
print(abundant_list)