เมทริกซ์ย่อยกลับด้านโดยสิ้นเชิง


16

(เเรงบันดาลใจจาก คำถามนี้ทางคณิตศาสตร์)

คำจำกัดความ

รับn x nตารางเมทริกซ์เราสามารถเรียกมันว่าถ้ามีบางเมทริกซ์ตารางBดังกล่าวว่าAB = BA = ฉันnกับฉันnเป็นเมทริกซ์เอกลักษณ์ขนาด(เมทริกซ์ที่มีเส้นทแยงมุมหลักและสิ่งอื่น) และABและBAแทนการคูณเมทริกซ์ปกติ(ฉันจะไม่เข้าไปที่นี่ - ไปเรียนพีชคณิตเชิงเส้น)invertiblen x nn x n10

จากที่เราสามารถเรียกm x nเมทริกซ์C totally invertibleถ้าทุกk x ksubmatrix (ระบุด้านล่าง) ของCคือ invertible ทั้งหมด,k > 1k <= (smaller of m,n)

submatrix ถูกกำหนดให้เป็นเมทริกซ์ที่เกิดขึ้นหลังจากการลบจำนวนแถวและ / หรือคอลัมน์ใด ๆ จากเมทริกซ์ดั้งเดิม ตัวอย่างเช่น3x3เมทริกซ์Cด้านล่างสามารถเปลี่ยนเป็น2x2submatrix C 'ได้โดยการลบแถวแรก1 2 3และคอลัมน์กลาง2 5 8ดังนี้:

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

โปรดสังเกตว่ามีความเป็นไปได้ของ submatrix ที่แตกต่างกันข้างต้นเป็นเพียงตัวอย่าง ความท้าทายนี้เกี่ยวข้องกับสิ่งที่ผลลัพธ์ย่อยเป็นk x k เมทริกซ์จตุรัสเท่านั้น

ความท้าทาย

รับเมทริกซ์อินพุทตรวจสอบว่ามันเป็น invertible โดยสิ้นเชิงหรือไม่

การป้อนข้อมูล

  • เมทริกซ์เดียวของขนาด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 อ๊ะขอบคุณสำหรับการจับ ที่ควรจะได้ไปอยู่ภายใต้การ Truthy และหนึ่งด้านล่างมันก็ควรจะเป็นในมุมที่ไม่ได้เป็น6 7พิมพ์ผิดเงอะงะ
AdmBorkBork

ตอนแรกฉันคิดว่าชื่อพูดว่า "เรือดำน้ำกลับหัวกลับหางโดยสิ้นเชิง"
user2357112 รองรับ Monica

คำตอบ:


5

เยลลี่ , 26 24 23 20 19 17 16 ไบต์

-1 ไบต์ต้องขอบคุณ @miles (ไม่จำเป็นสำหรับแต่ละตัว, เมื่อทำการดีเทอร์มิแนนต์)
-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

ฉันคิดว่าฉันต้องการเพราะฉันมีชุดค่าผสมจำนวนมาก แต่ไม่มีฉันไม่จำเป็นต้องสั่งสอนอย่างชัดเจน ขอบคุณ!
Jonathan Allan

ฉันได้เรียนรู้เกี่ยวกับความท้าทายครั้งล่าสุดโดยใช้ดีเทอร์มิแนนต์และตรวจสอบว่ามันมีอยู่จริงldepth = 2ในแหล่งกำเนิด
ไมล์

1
นอกจากนี้ฉันคิดว่าคุณสามารถบันทึกไบต์ในลิงค์ 2 โดยใช้ZœcLÆḊและอีกไบต์ในลิงก์หลักโดยçЀJȦ
ไมล์

สิ่งที่ดี @miles ขอบคุณอีกครั้ง! ฉันคิดว่าครั้งแรกของทั้งสองไม่ได้ทำงานเมื่อฉันลองมัน แต่มันจะต้องได้รับเมื่อฉันใช้คุณกอล์ฟออก Ѐทั้งหมดลืมเกี่ยวกับ
Jonathan Allan

2
การรวมที่ดีฉันคิดว่าคุณสามารถทำให้เป็นหนึ่งซับถ้าคุณต้องการœcЀJµZœcLÆḊµ€€Ȧซึ่งยังเป็น 16 ไบต์
ไมล์


3

MATL, 57 ไบต์

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

แน่นอนคุณสามารถ ลองออนไลน์ได้!

อินพุตควรอยู่ในแนวตั้ง 'แนวตั้ง' (nRows> = nColumns) ฉันรู้สึกว่านี่อาจไม่ใช่วิธีที่มีประสิทธิภาพมากที่สุด ... แต่อย่างน้อยฉันก็ออกจากห้องเพื่อให้คนอื่นแซงหน้าฉันไป ฉันชอบที่จะได้ยินคำแนะนำที่เฉพาะเจาะจงซึ่งอาจทำให้วิธีนี้สั้นลง แต่ฉันคิดว่าจำนวนผู้ใช้ที่ยอดเยี่ยมนี้ควรเป็นแรงบันดาลใจให้คนอื่นทำรายการ MATL ด้วยวิธีการที่แตกต่างอย่างสิ้นเชิง แสดง 0 ถ้าเท็จหรือค่ามากถ้าความจริง (จะกลายเป็น Inf ถ้าเมทริกซ์ใหญ่เกินไปอย่างรวดเร็วสำหรับ 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.