28 lines
597 B
Perl
28 lines
597 B
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";
|