Ввести квадратную целочисленную матрицу построчно и посчитать её определитель (например, методом конденсации Доджсона). Размер матрицы (1<N⩽20) определяется длиной её нулевой строки. Описание предлагаемого метода в подсказках. Пользоваться numpy.linalg.det(arr) нельзя ☺.
Дополнительно текст программы будет проверяться mypyc --strict, ошибок быть не должно
Сам метод хорошо описан в Википедии. Приведём слегка модифицированный вариант. Будем строить матрицу $$A'$$ размера $$n-1 xx n-1$$ из матрицы $$A$$ размера $$n xx n$$ таким образом, что каждый её элемент равен определителю минора второго порядка строк $$0$$ и $$j+1$$ и столбцов $$0$$ и $$i+1$$ матрицы $$A$$, т. е.
$$A'_(i,j) = det([[A_(0,0), A_(0,i+1)], [A_(j+1,0), A_(j+1,i+1)]])$$
Согласно алгоритму Доджсона, элементы матрицы $$A''_(i,j)$$ надо поделить на соответствующие внутренние элементы матрицы $$A_(i+1,j+1)$$. В нашем случае делить надо всегда на $$A_(0,0)$$, так что можно посчитать определитель $$A''$$, а потом уже поделить на $$(A_(0,0))^(n-2)$$. Таким образом, на каждом шаге конденсации мы накапливаем общий делитель $$D=(A_(0,0))^(n-2)*(A'_(0,0))^(n-3)*(A''_(0,0))^(n-4)*...$$, а на последнем шаге (когда размерность матрицы становится $$1 xx 1$$) делим $$A'^…'_(0,0)$$ на $$D$$.
Кроме того, исходный алгоритм Доджсона предписывает переставлять строки, если какой-то внешний элемент оказался нулевым. В нашем варианте алгоритма достаточно поддерживать $$A'^…'_(0,0) ≠ 0$$, то есть переставлять в матрице строки до тех пор, пока угловой элемент не окажется ненулевым (если таких нет, определитель 0). Не забываем о знаке определителя при перестановке строк (иногда его надо менять)!
8, 8, 5, 6, 3 1, 4, 4, 9, 0 9, 6, 7, 7, 3 4, 1, 0, 1, 4 6, 7, 9, 7, 3
2784
Для проверки правильности можно воспользоваться модулем numpy (предположим, матрица Array хранится в виде списка списков):
Помните! Наша цель — учёба, а не лёгкая жизнь!