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.
%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.
#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