fork(1) 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. primeDivs n = divs n primes where
  7. divs 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 (p, c) : 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. combine divs = comb [1] divs where
  19. comb list [] = list
  20. comb list ((p, c) : ps) =
  21. comb [ x*y | x <- take (c+1) $ iterate (*p) 1, y <- list ] ps
  22.  
  23. sumDiv n = (sum $ combine $ primeDivs n) - n
  24.  
  25.  
  26. friends :: [(Integer, Integer)]
  27. friends = filter (\(x, s) -> x < s && sumDiv s == x) $ map (\x -> (x, sumDiv x)) [1..]
  28.  
  29. main = mapM print $ take 30 friends
  30.  
Success #stdin #stdout 4.48s 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)