Matriks hermit?


17

Perhatikan bahwa tantangan ini tidak memerlukan penanganan atau pemahaman angka kompleks.

Diberikan matriks kuadrat non-kosong di mana setiap elemen adalah daftar bilangan bulat dua elemen (Re, Im), tentukan (memberikan nilai kebenaran / kepalsuan atau dua nilai yang konsisten) apakah ini merupakan matriks Hermitian.

Perhatikan bahwa input adalah array 3D bilangan bulat; bukan array 2D bilangan kompleks. Jika bahasa Anda tidak dapat mengambil larik 3D secara langsung, Anda dapat membuat daftar datar (dan bentuk n × n atau n × n × 2 jika itu membantu).

Matriks adalah Hermitian jika sama dengan transpose konjugatnya sendiri . Dengan kata lain, jika Anda membalikkannya diagonal kiri atas ke kanan bawah dan meniadakan elemen kedua dari semua daftar daun dua elemen, itu identik dengan matriks input. Perhatikan bahwa urutan membalik dan meniadakan tidak relevan, sehingga Anda dapat meniadakan terlebih dahulu, dan membalik sesudahnya.

Contoh walk-though

Contoh ini menggunakan JSON dengan ruang putih berlebihan untuk memudahkan membaca:

[[ [2, 0] , [2, 1] , [4, 0] ],
 [ [2,-1] , [3, 0] , [0, 1] ],
 [ [4, 0] , [0,-1] , [1, 0] ]]

Transpos (balik melintasi NW — SE diagonal):

[[ [2, 0] , [2,-1] , [4, 0] ],
 [ [2, 1] , [3, 0] , [0,-1] ],
 [ [4, 0] , [0, 1] , [1, 0] ]]

Meniadakan elemen kedua daftar daun:

[[ [2, 0] , [2, 1] , [4, 0] ],
 [ [2,-1] , [3, 0] , [0, 1] ],
 [ [4, 0] , [0,-1] , [1, 0] ]]

Karena ini identik dengan input, matriksnya adalah Hermitian.

Uji kasus

Hermit

[[[2,0],[2,1],[4,0]],[[2,-1],[3,0],[0,1]],[[4,0],[0,-1],[1,0]]]

[[[1,0],[2,0]],[[2,0],[1,0]]]

[[[1,0],[2,-3]],[[2,3],[1,0]]]

[[[42,0]]]

Non-Hermitian

[[[2,0],[2,1],[4,0]],[[2,-1],[3,0],[0,1]],[[4,0],[0,-1],[1,-1]]]

[[[0,1],[0,2]],[[0,2],[0,1]]]

[[[1,0],[2,3]],[[2,3],[1,0]]]

[[[3,2]]]


@LuisMendo saya masih berpikir. Ada ide?
Adám

Sebagai catatan, Meta-post baru . (Saya belum memilih untuk menutup, tetapi saya melihat seseorang memilikinya, jadi saya ingin tahu apa pendapat masyarakat tentang ini).
Stewie Griffin

5
@ Adám saya akan membuatnya sejelas mungkin, tetapi terserah Anda. Fleksibilitas dalam format input dan output biasanya diinginkan, tetapi tidak dapat disimpulkan secara default, khususnya ketika Anda mengatakan input adalah array 3D bilangan real; bukan array 2D bilangan kompleks . Tidak jelas seberapa luas konsep format input array 3D Anda
Luis Mendo

3
@ Adam Apakah sepasang matriks 2D (satu untuk bagian nyata, satu untuk bagian imajiner) dapat diambil sebagai input?
dylnan

1
@dylnan No. Input harus berupa struktur tunggal yang mewakili semacam 3 dimensi di mana dimensi daun berisi pasangan Re-Im.
Adám

Jawaban:


10

R, 71 48 47 byte

function(A)all(Conj(t(B<-A[,,1]+A[,,2]*1i))==B)

Mengambil array 3D dari bilangan real, membuat array 2D bilangan imajiner, transpos, konjugasi, dan bandingkan.

Terima kasih kepada @Giuseppe untuk mengurangi jumlah byte dengan 23 byte yang mengejutkan, dan @Vlo untuk yang terakhir 1!

Cobalah online!

Contoh:

> A <- array(c(2,2,4,2,3,0,4,0,1,0,-1,0,1,0,-1,0,1,0),dim=c(3,3,2))
> A
, , 1

     [,1] [,2] [,3]
[1,]    2    2    4
[2,]    2    3    0
[3,]    4    0    1

, , 2

     [,1] [,2] [,3]
[1,]    0    1    0
[2,]   -1    0    1
[3,]    0   -1    0

> f <- function(A)all(Conj(t(B<-A[,,1]+A[,,2]*1i))==B)
> f(A)
[1] TRUE

1
B=A[,,1]+A[,,2]*1iharus menyimpan beberapa byte.
Giuseppe

@GIuseppe arf saya pikir saya sudah mencobanya tetapi ternyata tidak Terima kasih!
plannapus

