Project Euler

Problem #21

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.

Erlang: Running time = 4.66s
+%run_procs

+%pow

+%cartesian_product

+%echo

+%prime_list

+%prime_iterator

+%factor

+%product

+%divisors

p21()->
	Ans=run_procs(9998,fun(I)->[euler,p21,[I+1,self()]] end,
			   fun(F,{positive,A,B})->F+A+B;
			      (F,negative)->F end,
			   0),
	io:format("~w~n",[Ans]).

p21(Test,Parent)->
	P=lists:sum(divisors(Test))-Test,
	if
		P > Test ->
			C=lists:sum(divisors(P))-P,
			if
				C==Test->
					Parent ! {positive,C,P};
				true-> Parent ! negative
			end;
		true -> Parent ! negative
	end.

Ruby: Running time = 3.51s
+#cartesian_product

+#PrimeList

+#factors

+#divisors

+#Enumerable

def p21amicable?(a)
  c=divisors(a).delete(a).sum
  (not a==c) and a==divisors(c).delete(c).sum
end

def p21
  puts (2...10000).select{|i|p21amicable? i}.sum
end