Pretty standard Project Euler solution. You only need to check up to the square of each number, and you can cache each calculation as you go along.
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.Evaluate the sum of all the amicable numbers under 10000.
def d(n)
total = 1
(2..Math.sqrt(n)).each do |i|
if n % i == 0
total += n / i + i
end
end
total
end
def amicable?(a, repo)
repo[a] = b = d(a)
a != b and a == repo[b]
end
repo = {}
total = 0
10_000.times do |i|
if amicable?(i, repo)
total += (i + repo[i])
end
end
puts total