Полностью обратимые подматрицы


16

(вдохновленный этим вопросом по математике)

Определения

Для данной n x nквадратной матрицы A мы можем назвать ее, invertibleесли существует некоторая n x nквадратная матрица B такая, что AB = BA = I n , где I n - единичная матрица размера n x n(матрица с главной диагональю 1s и все остальное 0), и AB и BA, представляющий обычное матричное умножение (я не буду вдаваться в это здесь - перейдите к классу линейной алгебры).

Из этого мы можем назвать m x nматрицу C totally invertible , если каждый k x kподматрицы (определено ниже) C обратим для всех k > 1, k <= (smaller of m,n).

Подматрица определяется как результирующая матрица после удаления любого количества строк и / или столбцов из исходной матрицы. Например, приведенная ниже 3x3матрица C может быть преобразована в 2x2подматрицу C ' путем удаления первой строки 1 2 3и среднего столбца 2 5 8следующим образом:

C = [[1 2 3]
     [4 5 6]    -->  C' = [[4 6]
     [7 8 9]]              [7 9]]

Обратите внимание, что существует множество различных возможностей подматриц, приведенное выше является лишь примером. Эта задача касается только тех, где результирующая подматрица является k x k квадратной матрицей .

Соревнование

Учитывая входную матрицу, определите, является ли она полностью обратимой или нет.

Вход

  • Единая матрица размера m x nв любом подходящем формате .
  • Без потери общности вы можете предположить m <= nили m >= n, в зависимости от того, что лучше для вашего кода, и принять ввод таким образом (т.е. вы получите операцию транспонирования бесплатно, если хотите).
  • Размер входной матрицы будет не меньше 3 x 3и не больше, чем ваш язык может обработать.
  • Входная матрица будет состоять только из числовых значений от Z + ( натуральные числа ).

Выход

  • Значение true / falsey для того, является ли входная матрица полностью обратимой.

Правила

  • Либо полная программа или функция приемлемы.
  • Стандартные лазейки запрещены.
  • Это поэтому применяются все обычные правила игры в гольф, и выигрывает самый короткий код (в байтах).

Примеры

Truthy

[[1 2 3]
 [2 3 1]
 [3 1 2]]

[[2 6 3]
 [1 12 2]
 [5 3 1]]

[[1 2 3 4]
 [2 3 4 1]
 [3 4 1 2]]

[[2  3  5  7  11]
 [13 17 19 23 29]
 [31 37 41 43 47]]


Falsey

[[1 2 3]
 [4 5 6]
 [7 8 9]]

[[1 6 2 55 3]
 [4 5 5 5  6]
 [9 3 7 10 4]
 [7 1 8 23 9]]

[[2 3 6]
 [1 2 12]
 [1 1 6]]

[[8 2 12 13 2]
 [12 7 13 12 13]
 [8 1 12 13 5]]

Где находится единственная подматрица 2 6 3; 1 12 2; 5 3 1?
feersum

1
@feersum Whoops - спасибо за улов. Предполагалось, что это произошло под правдой, а тот, что ниже, должен был быть 6в углу, а не 7. Неуклюжие опечатки.
AdmBorkBork

Сначала я подумал, что название гласит «полностью обратимые подводные лодки».
user2357112 поддерживает Monica

Ответы:


5

Желе , 26 24 23 20 19 17 16 байт

-1 байт благодаря @miles (не нужно для каждого , при получении определителей)
-2 байта, снова @miles! (ненужное разделение цепей и использование Ѐбыстрого)

ZœcLÆḊ
œcЀJÇ€€Ȧ

TryItOnline! или все 8 тестов

Как?

œcЀJÇ€€Ȧ  - Main link: matrix as an array, M
    J      - range of length -> [1,2,...,len(a)] (n)
  Ѐ       - for each of right argument
œc         -     combinations of M numbering n
     Ç€€   - call the last link (1) as a monad for €ach for €ach
        Ȧ  - all truthy (any determinant of zero results in 0, otherwise 1)
                 (this includes an implicit flattening of the list)

