Sous-matrices totalement inversibles


16

(inspiré par cette question sur Math)

Les définitions

Étant donné une n x nmatrice carrée A , nous pouvons l'appeler invertibles'il existe une n x nmatrice carrée B telle que AB = BA = I n , I n étant la matrice d'identité de taille n x n(la matrice avec la diagonale principale 1s et tout le reste 0), et AB et BA représentant la multiplication matricielle habituelle (je n'entrerai pas dans le détail ici - allez prendre une classe d'algèbre linéaire).

De là, on peut appeler une m x nmatrice C totally invertible si chaque k x ksous - matrice (défini ci - dessous) de C est inversible pour tous k > 1, k <= (smaller of m,n).

Une sous-matrice est définie comme la matrice résultante après la suppression d'un nombre quelconque de lignes et / ou de colonnes de la matrice d'origine. Par exemple, la 3x3matrice C ci-dessous peut être transformée en 2x2sous - matrice C ' en supprimant la première ligne 1 2 3et la colonne du milieu 2 5 8comme suit:

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

Notez qu'il existe de nombreuses possibilités de sous-matrice différentes, ce qui précède n'est qu'un exemple. Ce défi ne concerne que ceux où la sous-matrice résultante est une k x k matrice carrée .

Le défi

Étant donné une matrice d'entrée, déterminez si elle est totalement inversible ou non.

L'entrée

  • Une seule matrice de taille m x n, dans n'importe quel format approprié .
  • Sans perte de généralité, vous pouvez supposer m <= nou m >= n, selon ce qui est golfeur pour votre code, et prendre la saisie de cette façon (c'est-à-dire que vous obtenez une opération de transposition gratuite si vous le souhaitez).
  • La taille de la matrice d'entrée ne sera ni inférieure 3 x 3ni supérieure à celle que votre langue peut gérer.
  • La matrice d'entrée sera constituée uniquement de valeurs numériques de Z + (les entiers positifs ).

Le résultat

  • Une valeur truey / falsey pour savoir si la matrice d'entrée est totalement inversible.

Les règles

  • Un programme complet ou une fonction sont acceptables.
  • Les failles standard sont interdites.
  • Il s'agit de donc toutes les règles de golf habituelles s'appliquent et le code le plus court (en octets) l'emporte.

Les exemples

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

Où est la sous-matrice singulière 2 6 3; 1 12 2; 5 3 1?
feersum

1
@feersum Whoops - merci pour la capture. C'était censé être passé sous Truthy et celui en dessous était censé être un 6coin, pas un 7. Fautes de frappe maladroites.
AdmBorkBork

Au début, je pensais que le titre disait "sous-marins totalement inversibles".
user2357112 prend en charge Monica

Réponses:


5

Gelée , 26 24 23 20 19 17 16 octets

-1 octet grâce à @miles (inutile pour chacun , lors de la prise de déterminants)
-2 octets, @miles à nouveau! (séparation de chaîne inutile et utilisation Ѐrapide)

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

TryItOnline! ou les 8 tests

Comment?

œ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

Je pensais que j'en avais besoin parce que j'ai un tas de combinaisons, mais non, je n'ai pas besoin d'instruire explicitement. Merci!
Jonathan Allan

J'ai appris cela à partir de ce dernier défi en utilisant des déterminants, et j'ai vérifié qu'il avait bien ldepth = 2dans la source
miles

1
Je pense également que vous pouvez enregistrer un octet dans le lien 2 à l'aide ZœcLÆḊet un autre octet dans le lien principal parçЀJȦ
miles

Bonne chose @miles merci encore! Je pensais que le premier de ces deux ne fonctionnait pas quand je l'ai essayé, mais ça devait être quand j'utilisais le you golfed off. Totalement oublié Ѐ.
Jonathan Allan

2
Belle combinaison, je pense que vous pouvez en faire un seul liner si vous le souhaitez, œcЀJµZœcLÆḊµ€€Ȧqui est également de 16 octets
miles du

4

Mathematica 10.0, 34 octets

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

Une chaîne de 6 tilde ... nouveau record personnel!


3

MATL, 57 octets

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

Bien sûr, vous pouvez l' essayer en ligne!

L'entrée doit être en orientation «portrait» (nRows> = nColumns). Je pense que ce n'est peut-être pas la solution la plus efficace ... Mais au moins je laisse un peu de place pour que d'autres me surpassent. J'adorerais entendre des indices spécifiques qui auraient pu raccourcir cette approche particulière, mais je pense que ce bytecount massif devrait inspirer les autres à faire une entrée MATL avec une approche complètement différente. Affiche 0 si faux, ou une valeur massive si vrai (deviendra rapidement Inf si la matrice est trop grande; pour 1 octet supplémentaire, on pourrait remplacer H*par H&Y(logique et)). Enregistré quelques octets grâce à @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.
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.