fork download
  1. primes = 2 : [n | n <- [3..], isPrime n]
  2. where isPrime n = foldr (\p r-> p*p>n || (rem n p /= 0 && r)) True primes
  3.  
  4. sumDiv n = (divs n primes) - n where
  5. divs 1 _ = 1
  6. divs n (p:ps) =
  7. if p*p > n
  8. then n+1
  9. else let (c, r) = cnt n p 0 in
  10. if c == 0
  11. then divs n ps
  12. else (sum $ take (c+1) $ iterate (*p) 1) * (divs r ps)
  13. cnt n p c | mod n p == 0 = cnt (div n p) p (c+1)
  14. | otherwise = (c, n)
  15.  
  16. friends :: [(Integer, Integer)]
  17. friends = filter (\(x, s) -> x < s && sumDiv s == x) $ map (\x -> (x, sumDiv x)) [1..]
  18.  
  19. main = mapM print $ take 37 friends
Success #stdin #stdout 4.3s 3596KB
stdin
Standard input is empty
stdout
(220,284)
(1184,1210)
(2620,2924)
(5020,5564)
(6232,6368)
(10744,10856)
(12285,14595)
(17296,18416)
(63020,76084)
(66928,66992)
(67095,71145)
(69615,87633)
(79750,88730)
(100485,124155)
(122265,139815)
(122368,123152)
(141664,153176)
(142310,168730)
(171856,176336)
(176272,180848)
(185368,203432)
(196724,202444)
(280540,365084)
(308620,389924)
(319550,430402)
(356408,399592)
(437456,455344)
(469028,486178)
(503056,514736)
(522405,525915)
(600392,669688)
(609928,686072)
(624184,691256)
(635624,712216)
(643336,652664)
(667964,783556)
(726104,796696)