Повністю обернені субматриці


16

(натхненний цим питанням на Math)

Визначення

Враховуючи 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 + ( додатні цілі числа ).

Вихід

  • Truthy / 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 підтримує Моніку

Відповіді:


5

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

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

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

СпробуйтеItOnline! або всі 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> = nСтовпці). Я відчуваю, що це може бути не найефективнішим рішенням ... Але принаймні я залишаю місце для інших, щоб перевершити мене. Мені б хотілося почути конкретні підказки, які могли б скоротити цей конкретний підхід, але я думаю, що цей масивний облік повинен надихнути інших зробити запис MATL із зовсім іншим підходом. Відображає 0, якщо фальш, або масивне значення, якщо truthy (швидко стане 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.