Let
d(n)be defined as the sum of proper divisors of n (numbers less than n which divide evenly into n).
Ifd(a) = bandd(b) = a, wherea ≠ 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; sod(284) = 220.
def proper_divisors(n): """ Find all divisors of n by trial division """ divisors = set([1]) for i in range(2, math.ceil(n ** 0.5)+1): if n % i == 0: divisors.add(i) divisors.add(n/i) return divisors def amicable_numbers(n): candidates = range(1,n) amicables = [] for a in candidates: b = sum(proper_divisors(a)) if a != b \ and sum(proper_divisors(a)) == b \ and sum(proper_divisors(b)) == a: amicables.append(a) amicables.append(b) candidates.remove(b) return amicables >>> sum(amicable_numbers(10000)) 31626 |