Est-ce une matrice de Weyr?

18

Il existe un type de matrice n × n W appelé forme canonique de base de Weyr . Une telle matrice est décrite par ses blocs et possède les propriétés suivantes, à l'aide du diagramme de référence suivant:

entrez la description de l'image ici

  • les principaux blocs diagonaux W ii sont des matrices n i × n i de la forme λ I n iI n i est la matrice d'identité n i × n i .
  • n 1 ≥ n 2 ≥ ... ≥ n r
  • les premiers blocs superdiagonaux W k-1, k pour k ∈ 2..r sont n matrices k k-1 × n k qui sont de rang de colonne complet sous forme d'échelon à rangées réduites , ou plus simplement, I n k assis au-dessus de n k-1 - n k rangées de zéros.
  • tous les autres blocs sont 0 matrices.

Par exemple:

Forme de Weyr

  • Les principaux blocs diagonaux (jaunes) sont tels que les n i sont 4, 2, 2 et 1.
  • Les premiers blocs superdiagonaux sont en vert.
  • La zone grise se compose de tous les autres blocs, qui sont tous à 0 .

Pour ce défi, nous supposerons λ = 1.

Contribution

Une matrice carrée avec 0 et 1 dans n'importe quel format pratique.

Production

Sortez l'une des deux valeurs distinctes pour savoir si la matrice d'entrée est Weyr ou non Weyr.

Règles

C'est du . Le moins d'octets dans chaque langue gagne. Des règles / lacunes standard s'appliquent.

Cas de test

Présenté sous forme de tableaux de lignes.

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

Non-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
la source
2
Votre définition de weyr, matrice est très floue. Afin de le comprendre, je devais d'abord lire la définition de wikipedia (qui n'est pas très claire non plus) et même alors votre définition est plutôt vague et ambiguë. D'une part, je préciserais ce qu'est n <sub> i </sub> et ce que cela signifie, actuellement il n'est pas très clair qu'une matrice est weyr si de tels n existent et il semble plutôt qu'ils en sont propriété de la matrice.
Post Rock Garf Hunter
Est-il exact que la matrice d'identité est une matrice de Weyr?
Stewie Griffin
La matrice d'identité est une matrice de Weyr avec r = 1 et n_1 = n, donc oui, quoique dégénérée.
S.Klumpers
2
Cas de test suggéré: [[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]]. Je pense que c'est faux (mais ma réponse ne l'identifie pas comme tel).
Arnauld
Les définitions que vous avez incluses suggèrent que vous souhaitez uniquement identifier les matrices de Weyr de base, et non les matrices de Weyr générales. Est-ce ce que vous vouliez pour ce défi?
S.Klumpers

Réponses:

1

Python 2 , 270 octets

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

Essayez-le en ligne!

Explication:

Vérifie récursivement l'identité des blocs et leurs blocs superdiagonaux.

I vérifie si une matrice est une matrice d'identité

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

Pour chaque bloc de la matrice d'entrée, la fonction vérifie qu'il s'agit d'une identité, et qu'il y a un autre bloc de matrice d'identité, à sa droite. L'itération suivante examine ensuite un bloc de cette taille.

{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
la source