Determinant and permanent: Difference between revisions
Content added Content deleted
m (added ;Related tasks: section header.) |
(→{{header|Haskell}}: Haskell for determinant) |
||
Line 850: | Line 850: | ||
Permanent: |
Permanent: |
||
16</pre> |
16</pre> |
||
===Calculation of the determinant=== |
|||
The computation of the determinant and that of the permanent should be separate tasks. Here is code for computing the determinant (inefficiently): |
|||
<lang Haskell> |
|||
outer :: (a->b->c) -> [a] -> [b] -> [[c]] |
|||
outer f [] _ = [] |
|||
outer f _ [] = [] |
|||
outer f (h1:t1) x2 = (f h1 <$> x2) : outer f t1 x2 |
|||
dot [] [] = 0 |
|||
dot (h1:t1) (h2:t2) = (h1*h2) + (dot t1 t2) |
|||
transpose [] = [] |
|||
transpose ([] : xss) = transpose xss |
|||
transpose ((x:xs) : xss) = (x : [h | (h:_) <- xss]) : transpose (xs : [ t | (_:t) <- xss]) |
|||
mul :: Num a => [[a]] -> [[a]] -> [[a]] |
|||
mul a b = outer dot a (transpose b) |
|||
delRow :: Int -> [a] -> [a] |
|||
delRow i v = |
|||
(first ++ rest) where (first, _:rest) = splitAt i v |
|||
delCol :: Int -> [[a]] -> [[a]] |
|||
delCol j m = (delRow j) <$> m |
|||
adj :: Num a => [[a]] -> [[a]] |
|||
adj [] = [] |
|||
adj m = |
|||
[ |
|||
[(-1)^(i+j) * det (delRow i $ delCol j m) |
|||
| i <- [0.. -1+length m] |
|||
] |
|||
| j <- [0.. -1+length m] |
|||
] |
|||
det :: Num a => [[a]] -> a |
|||
det [] = 1 |
|||
det m = (mul m (adj m)) !! 0 !! 0 |
|||
</lang> |
|||
=={{header|J}}== |
=={{header|J}}== |