Построить формулу определителя

<?php


const N = 4;

function getLines(array $indexRows, int $position)
{
    $data = [];
    foreach ($indexRows as $row) {

        $indices = array_diff(
            range(1, N),
            $row,
        );

        foreach ($indices as $index) {
            $newRow = $row;
            $newRow[$position] = $index;
            $data[] = $newRow;
        }
    }

    $position++;

    return $position > N ?
        $data :
        getLines($data, $position);
}

function getSign(array $permutation)
{
    $inversions = 0;

    foreach ($permutation as $index => $val)
    {
        for ($i = 1; $i < $index ; $i++) {
            if ($permutation[$i] > $val) {
                $inversions++;
            }
        }
    }

    return $inversions % 2 === 0 ? '+' : '-';
}


echo "\n";
for ($i = 1; $i <= N; $i++) {
    echo "| ";
    for ($j = 1; $j <= N; $j++) {
        echo "a_{{$i} {$j}} ";
    }
    echo " |" . ($i === (int)(N/2) + 1 ? ' =' : '') . "\n";
}
echo "\n=";

$string = '';
foreach (getLines([[]], 1) as $line) {
    $sign = getSign($line);
    $string .= empty($string) && $sign === '+' ? ' ' : " $sign ";
    foreach ($line as $key => $val) {
        $last = $key === N ? '' : ' * ';
        $string .= "a_{{$key} {$val}}$last";
    }
}

echo "$string\n";

Вывод скрипта:

| a_{1 1} a_{1 2} a_{1 3} a_{1 4}  |
| a_{2 1} a_{2 2} a_{2 3} a_{2 4}  |
| a_{3 1} a_{3 2} a_{3 3} a_{3 4}  | =
| a_{4 1} a_{4 2} a_{4 3} a_{4 4}  |

= a_{1 1} * a_{2 2} * a_{3 3} * a_{4 4} - a_{1 1} * a_{2 2} * a_{3 4} * a_{4 3} - a_{1 1} * a_{2 3} * a_{3 2} * a_{4 4} +
 a_{1 1} * a_{2 3} * a_{3 4} * a_{4 2} + a_{1 1} * a_{2 4} * a_{3 2} * a_{4 3} - a_{1 1} * a_{2 4} * a_{3 3} * a_{4 2} -
 a_{1 2} * a_{2 1} * a_{3 3} * a_{4 4} + a_{1 2} * a_{2 1} * a_{3 4} * a_{4 3} + a_{1 2} * a_{2 3} * a_{3 1} * a_{4 4} -
 a_{1 2} * a_{2 3} * a_{3 4} * a_{4 1} - a_{1 2} * a_{2 4} * a_{3 1} * a_{4 3} + a_{1 2} * a_{2 4} * a_{3 3} * a_{4 1} +
 a_{1 3} * a_{2 1} * a_{3 2} * a_{4 4} - a_{1 3} * a_{2 1} * a_{3 4} * a_{4 2} - a_{1 3} * a_{2 2} * a_{3 1} * a_{4 4} +
 a_{1 3} * a_{2 2} * a_{3 4} * a_{4 1} + a_{1 3} * a_{2 4} * a_{3 1} * a_{4 2} - a_{1 3} * a_{2 4} * a_{3 2} * a_{4 1} -
 a_{1 4} * a_{2 1} * a_{3 2} * a_{4 3} + a_{1 4} * a_{2 1} * a_{3 3} * a_{4 2} + a_{1 4} * a_{2 2} * a_{3 1} * a_{4 3} -
 a_{1 4} * a_{2 2} * a_{3 3} * a_{4 1} - a_{1 4} * a_{2 3} * a_{3 1} * a_{4 2} + a_{1 4} * a_{2 3} * a_{3 2} * a_{4 1}