Sottomaterie totalmente invertibili


16

(ispirato a questa domanda sopra in matematica)

Le definizioni

Data una n x nmatrice quadrata A , possiamo chiamarla invertiblese esiste una n x nmatrice quadrata B tale che AB = BA = I n , con I n che è la matrice identità della dimensione n x n(la matrice con le principali diagonali 1s e qualsiasi altra cosa 0) e AB e BA che rappresenta la solita moltiplicazione di matrici (non entrerò qui - vai a prendere una classe di algebra lineare).

Da questo, si può chiamare una m x nmatrice C totally invertible se ogni k x ksottomatrice (definito di seguito) di C è invertibile per tutti k > 1, k <= (smaller of m,n).

Una matrice secondaria è definita come matrice risultante dopo l'eliminazione di qualsiasi numero di righe e / o colonne dalla matrice originale. Ad esempio, la 3x3matrice C in basso può essere trasformata in una 2x2sottotrix C ' rimuovendo la prima riga 1 2 3e la colonna centrale 2 5 8come segue:

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

Si noti che ci sono molte diverse possibilità di submatrix, quanto sopra è solo un esempio. Questa sfida riguarda solo quelli in cui la sottostruttura risultante è una k x k matrice quadrata .

La sfida

Data una matrice di input, determinare se è totalmente invertibile o meno.

L'ingresso

  • Una singola matrice di dimensioni m x n, in qualsiasi formato adatto .
  • Senza perdita di generalità, puoi assumere m <= no m >= n, a seconda di quale sia il più golfista per il tuo codice, e prendere l'input in quel modo (ad esempio, ottieni un'operazione di trasposizione gratuitamente se lo desideri).
  • Le dimensioni della matrice di input non saranno inferiori 3 x 3e non superiori a quelle gestibili dalla tua lingua.
  • La matrice di input sarà composta solo da valori numerici da Z + (gli interi positivi ).

Il risultato

  • Un valore di verità / falsità per stabilire se la matrice di input è totalmente invertibile.

Le regole

  • È accettabile un programma completo o una funzione.
  • Sono vietate le scappatoie standard .
  • Si tratta di quindi si applicano tutte le normali regole del golf e vince il codice più breve (in byte).

Gli esempi

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]]

Dov'è la singolare submatrix 2 6 3; 1 12 2; 5 3 1?
feersum

1
@feersum Whoops - grazie per la cattura. Doveva essere andato sotto Truthy e quello sotto doveva essere un 6angolo, non un 7. Errori di battitura goffi.
AdmBorkBork,

All'inizio, ho pensato che il titolo dicesse "sottomarini totalmente invertibili".
user2357112 supporta Monica il

Risposte:


5

Gelatina , 26 24 23 20 19 17 16 byte

-1 byte grazie a @miles (non necessario per ciascuno , quando si prendono i determinanti)
-2 byte, di nuovo @miles! (separazione non necessaria della catena e utilizzo di Ѐquick)

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

TryItOnline! o tutti e 8 i test

Come?

œ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

Pensavo di averne bisogno perché ho un sacco di combinazioni, ma no non ho bisogno di istruire esplicitamente. Grazie!
Jonathan Allan,

L'ho imparato dall'ultima sfida usando i determinanti e ho verificato che effettivamente ha ldepth = 2nella fonte
miglia

1
Inoltre penso che puoi salvare un byte nel link 2 usando ZœcLÆḊe un altro byte nel link principale diçЀJȦ
miglia

Roba buona @miles grazie ancora! Pensavo che il primo di quei due non funzionasse quando l'ho provato, ma deve essere stato quando stavo usando il golf. Totalmente dimenticato Ѐ.
Jonathan Allan,

2
Bella combinazione, penso che puoi farne uno solo se vuoi con œcЀJµZœcLÆḊµ€€Ȧquale è anche 16 byte
miglia

4

Mathematica 10.0, 34 byte

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

Una catena di 6 tilde ... nuovo record personale!


3

MATL, 57 byte

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

Certo, puoi provarlo online!

L'input deve essere orientato in "verticale" (nRows> = nColumns). Sento che questa potrebbe non essere la soluzione più efficiente ... Ma almeno sto lasciando un po 'di spazio agli altri per superarmi. Mi piacerebbe sentire suggerimenti specifici che avrebbero potuto accorciare questo particolare approccio, ma penso che questo enorme addetto dovrebbe ispirare gli altri a fare una voce MATL con un approccio completamente diverso. Visualizza 0 se falsa o un valore enorme se verità (diventerà rapidamente Inf se matrice troppo grande; per 1 byte extra, si potrebbe sostituire H*con H&Y(logico e)). Risparmio di pochi byte grazie a @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.
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.