Ist das eine Weyr-Matrix?

18

Es gibt eine Art n × n Matrix W, die als kanonische Grundform von Weyr bezeichnet wird . Eine solche Matrix wird durch ihre Blöcke beschrieben und hat die folgenden Eigenschaften unter Verwendung des folgenden Referenzdiagramms:

Bildbeschreibung hier eingeben

  • die Hauptdiagonalblöcke W ii sind n i × n i Matrizen der Form λ I n i, wobei I n i die Identitätsmatrix n i × n i ist.
  • n 1 ≥ n 2 ≥ ... ≥ n r
  • Die ersten superdiagonalen Blöcke W k-1, k für k ∈ 2..r sind n k-1 × n k Matrizen, die den vollen Spaltenrang in zeilenreduzierter Staffelform haben , oder einfacher gesagt, I n k, die oben aufliegen n k-1 - n k Reihen von Nullen.
  • Alle anderen Blöcke sind 0 Matrizen.

Beispielsweise:

Weyr-Form

  • Die diagonalen Hauptblöcke (gelb) sind so, dass die n i 4, 2, 2 und 1 sind.
  • Die ersten superdiagonalen Blöcke sind grün.
  • Die graue Zone besteht aus allen anderen Blöcken, die alle 0 sind .

Für diese Herausforderung nehmen wir λ = 1 an.

Eingang

Eine quadratische Matrix mit Nullen und Einsen in einem beliebigen Format.

Ausgabe

Geben Sie einen von zwei unterschiedlichen Werten aus, ob die Eingabematrix Weyr ist oder nicht.

Regeln

Das ist . In jeder Sprache gewinnen die wenigsten Bytes. Es gelten Standardregeln / Regelungslücken.

Testfälle

Präsentiert als Arrays von Zeilen.

Weyr:

[[1]] 
[[1,1],[0,1]] 
[[1,0,1,0,0],[0,1,0,1,0],[0,0,1,0,1],[0,0,0,1,0],[0,0,0,0,1]]
[[1,0,0,1,0,0,0,0,0],[0,1,0,0,1,0,0,0,0],[0,0,1,0,0,1,0,0,0],[0,0,0,1,0,0,1,0,0],[0,0,0,0,1,0,0,1,0],[0,0,0,0,0,1,0,0,1],[0,0,0,0,0,0,1,0,0],[0,0,0,0,0,0,0,1,0],[0,0,0,0,0,0,0,0,1]]
[[1,0,0,0,1,0,0,0,0],[0,1,0,0,0,1,0,0,0],[0,0,1,0,0,0,0,0,0],[0,0,0,1,0,0,0,0,0],[0,0,0,0,1,0,1,0,0],[0,0,0,0,0,1,0,1,0],[0,0,0,0,0,0,1,0,1],[0,0,0,0,0,0,0,1,0],[0,0,0,0,0,0,0,0,1]]

Nicht-Weyr:

[[0]]
[[1,0],[1,1]]
[[1,0,0,1,0,0],[0,1,0,0,0,0],[0,0,1,0,0,1],[0,0,0,1,0,0],[0,0,0,0,1,0],[0,0,0,0,0,1]]
[[1,0,1,0,0],[0,1,0,0,0],[0,0,1,0,0],[0,0,0,1,0],[0,0,0,0,1]]
[[1,0,0,1,0,0,0,0,0],[0,1,0,0,1,0,0,0,0],[0,0,1,0,0,1,0,0,0],[0,0,0,1,0,0,0,0,0],[0,0,0,0,1,0,1,0,0],[0,0,0,0,0,1,0,1,0],[0,0,0,0,0,0,1,0,1],[0,0,0,0,0,0,0,1,0],[0,0,0,0,0,0,0,0,1]]
ngm
quelle
2
Ihre Definition von weyr, matrix ist sehr unklar. Um es zu verstehen, musste ich zuerst die Definition aus Wikipedia lesen (was auch nicht sehr klar ist) und selbst dann ist Ihre Definition ziemlich vage und mehrdeutig. Zum einen würde ich es klarer , was n <sub> i </ sub> ist und was es ist , Mittel zu tun, zur Zeit ist es nicht ganz klar , dass eine Matrix ist weyr , wenn eine solche n s existiert und eher scheint es , wie sie manche Eigenschaft der Matrix.
Weizen-Assistent
Ist es richtig, dass die Identitätsmatrix eine Weyr-Matrix ist?
Stewie Griffin
Die Identitätsmatrix ist eine Weyr-Matrix mit r = 1 und n_1 = n, also ja, wenn auch eine entartete.
S.Klumpers
2
Empfohlene Testfall: [[1,0,0,1,0,0,0,0,0],[0,1,0,0,1,0,0,0,0],[0,0,1,0,0,1,0,0,0],[0,0,0,1,0,0,0,0,0],[0,0,0,0,1,0,1,0,0],[0,0,0,0,0,1,0,1,0],[0,0,0,0,0,0,1,0,1],[0,0,0,0,0,0,0,1,0],[0,0,0,0,0,0,0,0,1]]. Ich denke, es ist falsch (aber meine Antwort kann es nicht als solches identifizieren).
Arnauld
Die Definitionen, die Sie einbezogen haben, legen nahe, dass Sie nur grundlegende Weyr-Matrizen und keine allgemeinen Weyr-Matrizen identifizieren möchten. Ist es das, was Sie für diese Herausforderung beabsichtigt haben?
S.Klumpers

Antworten:

1

Python 2 , 270 Bytes

lambda m,w=0:{w}&{0,len(m)}and I(m)or any(I([l[:i]for l in m[:i]])*I([l[i:j+i]for l in m[:j]])*(sum(sum(m[:i]+[l[:i]for l in m],[]))==2*i+j)and f([l[i:]for l in m[i:]],j)for i in range(w,len(m))for j in range(1,i+1))
I=lambda m:all(sum(l)==l[i]>0for i,l in enumerate(m))

Probieren Sie es online!

Erläuterung:

Überprüft Blöcke rekursiv auf Identität und ihre überdiagonalen Blöcke.

I prüft, ob eine Matrix eine Identitätsmatrix ist

I=lambda m:all(sum(l)==l[i]>0for i,l in enumerate(m))

Für jeden Block der Eingabematrix prüft die Funktion, ob es sich um eine Identität handelt und ob rechts davon ein weiterer Identitätsmatrixblock vorhanden ist. Die nächste Iteration betrachtet dann einen Block dieser Größe.

{w}&{0,len(m)}and I(m)                # if the while matrix is an identity matrix,
                                      # return true (but only the first time or last block)
or
any(
 I([l[:i]for l in m[:i]])                         # the current block is identity
 *I([l[i:j+i]for l in m[:j]])                     # and, the smaller block to the right is identity
 *(sum(sum(m[:i]+[l[:i]for l in m],[]))==2*i+j)   # and everything below and to the right (not the
                                                  # smaller block), are 0
 and f([l[i:]for l in m[i:]],j)                   # and the remaining matrix is alse Weyr(recursively)
 for i in range(w,len(m))             # for each block size i
 for j in range(1,i+1)                # for each smaller right block of size j
)
TFeld
quelle