完全に可逆な部分行列


16

(数学に関するこの質問に触発された)

定義

与えられたn x n正方行列A、我々はそれを呼び出すことができますinvertibleいくつか存在する場合はn x n、正方行列BとなるようにAB = BA = I NI nは大きさの単位行列であることn x n(主対角の行列1sおよび何か他のもの0)、およびABそして、通常の行列乗算を表すBA(ここでは説明しません-線形代数クラスを取ります)。

それから、我々は呼び出すことができますm x n行列Cを totally invertible、すべての場合k x kの部分行列(以下に定義)Cはすべてのために可逆でk > 1k <= (smaller of m,n)

サブマトリックスは、元のマトリックスから任意の数の行や列を削除した結果のマトリックスとして定義されます。たとえば、次の3x3行列Cは、次のように最初の行と中央の列を削除することにより、2x2部分行列C 'に変換できます。1 2 32 5 8

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

サブマトリックスにはさまざまな可能性があることに注意してください。上記は単なる例です。この課題は、結果の部分行列がk x k 正方行列である場合にのみ関係します。

チャレンジ

入力行列が与えられたら、それが完全に可逆かどうかを判断します。

入力

  • サイズの単一マトリックスm x nに、任意の適切なフォーマット
  • 一般性を失うことなく、m <= nまたはのm >= nどちらかをコードのゴルファーとみなし、その方法で入力を取得できます(つまり、必要に応じて転置操作を無料で取得できます)。
  • 入力行列のサイズはで3 x 3、あなたの言語が処理できるより大きくなりません。
  • 入力行列は、Z +正の整数)の数値のみで構成されます。

出力

ルール

  • 完全なプログラムまたは機能のいずれかが受け入れられます。
  • 標準的な抜け穴は禁止されています。
  • これはので、通常のゴルフルールがすべて適用され、最短のコード(バイト単位)が勝ちます。

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

の特異部分行列はどこにあり2 6 3; 1 12 2; 5 3 1ますか?
feersum

1
@feersum Whoops-キャッチしてくれてありがとう。これはTruthyの下にあるはずで、その下の1つ6はaではなく隅にあるはず7です。不器用なタイプミス。
AdmBorkBork

最初は、タイトルが「完全に潜水艦」と言っていたと思いました。
user2357112は、Monicaを

回答:


5

ゼリー26 24 23 20 19 17 16 バイト

@milesのおかげで-1バイト(それぞれに不要、行列式を取るとき、)
-2バイト、再び@miles!(不要なチェーン分離、およびЀクイックの使用)

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

TryItOnline!または 8つのテストすべて

どうやって?

œ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

たくさんの組み合わせがあるので必要だと思っていましたが、明示的に指示する必要はありません。ありがとう!
ジョナサンアラン

私は決定を使用して、その最後の挑戦からそれについて学び、それが実際に持ってないことを検証ldepth = 2ソースに
マイル

1
また、私はあなたが使用してリンク2にバイトを保存することができると思うZœcLÆḊとすることにより、メインリンクで別のバイトçЀJȦ
マイル

@milesに感謝します!私はそれを試したとき、これらの2つのうちの最初の1つは機能しなかったと思いましたが、それはあなたがゴルフをオフにしたときだったに違いありません。を完全に忘れましたЀ
ジョナサンアラン

2
素敵な組み合わせ、œcЀJµZœcLÆḊµ€€Ȧ16バイトである場合は16
マイル

4

Mathematica 10.0、34バイト

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

6チルドチェーン...新しい個人記録!


3

MATL、57バイト

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

もちろん、オンラインで試すことができます!

入力は「縦」方向(nRows> = nColumns)でなければなりません。私はこれが最も効率的な解決策ではないかもしれないと感じています...しかし、少なくとも私は他の人が私を打ち負かすための余地を残しています。この特定のアプローチを短くすることができた特定のヒントを聞きたいと思いますが、この巨大なバイトカウントは、まったく異なるアプローチでMATLエントリを作成するように他の人を刺激するはずだと思います。表示は0 falsy場合、または大規模な値truthy場合(行列が大きすぎる場合はすぐにInfになります。1余分なバイト、1つは、置き換えることができH*H&Y(論理と))。@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.
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.