Project Euler: Problem124

Haskell だと "(1,2) < (1,3)" みたいにタプルの比較ができてしまう。今回はこれがかなり便利。

import Data.List

prime = p [2..]
    where p (x:xs) = x : p (filter (\y -> rem y x /= 0) xs)
factor n = f n prime
    where f 1 _      = []
	  f n (p:ps) | rem n p == 0 = p : f (div n p) (p:ps)
		     | otherwise    = f n ps
rad x = product $ nub $ factor x
main = print $ (sort $ zip (map rad [1..100000]) [1..100000])!!(10000-1)