เมทริกซ์อยู่ในอันดับที่หนึ่งหรือไม่


21

กำหนดเมทริกซ์ของจำนวนเต็มทดสอบว่าเป็นอันดับที่หนึ่งซึ่งหมายความว่าทุกแถวเป็นพหุคูณของเวกเตอร์เดียวกัน ตัวอย่างเช่นใน

 2   0  -20  10  
-3   0   30 -15
 0   0   0   0

ทุกแถวมีหลาย1 0 -10 5ค่า

คำจำกัดความเดียวกันนี้ยังใช้งานได้กับคอลัมน์แทนที่แถว อีกวิธีหนึ่งคืออันดับหนึ่งถ้ามันเหมือนกับตารางสูตรคูณ:

 *    1   0  -10  5
    ----------------
 2 |  2   0  -20  10  
-3 | -3   0   30 -15
 0 |  0   0   0   0

เราได้กำหนดเลเบลแถวr[i]และเลเบลคอลัมน์c[j]เพื่อให้แต่ละรายการเมทริกซ์M[i][j]เป็นผลิตภัณฑ์ของเลเบลที่สอดคล้องกันM[i][j] = r[i] * c[j]ดังนี้

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

เมทริกซ์จำนวนเต็มเป็นคอนเทนเนอร์ 2D ที่คุณเลือก ตัวอย่างเช่นรายการของรายการอาร์เรย์ 2 มิติหรือคล้ายกัน คุณไม่ควรใช้ความกว้างหรือความสูงเป็นอินพุตเพิ่มเติมเว้นแต่รูปแบบอาเรย์จะต้องใช้

เมทริกซ์อาจไม่ใช่แบบสแควร์ มันจะมีรายการที่ไม่ใช่ศูนย์อย่างน้อยหนึ่งรายการ - คุณไม่ต้องจัดการกับเมทริกซ์ที่ว่างเปล่าหรือศูนย์

คุณสามารถสมมติว่าจำนวนเต็มจะไม่ทำให้เกิดปัญหามากเกินไป

เอาท์พุท:

ค่าที่สอดคล้องกันสำหรับเมทริกซ์อันดับหนึ่งและค่าที่สอดคล้องต่างกันสำหรับเมทริกซ์อื่น

Built-ins:

คุณไม่สามารถใช้งานบิวด์อินเพื่อคำนวณอันดับหรือตรวจสอบอันดับหนึ่งได้โดยตรง คุณอาจใช้บิวด์อินอื่น ๆ เช่นค่าลักษณะเฉพาะการสลายตัว ฯลฯ แต่ฉันขอแนะนำให้ถอนคำตอบที่ไม่ได้มีบิวด์อินทำงานส่วนใหญ่

กรณีทดสอบ:

อันดับหนึ่ง:

[[2, 0, -20, 10], [-3, 0, 30, -15], [0, 0, 0, 0]]
[[0, 0, 0], [0, 3, 0], [0, 0, 0]]
[[-10]]
[[0, 0, 0], [0, 4, 11], [0, -4, -11]]

ไม่อันดับหนึ่ง:

[[-2, 1], [2, 4]]
[[0, 0, 3], [-22, 0, 0]]
[[1, 2, 3], [2, 4, 6], [3, 6, 10]]
[[0, -2, 0, 0], [0, 0, 0, 1], [0, 0, -2, 0]]

ลีดเดอร์บอร์ด:


2
สำหรับความอยากรู้อยากเห็นการตอบสนองทางคณิตศาสตร์โดยใช้บิวอินจะมีลักษณะเช่นนี้ (16 ไบต์):MatrixRank@#==1&
JungHwan Min


2
ทฤษฎีบทที่สวยงามคืออันดับของคอลัมน์นั้นเท่ากับตำแหน่งแถวสำหรับเมทริกซ์มิติ จำกัด
Leun Nun

3
เราต้องกังวลกับปัญหาความแม่นยำลอยหรือไม่? พวกเขาอาจจะทำให้อันดับที่ 1 เมทริกซ์ดูเหมือนอันดับ 2 เช่น
หลุยส์ Mendo

@LuisMendo คุณต้องจัดการกับปัญหาความแม่นยำเช่นค่าลักษณะเฉพาะของ 1.0000000001 แต่สามารถสันนิษฐานได้ว่าเมทริกซ์นั้นมีขนาดไม่ใหญ่และไม่ได้เลือกเป็นการเฉพาะเพื่อให้ผิดประเภท
xnor

คำตอบ:


13

เยลลี่ 6 ไบต์

ẸÐfÆrE

