(inspiriert von dieser Frage über Mathe)
Die Definitionen
Gegeben eine n x n
quadratische Matrix A , können wir es nennen , invertible
wenn es etwas gibt n x n
quadratische Matrix B , so dass AB = BA = I n , mit I n die Identitätsmatrix der Größe zu sein n x n
(die Matrix mit den Hauptdiagonalen 1
s und alles andere 0
) und AB und BA repräsentieren die übliche Matrixmultiplikation (ich werde hier nicht darauf eingehen - nehmen Sie eine lineare Algebra-Klasse).
Daher können wir eine m x n
Matrix C nennen, totally invertible
wenn jede k x k
(unten definierte) Submatrix von C für alle invertierbar k > 1
ist k <= (smaller of m,n)
.
Eine Submatrix wird als die resultierende Matrix definiert, nachdem eine beliebige Anzahl von Zeilen und / oder Spalten aus der ursprünglichen Matrix gelöscht wurde. Beispielsweise kann die folgende 3x3
Matrix C in eine 2x2
Untermatrix C 'umgewandelt werden, indem die erste Zeile 1 2 3
und die mittlere Spalte 2 5 8
wie folgt entfernt werden:
C = [[1 2 3]
[4 5 6] --> C' = [[4 6]
[7 8 9]] [7 9]]
Beachten Sie, dass es viele verschiedene Submatrix-Möglichkeiten gibt. Die obigen sind nur ein Beispiel. Diese Herausforderung betrifft nur diejenigen, bei denen die resultierende Untermatrix eine k x k
quadratische Matrix ist .
Die Herausforderung
Bestimmen Sie anhand einer Eingabematrix, ob diese vollständig invertierbar ist oder nicht.
Die Eingabe
- Eine einzelne Größenmatrix
m x n
in jedem geeigneten Format . - Ohne Verlust der Allgemeinheit können Sie davon ausgehen
m <= n
m >= n
Einschränkung oder , was für Ihren Code besser geeignet ist, und die Eingabe auf diese Weise vornehmen (dh Sie erhalten eine kostenlose Transponierungsoperation, wenn Sie dies wünschen). - Die Größe der Eingabematrix ist nicht kleiner als
3 x 3
und nicht größer als Ihre Sprache. - Die Eingabematrix besteht nur aus numerischen Werten von Z + (den positiven ganzen Zahlen ).
Die Ausgabe
- Ein wahrer / falscher Wert, der angibt , ob die Eingabematrix vollständig invertierbar ist.
Die Regeln
- Es ist entweder ein vollständiges Programm oder eine Funktion zulässig.
- Standardlücken sind verboten.
- Dies ist Codegolf, daher gelten alle üblichen Golfregeln, und der kürzeste Code (in Byte) gewinnt.
Die Beispiele
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]]
quelle
2 6 3; 1 12 2; 5 3 1
?6
Ecke sein, nicht eine7
. Unbeholfene Tippfehler.Antworten:
Jelly ,
26 24 23 20 19 1716 Bytes-1 Byte dank @miles (für jedes unnötig
€
, wenn Determinanten genommen werden)-2 Byte, wieder @miles! (unnötige kettentrennung und verwendung von
Ѐ
quick)TryItOnline! oder alle 8 Tests
Wie?
quelle
ldepth = 2
in der Quelle vorhanden istZœcLÆḊ
und ein weiteres Byte im Hauptlink mitçЀJȦ
€
Golfspieler benutzt habe. Völlig vergessenЀ
.œcЀJµZœcLÆḊµ€€Ȧ
dem auch 16 Bytes sindMathematica 10.0, 34 Bytes
Eine 6-Tilde-Kette ... neuer persönlicher Rekord!
quelle
MATL, 57 Bytes
Natürlich können Sie es online ausprobieren!
Die Eingabe sollte im Hochformat erfolgen (nRows> = nColumns). Ich bin der Meinung, dass dies möglicherweise nicht die effizienteste Lösung ist ... Aber zumindest lasse ich einigen Spielraum für andere, um mich zu übertreiben. Ich würde gerne spezielle Hinweise hören, die diesen bestimmten Ansatz hätte verkürzen können, aber ich denke, dieser massive Bytecount sollte andere dazu inspirieren, einen MATL-Eintrag mit einem völlig anderen Ansatz zu machen. Zeigt 0 an, wenn es falsch ist, oder einen massiven Wert, wenn es wahr ist (wird schnell zu Inf, wenn die Matrix zu groß ist; für 1 zusätzliches Byte könnte man
H*
durchH&Y
(logisch und) ersetzen ). Ein paar Bytes gespart dank @LuisMendo.quelle