-- Shakespeare Cymbeline
Act III, Scene I, Line 73
Perfection is rare, one can even say perfection is anti-science. For with perfection there is nothing more to investigate, nothing to ponder, nothing to study.
Perfect Numbers
In mathematics we have a class of numbers which are called perfect. These numbers have the property that the some of their proper divisors is equal to them.We can break this algorithm down into three steps.
Step 1: Find divisors
Given the example of n = 6
In Haskell
filter (\x -> mod 6 x == 0) [1..5]In F#
[1..5] |> List.filter (fun x -> 6 % x = 0)Step 2: Sum divisors
Still working with n = 6, we have [1, 2, 3] to sum.
In Haskell
sum [1, 2, 3]In F#
[1; 2; 3] |> List.sumStep 3: Compare
In Haskell
6 == 6In F#
6 = 6Putting it together
In Haskell (on codepad)
isPerfect :: Int -> BoolisPerfect n =
sum (
filter (\x -> mod n x == 0) [1..(n-1)]) == n
main = print $ isPerfect 496
> true
In F# (on tryfsharp)
let isPerfect n =let d = [1..(n-1)]
|> List.filter (fun x -> n % x = 0)
|> List.sum
d = n
;;
isPerfect 496;;
> true