ZœcLÆḊ - Link 1, determinants of sub-matrices: row selection, s
Z      - transpose s
   L   - length of s
 œc    - combinations of transposed s numbering length of s
    ÆḊ - determinant

Я думал, что мне это нужно, потому что у меня есть куча комбинаций, но нет, мне не нужно явно указывать. Благодарность!
Джонатан Аллан

Я узнал об этом из этого последнего испытания, используя детерминанты, и убедился, что он действительно имеет ldepth = 2в источнике
мили

1
Также я думаю, что вы можете сохранить байт в ссылке 2, используя ZœcLÆḊеще один байт в основной ссылке,çЀJȦ
мили

Хороший материал @Miles спасибо еще раз! Я думал, что первый из этих двух не сработал, когда я попробовал, но, должно быть, это было, когда я использовал гольф. Полностью забыл про Ѐ.
Джонатан Аллан

2
Хорошее объединение, я думаю, вы можете сделать его одним лайнером, если хотите, œcЀJµZœcLÆḊµ€€Ȧкоторый также составляет 16 байтов
мили

4

Mathematica 10,0, 34 байта

#~Minors~n~Table~{n,Tr@#}~FreeQ~0&

Сеть из 6 тильд ... новый личный рекорд!


3

MATL, 57 байт

tZyt:Y@!"@w2)t:Y@!"@w:"3$t@:)w@:)w3$)0&|H*XHx]J)]xxtZy]H&

Конечно, вы можете попробовать это онлайн!

Входные данные должны быть в «книжной» ориентации (nRows> = nColumns). Я чувствую, что это может быть не самое эффективное решение ... Но, по крайней мере, я оставляю место для других, чтобы превзойти меня. Я хотел бы услышать конкретные подсказки, которые могли бы сделать этот конкретный подход короче, но я думаю, что этот огромный счет должен вдохновить других на участие в MATL с совершенно другим подходом. Отображает 0, если ложно, или массивное значение, если правдиво (быстро станет Inf, если матрица слишком большая; для 1 дополнительного байта можно заменить H*на H&Y(логическое и)). Сохранено несколько байтов благодаря @LuisMendo.

tZy  % Duplicate, get size. Note that n=<m.   
%   STACK:  [m n], [C]
t: % Range 1:m                           
%   STACK:  [1...m], [m n], [C]
Y@   % Get all permutations of that range. 
%   STACK:  [K],[m n],[C] with K all perms in m direction.
!"   % Do a for loop over each permutation.
%   STACK:  [m n],[C], current permutation in @.
@b   % Push current permutation. Bubble size to top.
%   STACK:  [m n],[pM],[C] with p current permutation in m direction.
2)t:Y@!" % Loop over all permutations again, now in n direction
%   STACK: [n],[pM],[C] with current permutation in @.
@w:" % Push current permutation. Loop over 1:n (to get size @ x @ matrices)
%   STACK: [pN],[pM],[C] with loop index in @.
3$t  % Duplicate the entire stack.
%   STACK: [pN],[pM],[C],[pN],[pM],[C]
@:)  % Get first @ items from pN
%   STACK: [pNsub],[pM],[C],[pN],[pM],[C]
w@:) % Get first @ items from pM
%   STACK: [pMsub],[pNsub],[C],[pN],[pM],[C]
w3$)  % Get submatrix. Needs a `w` to ensure correct order.
%   STACK: [Csub],[pN],[pM],[C]
0&|  % Determinant.
%   STACK: [det],[pN],[pM],[C]
H*XHx% Multiply with clipboard H.
%   STACK: [pN],[pM],[C]
]    % Quit size loop
%   STACK: [pN],[pM],[C]. Expected: [n],[pM],[C]
J)   % Get last element from pN, which is n.
%   STACK: [n],[pM],[C]
]    % Quit first loop
xxtZy% Reset stack to
%   STACK: [m n],[C]
]    % Quit final loop.
H& % Output H only.
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.