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.

また、素因数分解を使った。名前をfatorsにした。factorizeは長い気がする。

簡潔ないい名前はないか?

import Data.List
factors' 1 _ = []
factors' m d = q:(factors' m' q)
where (q,m') = head [(n,div m n)|n<-[d..(floor.sqrt.fromIntegral$m)]++[m],mod m n==]
factors n = factors' n 2
d n = (flip(-)n).product.map q.c .factors$n
where c = map f .group::[Int]->[(Int,Int)]
f xxs@(x:xs) = (x,length xxs)
q(p,n)= div (p^(n+1) - 1) $p - 1
p012 m =sum [n|n<-[2..m],n==(d.d)n,n/=d n]
More Reading
Newer// Problem 20
Older// Problem 22