> From: Richard O'Keefe [mailto:o...@cs.otago.ac.nz]
> 
> These lines of Haskell code find the Zumkeller numbers up to 5000
> in 5 seconds on a 2.2GHz intel Mac.  The equivalent in SML took
> 1.1 seconds.  Note that this just finds whether a suitable
> partition exists; it does not report the partition.
> 
> factors :: Int -> [Int]
> 
> factors n = [m | m <- [1..n], mod n m == 0]
> 
> can_part :: [Int] -> Int -> Bool
> 
> can_part _  0 = True
> can_part xs t = loop xs []
>    where loop [] _ = False
>          loop (x:xs) ys = x <= t && can_part (xs++ys) (t-x)
>                        || loop xs ys
> 
> is_Zumkeller :: Int -> Bool
> is_Zumkeller n =
>      let facs = factors n
>          fsum = sum facs
>      in  mod fsum 2 == 0 &&
>          can_part facs (div fsum 2)
> 
> main = print (filter is_Zumkeller [1..5000])

Thanks, I like this solution! Pure functional, easy to understand, no monads
and fast :-)

-- 
Frank Buss, f...@frank-buss.de
http://www.frank-buss.de, http://www.it4-systems.de

_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe

Reply via email to