pytr :: Int -> [(Bool, Int, Int, Int)] pytr n = filter (\(_, a, b, c) -> a + b + c <= n) [ (prim a b c, a, b, c) | a <- xs , b <- drop a xs , c <- drop b xs , a ^ 2 + b ^ 2 == c ^ 2 ] where xs = [1 .. n] prim a b _ = gcd a b == 1 main :: IO () main = putStrLn $ "Up to 100 there are " ++ show (length xs) ++ " triples, of which " ++ show (length $ filter (\(x, _, _, _) -> x) xs) ++ " are primitive." where xs = pytr 100