fork download
  1. primes = (2 : filter (check primes) [3..]) where
  2. check (p:ps) n | p*p > n = True
  3. | n `mod` p == 0 = False
  4. | otherwise = check ps n
  5.  
  6. sumDiv n = (divs n primes) - n where
  7. divs 1 _ = 1
  8. divs n (p:ps) =
  9. if p*p > n
  10. then n+1
  11. else let (c, r) = cnt n p 0 in
  12. if c == 0
  13. then divs n ps
  14. else (sum $ take (c+1) $ iterate (*p) 1) * (divs r ps)
  15. cnt n p c | mod n p == 0 = cnt (div n p) p (c+1)
  16. | otherwise = (c, n)
  17.  
  18. friends :: [(Integer, Integer)]
  19. friends = filter (\(x, s) -> x < s && sumDiv s == x) $ map (\x -> (x, sumDiv x)) [1..]
  20.  
  21. main = mapM print $ take 37 friends
Success #stdin #stdout 4.45s 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)