これはWeyr行列ですか?


18

基本的なワイア正準型と呼ばれるn × n行列Wのタイプがあります。このようなマトリックスはブロックで記述され、次の参照図を使用して次のプロパティを持ちます。

ここに画像の説明を入力してください

  • 主対角ブロックW IIがあり、N I ×N iが λ形式の行列I N I I N iはあるN I ×N I恒等行列。
  • nは1 ≥N 2 ≥...≥N R
  • 最初の対角ブロックW K-1、K2..r∈Kであり、N K-1 ×N Kである行列の行還元階段状のフル列ランクは、以上簡単に言えば、I N k個の上に座っn k-1 -n k行のゼロ。
  • 他のすべてのブロックは0行列です。

例えば:

ワイアー形

  • 主な対角ブロック(黄色)は、n iが4、2、2、および1であるようなものです。
  • 最初の超対角ブロックは緑色です。
  • グレーゾーンは、他のすべてのブロックで構成され、すべて0です。

この課題では、λ= 1と仮定します。

入力

任意の便利な形式の0と1の正方行列。

出力

入力行列がWeyrであるかどうかについて、2つの異なる値のいずれかを出力します。

ルール

これはです。各言語の最少バイト数が優先されます。標準のルール/抜け穴が適用されます。

テストケース

行の配列として提示されます。

ワイアー:

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

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

2
weyr、マトリックスの定義は非常に不明確です。それを理解するために、最初にウィキペディアから定義を読む必要があります(どちらもあまり明確ではありません)。一つには、n <sub> i </ sub>とは何か、それが何を意味するのかを明確にするだろうが、現在、そのようなnが存在する場合、マトリックスがweであることはあまり明確ではない。マトリックスのプロパティ。
小麦ウィザード

単位行列がワイア行列であることは正しいですか?
スチューウィーグリフィン

恒等行列は、r = 1およびn_1 = nのWeyr行列です。したがって、縮退した行列ではあります。
S.Klumpers

2
推奨されるテストケース:[[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]]。私はそれが偽であると思います(しかし、私の答えはそれをそのように識別できません)。
アーナルド

含めた定義は、一般的なweyrマトリックスではなく、基本的なweyrマトリックスのみを識別することを示唆しています。これはあなたがこの挑戦のために意図したものですか?
S.Klumpers

回答:



1

Python 2、270バイト

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

オンラインでお試しください!

説明:

ブロックのアイデンティティとその超対角ブロックを再帰的にチェックします。

I 行列が単位行列かどうかを確認します

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

入力行列の各ブロックについて、関数はそれが恒等式であること、およびその右に別の恒等行列ブロックがあることを確認します。次の反復では、そのサイズのブロックを調べます。

{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
)
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.