ลองออนไลน์!

มันทำงานอย่างไร

ẸÐfÆrE  Main link. Argument: M (2D array)

ẸÐf     Filter by any, removing rows of zeroes.
   Ær   Interpret each row as coefficients of a polynomial and solve it over the
        complex numbers.
     E  Test if all results are equal.

ความแม่นยำ

Ærใช้วิธีการเชิงตัวเลขดังนั้นผลลัพธ์ของมันมักจะไม่แน่นอน ยกตัวอย่างเช่นการป้อนข้อมูล[6, -5, 1]ซึ่งเป็นตัวแทนของพหุนามที่ 6 - 5x + x²ผลในราก3.0000000000000004และ1.9999999999999998 อย่างไรก็ตามการคูณสัมประสิทธิ์ทั้งหมดของพหุนามด้วยค่าคงที่ที่ไม่เป็นศูนย์เหมือนกันจะทำให้เกิดรากที่ไม่แน่นอนเท่ากัน ยกตัวอย่างเช่นÆrได้รับรากเดียวกันสำหรับ[6, -5, 1]และ[6 × 10 100 -5 × 10 100 10 100 ]

ควรสังเกตว่าความแม่นยำที่ จำกัด ของโฟลตและชนิดที่ซับซ้อนสามารถนำไปสู่ข้อผิดพลาด ยกตัวอย่างเช่นÆrจะได้รับรากเดียวกันสำหรับ[1, 1]และ[10 100 10 100 + 1] เนื่องจากเราสามารถสันนิษฐานได้ว่าเมทริกซ์นั้นไม่ใหญ่และไม่ได้เลือกให้มีการแยกประเภทโดยเฉพาะนั่นจึงน่าจะดี


5
การคูณค่าสัมประสิทธิ์ทั้งหมดของพหุนามด้วยผลลัพธ์คงที่ที่ไม่เป็นศูนย์เหมือนกันในรากที่ไม่แน่นอนเท่ากันนั่นคือวิธีที่ยอดเยี่ยม
Luis Mendo

8

Haskell , 50 ไบต์

rรับรายการของIntegers และส่งคืนFalseถ้าเมทริกซ์มีอันดับหนึ่งเป็นอย่างTrueอื่น

r l=or[map(x*)b<map(y*)a|a<-l,b<-l,(x,y)<-zip a b]

ลองออนไลน์!

มันทำงานอย่างไร

  • สร้างคู่แถวทั้งหมดaและb(รวมถึงแถวเท่ากัน) และสำหรับแต่ละคู่จะอนุญาตxและyเรียกใช้ผ่านองค์ประกอบที่เกี่ยวข้อง
  • คูณแถวbโดยxและแถวโดยa yเมทริกซ์จะมีอันดับหนึ่งถ้าหากผลลัพธ์เท่ากันเสมอ
  • เนื่องจากคู่ถูกสร้างขึ้นในทั้งสองคำสั่งซื้อคุณ<สามารถใช้เพื่อตรวจสอบว่ามีความไม่เท่าเทียมกันหรือไม่ รายชื่อของผลการทดสอบจะรวมกันกับorให้Trueหากมีแถวที่ไม่ได้สัดส่วน

7

Mathematica, 51 33 ไบต์

RowReduce@#~Count~Except@{0..}<2&

อินพุต

[{{2,0, -20,10}, {- 3,0,30, -15}, {0,0,0,0}}]

-14 ไบต์จาก user202729
บันทึกอีก 3 ไบต์จาก junghwanmin


ผมแนะนำว่าแทนที่จะสร้างตารางที่มีความยาวเท่ากับของFirst@#คุณสามารถคำนวณได้0First@#ตั้งแต่ 0 คูณด้วยทุกอย่างคือ 0 และการคูณนั้นฟังได้ นอกจากนี้คุณอาจพิจารณาใช้Tr[1^<list>]ในการคำนวณความยาวของรายการ
user202729

ดีมากฉันจะแก้ไข!
J42161217

แทนที่จะ0#&@@#, {0..}จะทำงานมากเกินไป จากนั้นจึงใช้Infixงานได้ดังนั้นรหัสสุดท้ายอาจเป็นไปได้ที่จะRowReduce@#~Count~{0..}==Tr[1^#]-1&บันทึก 2 ไบต์
JungHwan Min

จริงๆแล้วExceptสามารถนำไปกำจัดTrสิ่งต่างๆได้ -3 bytes:RowReduce@#~Count~Except@{0..}==1&
JungHwan Min

