Let d(n) be defined as the sum of proper divisors of n (numbers less than n which divide evenly into n). If d(a) = b and d(b) = a, where a ≠ b, then a and b are an amicable pair and each of a and b are called amicable numbers.
For example, the proper divisors of 220 are 1, 2, 4, 5, 10, 11, 20, 22, 44, 55 and 110; therefore d(220) = 284. The proper divisors of 284 are 1, 2, 4, 71 and 142; so d(284) = 220.
Evaluate the sum of all the amicable numbers under 10000.
My solution to the 21 problem on project Euler is very slow (with pure brute force it took 30 mins to find the solution). Any ways that i can improve my code or shuld I scrap it and think about something else ?
Here's my code :
import time, math
start = time.time()
amicable_nums = set()
def sum_div(n):
divisors = []
for x in range(1, int(math.sqrt(n) + 1)):
if n % x == 0:
divisors.append(x)
if x * x != n and x != 1:
divisors.append(int(n / x))
return sum(divisors)
for i in range(1, 10000):
for j in range(1, 10000):
if sum_div(i) == j and sum_div(j) == i and i != j:
amicable_nums.update([i, j])
print(sum(amicable_nums))
print("It took " + str(time.time() - start) + " seconds")