#!/usr/bin/ruby

#
## Determinant of a (square) matrix
#

var d1 = det(
    [
        [1, 2,  3],
        [6, 0,  8],
        [0, 2, 10],
    ]
)

assert_eq(d1, -100)

var d2 = det(
    [
        [1,  2, 3],
        [6,  0, 8],
        [10, 2, 0],
    ]
)

assert_eq(d2, 180)

var d3 = det(
    [
        [ 1, 0, 3],
        [ 6, 3, 8],
        [10, 2, 0],
    ]
)

assert_eq(d3, -70)

var d4 = det(
    [
        [ 1, 9, 3],
        [ 6, 3, 8],
        [10, 2, 13],
    ]
)

assert_eq(d4, -13)

var d4 = det(
    [
        [60, 52, 23, 70],
        [91, 86, 27, 81],
        [14, 25, 97, 73],
        [40,  1, 86, 87],
    ]
)

assert_eq(d4, -5015514)

var d5 = det(
    [
         [-75, -49,  56, -62],
         [ 36,  86, -20,  88],
         [-56,  20, -97, -25],
         [ 75, -91, -41, -38],
    ]
)

assert_eq(d5, 16246710);

var d6 = det(
    [
        [ 1, -2,  1,  1],
        [ 1,  0,  0,  1],
        [-2, -2, -2,  1],
        [-2,  1, -1, -2],
    ]
)

assert_eq(d6, 3)

var d7 = det(
    [
        [1,2,3],
        [4,5,6],
        [7,8,9],
    ]
)

assert_eq(d7, 0)

var d8 = det(
    [
        [ 1,  2,  3,  4],
        [ 5,  6,  7,  8],
        [ 9, 10, 11, 12],
        [13, 14, 15, 16],
    ]
)

assert_eq(d8, 0)

var d9 =det(
    [
        [1,  0,  3, 4],
        [5,  0,  7, 0],
        [4,  0,  0, 0],
        [1, 14, 15, 0],
    ]
)

assert_eq(d9, -1568)

assert_eq(det([[-3, -1,  5,  1], [-32,   2,   2, - 6], [-47,   3,   3, - 1], [49, - 2, - 3,  3]]),  1368)
assert_eq(det([[ 2, -3,  5,  1], [  3, -32,   2, - 6], [  1, -47,   3, - 1], [ 5,  49, - 3,  3]]), -8208)
assert_eq(det([[ 2, -1, -3,  1], [  3,   2, -32, - 6], [  1,   3, -47, - 1], [ 5, - 2,  49,  3]]), -2736)
assert_eq(det([[ 2, -1,  5, -3], [  3,   2,   2, -32], [  1,   3,   3, -47], [ 5, - 2, - 3, 49]]),   684)
assert_eq(det([[ 2, -1,  5,  1], [  3,   2,   2, - 6], [  1,   3,   3, - 1], [ 5, - 2, - 3,  3]]),   684)

say "** Test passed!"