--
amicablePairs :: Integral a => [a] -> [(a, a)]
amicablePairs xs = [(x, fromJust y) | x <- xs,
                    let y = findAmicableNumber x, isJust y, Just x < y]



-----------------------------------------
-- ピタゴラス数
-----------------------------------------

--
-- ピタゴラス数
--
-- + a + b + c = n, a^2 + b^2 = c^2, a < b < c の組を探す
--
-- 1. a + a + a < n よって a <= div n 3
-- 2. a^2 + b^2 = (n - a - b)^2 変形すると、
--    b = n / 2 - (a * n) / (2 * (n - a))
-- 3. a, b ともに整
findAmicableNumber :: Integral a => a -> Maybe a
findAmicableNumber x
  | (x /= y) && (sumOfDivisors y - y == x) = Just y
  | otherwise = Nothing
  where y = sumOfDivisors x - x

--
-- 友愛数のペアのうち、小さい値が引数の範囲内にあるものを返す。
--
-- ex : amicablePairs [2 .. 1200] => [(220,284),(1184,1210)]
--
findAmicableNumber x
  | (x /= y) && (sumOfDivisors y - y == x) = Just y
  | otherwise = Nothing
  where y = sumOfDivisors x - x

--
-- 友愛数のペアのうち、小さい値が引数の範囲内にあるものを返す。
--
-- ex : amicablePairs [2 .. 1200] => [(220,284),(1184,1210)]
--