ฉันคิดว่าเมทริกซ์ที่ลดแถวถูกรับรองว่าไม่ใช่ศูนย์ (เพราะเมทริกซ์ดั้งเดิมไม่ใช่ศูนย์) ดังนั้นผลลัพธ์การนับจะเป็นจำนวนเต็มบวกจึง<2สามารถใช้แทน==1ได้
user202729

4

JavaScript (ES6), 68 67 65 ไบต์

อันนี้มีพื้นฐานมาจากคำตอบ 05AB1E ของ Neilและมีประสิทธิภาพมากกว่าวิธีเดิมของฉันอย่างมาก

ส่งคืนfalseสำหรับอันดับหนึ่งและtrueอย่างอื่น

f=(a,R,V,X)=>a.some(r=>r.some((v,x)=>R?v*V-r[X]*R[x]:f(a,r,v,x)))

กรณีทดสอบ


คำตอบเดิม 84 ไบต์

ส่งคืนfalseสำหรับอันดับหนึ่งและtrueอย่างอื่น

a=>a.some(r=>r.some((x,i)=>(isNaN(x/=a.find(r=>r.some(x=>x))[i])?r:1/r[0]?r=x:x)-r))

กรณีทดสอบ

อย่างไร?

a => a.some(r =>          // given a matrix a, for each row r of a:
  r.some((x, i) =>        //   for each value x of r at position i:
    (                     //
      isNaN(x /=          //     divide x by a[ref][i]
        a.find(r =>       //       where ref is the index of the first row that
          r.some(x => x)  //       contains at least one non-zero value
        )[i]              //       (guaranteed to exist by challenge rules)
      ) ?                 //     we get NaN for 0/0, in which case:
        r                 //       use r, so that this column is ignored
      :                   //     else:
        1 / r[0] ?        //       if r is still holding the current row:
          r = x           //         set it to x (either a float, +Inf or -Inf)
        :                 //       else:
          x               //         use x
    ) - r                 //     subtract r from the value set above (see table)
  )                       //   end of some()
)                         // end of every()

การลบที่ดำเนินการในตอนท้ายของรหัสสามารถนำไปสู่สถานการณ์ที่แตกต่างกันซึ่งสรุปไว้ด้านล่าง:

A                   | B              | A - B       | False / True
--------------------+----------------+-------------+-------------
array of 1 number   | same array     | 0           | False
array of 2+ numbers | same array     | NaN         | False
a number            | same number    | 0           | False
+Infinity           | +Infinity      | NaN         | False
-Infinity           | -Infinity      | NaN         | False
a number            | another number | <> 0        | True
+Infinity           | -Infinity      | +Infinity   | True
-Infinity           | +Infinity      | -Infinity   | True
a number            | +/-Infinity    | +/-Infinity | True
+/-Infinity         | a number       | +/-Infinity | True

การทดสอบล้มเหลวทันทีที่เราได้รับค่า truthy A: นี้เกิดขึ้นเมื่อเราพบสองอัตราส่วนที่แตกต่างกัน (นอกเหนือจาก0/0 ) ระหว่างA (i, y)และA (i, R)ในแถวใด ๆYของเมทริกซ์ที่ rคือดัชนีของแถวที่ไม่เป็นศูนย์


อืมฉันแค่สงสัยว่าตัวเอง ...
Neil

@Neil คุณต้องการโพสต์เป็นคำตอบใหม่หรือไม่? เพียงแค่แจ้งให้เราทราบ.
Arnauld


3

เยลลี่ 12 ไบต์

ẸÐfµ÷"ЀZE€Ẹ

ลองออนไลน์!

คำอธิบาย

ẸÐfµ÷"ЀZE€Ẹ  Main link
 Ðf           Filter; keep all elements where
Ẹ             At least one element is truthy (remove zero-rows)
      Ѐ      For each row on the right side
    ÷"        Divide it by each row in the original
        Z     Zip the array
          €   For each submatrix
         E    Are all rows equal?
           Ẹ  Is at least one of the elements from above truthy?

คำอธิบายอาจไม่ถูกต้องเล็กน้อยเนื่องจากนี่เป็นการตีความของกอล์ฟไมล์ของอัลกอริทึมดั้งเดิมของฉัน

-5 ไบต์ขอบคุณไมล์


... รหัสของคุณติดเงิน (ฉันได้รับ deja vu ... )
สิ้นเชิงมนุษย์

@icrieverytim เฮ้อย่างน้อยจำนวนสัญญาณดอลลาร์จะน้อยกว่าครึ่งหนึ่งของความยาวของรหัสในครั้งนี้! : P
HyperNeutrino

