You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
90 lines
2.2 KiB
90 lines
2.2 KiB
# 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)
|
|
|
|
|
|
|