Ввести квадратную целочисленную матрицу построчно и посчитать её определитель (например, методом конденсации Доджсона). Размер матрицы (1<N<14) определяется длиной её нулевой строки. Описание предлагаемого метода в подсказках. Пользоваться numpy нельзя:)

Сам метод хорошо описан в Википедии. Приведём слегка модифицированный вариант. Будем строить матрицу A размера n-1×n-1 из матрицы A размера n×n таким образом, что каждый её элемент равен определителю минора второго порядка строк 0 и j+1 и столбцов 0 и i+1 матрицы A, т. е.

Ai,j=det([A0,0A0,i+1Aj+1,0Aj+1,i+1])

Согласно алгоритму Доджсона, элементы матрицы Ai,j надо поделить на соответствующие внутренние элементы матрицы Ai+1,j+1. В нашем случае делить надо всегда на A0,0, так что можно посчитать определитель A, а потом уже поделить на (A0,0)n-2. Таким образом, на каждом шаге конденсации мы накапливаем общий делитель D=(A0,0)n-2(A0,0)n-3(A0,0)n-4..., а на последнем шаге (когда размерность матрицы становится 1×1) делим A0,0 на D.

Кроме того, исходный алгоритм Доджсона предписывает переставлять строки, если какой-то внешний элемент оказался нулевым. В нашем варианте алгоритма достаточно поддерживать A0,00, то есть переставлять в матрице строки до тех пор, пока угловой элемент не окажется ненулевым (если таких нет, определитель 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 хранится в виде списка списков):

Переключить отображение номеров строк
   1 import numpy
   2 print(numpy.linalg.det(numpy.array(Array)))

Да, с модулями в Ptyhon жизнь становится намного проще :) . Но наша цель — учёба, а не лёгкая жизнь.


CategoryHomework

LecturesCMC/PythonIntro2019/Homework_DodgsonDet (последним исправлял пользователь FrBrGeorge 2020-01-01 18:14:39)