1
@icrieverytim แก้ไขข้อผิดพลาดและตอนนี้ยิ่งน้อยลงสัญญาณดอลลาร์: P
HyperNeutrino

ฉันเชื่อว่าสิ่งนี้ควรใช้งานได้เช่นกันสำหรับ 12 ไบต์ẸÐfµ÷"ЀZE€Ẹ TIO
ไมล์

@miles โอ้ดีมาก! วิธีสำหรับคุณที่ได้คือการที่แตกต่างกันบิต (ผมคิดว่า?) เพื่อให้คุณสามารถโพสต์ที่เป็นคำตอบของตัวเองของคุณต้องการ :)
HyperNeutrino

3

05AB1E , 16 ไบต์

2ãεø2ãε`R*`Q}W}W

ลองออนไลน์! ใช้คุณสมบัติตารางสูตรคูณที่มุมตรงข้ามของสี่เหลี่ยมผืนผ้าใด ๆ มีผลิตภัณฑ์เดียวกัน คำอธิบาย:

2ãε           }     Loop over each pair of rows
   ø                Transpose the pair into a row of pairs
    2ãε     }       Loop over each pair of columns
       `R*`Q        Cross-multiply and check for equality
             W W    All results must be true

3

TI-Basic (TI-83 series), 28 27 28 ไบต์ (62 ตัวอักษร)

