Determinant and permanent: Difference between revisions

Add C# implementation
(added program for rust)
(Add C# implementation)
 
(15 intermediate revisions by 12 users not shown)
Line 14:
* [[Permutations by swapping]]
<br><br>
 
=={{header|11l}}==
{{trans|Nim}}
 
<syntaxhighlight lang="11l">F s_permutations(seq)
V items = [[Int]()]
L(j) seq
[[Int]] new_items
L(item) items
V i = L.index
I i % 2
new_items [+]= (0 .. item.len).map(i -> @item[0 .< i] [+] [@j] [+] @item[i ..])
E
new_items [+]= (item.len .< -1).step(-1).map(i -> @item[0 .< i] [+] [@j] [+] @item[i ..])
items = new_items
 
R enumerate(items).map((i, item) -> (item, I i % 2 {-1} E 1))
 
F det(a)
V result = 0.0
L(sigma, _sign_) s_permutations(Array(0 .< a.len))
V x = Float(_sign_)
L(i) 0 .< a.len
x *= a[i][sigma[i]]
result += x
R result
 
F perm(a)
V result = 0.0
L(sigma, _sign_) s_permutations(Array(0 .< a.len))
V x = 1.0
L(i) 0 .< a.len
x *= a[i][sigma[i]]
result += x
R result
 
V a = [[1.0, 2.0],
[3.0, 4.0]]
 
V b = [[Float( 1), 2, 3, 4],
[Float( 4), 5, 6, 7],
[Float( 7), 8, 9, 10],
[Float(10), 11, 12, 13]]
 
V c = [[Float( 0), 1, 2, 3, 4],
[Float( 5), 6, 7, 8, 9],
[Float(10), 11, 12, 13, 14],
[Float(15), 16, 17, 18, 19],
[Float(20), 21, 22, 23, 24]]
 
print(‘perm: ’perm(a)‘ det: ’det(a))
print(‘perm: ’perm(b)‘ det: ’det(b))
print(‘perm: ’perm(c)‘ det: ’det(c))</syntaxhighlight>
 
{{out}}
<pre>
perm: 10 det: -2
perm: 29556 det: 0
perm: 6778800 det: 0
</pre>
 
=={{header|360 Assembly}}==
Line 19 ⟶ 79:
and two ASSIST macros (XDECO,XPRNT) to keep it as short as possible.
It works on OS/360 family (MVS,z/OS), on DOS/360 family (z/VSE) use GETVIS,FREEVIS instead of GETMAIN,FREEMAIN.
<langsyntaxhighlight lang="360asm">* Matrix arithmetic 13/05/2016
MATARI START
STM R14,R12,12(R13) save caller's registers
Line 170 ⟶ 230:
Q DS F sub matrix q((n-1)*(n-1)+1)
YREGS
END MATARI</langsyntaxhighlight>
{{out}}
<pre>
Line 176 ⟶ 236:
permanent= 900
</pre>
 
=={{header|Arturo}}==
 
<syntaxhighlight lang="rebol">printMatrix: function [m][
loop m 'row -> print map row 'val [pad to :string .format:".2f" val 6]
print "--------------------------------"
]
 
permutations: function [arr][
d: 1
c: array.of: size arr 0
xs: new arr
sign: 1
 
ret: new @[@[xs, sign]]
 
while [true][
while [d > 1][
d: d-1
c\[d]: 0
]
 
while [c\[d] >= d][
d: d+1
if d >= size arr -> return ret
]
 
i: (1 = and d 1)? -> c\[d] -> 0
tmp: xs\[i]
xs\[i]: xs\[d]
xs\[d]: tmp
 
sign: neg sign
'ret ++ @[new @[xs, sign]]
c\[d]: c\[d] + 1
]
 
return ret
]
 
perm: function [a][
n: 0..dec size a
result: new 0.0
loop permutate n 'sigma [
x: 1.0
loop n 'i -> x: x * get a\[i] sigma\[i]
'result + x
]
return result
]
 
det: function [a][
n: 0..dec size a
result: new 0.0
loop.with:'i permutations n 'p[
x: p\1
loop n 'i -> x: x * get a\[i] p\0\[i]
'result + x
]
return result
]
 
A: [[1.0 2.0]
[3.0 4.0]]
 
B: [[ 1.0 2 3 4]
[ 4.0 5 6 7]
[ 7.0 8 9 10]
[10.0 11 12 13]]
 
C: [[ 0.0 1 2 3 4]
[ 5.0 6 7 8 9]
[10.0 11 12 13 14]
[15.0 16 17 18 19]
[20.0 21 22 23 24]]
 
print ["A: perm ->" perm A "det ->" det A]
print ["B: perm ->" perm B "det ->" det B]
print ["C: perm ->" perm C "det ->" det C]</syntaxhighlight>
 
{{out}}
 
<pre>A: perm -> 10.0 det -> -2.0
B: perm -> 29556.0 det -> 0.0
C: perm -> 6778800.0 det -> 0.0</pre>
 
=={{header|C}}==
C99 code. By no means efficient or reliable. If you need it for serious work, go find a serious library.
<langsyntaxhighlight Clang="c">#include <stdio.h>
#include <stdlib.h>
#include <string.h>
Line 223 ⟶ 368:
 
return 0;
}</langsyntaxhighlight>
A method to calculate determinant that might actually be usable:
<langsyntaxhighlight lang="c">#include <stdio.h>
#include <stdlib.h>
#include <tgmath.h>
Line 300 ⟶ 445:
printf("det: %19f\n", det(x, N));
return 0;
}</langsyntaxhighlight>
 
