RosettaCodeData/Task/Amicable-pairs/Haskell/amicable-pairs-2.hs

22 lines
549 B
Haskell
Raw Permalink Normal View History

2020-02-17 23:21:07 -08:00
import Data.Bool (bool)
2017-09-23 10:01:46 +02:00
amicablePairsUpTo :: Int -> [(Int, Int)]
amicablePairsUpTo n =
2020-02-17 23:21:07 -08:00
let sigma = sum . properDivisors
in [1 .. n] >>=
(\x ->
let y = sigma x
in bool [] [(x, y)] (x < y && x == sigma y))
2017-09-23 10:01:46 +02:00
2020-02-17 23:21:07 -08:00
properDivisors
:: Integral a
=> a -> [a]
properDivisors n =
let root = (floor . sqrt) (fromIntegral n :: Double)
lows = filter ((0 ==) . rem n) [1 .. root]
in init $
lows ++ drop (bool 0 1 (root * root == n)) (reverse (quot n <$> lows))
2017-09-23 10:01:46 +02:00
main :: IO ()
main = mapM_ print $ amicablePairsUpTo 20000