Tamamen Tersine Çevrilebilir Alt Matrisler


16

( Matematikte bu sorudan esinlenerek )

Tanımlar

Bir Verilen n x nkare matris A , bunu çağırabilir invertiblebazı mevcutsa n x nkare matris B öyle AB = BA = I n ile ben n boyutta birim matris olmak n x n(ana köşegen ile matrisin 1s ve başka bir şey 0) ve AB ve her zamanki matris çarpımını temsil eden BA (buraya girmeyeceğim - git doğrusal cebir sınıfını al).

O, biz bir çağırabilir m x nmatris C totally invertible Her eğer k x kbir submatrix (aşağıda tanımlanmıştır) C herkes için ters çevrilebilir olup k > 1, k <= (smaller of m,n).

Bir alt matris, orijinal matristen herhangi bir sayıda satır ve / veya sütunun silinmesinden sonra ortaya çıkan matris olarak tanımlanır. Örneğin, aşağıdaki 3x3matris C bir transforme edilebilir 2x2submatrix C' ilk satırı kaldırarak 1 2 3ve orta sütunu 2 5 8şu şekilde:

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

Birçok farklı alt matris olasılığının olduğunu unutmayın, yukarıdakiler sadece bir örnektir. Bu zorluk sadece sonuçta ortaya çıkan alt k x k matrisin kare matris olduğu durumlarla ilgilidir .

Meydan okuma

Bir giriş matrisi verildiğinde, tamamen ters çevrilebilir olup olmadığını belirleyin.

Girdi

  • Boyutta tek bir matris m x niçinde, uygun olan herhangi bir biçimi .
  • Genelliği kaybı olmadan, varsayabiliriz m <= nveya m >= nKodunuzla için golfier hangisi ve yolu (yani, bir almak girdi almak devrik eğer istersen ücretsiz operasyonu).
  • Giriş matrisi boyutu, 3 x 3dilinizin işleyebileceğinden daha küçük ve daha büyük olmayacaktır.
  • Giriş matrisi sadece Z + ' dan gelen sayısal değerlerden ( pozitif tamsayılar ) oluşacaktır .

Çıktı

Kurallar

  • Tam bir program veya bir işlev kabul edilebilir.
  • Standart boşluklar yasaktır.
  • Bu bu nedenle her zamanki golf kuralları geçerlidir ve en kısa kod (bayt cinsinden) kazanır.

Örnekler

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

Tekil alt matris nerede 2 6 3; 1 12 2; 5 3 1?
feersum

1
@feersum Whoops - yakaladığınız için teşekkürler. Bunun Gerçeğin altına girmesi gerekiyordu ve altındaki kişinin 6köşede bir olması gerekiyordu , değil 7. Sakar yazım hataları.
AdmBorkBork

İlk başta, başlığın "tamamen tersine çevrilebilir denizaltılar" dediğini düşündüm.
user2357112 Monica

Yanıtlar:


5

Jöle , 26 24 23 20 19 17 16 bayt

Miles sayesinde -1 byte (her biri için gereksiz , determinant alırken)
-2 byte, yine miles! (gereksiz zincir ayırma ve Ѐhızlı kullanım )

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

TryItOnline! veya 8 testin tümü

Nasıl?

œ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

İhtiyacım olduğunu düşünüyordum, çünkü bir sürü kombinasyonum var, ama hayır açıkça belirtmem gerekmiyor. Teşekkürler!
Jonathan Allan

Bunu belirleyicileri kullanarak son zorluktan öğrendim ve gerçekten ldepth = 2de kaynakta olduğunu doğruladım
mil

1
Ayrıca ZœcLÆḊana bağlantıda kullanarak bağlantı 2 bir bayt ve başka bir bayt kaydedebilirsiniz düşünüyorumçЀJȦ
mil

İyi şeyler miles tekrar teşekkürler! Denediğimde bu ikisinin ilkinin işe yaramadığını düşündüm, ama seni golf yaparken kullanmalıydım . Tamamen unutmuşum Ѐ.
Jonathan Allan

2
Güzel birleştirerek, ben œcЀJµZœcLÆḊµ€€Ȧde 16 bayt
mil

4

Mathematica 10.0, 34 bayt

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

6-tilde zinciri ... yeni kişisel rekor!


3

MATL, 57 bayt

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

Tabii ki, çevrimiçi deneyebilirsiniz!

Giriş 'dikey' yönde olmalıdır (nRows> = nColumns). Bunun en etkili çözüm olmayabileceğini düşünüyorum ... Ama en azından başkalarının beni geride bırakması için biraz yer bırakıyorum. Bu özel yaklaşımı kısaltabilecek belirli ipuçlarını duymak isterim, ancak bu büyük baytın başkalarına tamamen farklı bir yaklaşımla bir MATL girişi yapmaları için ilham vermesi gerektiğini düşünüyorum. Yanlışsa 0 veya doğrulukta büyük bir değer görüntüler (matris çok büyükse hızla Inf olur; 1 ekstra bayt için (mantıksal ve) H*ile değiştirilebilir H&Y). @LuisMendo sayesinde birkaç bayt kaydedildi.

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.
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.