1
Juga, isSymmetricada dan berfungsi untuk matriks kompleks Hermitian tetapi 1x1kasusnya rumit karena [menjatuhkan atribut dan menghasilkan complexlebih daripada amatrix
Giuseppe

2
function(A)all(Conj(t(B<-A[,,1]+A[,,2]*1i))==B)Tugas in-line menghemat 1.
Vlo

7

Oktaf , 39 34 31 byte

@(x)(y=x(:,:,1)+j*x(:,:,2))==y'

Cobalah online!

Disimpan 3 byte berkat Luis Mendo yang memberi tahu saya tentang klarifikasi dalam teks tantangan.

Penjelasan:

Dalam MATLAB dan Oktaf, 'adalah transpose kompleks konjugat, bukan transpose "reguler".

Kami membuat ysebaris variabel yang merupakan lapisan pertama dari matriks 3D ditambah lapisan kedua dikalikan dengan unit kompleks j, yaitu matriks kompleks di mana istilah sebenarnya adalah "lapisan" pertama, dan imajiner adalah "lapisan" kedua. Kami kemudian memeriksa apakah itu sama dengan konjugat kompleks yang ditransposisikan.

Ini akan menghasilkan matriks yang hanya berisi 1jika benar, dan matriks yang mengandung setidaknya satu 0jika salah. Ini dianggap benar dan salah dalam Oktaf (Bukti) .



5

APL (Dyalog Unicode) , 22 15 9 7 byte

⍉≡⊢∘-

Cobalah online!

Fungsi awalan Tacit.

Terima kasih kepada Adám selama 7 byte pada Dfn, dan juga Adám dan ErikTheOutgolfer karena tahan dengan kebodohan saya membantu saya menemukan versi diam-diam.

Berkat ngn untuk 2 byte pada versi diam-diam.

Bagaimana?

⍉≡⊢∘- Anonymous tacit function.
      ¨  Apply to each element of the argument:
     \   Cumulative reduction, using
  ⊢∘-    Ignore the first element, then negate the second
        And match
        To the argument's transposition.

5

Bahasa Wolfram (Mathematica) , 45 34 33 26 21 18 byte

#==#&[#.{1,I}]&

Cobalah online!



@alephalpha Terima kasih banyak; Saya tahu itu 0xf3c7operator transpose, tapi apa itu 0xf3c8?
Jonathan Frech

1
@alephalpha Ada juga 0xf3c9( Dokumentasi Wolfram ).
Jonathan Frech

4

Java 8, 137 136 134 126 119 byte

m->{int r=1,l=m.length,i=l,j;for(;i-->0;)for(j=l;j-->0;)r=m[i][j][0]!=m[j][i][0]|m[i][j][1]!=-m[j][i][1]?0:r;return r;}

Kembali 1jika Hermitian, 0sebaliknya.

Penjelasan:

Cobalah online.

m->{                 // Method with 3D integer-array as parameter and boolean return-type
  int r=1,           //  Flag-integer `r`, starting at 1
      l=m.length,    //  The size of the 3D input array
      i=l,j;         //  Index-integers
  for(;i-->0;)       //  Loop over the rows
    for(j=l;j-->0;)  //   Inner loop over the columns
      r=m[i][j][0]!=m[j][i][0] 
                     //    If the first numbers diagonally aren't equal,
        |m[i][j][1]!=-m[j][i][1]?
                     //    or the second numbers aren't negatives of each other:
         0           //     Set the flag `r` to 0
        :            //    Else:
         r;          //     Leave the flag `r` the same
  return r;}         //  Return the flag `r`

3

J , 14 byte

[:(+-:|:)j./"1

Cobalah online!

Penjelasan

[:(+-:|:)j./"1  Input: 3d array
         j./"1  Reduce by complex combine at rank 1
[:              Cap, operate on the 2d array of complex values
   +              Conjugate
      |:          Transpose
    -:            Match?

Juga 14:-:0 2|:(,-)/"1
FrownyFrog


3

Jelly ,  6  5 byte

Z×Ø+⁼

Tautan monadik yang kembali 1untuk input Hermitian dan 0sebaliknya.

Cobalah online!

Bagaimana?

Z×Ø+⁼ - Link: list of lists of lists, M
Z     - transpose
  Ø+  - literal = [1,-1]
 ×    - multiply (vectorises)
    ⁼ - equal to M?

Saya percaya Jelly modern Ø+.
lirtosiast

@ lirtosiast memang Anda benar, diperbarui untuk menggunakannya; Terima kasih!
Jonathan Allan

2

05AB1E , 9 byte

øεεX®‚*]Q

Cobalah online!

Penjelasan

ø           # transpose
 ε          # apply to each 2-d array
  ε         # apply to each pair
   X®‚*     # multiply by [1,-1]
       ]    # end apply(s)
        Q   # compare to input for equality


1

Perl 5 , -a0 48 byte

Penghitungan lama: 50 byte ( +2untuk a0). Tidak buruk untuk bahasa yang tidak memiliki transpose bawaan (saya tidak cemburu sama sekali, tidak ada sirree)

Berikan matriks input pada STDIN dengan ,antara bagian nyata dan imajiner, jadi mis:

2,0 2,1 4,0
2,-1 3,0 0,1
4,0 0,-1 1,0

Akan mencetak 1untuk hermitian, tidak ada yang sebaliknya

#!/usr/bin/perl -a0
say@F~~[map/(\S+,)(\S+)/gc?$1.-$2:(),(/.+/g)x@F]

Cobalah online!


1

Sekam , 7 byte

=¹mmṀ_T

Cobalah online!

Bagaimana?

Catatan yang seharusnya berfungsi mm , tapi ada bug yang mengganggu yang yang mencegah saya menggunakannya :(

= ¹mmṀ_T - Program lengkap. Mengambil input dari baris perintah args, sebagai daftar daftar tupel.
  m T - Untuk setiap daftar di input input ...
   mṀ_ - ... Meniadakan nilai terakhir dari setiap tuple yang dikandungnya.
= ¹ - Periksa apakah ini sama dengan input.


1

C (gcc) , 107 103 100 byte

  • Disimpan empat byte berkat Steadybox ; golfed A[0]ke *Adua kali.
  • Disimpan tiga byte berkat ceilingcat .
j,k,r;f(A,s)int***A;{for(r=0,j=s;j--;)for(k=s;k--;)r|=*A[j][k]-*A[k][j]|A[j][k][1]+A[k][j][1];A=!r;}

Cobalah online!



@Steadybox Terima kasih banyak. Lucu ... Beberapa jam yang lalu saya memikirkan golf ini - dereferencing alih-alih pengindeksan - tetapi hanya lupa ...
Jonathan Frech

@ceilingcat Terima kasih.
Jonathan Frech

0

Sebenarnya , 13 byte

┬⌠⌠Çá╫k⌡M⌡Mß=

Cobalah online!

Bagaimana itu bekerja?

Pengajuan ini sebenarnya menggunakan bilangan kompleks. Jika mengambil input sebagai matriks entri kompleks diizinkan, maka itu akan menjadi 8 byte .

┬⌠⌠Çá╫k⌡M⌡Mß=  –> Full program.
┬              –> Transpose.
 ⌠       ⌡M    –> For each list in the input's transpose do the following:
  ⌠    ⌡M         –> For each two-element list of the form [a, b]...
   Ç              –> Turn it into a complex number (a+bi).
    á             –> Find its complex conjugate: Push (a-bi).
     ╫k           –> Push [Re(N), Im(N)], so [a, -b].
           ß=  –> Check whether the result equals the input.

0

Pyth, 9 byte

qCmm,hk_e

Penjelasan:

qCmm,hk_ekdQQ  Autofill variables
    ,hk_ek     [a,-b]...
  mm      dQ    ...for each [a,b] in the input (m...Q)'s rows (m...d).
 C             Transpose.
q           Q  Is this result equal to the original?

Suite uji .


Jawaban Anda sebenarnya 9 bytes ... A 9-byte alternatif: qCmm*V_B1.
Tn. Xcoder

Saya bermain golf satu byte saat saya membuat kiriman, dari qCmm.e_Fbk... rupanya saya lupa mengedit jumlah byte di kiriman akhir. @ Mr.Xcoder saya memperbaikinya, terima kasih atas tangkapannya!
Steven H.

0

C,  111   110  108 byte

Terima kasih kepada @Jonathan Frech karena telah menghemat satu byte dan terima kasih kepada @ceilingcat karena telah menghemat dua byte!

i,j,r;f(A,n)int*A;{for(r=i=0;i<n*2;i+=2)for(j=n*2;j;r|=A[i*n+j]-A[j*n+i]|A[i*n-~j]+A[j*n-~i])j-=2;return!r;}

Cobalah online!

C (gcc) ,  106  104 byte

i,j,r;f(A,n)int*A;{for(r=i=0;i<n*2;i+=2)for(j=n*2;j;r|=A[i*n+j]-A[j*n+i]|A[i*n-~j]+A[j*n-~i])j-=2;A=!r;}

Cobalah online!


Saya pikir r|=...|...berfungsi juga r+=...||....
Jonathan Frech

@ JonathanFrech Ya, benar. Terima kasih!
Steadybox

0

Sebenarnya , 13 byte

;┬⌠⌠d±@q⌡M⌡M=

Cobalah online!

Penjelasan:

;┬⌠⌠d±@q⌡M⌡M=
;              make a copy
 ┬             transpose copy
  ⌠⌠d±@q⌡M⌡M   for each row:
   ⌠d±@q⌡M       for each cell in row:
    d              remove last element from list
     ±             swap sign
      @q           insert at end of list
            =  compare equality with original
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.