diff options
| author | Charles <sircharlesaze@gmail.com> | 2019-08-17 21:39:43 +0200 |
|---|---|---|
| committer | Charles <sircharlesaze@gmail.com> | 2019-08-17 21:39:43 +0200 |
| commit | 3ffc76713f6db4c33f20588ce6896ea3c2bae2a7 (patch) | |
| tree | 1025c801330f078e3a12da191f923ae8b6ddd81b /haskell/wip/021-amicable_numbers.hs | |
| parent | 9a65938232d1fa9e1afe9a6eb2de48d25ff738a6 (diff) | |
| download | project_euler-3ffc76713f6db4c33f20588ce6896ea3c2bae2a7.tar.gz project_euler-3ffc76713f6db4c33f20588ce6896ea3c2bae2a7.tar.bz2 project_euler-3ffc76713f6db4c33f20588ce6896ea3c2bae2a7.zip | |
wip directory for each language
Diffstat (limited to 'haskell/wip/021-amicable_numbers.hs')
| -rw-r--r-- | haskell/wip/021-amicable_numbers.hs | 31 |
1 files changed, 31 insertions, 0 deletions
diff --git a/haskell/wip/021-amicable_numbers.hs b/haskell/wip/021-amicable_numbers.hs new file mode 100644 index 0000000..867765d --- /dev/null +++ b/haskell/wip/021-amicable_numbers.hs @@ -0,0 +1,31 @@ +-- Amicable numbers +-- +-- Problem 21 +-- Let d(n) be defined as the sum of proper divisors of n +-- (numbers less than n which divide evenly into n). +-- If d(a) = b and d(b) = a, where a ≠ b, then a and b are an amicable +-- pair and each of a and b are called amicable numbers. +-- +-- For example, the proper divisors of 220 are 1, 2, 4, 5, 10, 11, 20, 22, 44, 55 and 110; +-- therefore d(220) = 284. The proper divisors of 284 are 1, 2, 4, 71 and 142; so d(284) = 220. +-- +-- Evaluate the sum of all the amicable numbers under 10000. + + +-- 5s isnt pretty, divSum is probably the root of evil +main = print (sum $ map fst (filterAmicable [2..10000])) + +filterAmicable :: [Int] -> [(Int, Int)] +filterAmicable xs = filter (\(n, s) -> n /= s && any ((==)(s, n)) sums) sums + where sums = [(x, divSum x) | x <- xs] + +divSum :: Int -> Int +divSum n = factorise 2 + where factorise d + | d > nSqrt = 1 + | rest == 0 && d /= quotient = d + quotient + factorise (d + 1) + | rest == 0 && d == quotient = quotient + factorise (d + 1) + | otherwise = factorise (d + 1) + where quotient = n `div` d + rest = n `mod` d + nSqrt = floor $ sqrt $ fromIntegral n |
