31 lines
1.5 KiB
Haskell

-- A perfect number is a number for which the sum of its proper divisors is exactly equal to the number.
-- For example, the sum of the proper divisors of 28 would be 1 + 2 + 4 + 7 + 14 = 28, which means that 28 is a perfect number.
--
-- A number n is called deficient if the sum of its proper divisors is less than n and it is called abundant if this sum exceeds n.
--
-- As 12 is the smallest abundant number, 1 + 2 + 3 + 4 + 6 = 16, the smallest number that can be written as the sum of two abundant numbers is 24.
-- By mathematical analysis, it can be shown that all integers greater than 28123 can be written as the sum of two abundant numbers.
-- However, this upper limit cannot be reduced any further by analysis even though it is known that the greatest number that cannot be expressed
-- as the sum of two abundant numbers is less than this limit.
--
-- Find the sum of all the positive integers which cannot be written as the sum of two abundant numbers.
import Data.List
import qualified Data.Set as Set
import ProjectEuler (sumProperDivisors)
isAbundant :: (Integral a) => a -> Bool
isAbundant n = sumProperDivisors n > n
abundantSums :: (Integral a) => [a]
abundantSums = Set.toList $ Set.fromList [ x + y | x <- abundantList, y <- abundantList, x + y <= 28123, y >= x ]
where abundantList = [ x | x <- [12..28123], isAbundant x ]
sumNotAbundant :: (Integral a) => a
sumNotAbundant = sum $ [1..28123] \\ abundantSums
main = do
let result = sumNotAbundant
putStrLn $ "Project Euler, Problem 23\n"
++ "Answer: " ++ show result