June 2018 Update

This commit is contained in:
Ingy döt Net 2018-06-22 20:57:24 +00:00
parent ba8067c3b7
commit 22f33d4004
5278 changed files with 84726 additions and 14379 deletions

View file

@ -8,6 +8,7 @@ In both cases the sum is over the permutations <math>\sigma</math> of the permut
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.
;Cf.:
;Related task:
* [[Permutations by swapping]]
<br><br>

View file

@ -3,14 +3,14 @@ package main
import (
"fmt"
"github.com/gonum/matrix/mat64"
"gonum.org/v1/gonum/mat"
)
func main() {
fmt.Println(mat64.Det(mat64.NewDense(2, 2, []float64{
fmt.Println(mat.Det(mat.NewDense(2, 2, []float64{
1, 2,
3, 4})))
fmt.Println(mat64.Det(mat64.NewDense(3, 3, []float64{
fmt.Println(mat.Det(mat.NewDense(3, 3, []float64{
2, 9, 4,
7, 5, 3,
6, 1, 8})))

View file

@ -0,0 +1,27 @@
#!/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";

View file

@ -0,0 +1,31 @@
class Array {
method permanent {
var r = @^self.len
var sum = 0
r.permutations { |*a|
var prod = 1
[a,r].zip {|row,col| prod *= self[row][col] }
sum += prod
}
return sum
}
}
var m1 = [[1,2],[3,4]]
var m2 = [[1, 2, 3, 4],
[4, 5, 6, 7],
[7, 8, 9, 10],
[10, 11, 12, 13]]
var m3 = [[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]]
[m1, m2, m3].each { |m|
say "determinant:\t #{m.determinant}\npermanent:\t #{m.permanent}\n"
}

View file

@ -1,24 +1,18 @@
! MATRIX ARITHMETIC ;
BEGIN
INTEGER PROCEDURE LENGTH(A); REAL ARRAY A;
INTEGER PROCEDURE LENGTH(A); ARRAY A;
LENGTH := UPPERBOUND(A, 1) - LOWERBOUND(A, 1) + 1;
PROCEDURE MINOR(A, X, Y, MAT); REAL ARRAY A, MAT; INTEGER X, Y;
! Set MAT to the first minor of A dropping row X and column Y ;
PROCEDURE MINOR(A, X, Y, MAT); ARRAY A, MAT; INTEGER X, Y;
BEGIN
INTEGER I, J, M; M := LENGTH(A) - 1;
FOR I := 1 STEP 1 UNTIL M DO
INTEGER I, J, rowA, M; M := LENGTH(A) - 1; ! not a constant;
FOR I := 1 STEP 1 UNTIL M DO BEGIN
rowA := IF I < X THEN I ELSE I + 1;
FOR J := 1 STEP 1 UNTIL M DO
BEGIN
IF I < X AND J < Y THEN
MAT(I, J) := A(I, J)
ELSE IF I >= X AND J < Y THEN
MAT(I, J) := A(I + 1, J)
ELSE IF I < X AND J >= Y THEN
MAT(I, J) := A(I, J + 1)
ELSE ! I > X AND J > Y ;
MAT(I, J) := A(I + 1, J + 1)
END
MAT(I, J) := A(rowA, IF J < Y THEN J else J + 1);
END
END MINOR;
REAL PROCEDURE DET(A); REAL ARRAY A;
@ -68,18 +62,17 @@ BEGIN
REAL ARRAY A(1:SIZE, 1:SIZE);
INTEGER I, J;
FOR I := 1 STEP 1 UNTIL SIZE DO
FOR I := 1 STEP 1 UNTIL SIZE DO BEGIN
! may be need here: INIMAGE;
FOR J := 1 STEP 1 UNTIL SIZE DO
A(I, J) := INREAL;
A(I, J) := INREAL
END;
OUTTEXT("DETERMINANT ... : "); OUTREAL(DET (A), 10, 20); OUTIMAGE;
OUTTEXT("PERMANENT ..... : "); OUTREAL(PERM(A), 10, 20); OUTIMAGE;
END
! NOTE THAT THE FIRST INPUT IS THE SIZE OF THE MATRIX.
! FOR EXAMPLE:
COMMENT THE FIRST INPUT IS THE SIZE OF THE MATRIX, FOR EXAMPLE:
COMMENT
! 2
! 1 2
! 3 4

View file

@ -0,0 +1,28 @@
real vector range1(real scalar n, real scalar i) {
if (i < 1 | i > n) {
return(1::n)
} else if (i == 1) {
return(2::n)
} else if (i == n) {
return(1::n-1)
} else {
return(1::i-1\i+1::n)
}
}
real matrix submat(real matrix a, real scalar i, real scalar j) {
return(a[range1(rows(a), i), range1(cols(a), j)])
}
real scalar sumrec(real matrix a, real scalar x) {
real scalar n, s, p
n = rows(a)
if (n==1) return(a[1,1])
s = 0
p = 1
for (i=1; i<=n; i++) {
s = s+p*a[i,1]*sumrec(submat(a, i, 1), x)
p = p*x
}
return(s)
}

View file

@ -0,0 +1,19 @@
: a=1,1,1,0\1,1,0,1\1,0,1,1\0,1,1,1
: a
[symmetric]
1 2 3 4
+-----------------+
1 | 1 |
2 | 1 1 |
3 | 1 0 1 |
4 | 0 1 1 1 |
+-----------------+
: det(a)
-3
: sumrec(a,-1)
-3
: sumrec(a,1)
9