haskell版 行列式
import System.Random randomList :: Random a => a -> a -> IO [a] randomList a b = fmap (randomRs (a, b)) newStdGen pmat :: Int -> [[a]] -> [[a]] pmat n d = [tail x | x <- left ++ tail right] where (left, right) = splitAt n d sig :: (Integral a, Num b) => a -> b sig a = if mod a 2 == 0 then 1 else -1 det:: (Num a) => [[a]] -> a det [[x]] = x det [[a, b], [c, d]] = a * d - b * c det d = sum [(sig i) * head x * det (pmat i d) | (i, x) <- zip [0..] d] getMat :: (Num a) => Int -> [a] -> [[a]] getMat _ [] = [] getMat n x = [take n x] ++ getMat n (drop n x) main = do hoge <- randomList 1 9 :: (IO [Int]) let n = 10 let d = getMat n $ take (n^2) hoge print d print $ det d
haskellのリストはリンクリストなんで、 x !! i みたいなアクセスは時間がかかるらしい。
それで、!!関数を使わないようにしてみた。