For a given matrix, return the determinant and the permanent of the matrix.

The determinant is given by

 



det
(
A
)
=

∑

σ


sgn
⁡
(
σ
)

∏

i
=
1


n



M

i
,

σ

i






{\displaystyle \det(A)=\sum _{\sigma }\operatorname {sgn}(\sigma )\prod _{i=1}^{n}M_{i,\sigma _{i}}}


while the permanent is given by

 



perm
⁡
(
A
)
=

∑

σ



∏

i
=
1


n



M

i
,

σ

i






{\displaystyle \operatorname {perm} (A)=\sum _{\sigma }\prod _{i=1}^{n}M_{i,\sigma _{i}}}


In both cases the sum is over the permutations 



σ


{\displaystyle \sigma }

 of the permutations of 1, 2, ..., n. (A permutation's sign is 1 if there are an even number of inversions and -1 otherwise; see parity of a permutation.)

More efficient algorithms for the determinant are known: LU decomposition, see for example wp:LU decomposition#Computing the determinant. Efficient methods for calculating the permanent are not known.



Related task

 Permutations by swapping


 
(lib 'list)
(lib 'matrix)
 
;; adapted from Racket
(define (permanent M)
    (let (( n (matrix-row-num M)))
    (for/sum ([σ (in-permutations n)])
        (for/product ([i n] [σi σ])
            (array-ref M i σi)))))
 
;; output
(define A (list->array '(1 2 3 4) 2 2))
(array-print A)
  1  2
  3  4
(determinant A) → -2
(permanent A) → 10
 
(define M (list->array (iota 25) 5 5))
(array-print M)
   0   1   2   3   4
   5   6   7   8   9
  10  11  12  13  14
  15  16  17  18  19
  20  21  22  23  24
(determinant M) → 0
(permanent M) → 6778800
 
 