ラグランジュの四平方定理
リストモナドすごーい。
import System import Control.Monad lagrange :: Integer -> [(Integer, Integer, Integer, Integer)] lagrange x = do let seed = [ s^2 | s <- [0..(floor $ sqrt $ fromInteger x)]] a <- seed b <- [ b | b <- seed, b <= a ] c <- [ c | c <- seed, c <= b ] d <- [ d | d <- seed, d <= c ] guard $ sum [a,b,c,d] == x return (a,b,c,d) main :: IO () main = do (arg:_) <- getArgs let result = lagrange $ read arg print result print $ length result