:Prompt [A]
:{0→X
:Matr►list(ref([A])ᵀ,L₁,X
:not(max(abs(ᶫX

คำนวณรูปแบบแถวระดับของเมทริกซ์[A], เก็บแถวแรกของมัน (จะทิ้ง) ในแถวที่สองในL₁ ᶫXจากนั้นmax(abs(ᶫXจะเป็นศูนย์หากᶫXประกอบด้วยศูนย์เท่านั้นและค่าบวกเป็นอย่างอื่นซึ่งnot(จะเปลี่ยนเป็น 1 หากเมทริกซ์อยู่ในอันดับหนึ่ง 0 เป็นอย่างอื่น

สำหรับเมทริกซ์ 1 แถวᶫXตั้งค่าเป็น{0}และจากนั้นจะไม่เปลี่ยนแปลงเมื่อเราพยายามดูแถวที่สองที่ไม่มีอยู่ของเมทริกซ์


-1 ไบต์ต้องขอบคุณ Scott Milner

+1 ไบต์เพื่อแก้ไขข้อผิดพลาดด้านมิติสำหรับเมทริกซ์ 1 แถว ปรากฎ Matr►list( คำสั่งที่บ่นถ้าคุณพยายามที่จะแยกแถวที่สองจากเมทริกซ์ที่มีเพียงหนึ่งแถว; อย่างไรก็ตามถ้าคุณพยายามที่จะแยกแถวที่หนึ่งและสองจากเมทริกซ์มันจะล้มเหลวอย่างเงียบ ๆ


1
คุณสามารถบันทึกไบต์ที่มีแทนPrompt [A] Ans→[A]
Scott Milner

@ScottMilner ขอบคุณ! อาจมีวิธีหลีกเลี่ยงถ้าเราใช้บางอย่างเช่นClrListเริ่มต้นᶫXแต่ฉันไม่ได้รับที่จะทำงานในพื้นที่น้อย
Misha Lavrov

กำจัดบรรทัดที่สองเนื่องจากMatr►list(จะเขียนทับรายการแม้ว่าจะไม่มีอยู่และคุณจะประหยัดได้ 5 ไบต์
kamoroso94

1
@ kamoroso94 จุดของบรรทัดที่สองไม่ได้สร้างรายการเมื่อไม่มี: จุดของบรรทัดที่สองคือการสร้างค่าเริ่มต้นสำหรับแถวที่สองเมื่อเมทริกซ์มีเพียงหนึ่งแถว หากคุณกำจัดบรรทัดที่สองโค้ดจะขัดข้องสำหรับเมทริกซ์ 1xN
Misha Lavrov

2
@ kamoroso94 เราจะต้องแทนที่ L1 ด้วยᶫYไม่ใช่ Y; มิฉะนั้นเครื่องคิดเลขจะคิดว่า "ดึงแถว Y-th ของเมทริกซ์ไปที่ᶫX" ไม่ใช่ "แยกแถวแรกไปที่ᶫYและแถวที่สองไปที่ᶫX"
Misha Lavrov

3

Brachylogขนาด 27 ไบต์

{⊇Ċ}ᶠzᵐ{↰₁ᶠ{⟨hz{t↔}⟩×ᵐ=}ᵐ}ᵐ

ลองออนไลน์!

ใช้แนวทางของนีลเรื่อง "ผลิตภัณฑ์ของมุมตรงข้ามของแต่ละสี่เหลี่ยมควรเท่ากัน" ผลิตภัณฑ์ครอสราคาแพงและใช้เวลา 10 ไบต์ทั้งหมด แต่ก็ยังสั้นกว่าวิธีการหารตามที่ฉันพยายามส่วนใหญ่เป็นเพราะการกำหนดผลลัพธ์ที่สอดคล้องกันสองรายการสำหรับความจริงและเท็จในคำถามทำให้ความเท็จเป็นเพียง a false.และไม่ใช่บางครั้ง ข้อผิดพลาดหารด้วยศูนย์ใช้จำนวนไบต์มากเกินไป

{⊇Ċ}ᶠzᵐ{↰₁ᶠ{⟨hz{t↔}⟩×ᵐ=}ᵐ}ᵐ
{⊇Ċ}ᶠ                        Get each pair of rows from the matrix
                             eg.: [ [[a, b, c], [k, l, m]], ... ]
     zᵐ                      Zip each pair's elements
                                  [ [[a, k], [b, l], [c, m]], ... ]
       {                 }ᵐ  Map this over each pair of rows:
                                  [[a, k], [b, l], [c, m]]
        ↰₁ᶠ                  Get each pair of paired elements from the rows
                                  [[[a, k], [b, l]], [[b, l], [c, m]], [[a, k], [c, m]]]
           {           }ᵐ    Map this over each pair of pairs
                                  [[a, k], [b, l]]
            ⟨hz{t↔}⟩         Zip the first pair with the reverse of the second
                                  [[a, l], [k, b]]
                    ×ᵐ       Multiply within each sublist
                                  [al, kb]
                      =      The results should be equal
                             (If the results are unequal for any pair, the whole predicate fails,
                              and outputs false.)

แนวทางสำรองขึ้นอยู่กับการแบ่งองค์ประกอบฉลาด ( 30 ไบต์ ):

{≡ᵉ¬0&}ˢ\↰₁ˢ{c׬0&⟨hz∋⟩ᶠ/ᵐ²=ᵐ}

ลองออนไลน์!



1

SageMath, 40 ไบต์

lambda M:any(M.rref()[1:])*(M.nrows()>1)

ลองออนไลน์

ฟังก์ชันที่ไม่ระบุชื่อนี้ส่งคืน Falseหากเมทริกซ์นั้นอยู่ในอันดับหนึ่งและเป็นTrueอย่างอื่น

ฟังก์ชันใช้เมทริกซ์Mเป็นอินพุตแปลงเป็นรูปแบบแถว - แถว ( M.rref()) ที่ลดลงและการทดสอบanyแถวที่ผ่านมาจะไม่เป็นศูนย์ จากนั้นค่านั้นจะถูกคูณด้วยM.nrows()>1(เมทริกซ์มีมากกว่าหนึ่งแถวหรือไม่)


1

Python 3 , 93 91 bytes

lambda m,e=enumerate:any(h*g-r[j]*s[i]for r in m for i,h in e(r)for s in m for j,g in e(s))

ลองออนไลน์!

มันทำงานอย่างไร

ตรวจสอบว่า 2 เล็กน้อยใด ๆ มีปัจจัยที่ไม่ใช่ศูนย์ หากเป็นกรณีนี้อันดับจะต้องมีอย่างน้อย 2: "ไม่ใช่ sub-p- รอง (p × p submatrix ที่ไม่เป็นศูนย์) แสดงให้เห็นว่าแถวและคอลัมน์ของ submatrix นั้นเป็นอิสระเชิงเส้นดังนั้นแถวเหล่านั้นและ คอลัมน์ของเมทริกซ์เต็มรูปแบบเป็นอิสระเชิงเส้น (ในเมทริกซ์เต็ม) ดังนั้นแถวและคอลัมน์อันดับอย่างน้อยใหญ่เท่ากับอันดับดีเทอร์แนนทัล "(จากWikipedia )

หมายเหตุ: โกนสองไบต์ด้วยความคิดเห็นของ user71546


1
91 - สั้นลงหากใส่จำนวนลงในอาร์กิวเมนต์ของฟังก์ชันและทำให้ไม่ต้องใช้f=:lambda m,e=enumerate:any(h*g-r[j]*s[i]for r in m for i,h in e(r)for s in m for j,g in e(s))
Shieru Asakoto

@ user71546 ขอบคุณ! เสร็จแล้ว!
Luca Citi

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.