Determinant and permanent: Difference between revisions
Content added Content deleted
m (→Library determinant: library churn) |
(+perl) |
||
Line 1,374: | Line 1,374: | ||
As of version 2.10, the matrix permanent is built in: |
As of version 2.10, the matrix permanent is built in: |
||
<lang parigp>matpermanent(M)</lang> |
<lang parigp>matpermanent(M)</lang> |
||
=={{header|Perl}}== |
|||
{{trans|C}} |
|||
<lang perl>#!/usr/bin/perl |
|||
use strict; |
|||
use warnings; |
|||
use PDL; |
|||
use PDL::NiceSlice; |
|||
sub permanent{ |
|||
my $mat = shift; |
|||
my $n = shift // $mat->dim(0); |
|||
return undef if $mat->dim(0) != $mat->dim(1); |
|||
return $mat(0,0) if $n == 1; |
|||
my $sum = 0; |
|||
--$n; |
|||
my $m = $mat(1:,1:)->copy; |
|||
for(my $i = 0; $i <= $n; ++$i){ |
|||
$sum += $mat($i,0) * permanent($m, $n); |
|||
last if $i == $n; |
|||
$m($i,:) .= $mat($i,1:); |
|||
} |
|||
return sclr($sum); |
|||
} |
|||
my $M = pdl([[2,9,4], [7,5,3], [6,1,8]]); |
|||
print "M = $M\n"; |
|||
print "det(M) = " . $M->determinant . ".\n"; |
|||
print "det(M) = " . $M->det . ".\n"; |
|||
print "perm(M) = " . permanent($M) . ".\n";</lang> |
|||
<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. |
|||
{{out}} |
|||
<pre> |
|||
M = |
|||
[ |
|||
[2 9 4] |
|||
[7 5 3] |
|||
[6 1 8] |
|||
] |
|||
det(M) = -360. |
|||
det(M) = -360. |
|||
perm(M) = 900. |
|||
</pre> |
|||
=={{header|Perl 6}}== |
=={{header|Perl 6}}== |