=={{header|C#}}==
{{trans|Go}}
<syntaxhighlight lang="C#">
using System;
using System.Collections.Generic;
using System.Linq; // This is required for LINQ extension methods
 
class Program
{
static IEnumerable<IEnumerable<int>> GetPermutations(IEnumerable<int> list, int length)
{
if (length == 1) return list.Select(t => new int[] { t });
 
return GetPermutations(list, length - 1)
.SelectMany(t => list.Where(e => !t.Contains(e)),
(t1, t2) => t1.Concat(new int[] { t2 }));
}
 
static double Determinant(double[][] m)
{
double d = 0;
var p = new List<int>();
for (int i = 0; i < m.Length; i++)
{
p.Add(i);
}
 
var permutations = GetPermutations(p, p.Count);
foreach (var perm in permutations)
{
double pr = 1;
int sign = Math.Sign(GetPermutationSign(perm.ToList()));
for (int i = 0; i < perm.Count(); i++)
{
pr *= m[i][perm.ElementAt(i)];
}
d += sign * pr;
}
 
return d;
}
 
static int GetPermutationSign(IList<int> perm)
{
int inversions = 0;
for (int i = 0; i < perm.Count; i++)
for (int j = i + 1; j < perm.Count; j++)
if (perm[i] > perm[j])
inversions++;
return inversions % 2 == 0 ? 1 : -1;
}
 
static double Permanent(double[][] m)
{
double d = 0;
var p = new List<int>();
for (int i = 0; i < m.Length; i++)
{
p.Add(i);
}
 
var permutations = GetPermutations(p, p.Count);
foreach (var perm in permutations)
{
double pr = 1;
for (int i = 0; i < perm.Count(); i++)
{
pr *= m[i][perm.ElementAt(i)];
}
d += pr;
}
 
return d;
}
 
static void Main(string[] args)
{
double[][] m2 = new double[][] {
new double[] { 1, 2 },
new double[] { 3, 4 }
};
 
double[][] m3 = new double[][] {
new double[] { 2, 9, 4 },
new double[] { 7, 5, 3 },
new double[] { 6, 1, 8 }
};
 
Console.WriteLine($"{Determinant(m2)}, {Permanent(m2)}");
Console.WriteLine($"{Determinant(m3)}, {Permanent(m3)}");
}
}
</syntaxhighlight>
{{out}}
<pre>
-2, 10
-360, 900
 
</pre>
 
=={{header|C++}}==
{{trans|Java}}
<langsyntaxhighlight lang="cpp">#include <iostream>
#include <vector>
 
Line 397 ⟶ 642:
 
return 0;
}</langsyntaxhighlight>
{{out}}
<pre>[[1, 2], [3, 4]]
Line 411 ⟶ 656:
A recursive version, no libraries required, it doesn't use much consing, only for the list of columns to skip
 
<langsyntaxhighlight lang="lisp">
(defun determinant (rows &optional (skip-cols nil))
(let* ((result 0) (sgn -1))
Line 455 ⟶ 700:
(dolist (m (list m2 m3 m4 m5))
(format t "~a determinant: ~a, permanent: ~a~%" m (determinant m) (permanent m)) )
</syntaxhighlight>
</lang>
 
{{out}}
Line 467 ⟶ 712:
This requires the modules from the [[Permutations#D|Permutations]] and [[Permutations_by_swapping#D|Permutations by swapping]] tasks.
{{trans|Python}}
<langsyntaxhighlight lang="d">import std.algorithm, std.range, std.traits, permutations2,
permutations_by_swapping1;
 
Line 521 ⟶ 766:
a.permanent, a.determinant);
}
}</langsyntaxhighlight>
{{out}}
<pre>[[ 1, 2],
Line 539 ⟶ 784:
[20, 21, 22, 23, 24]]
Permanent: 6778800, determinant: 0</pre>
=={{header|Delphi}}==
{{libheader| System.SysUtils}}
{{Trans|Java}}
<syntaxhighlight lang="delphi">
program Determinant_and_permanent;
 
{$APPTYPE CONSOLE}
 
uses
System.SysUtils;
 
type
TMatrix = TArray<TArray<Double>>;
 
function Minor(a: TMatrix; x, y: Integer): TMatrix;
begin
var len := Length(a) - 1;
SetLength(result, len, len);
for var i := 0 to len - 1 do
begin
for var j := 0 to len - 1 do
begin
if ((i < x) and (j < y)) then
begin
result[i][j] := a[i][j];
end
else if ((i >= x) and (j < y)) then
begin
result[i][j] := a[i + 1][j];
end
else if ((i < x) and (j >= y)) then
begin
result[i][j] := a[i][j + 1];
end
else //i>x and j>y
result[i][j] := a[i + 1][j + 1];
end;
end;
end;
 
function det(a: TMatrix): Double;
begin
if length(a) = 1 then
exit(a[0][0]);
 
var sign := 1;
result := 0.0;
for var i := 0 to high(a) do
begin
result := result + sign * a[0][i] * det(minor(a, 0, i));
sign := sign * - 1;
end;
end;
 
function perm(a: TMatrix): Double;
begin
if Length(a) = 1 then
exit(a[0][0]);
Result := 0;
for var i := 0 to high(a) do
result := result + a[0][i] * perm(Minor(a, 0, i));
end;
 
function Readint(Min, Max: Integer; Prompt: string): Integer;
var
val: string;
vali: Integer;
begin
Result := -1;
repeat
writeln(Prompt);
Readln(val);
if TryStrToInt(val, vali) then
if (vali < Min) or (vali > Max) then
writeln(vali, ' is out range [', Min, '...', Max, ']')
else
exit(vali)
else
writeln(val, ' is not a number valid');
until false;
end;
 
function ReadDouble(Min, Max: double; Prompt: string): double;
var
val: string;
vali: double;
begin
Result := -1;
repeat
writeln(Prompt);
Readln(val);
if TryStrToFloat(val, vali) then
if (vali < Min) or (vali > Max) then
writeln(vali, ' is out range [', Min, '...', Max, ']')
else
exit(vali)
else
writeln(val, ' is not a number valid');
until false;
end;
 
procedure ShowMatrix(a: TMatrix);
begin
var sz := length(a);
for var i := 0 to sz - 1 do
begin
Write('[');
for var j := 0 to sz - 1 do
write(a[i][j]: 3: 2, ' ');
Writeln(']');
end;
end;
 
var
a: TMatrix;
sz: integer;
 
begin
sz := Readint(1, 10, 'Enter with matrix size: ');
SetLength(a, sz, sz);
for var i := 0 to sz - 1 do
for var j := 0 to sz - 1 do
begin
a[i][j] := ReadDouble(-1000, 1000, format('Enter a value of position (%d,%d):',
[i, j]));
end;
 
writeln('Matrix defined: ');
ShowMatrix(a);
writeln(#10'Determinant: ', det(a): 3: 2);
writeln(#10'Permanent: ', perm(a): 3: 2);
readln;
end.</syntaxhighlight>
{{out}}
<pre>Enter with matrix size:
2
Enter a value of position (0,0):
1
Enter a value of position (0,1):
2
Enter a value of position (1,0):
3
Enter a value of position (1,1):
4
Matrix defined:
[1.00 2.00 ]
[3.00 4.00 ]
 
Determinant: -2.00
 
Permanent: 10.00</pre>
=={{header|EchoLisp}}==
This requires the 'list' library for '''(in-permutations n)''' and the 'matrix' library for the built-in '''(determinant M)'''.
<langsyntaxhighlight lang="lisp">
(lib 'list)
(lib 'matrix)
Line 571 ⟶ 966:
(permanent M) → 6778800
 
</syntaxhighlight>
</lang>
 
=={{header|Factor}}==
<langsyntaxhighlight lang="factor">USING: fry kernel math.combinatorics math.matrices sequences ;
 
: permanent ( matrix -- x )
dup square-matrix? [ "Matrix must be square." throw ] unless
[ dim first <iota> ] keep
'[ [ _ nth nth ] map-index product ] map-permutations sum ;</langsyntaxhighlight>
Example output:
<pre>
Line 590 ⟶ 985:
900
</pre>
 
 
=={{header|Forth}}==
Line 595 ⟶ 991:
{{works with|gforth|0.7.9_20170427}}
Requiring a permute.fs file from the [[Permutations_by_swapping#Forth|Permutations by swapping]] task.
<langsyntaxhighlight lang="forth">S" fsl-util.fs" REQUIRED
S" fsl/dynmem.seq" REQUIRED
[UNDEFINED] defines [IF] SYNONYM defines IS [THEN]
Line 632 ⟶ 1,028:
m3{{ lmat lufact
lmat det F. 3 m3{{ permanent F. CR
lmat lu-free</langsyntaxhighlight>
 
=={{header|Fortran}}==
Line 638 ⟶ 1,034:
Please find the compilation and example run at the start of the comments in the f90 source. Thank you.
 
<syntaxhighlight lang="fortran">
<lang FORTRAN>
!-*- mode: compilation; default-directory: "/tmp/" -*-
!Compilation started at Sat May 18 23:25:42
Line 710 ⟶ 1,106:
 
end program f
</syntaxhighlight>
</lang>
 
=={{header|FreeBASIC}}==
<syntaxhighlight lang="freebasic">sub make_S( M() as double, S() as double, i as uinteger, j as uinteger )
'removes row j, column i from the matrix, stores result in S()
dim as uinteger ii, jj, size=ubound(M), ix, jx
for ii = 1 to size-1
if ii<i then ix = ii else ix = ii + 1
for jj = 1 to size-1
if jj<j then jx = jj else jx = jj + 1
S(ii, jj) = M(ix, jx)
next jj
next ii
end sub
 
function deperminant( M() as double, det as boolean ) as double
'calculates the determinant or the permanent of a square matrix M
'det = true for determinant, false for permanent
'assumes a square matrix
dim as uinteger size = ubound(M,1), i
dim as integer sign
dim as double S(1 to size-1, 1 to size-1)
dim as double ret = 0.0, inc
if size = 1 then return M(1,1) 'matrices of size < 3 are easy to calculate
if size = 2 and det then return M(1,1)*M(2,2) - M(1,2)*M(2,1)
if size = 2 then return M(1,1)*M(2,2) + M(1,2)*M(2,1)
for i = 1 to size
if det then sign = (-1)^(i+1) else sign = 1 'this bit is what distinguishes a determinant from a permanent
make_S( M(), S(), i, 1 )
inc = sign*M(i,1)*deperminant( S(), det ) 'recursively call on submatrices
ret += inc
next i
return ret
end function
dim as double A(1 to 2, 1 to 2) = {{1,2},{3,4}}
 
dim as double B(1 to 4, 1 to 4) = {_
{1,2,3,4}, {4,5,6,7}, {7,8,9,10}, {10,11,12,13} }
 
dim as double C(1 to 5, 1 to 5) = {_
{ 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 } }
 
print deperminant( A(), true ), deperminant( A(), false )
print deperminant( B(), true ), deperminant( B(), false )
print deperminant( C(), true ), deperminant( C(), false )</syntaxhighlight>
{{out}}<pre>
-2 10
0 29556
0 6778800
</pre>
 
=={{header|FunL}}==
From the task description:
<langsyntaxhighlight lang="funl">def sgn( p ) = product( (if s(0) < s(1) xor i(0) < i(1) then -1 else 1) | (s, i) <- p.combinations(2).zip( (0:p.length()).combinations(2) ) )
 
def perm( m ) = sum( product(m(i, sigma(i)) | i <- 0:m.length()) | sigma <- (0:m.length()).permutations() )
 
def det( m ) = sum( sgn(sigma)*product(m(i, sigma(i)) | i <- 0:m.length()) | sigma <- (0:m.length()).permutations() )</langsyntaxhighlight>
 
Laplace expansion (recursive):
<langsyntaxhighlight lang="funl">def perm( m )
| m.length() == 1 and m(0).length() == 1 = m(0, 0)
| otherwise = sum( m(i, 0)*perm(m(0:i, 1:m.length()) + m(i+1:m.length(), 1:m.length())) | i <- 0:m.length() )
Line 727 ⟶ 1,177:
def det( m )
| m.length() == 1 and m(0).length() == 1 = m(0, 0)
| otherwise = sum( (-1)^i*m(i, 0)*det(m(0:i, 1:m.length()) + m(i+1:m.length(), 1:m.length())) | i <- 0:m.length() )</langsyntaxhighlight>
 
Test using the first set of definitions (from task description):
<langsyntaxhighlight lang="funl">matrices = [
( (1, 2),
(3, 4)),
Line 747 ⟶ 1,197:
 
for m <- matrices
println( m, 'perm: ' + perm(m), 'det: ' + det(m) )</langsyntaxhighlight>
 
{{out}}
Line 759 ⟶ 1,209:
 
=={{header|GLSL}}==
<langsyntaxhighlight lang="glsl">
mat4 m1 = mat3(1, 2, 3, 4,
5, 6, 7, 8
Line 766 ⟶ 1,216:
 
float d = det(m1);
</syntaxhighlight>
</lang>
 
=={{header|Go}}==
===Implementation===
This implements a naive algorithm for each that follows from the definitions. It imports the permute packge from the [[Permutations_by_swapping#Go|Permutations by swapping]] task.
<langsyntaxhighlight lang="go">package main
 
import (
Line 822 ⟶ 1,272:
fmt.Println(determinant(m2), permanent(m2))
fmt.Println(determinant(m3), permanent(m3))
}</langsyntaxhighlight>
{{out}}
<pre>
Line 829 ⟶ 1,279:
</pre>
===Ryser permanent===
<langsyntaxhighlight lang="go">package main
 
import "fmt"
Line 872 ⟶ 1,322:
}
return
}</langsyntaxhighlight>
{{out}}
<pre>
Line 880 ⟶ 1,330:
===Library determinant===
'''go.matrix:'''
<langsyntaxhighlight lang="go">package main
 
import (
Line 896 ⟶ 1,346:
{7, 5, 3},
{6, 1, 8}}).Det())
}</langsyntaxhighlight>
{{out}}
<pre>
Line 903 ⟶ 1,353:
</pre>
'''gonum/mat:'''
<langsyntaxhighlight lang="go">package main
 
import (
Line 919 ⟶ 1,369:
7, 5, 3,
6, 1, 8})))
}</langsyntaxhighlight>
{{out}}
<pre>
Line 927 ⟶ 1,377:
 
=={{header|Haskell}}==
<langsyntaxhighlight Haskelllang="haskell">sPermutations :: [a] -> [([a], Int)]
sPermutations = flip zip (cycle [1, -1]) . foldl aux [[]]
where
Line 985 ⟶ 1,435:
, [[2, 5], [4, 3]]
, [[4, 4], [2, 2]]
]</langsyntaxhighlight>
{{Out}}
<pre>Matrix:
Line 1,045 ⟶ 1,495:
Here is code for computing the determinant and permanent very inefficiently, via [[wp:Cramer's rule|Cramer's rule]] (for the determinant, as well as its analog for the permanent):
 
<syntaxhighlight lang="haskell">
<lang Haskell>
outer :: (a->b->c) -> [a] -> [b] -> [[c]]
outer f [] _ = []
Line 1,097 ⟶ 1,547:
perm m = (mul m (padj m)) !! 0 !! 0
 
</syntaxhighlight>
</lang>
 
=={{header|J}}==
Line 1,105 ⟶ 1,555:
For example, given the matrix:
 
<langsyntaxhighlight Jlang="j"> i. 5 5
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</langsyntaxhighlight>
 
Its determinant is 0. When we use IEEE floating point, we only get an approximation of this result:
 
<langsyntaxhighlight Jlang="j"> -/ .* i. 5 5
_1.30277e_44</langsyntaxhighlight>
 
If we use exact (rational) arithmetic, we get a precise result:
 
<langsyntaxhighlight Jlang="j"> -/ .* i. 5 5x
0</langsyntaxhighlight>
 
Meanwhile, the permanent does not have this problem in this example (the matrix contains no negative values and permanent does not use subtraction):
 
<langsyntaxhighlight Jlang="j"> +/ .* i. 5 5
6778800</langsyntaxhighlight>
 
As an aside, note also that for specific verbs (like <code>-/ .*</code>) J uses an algorithm which is more efficient than the brute force approach implied by the [http://www.jsoftware.com/help/dictionary/d300.htm definition of <code> .</code>]. (In general, where there are common, useful, concise definitions where special code can improve resource use by more than a factor of 2, the implementors of J try to make sure that that special code gets used for those definitions.)
Line 1,131 ⟶ 1,581:
=={{header|Java}}==
 
<langsyntaxhighlight Javalang="java">import java.util.Scanner;
 
public class MatrixArithmetic {
Line 1,185 ⟶ 1,635:
System.out.println("Permanent: "+perm(a));
}
}</langsyntaxhighlight>
 
Note that the first input is the size of the matrix.
Line 1,191 ⟶ 1,641:
For example:
 
<syntaxhighlight lang="text">2
1 2
3 4
Line 1,206 ⟶ 1,656:
Determinant: 0.0
Permanent: 6778800.0
</syntaxhighlight>
</lang>
 
=={{header|JavaScript}}==
<langsyntaxhighlight lang="javascript">const determinant = arr =>
arr.length === 1 ? (
arr[0][0]
Line 1,237 ⟶ 1,687:
];
console.log(determinant(M));
console.log(permanent(M));</langsyntaxhighlight>
{{Out}}
<pre>0
Line 1,245 ⟶ 1,695:
{{Works with|jq|1.4}}
====Recursive definitions====
<langsyntaxhighlight lang="jq"># Eliminate row i and row j
def except(i;j):
reduce del(.[i])[] as $row ([]; . + [$row | del(.[j]) ] );
Line 1,262 ⟶ 1,712:
| reduce range(0; length) as $i
(0; . + $m[0][$i] * ( $m | except(0;$i) | perm) )
end ;</langsyntaxhighlight>
'''Examples'''
<langsyntaxhighlight lang="jq">def matrices:
[ [1, 2],
[3, 4]],
Line 1,285 ⟶ 1,735:
 
"Determinants: ", (matrices | det),
"Permanents: ", (matrices | perm)</langsyntaxhighlight>
{{Out}}
<langsyntaxhighlight lang="sh">$ jq -n -r -f Matrix_arithmetic.jq
Determinants:
-2
Line 1,297 ⟶ 1,747:
10
29556
6778800</langsyntaxhighlight>
====Determinant via LU Decomposition====
The following uses the jq infrastructure at [[LU decomposition]] to achieve an efficient implementation of det/0:
<langsyntaxhighlight lang="jq"># Requires lup/0
def det:
def product_diagonal:
Line 1,308 ⟶ 1,758:
| (.[0]|product_diagonal) as $l
| if $l == 0 then 0 else $l * (.[1]|product_diagonal) | tidy end ;
</syntaxhighlight>
</lang>
'''Examples'''
 
Using matrices/0 as defined above:
<syntaxhighlight lang ="jq">matrices | det</langsyntaxhighlight>
{{Output}}
$ /usr/local/bin/jq -M -n -f LU.rc
Line 1,321 ⟶ 1,771:
 
=={{header|Julia}}==
<syntaxhighlight lang Julia="julia"> using LinearAlgebra</langsyntaxhighlight>
The determinant of a matrix <code>A</code> can be computed by the built-in function
<syntaxhighlight lang ="julia">det(A)</langsyntaxhighlight>
 
{{trans|Python}}
The following function computes the permanent of a matrix A from the definition:
<langsyntaxhighlight lang="julia">function perm(A)
m, n = size(A)
if m != n; throw(ArgumentError("permanent is for square matrices only")); end
sum(σ -> prod(i -> A[i,σ[i]], 1:n), permutations(1:n))
end</langsyntaxhighlight>
 
Example output:
<langsyntaxhighlight lang="julia">julia> A = [2 9 4; 7 5 3; 6 1 8]
julia> det(A), perm(A)
(-360.0,900)</langsyntaxhighlight>
 
=={{header|Kotlin}}==
<langsyntaxhighlight lang="scala">// version 1.1.2
 
typealias Matrix = Array<DoubleArray>
Line 1,425 ⟶ 1,875:
println(" permanent = ${permanent(m)}\n")
}
}</langsyntaxhighlight>
 
{{out}}
Line 1,447 ⟶ 1,897:
 
=={{header|Lambdatalk}}==
<langsyntaxhighlight lang="scheme">
{require lib_matrix}
 
Line 1,471 ⟶ 1,921:
[7,8,-9]]}}
-> 216
</syntaxhighlight>
</lang>
 
=={{header|Lua}}==
<langsyntaxhighlight lang="lua">-- Johnson–Trotter permutations generator
_JT={}
function JT(dim)
Line 1,560 ⟶ 2,010:
matrix2:dump();
print("det:",matrix2:det(), "permanent:",matrix2:perm())
</syntaxhighlight>
</lang>
{{out}}
<pre>7 2 -2 4
Line 1,574 ⟶ 2,024:
 
=={{header|Maple}}==
<langsyntaxhighlight Maplelang="maple">M:=<<2|9|4>,<7|5|3>,<6|1|8>>:
 
with(LinearAlgebra):
 
Determinant(M);
Permanent(M);</langsyntaxhighlight>
Output:
<pre> -360
900</pre>
 
=={{header|Mathematica}}/{{header|Wolfram Language}}==
Determinant is a built in function Det
 
<lang Mathematica>Permanent[m_List] :=
[https://reference.wolfram.com/language/ref/Permanent.html Permanent] is also a built in function, but here is a way it could be implemented:
<syntaxhighlight lang="mathematica">Permanent[m_List] :=
With[{v = Array[x, Length[m]]},
Coefficient[Times @@ (m.v), Times @@ v]
]</langsyntaxhighlight>
 
=={{header|Maxima}}==
<langsyntaxhighlight lang="maxima">a: matrix([2, 9, 4], [7, 5, 3], [6, 1, 8])$
 
determinant(a);
Line 1,598 ⟶ 2,050:
 
permanent(a);
900</langsyntaxhighlight>
 
=={{header|МК-61/52}}==
Line 1,619 ⟶ 2,071:
{{trans|Python}}
Using the permutationsswap module from [[Permutations by swapping#Nim|Permutations by swapping]]:
<langsyntaxhighlight lang="nim">import sequtils, permutationsswap
 
type Matrix[M,N: static[int]] = array[M, array[N, float]]
Line 1,655 ⟶ 2,107:
echo "perm: ", a.perm, " det: ", a.det
echo "perm: ", b.perm, " det: ", b.det
echo "perm: ", c.perm, " det: ", c.det</langsyntaxhighlight>
Output:
<pre>perm: 10.0 det: -2.0
Line 1,662 ⟶ 2,114:
 
=={{header|Ol}}==
<langsyntaxhighlight lang="scheme">
; helper function that returns rest of matrix by col/row
(define (rest matrix i j)
Line 1,729 ⟶ 2,181:
(20 21 22 23 24))))
; ==> 6778800
</syntaxhighlight>
</lang>
 
=={{header|PARI/GP}}==
The determinant is built in:
<syntaxhighlight lang ="parigp">matdet(M)</langsyntaxhighlight>
and the permanent can be defined as
<langsyntaxhighlight lang="parigp">matperm(M)=my(n=#M,t);sum(i=1,n!,t=numtoperm(n,i);prod(j=1,n,M[j,t[j]]))</langsyntaxhighlight>
For better performance, here's a version using Ryser's formula:
<langsyntaxhighlight lang="parigp">matperm(M)=
{
my(n=matsize(M)[1],innerSums=vectorv(n));
Line 1,750 ⟶ 2,202:
(-1)^hammingweight(gray)*factorback(innerSums)
)*(-1)^n;
}</langsyntaxhighlight>
 
{{works with|PARI/GP|2.10.0+}}
As of version 2.10, the matrix permanent is built in:
<syntaxhighlight lang ="parigp">matpermanent(M)</langsyntaxhighlight>
 
=={{header|Perl}}==
{{trans|C}}
<langsyntaxhighlight lang="perl">#!/usr/bin/perl
use strict;
use warnings;
Line 1,784 ⟶ 2,236:
print "det(M) = " . $M->determinant . ".\n";
print "det(M) = " . $M->det . ".\n";
print "perm(M) = " . permanent($M) . ".\n";</langsyntaxhighlight>
 
<code>determinant</code> and <code>det</code> are already defined in PDL, see[http://pdl.perl.org/?docs=MatrixOps&title=the%20PDL::MatrixOps%20manpage#det]. <code>permanent</code> has to be defined manually.
Line 1,804 ⟶ 2,256:
=={{header|Phix}}==
{{trans|Java}}
<!--<syntaxhighlight lang="phix">(phixonline)-->
<lang Phix>function minor(sequence a, integer x, integer y)
<span style="color: #008080;">with</span> <span style="color: #008080;">javascript_semantics</span>
integer l = length(a)-1
<span style="color: #008080;">function</span> <span style="color: #000000;">minor</span><span style="color: #0000FF;">(</span><span style="color: #004080;">sequence</span> <span style="color: #000000;">a</span><span style="color: #0000FF;">,</span> <span style="color: #004080;">integer</span> <span style="color: #000000;">x</span><span style="color: #0000FF;">,</span> <span style="color: #004080;">integer</span> <span style="color: #000000;">y</span><span style="color: #0000FF;">)</span>
sequence result = repeat(repeat(0,l),l)
<span style="color: #004080;">integer</span> <span style="color: #000000;">l</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">a</span><span style="color: #0000FF;">)-</span><span style="color: #000000;">1</span>
for i=1 to l do
<span style="color: #004080;">sequence</span> <span style="color: #000000;">result</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">repeat</span><span style="color: #0000FF;">(</span><span style="color: #7060A8;">repeat</span><span style="color: #0000FF;">(</span><span style="color: #000000;">0</span><span style="color: #0000FF;">,</span><span style="color: #000000;">l</span><span style="color: #0000FF;">),</span><span style="color: #000000;">l</span><span style="color: #0000FF;">)</span>
for j=1 to l do
<span style="color: #008080;">for</span> <span style="color: #000000;">i</span><span style="color: #0000FF;">=</span><span style="color: #000000;">1</span> <span style="color: #008080;">to</span> <span style="color: #000000;">l</span> <span style="color: #008080;">do</span>
result[i][j] = a[i+(i>=x)][j+(j>=y)]
<span style="color: #008080;">for</span> <span style="color: #000000;">j</span><span style="color: #0000FF;">=</span><span style="color: #000000;">1</span> <span style="color: #008080;">to</span> <span style="color: #000000;">l</span> <span style="color: #008080;">do</span>
end for
<span style="color: #000000;">result</span><span style="color: #0000FF;">[</span><span style="color: #000000;">i</span><span style="color: #0000FF;">][</span><span style="color: #000000;">j</span><span style="color: #0000FF;">]</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">a</span><span style="color: #0000FF;">[</span><span style="color: #000000;">i</span><span style="color: #0000FF;">+(</span><span style="color: #000000;">i</span><span style="color: #0000FF;">>=</span><span style="color: #000000;">x</span><span style="color: #0000FF;">)][</span><span style="color: #000000;">j</span><span style="color: #0000FF;">+(</span><span style="color: #000000;">j</span><span style="color: #0000FF;">>=</span><span style="color: #000000;">y</span><span style="color: #0000FF;">)]</span>
end for
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span>
return result
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span>
end function
<span style="color: #008080;">return</span> <span style="color: #000000;">result</span>
 
<span style="color: #008080;">end</span> <span style="color: #008080;">function</span>
function det(sequence a)
if length(a)=1 then
<span style="color: #008080;">function</span> <span style="color: #000000;">det</span><span style="color: #0000FF;">(</span><span style="color: #004080;">sequence</span> <span style="color: #000000;">a</span><span style="color: #0000FF;">)</span>
return a[1][1]
<span style="color: #008080;">if</span> <span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">a</span><span style="color: #0000FF;">)=</span><span style="color: #000000;">1</span> <span style="color: #008080;">then</span>
end if
<span style="color: #008080;">return</span> <span style="color: #000000;">a</span><span style="color: #0000FF;">[</span><span style="color: #000000;">1</span><span style="color: #0000FF;">][</span><span style="color: #000000;">1</span><span style="color: #0000FF;">]</span>
integer sgn = 1
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
integer res = 0
<span style="color: #004080;">integer</span> <span style="color: #000000;">res</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">0</span><span style="color: #0000FF;">,</span>
for i=1 to length(a) do
<span style="color: #000000;">sgn</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">1</span>
res += sgn*a[1][i]*det(minor(a,1,i))
<span style="color: #008080;">for</span> <span style="color: #000000;">i</span><span style="color: #0000FF;">=</span><span style="color: #000000;">1</span> <span style="color: #008080;">to</span> <span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">a</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">do</span>
sgn *= -1
<span style="color: #000000;">res</span> <span style="color: #0000FF;">+=</span> <span style="color: #000000;">sgn</span><span style="color: #0000FF;">*</span><span style="color: #000000;">a</span><span style="color: #0000FF;">[</span><span style="color: #000000;">1</span><span style="color: #0000FF;">][</span><span style="color: #000000;">i</span><span style="color: #0000FF;">]*</span><span style="color: #000000;">det</span><span style="color: #0000FF;">(</span><span style="color: #000000;">minor</span><span style="color: #0000FF;">(</span><span style="color: #000000;">a</span><span style="color: #0000FF;">,</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #000000;">i</span><span style="color: #0000FF;">))</span>
end for
<span style="color: #000000;">sgn</span> <span style="color: #0000FF;">*=</span> <span style="color: #0000FF;">-</span><span style="color: #000000;">1</span>
return res
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span>
end function
<span style="color: #008080;">return</span> <span style="color: #000000;">res</span>
 
<span style="color: #008080;">end</span> <span style="color: #008080;">function</span>
function perm(sequence a)
if length(a)=1 then
<span style="color: #008080;">function</span> <span style="color: #000000;">perm</span><span style="color: #0000FF;">(</span><span style="color: #004080;">sequence</span> <span style="color: #000000;">a</span><span style="color: #0000FF;">)</span>
return a[1][1]
<span style="color: #008080;">if</span> <span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">a</span><span style="color: #0000FF;">)=</span><span style="color: #000000;">1</span> <span style="color: #008080;">then</span>
end if
<span style="color: #008080;">return</span> <span style="color: #000000;">a</span><span style="color: #0000FF;">[</span><span style="color: #000000;">1</span><span style="color: #0000FF;">][</span><span style="color: #000000;">1</span><span style="color: #0000FF;">]</span>
integer res = 0
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
for i=1 to length(a) do
<span style="color: #004080;">integer</span> <span style="color: #000000;">res</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">0</span>
res += a[1][i]*perm(minor(a,1,i))
<span style="color: #008080;">for</span> <span style="color: #000000;">i</span><span style="color: #0000FF;">=</span><span style="color: #000000;">1</span> <span style="color: #008080;">to</span> <span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">a</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">do</span>
end for
<span style="color: #000000;">res</span> <span style="color: #0000FF;">+=</span> <span style="color: #000000;">a</span><span style="color: #0000FF;">[</span><span style="color: #000000;">1</span><span style="color: #0000FF;">][</span><span style="color: #000000;">i</span><span style="color: #0000FF;">]*</span><span style="color: #000000;">perm</span><span style="color: #0000FF;">(</span><span style="color: #000000;">minor</span><span style="color: #0000FF;">(</span><span style="color: #000000;">a</span><span style="color: #0000FF;">,</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #000000;">i</span><span style="color: #0000FF;">))</span>
return res
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span>
end function
<span style="color: #008080;">return</span> <span style="color: #000000;">res</span>
 
<span style="color: #008080;">end</span> <span style="color: #008080;">function</span>
constant tests = {
{{1, 2},
<span style="color: #008080;">constant</span> <span style="color: #000000;">tests</span> <span style="color: #0000FF;">=</span> <span style="color: #0000FF;">{</span>
{3, 4}},
<span style="color: #0000FF;">{{</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">2</span><span style="color: #0000FF;">},</span>
--Determinant: -2, permanent: 10
<span style="color: #0000FF;">{</span><span style="color: #000000;">3</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">4</span><span style="color: #0000FF;">}},</span>
{{2, 9, 4},
<span style="color: #000080;font-style:italic;">--Determinant: -2, permanent: 10</span>
{7, 5, 3},
<span style="color: #0000FF;">{{</span><span style="color: #000000;">2</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">9</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">4</span><span style="color: #0000FF;">},</span>
{6, 1, 8}},
<span style="color: #0000FF;">{</span><span style="color: #000000;">7</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">5</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">3</span><span style="color: #0000FF;">},</span>
--Determinant: -360, permanent: 900
<span style="color: #0000FF;">{</span><span style="color: #000000;">6</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">1</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">8</span><span style="color: #0000FF;">}},</span>
{{ 1, 2, 3, 4},
<span style="color: #000080;font-style:italic;">--Determinant: -360, permanent: 900</span>
{ 4, 5, 6, 7},
<span style="color: #0000FF;">{{</span> <span style="color: #000000;">1</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">2</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">3</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">4</span><span style="color: #0000FF;">},</span>
{ 7, 8, 9, 10},
<span style="color: #0000FF;">{</span> <span style="color: #000000;">4</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">5</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">6</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">7</span><span style="color: #0000FF;">},</span>
{10, 11, 12, 13}},
<span style="color: #0000FF;">{</span> <span style="color: #000000;">7</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">8</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">9</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">10</span><span style="color: #0000FF;">},</span>
--Determinant: 0, permanent: 29556
<span style="color: #0000FF;">{</span><span style="color: #000000;">10</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">11</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">12</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">13</span><span style="color: #0000FF;">}},</span>
{{ 0, 1, 2, 3, 4},
<span style="color: #000080;font-style:italic;">--Determinant: 0, permanent: 29556</span>
{ 5, 6, 7, 8, 9},
<span style="color: #0000FF;">{{</span> <span style="color: #000000;">0</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">1</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">2</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">3</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">4</span><span style="color: #0000FF;">},</span>
{10, 11, 12, 13, 14},
<span style="color: #0000FF;">{</span> <span style="color: #000000;">5</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">6</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">7</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">8</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">9</span><span style="color: #0000FF;">},</span>
{15, 16, 17, 18, 19},
<span style="color: #0000FF;">{</span><span style="color: #000000;">10</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">11</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">12</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">13</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">14</span><span style="color: #0000FF;">},</span>
{20, 21, 22, 23, 24}},
<span style="color: #0000FF;">{</span><span style="color: #000000;">15</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">16</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">17</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">18</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">19</span><span style="color: #0000FF;">},</span>
--Determinant: 0, permanent: 6778800
<span style="color: #0000FF;">{</span><span style="color: #000000;">20</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">21</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">22</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">23</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">24</span><span style="color: #0000FF;">}},</span>
{{5}},
<span style="color: #000080;font-style:italic;">--Determinant: 50, permanent: 5 6778800</span>
<span style="color: #0000FF;">{{</span><span style="color: #000000;">5</span><span style="color: #0000FF;">}},</span>
{{1,0,0},
<span style="color: #000080;font-style:italic;">--Determinant: 5, permanent: 5 </span>
{0,1,0},
<span style="color: #0000FF;">{{</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #000000;">0</span><span style="color: #0000FF;">,</span><span style="color: #000000;">0</span><span style="color: #0000FF;">},</span>
{0,0,1}},
<span style="color: #0000FF;">{</span><span style="color: #000000;">0</span><span style="color: #0000FF;">,</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #000000;">0</span><span style="color: #0000FF;">},</span>
--Determinant: 1, permanent: 1
<span style="color: #0000FF;">{</span><span style="color: #000000;">0</span><span style="color: #0000FF;">,</span><span style="color: #000000;">0</span><span style="color: #0000FF;">,</span><span style="color: #000000;">1</span><span style="color: #0000FF;">}},</span>
{{0,0,1},
<span style="color: #000080;font-style:italic;">--Determinant: 1, permanent: 1</span>
{0,1,0},
<span style="color: #0000FF;">{{</span><span style="color: #000000;">0</span><span style="color: #0000FF;">,</span><span style="color: #000000;">0</span><span style="color: #0000FF;">,</span><span style="color: #000000;">1</span><span style="color: #0000FF;">},</span>
{1,0,0}},
<span style="color: #0000FF;">{</span><span style="color: #000000;">0</span><span style="color: #0000FF;">,</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #000000;">0</span><span style="color: #0000FF;">},</span>
--Determinant: -1, Permanent: 1
<span style="color: #0000FF;">{</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #000000;">0</span><span style="color: #0000FF;">,</span><span style="color: #000000;">0</span><span style="color: #0000FF;">}},</span>
{{4,3},
<span style="color: #000080;font-style:italic;">--Determinant: -1, Permanent: 1</span>
{2,5}},
<span style="color: #0000FF;">{{</span><span style="color: #000000;">4</span><span style="color: #0000FF;">,</span><span style="color: #000000;">3</span><span style="color: #0000FF;">},</span>
--Determinant: 14, Permanent: 26
<span style="color: #0000FF;">{</span><span style="color: #000000;">2</span><span style="color: #0000FF;">,</span><span style="color: #000000;">5</span><span style="color: #0000FF;">}},</span>
{{2,5},
<span style="color: #000080;font-style:italic;">--Determinant: 14, Permanent: 26</span>
{4,3}},
<span style="color: #0000FF;">{{</span><span style="color: #000000;">2</span><span style="color: #0000FF;">,</span><span style="color: #000000;">5</span><span style="color: #0000FF;">},</span>
--Determinant: -14, Permanent: 26
<span style="color: #0000FF;">{</span><span style="color: #000000;">4</span><span style="color: #0000FF;">,</span><span style="color: #000000;">3</span><span style="color: #0000FF;">}},</span>
{{4,4},
<span style="color: #000080;font-style:italic;">--Determinant: -14, Permanent: 26</span>
{2,2}},
<span style="color: #0000FF;">{{</span><span style="color: #000000;">4</span><span style="color: #0000FF;">,</span><span style="color: #000000;">4</span><span style="color: #0000FF;">},</span>
--Determinant: 0, Permanent: 16
<span style="color: #0000FF;">{</span><span style="color: #000000;">2</span><span style="color: #0000FF;">,</span><span style="color: #000000;">2</span><span style="color: #0000FF;">}},</span>
{{7, 2, -2, 4},
<span style="color: #000080;font-style:italic;">--Determinant: 0, Permanent: 16</span>
{4, 4, 1, 7},
<span style="color: #0000FF;">{{</span><span style="color: #000000;">7</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">2</span><span style="color: #0000FF;">,</span> <span style="color: #0000FF;">-</span><span style="color: #000000;">2</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">4</span><span style="color: #0000FF;">},</span>
{11, -8, 9, 10},
<span style="color: #0000FF;">{</span><span style="color: #000000;">4</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">4</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">1</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">7</span><span style="color: #0000FF;">},</span>
{10, 5, 12, 13}},
<span style="color: #0000FF;">{</span><span style="color: #000000;">11</span><span style="color: #0000FF;">,</span> <span style="color: #0000FF;">-</span><span style="color: #000000;">8</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">9</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">10</span><span style="color: #0000FF;">},</span>
--det: -4319 permanent: 10723
<span style="color: #0000FF;">{</span><span style="color: #000000;">10</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">5</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">12</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">13</span><span style="color: #0000FF;">}},</span>
 
<span style="color: #000080;font-style:italic;">--det: -4319 permanent: 10723</span>
{{-2, 2, -3},
{-1, 1, 3},
<span style="color: #0000FF;">{{-</span><span style="color: #000000;">2</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">2</span><span style="color: #0000FF;">,</span> <span style="color: #0000FF;">-</span><span style="color: #000000;">3</span><span style="color: #0000FF;">},</span>
{2 , 0, -1}}
<span style="color: #0000FF;">{-</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">1</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">3</span><span style="color: #0000FF;">},</span>
--det: 18 permanent: 10
<span style="color: #0000FF;">{</span><span style="color: #000000;">2</span> <span style="color: #0000FF;">,</span> <span style="color: #000000;">0</span><span style="color: #0000FF;">,</span> <span style="color: #0000FF;">-</span><span style="color: #000000;">1</span><span style="color: #0000FF;">}}</span>
}
<span style="color: #000080;font-style:italic;">--det: 18 permanent: 10</span>
for i=1 to length(tests) do
<span style="color: #0000FF;">}</span>
sequence ti = tests[i]
<span style="color: #008080;">for</span> <span style="color: #000000;">i</span><span style="color: #0000FF;">=</span><span style="color: #000000;">1</span> <span style="color: #008080;">to</span> <span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">tests</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">do</span>
?{det(ti),perm(ti)}
<span style="color: #004080;">sequence</span> <span style="color: #000000;">ti</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">tests</span><span style="color: #0000FF;">[</span><span style="color: #000000;">i</span><span style="color: #0000FF;">]</span>
end for</lang>
<span style="color: #0000FF;">?{</span><span style="color: #000000;">det</span><span style="color: #0000FF;">(</span><span style="color: #000000;">ti</span><span style="color: #0000FF;">),</span><span style="color: #000000;">perm</span><span style="color: #0000FF;">(</span><span style="color: #000000;">ti</span><span style="color: #0000FF;">)}</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span>
<!--</syntaxhighlight>-->
{{out}}
<pre>
Line 1,909 ⟶ 2,364:
 
=={{header|PowerShell}}==
<syntaxhighlight lang="powershell">
<lang PowerShell>
function det-perm ($array) {
if($array) {
Line 1,954 ⟶ 2,409:
det-perm @(@(2,5),@(4,3))
det-perm @(@(4,4),@(2,2))
</syntaxhighlight>
</lang>
<b>Output:</b>
<pre>
Line 1,970 ⟶ 2,425:
Using the module file spermutations.py from [[Permutations by swapping#Python|Permutations by swapping]]. The algorithm for the determinant is a more literal translation of the expression in the task description and the Wikipedia reference.
 
<langsyntaxhighlight lang="python">from itertools import permutations
from operator import mul
from math import fsum
Line 2,014 ⟶ 2,469:
print('')
pp(a)
print('Perm: %s Det: %s' % (perm(a), det(a)))</langsyntaxhighlight>
 
;Sample output:
Line 2,031 ⟶ 2,486:
 
The second matrix above is that used in the Tcl example. The third matrix is from the J language example. Note that the determinant seems to be 'exact' using this method of calculation without needing to resort to other than Pythons default numbers.
 
=={{header|R}}==
R has matrix algebra built in, so we do not need to import anything when calculating the determinant. However, we will use a library to generate the permutations of 1:n.
<syntaxhighlight lang="rsplus">library(combinat)
perm <- function(A)
{
stopifnot(is.matrix(A))
n <- nrow(A)
if(n != ncol(A)) stop("Matrix is not square.")
if(n < 1) stop("Matrix has a dimension of size 0.")
sum(sapply(combinat::permn(n), function(sigma) prod(sapply(1:n, function(i) A[i, sigma[i]]))))
}
 
#We copy our test cases from the Python example.
testData <- list("Test 1" = rbind(c(1, 2), c(3, 4)),
"Test 2" = rbind(c(1, 2, 3, 4), c(4, 5, 6, 7), c(7, 8, 9, 10), c(10, 11, 12, 13)),
"Test 3" = rbind(c(0, 1, 2, 3, 4), c(5, 6, 7, 8, 9), c(10, 11, 12, 13, 14),
c(15, 16, 17, 18, 19), c(20, 21, 22, 23, 24)))
print(sapply(testData, function(x) list(Determinant = det(x), Permanent = perm(x))))</syntaxhighlight>
 
{{out}}
<pre> Test 1 Test 2 Test 3
Determinant -2 1.131522e-29 0
Permanent 10 29556 6778800</pre>
 
=={{header|Racket}}==
<langsyntaxhighlight lang="racket">
#lang racket
(require math)
Line 2,043 ⟶ 2,522:
(for/product ([i n] [σi σ])
(matrix-ref M i σi))))
</syntaxhighlight>
</lang>
 
=={{header|Raku}}==
Line 2,050 ⟶ 2,529:
Uses the permutations generator from the [[Permutations by swapping#Raku|Permutations by swapping]] task. This implementation is naive and brute-force (slow) but exact.
 
<syntaxhighlight lang="raku" perl6line>sub insert ($x, @xs) { ([flat @xs[0 ..^ $_], $x, @xs[$_ .. *]] for 0 .. @xs) }
sub order ($sg, @xs) { $sg > 0 ?? @xs !! @xs.reverse }
 
Line 2,106 ⟶ 2,585:
say "Permanent: \t", rat-or-int @matrix.&m_arith: <perm>;
say '-' x 40;
}</langsyntaxhighlight>
 
'''Output'''
Line 2,138 ⟶ 2,617:
 
=={{header|REXX}}==
<langsyntaxhighlight lang="rexx">/* REXX ***************************************************************
* Test the two functions determinant and permanent
* using the matrix specifications shown for other languages
Line 2,176 ⟶ 2,655:
Say ' permanent='right(permanent(as),7)
Say copies('-',50)
Return</langsyntaxhighlight>
 
<langsyntaxhighlight lang="rexx">/* REXX ***************************************************************
* determinant.rex
* compute the determinant of the given square matrix
Line 2,237 ⟶ 2,716:
Say 'invalid number of elements:' nn 'is not a square.'
Exit
End</langsyntaxhighlight>
 
<langsyntaxhighlight lang="rexx">/* REXX ***************************************************************
* permanent.rex
* compute the permanent of a matrix
Line 2,343 ⟶ 2,822:
Say 'invalid number of elements:' nn 'is not a square.'
Exit
End</langsyntaxhighlight>
 
Output:
Line 2,366 ⟶ 2,845:
permanent=6778800
--------------------------------------------------</pre>
 
=={{header|RPL}}==
{{trans|Phix}}
{{works with|HP|48G}}
« → a x y
« a SIZE {-1 -1} ADD 0 CON
1 OVER SIZE 1 GET '''FOR''' k
1 OVER SIZE 1 GET '''FOR''' j
k j 2 →LIST
a k DUP x ≥ + j DUP y ≥ + 2 →LIST GET
PUT
'''NEXT NEXT'''
» » '<span style="color:blue">MINOR</span>' STO <span style="color:grey">@ ''( matrix x y → matrix )''</span>
« DUP SIZE 1 GET
'''IF''' DUP 1 == '''THEN''' GET
'''ELSE'''
0
1 ROT '''FOR''' k
OVER { 1 } k + GET
3 PICK 1 k <span style="color:blue">MINOR PRM</span> * +
'''NEXT'''
SWAP DROP
END
» '<span style="color:blue">PRM</span>' STO <span style="color:grey">@ ''( matrix → permanent )''</span>
 
[[ 1 2 ]
[ 3 4 ]] DET LASTARG <span style="color:blue">PRM</span>
[[2 9 4]
[7 5 3]
[6 1 8]] DET LASTARG <span style="color:blue">PRM</span>
{{out}}
<pre>
4: -2
3: 10
2: -360
1: 900
</pre>
 
=={{header|Ruby}}==
Matrix in the standard library provides a method for the determinant, but not for the permanent.
<langsyntaxhighlight lang="ruby">require 'matrix'
 
class Matrix
Line 2,394 ⟶ 2,911:
puts "determinant:\t #{m.determinant}", "permanent:\t #{m.permanent}"
puts
end</langsyntaxhighlight>
{{Output}}
<pre>
Line 2,406 ⟶ 2,923:
permanent: 6778800
</pre>
 
=={{header|Rust}==
=={{header|Rust}}==
{{trans|Java}}
<langsyntaxhighlight lang="rust">
fn main() {
let mut m1: Vec<Vec<f64>> = vec![vec![1.0,2.0],vec![3.0,4.0]];
Line 2,425 ⟶ 2,943:
 
println!("Determinant of m1: {}", determinant(rr_m1));
println!("PermanantPermanent of m1: {}", permanent(rr_m1));
 
println!("Determinant of m2: {}", determinant(rr_m2));
println!("PermanantPermanent of m2: {}", permanent(rr_m2));
 
println!("Determinant of m3: {}", determinant(rr_m3));
println!("PermanantPermanent of m3: {}", permanent(rr_m3));
 
}
Line 2,490 ⟶ 3,008:
}
 
</syntaxhighlight>
</lang>
{{Output}}
<pre>
Determinant of m1: -2
PermanantPermanent of m1: 10
Determinant of m2: 0
PermanantPermanent of m2: 29556
Determinant of m3: 0
PermanantPermanent of m3: 6778800
</pre>
 
=={{header|Scala}}==
<langsyntaxhighlight lang="scala">
def permutationsSgn[T]: List[T] => List[(Int,List[T])] = {
case Nil => List((1,Nil))
Line 2,527 ⟶ 3,046:
}
summands.toList.foldLeft(0)({case (x,y) => x + y})
</syntaxhighlight>
</lang>
 
=={{header|Sidef}}==
The `determinant` method is provided by the Array class.
{{trans|Ruby}}
<langsyntaxhighlight lang="ruby">class Array {
method permanent {
var r = @^self.len
Line 2,562 ⟶ 3,081:
[m1, m2, m3].each { |m|
say "determinant:\t #{m.determinant}\npermanent:\t #{m.permanent}\n"
}</langsyntaxhighlight>
{{out}}
<pre>determinant: -2
Line 2,575 ⟶ 3,094:
 
=={{header|Simula}}==
<langsyntaxhighlight lang="simula">! MATRIX ARITHMETIC ;
BEGIN
 
Line 2,666 ⟶ 3,185:
! PERMANENT: 6778800.0 ;
 
END</langsyntaxhighlight>
Input:
<pre>
Line 2,697 ⟶ 3,216:
{{works with|OpenAxiom}}
{{works with|Axiom}}
<langsyntaxhighlight SPADlang="spad">(1) -> M:=matrix [[2, 9, 4], [7, 5, 3], [6, 1, 8]]
 
+2 9 4+
Line 2,712 ⟶ 3,231:
 
(3) 900
Type: PositiveInteger</langsyntaxhighlight>
 
[http://fricas.github.io/api/Matrix.html?highlight=matrix Domain:Matrix(R)]
Line 2,722 ⟶ 3,241:
For x=-1, the main function '''sumrec(a,x)''' computes the determinant of a by developing the determinant along the first column. For x=1, one gets the permanent.
 
<syntaxhighlight lang="text">real vector range1(real scalar n, real scalar i) {
if (i < 1 | i > n) {
return(1::n)
Line 2,749 ⟶ 3,268:
}
return(s)
}</langsyntaxhighlight>
 
Example:
 
<langsyntaxhighlight lang="stata">: a=1,1,1,0\1,1,0,1\1,0,1,1\0,1,1,1
: a
[symmetric]
Line 2,771 ⟶ 3,290:
 
: sumrec(a,1)
9</langsyntaxhighlight>
 
=={{header|Tcl}}==
Line 2,778 ⟶ 3,297:
{{tcllib|math::linearalgebra}}
{{tcllib|struct::list}}
<langsyntaxhighlight lang="tcl">package require math::linearalgebra
package require struct::list
 
Line 2,792 ⟶ 3,311:
}
return [::tcl::mathop::+ {*}$sum]
}</langsyntaxhighlight>
Demonstrating with a sample matrix:
<langsyntaxhighlight lang="tcl">set mat {
{1 2 3 4}
{4 5 6 7}
Line 2,801 ⟶ 3,320:
}
puts [::math::linearalgebra::det $mat]
puts [permanent $mat]</langsyntaxhighlight>
{{out}}
<pre>
Line 2,810 ⟶ 3,329:
=={{header|Visual Basic .NET}}==
{{trans|Java}}
<langsyntaxhighlight lang="vbnet">Module Module1
 
Function Minor(a As Double(,), x As Integer, y As Integer) As Double(,)
Line 2,887 ⟶ 3,406:
End Sub
 
End Module</langsyntaxhighlight>
{{out}}
<pre>[1, 2]
Line 2,914 ⟶ 3,433:
{{trans|Phix}}
As an extra, the results of the built in WorksheetFuction.MDeterm are shown. The latter does not work for scalars.
<langsyntaxhighlight lang="vb">Option Base 1
Private Function minor(a As Variant, x As Integer, y As Integer) As Variant
Dim l As Integer: l = UBound(a) - 1
Line 3,005 ⟶ 3,524:
Next i
Debug.Print det(tests(13)), "error", perm(tests(13))
End Sub</langsyntaxhighlight>{{out}}
<pre>Determinant Builtin det Permanent
-2 -2 10
Line 3,024 ⟶ 3,543:
{{libheader|Wren-matrix}}
{{libheader|Wren-fmt}}
<langsyntaxhighlight ecmascriptlang="wren">import "./matrix" for Matrix
import "./fmt" for Fmt
 
var arrays = [
Line 3,052 ⟶ 3,571:
System.print("\nDeterminant: %(m.det)")
System.print("Permanent : %(m.perm)\n")
}</langsyntaxhighlight>
 
{{out}}
Line 3,088 ⟶ 3,607:
 
=={{header|zkl}}==
<langsyntaxhighlight lang="zkl">var [const] GSL=Import("zklGSL"); // libGSL (GNU Scientific Library)
fcn perm(A){ // should verify A is square
numRows:=A.rows;
Line 3,098 ⟶ 3,617:
println(A.format());
println("Permanent: %.2f, determinant: %.2f".fmt(perm(A),A.det()));
};</langsyntaxhighlight>
<langsyntaxhighlight lang="zkl">A:=GSL.Matrix(2,2).set(1,2, 3,4);
B:=GSL.Matrix(4,4).set(1,2,3,4, 4,5,6,7, 7,8,9,10, 10,11,12,13);
C:=GSL.Matrix(5,5).set( 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);
T(A,B,C).apply2(test);</langsyntaxhighlight>
{{out}}
<pre>
337

edits