Hermityen matrisi?


18

Bu zorluğun karmaşık sayıların işlenmesi veya anlaşılmasını gerektirmediğini unutmayın.

Her öğenin iki elemanlı (Re, Im) bir tamsayı listesi olduğu boş olmayan bir kare matris verildiğinde, bunun bir Hermitian matrisini temsil edip etmediğini belirleyin (herhangi bir doğruluk / falsy değeri veya herhangi iki tutarlı değer vererek).

Girişin bir tamsayı 3D dizisi olduğuna dikkat edin; 2B karmaşık sayı dizisi değil. Diliniz doğrudan bir 3D dizisini alamıyorsa, düz bir liste (ve yardımcı olursa n × n veya n × n × 2 şekli) alabilirsiniz.

Bir matristir Hermitsel kendi eşitse eşlenik devrik . Diğer bir deyişle, onu sol-sol-sağ-sağ diyagonal boyunca çevirir ve tüm iki elemanlı yaprak listelerinin ikinci öğesini reddederseniz, giriş matrisi ile aynıdır. Çevirme ve reddetme sırasının alakasız olduğuna dikkat edin, bu yüzden önce reddedebilir ve daha sonra çevirebilirsiniz.

Yürüme örneği örneği

Bu örnek, okumayı kolaylaştırmak için gereksiz boşluk içeren JSON kullanır:

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

Sırasını değiştir (KB-GD çapraz)

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

Yaprak listelerinin ikinci öğelerini ayırın:

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

Bu, girişle aynı olduğundan, matris Hermitian'dır.

Test senaryoları

Hermitik

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

Sigara Hermisyen

[[[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 Hala düşünüyorum. Herhangi bir fikir?
Adám

Kayıt için yeni bir Meta yazısı . (Kapatmak için oy vermedim, ama birinin sahip olduğunu görüyorum, bu yüzden topluluğun bu konuda ne düşündüğünü merak ediyorum).
Stewie Griffin

5
@ Adám Bunu olabildiğince açık yapardım, ama size kalmış. Giriş ve çıkış formatlarında esneklik genellikle istenir, ancak özellikle girişin 3B gerçek sayılar dizisi olduğunu söylediğinizde varsayılan olarak çıkartılamaz ; 2B karmaşık sayı dizisi değil . 3D dizi giriş formatı konseptinizin ne kadar geniş olduğu açık değil
Luis Mendo

3
@ Adám Bir çift 2D matris (biri gerçek parça, biri hayali parça için) girdi olarak alınabilir mi?
dylnan

1
Girdi, yaprak boyutunun Re-Im çiftlerini içerdiği bir tür 3 boyutu temsil eden tek bir yapı olmalıdır .
Adam

Yanıtlar:


10

R, 71 48 47 bayt

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

Gerçek sayıların bir 3D dizisini alır, hayali sayıların bir 2D dizisini yapar, transpoze eder, konjuge ve karşılaştırır.

Sayesinde @Giuseppe şaşırtıcı bir tarafından ve 23 bayt bayt sayısını azaltmak için @Vlo son 1 için!

Çevrimiçi deneyin!

Misal:

> 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]*1ibirkaç bayt kaydetmelidir.
Giuseppe

@GIuseppe arf Bunu denedim ama görünüşe göre değil düşündüm. Teşekkürler!
plannapus

1
Ayrıca, isSymmetricHermitian karmaşık matrisleri için var ve çalışıyor, ancak özellikler düştüğü 1x1için zor [ve durum bir complexyerine bir sonuç veriyormatrix
Giuseppe

2
function(A)all(Conj(t(B<-A[,,1]+A[,,2]*1i))==B)Satır içi atama 1'i kaydeder.
Vlo

7

Oktav , 39 34 31 bayt

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

Çevrimiçi deneyin!

Meydan okuma metnindeki açıklamalar hakkında bana bilgi veren Luis Mendo sayesinde 3 bayt kurtardı.

Açıklama:

MATLAB ve Octave'de, ' "normal" devrik değil, eşlenik kompleks devriktür.

Bir değişken oluşturuyoruz y3D matrisin ilk katmanı ve ikinci katmanın karmaşık birim ile çarpıldığı satır içij , yani gerçek terimin ilk "katman" olduğu ve hayali ikinci "katman" olduğu karmaşık bir matris. Daha sonra, kendisinin transpoze edilen karmaşık konjugate eşit olup olmadığını kontrol ederiz.

Bu yalnızca 1doğru olduğunda içeren bir matris ve 0yanlışsa en az bir içeren bir matris çıkaracaktır . Bunlar Octave'de (Proof) doğru ve yanlış olarak kabul edilir .



5

APL (Dyalog Unicode) , 22 15 9 7 bayt

⍉≡⊢∘-

Çevrimiçi deneyin!

Ön ek önek işlevi.

Adf'a Dfn'deki 7 bayt için ve Adám ve ErikTheOutgolfer'a aptallığımı katladıkları için teşekkürler teşekkür ederim.

Tacit versiyonunda 2 bayt için ngn'e teşekkürler.

Nasıl?

⍉≡⊢∘- 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

Wolfram Dili (Mathematica) , 45 34 33 26 21 18 bayt

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

Çevrimiçi deneyin!



@alephalpha Çok teşekkürler; Bu 0xf3c7devrik operatör olduğunu biliyorum , ama nedir 0xf3c8?
Jonathan Frech

1
@alephalpha Ayrıca var 0xf3c9( Wolfram Belgeleri ).
Jonathan Frech

4

Java 8, 137 136 134 126 119 116 bayt

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

@Ceilingcat sayesinde -3 bayt .

Aksi 1takdirde Hermitiyen döndürür 0.

Açıklama:

Çevrimiçi deneyin.

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*l,j,k;     //  Index-integers
  for(;i-->0;)       //  Loop over the rows and columns
    r=m[j=i/l][k=i%l][0]!=m[k][j][0]
                     //   If the first numbers diagonally aren't equal,
      |m[j][k][1]!=-m[k][j][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 bayt

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

Çevrimiçi deneyin!

açıklama

[:(+-:|:)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?

Ayrıca 14:-:0 2|:(,-)/"1
FrownyFrog


3

Jöle ,  6  5 bayt

Z×Ø+⁼

1Hermitiyen girişi için dönen monadik bir bağlantı 0.

Çevrimiçi deneyin!

Nasıl?

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

Modern Jelly'in sahip olduğuna inanıyorum Ø+.
lirtosiast

@lirtosiast gerçekten doğru, kullanmak için güncellenmiş; Teşekkürler!
Jonathan Allan

2

05AB1E , 9 bayt

øεεX®‚*]Q

Çevrimiçi deneyin!

açıklama

ø           # 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 bayt

Eski sayım: 50 bayt ( +2içina0 ). Yerleşik devri olmayan bir dil için fena değil (kıskanç değilim, efendim yok)

STDIN üzerindeki giriş matrisini ,gerçek ve hayali kısım arasında verin, örneğin:

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

1Yalnızcı için baskı yapacak, aksi halde

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

Çevrimiçi deneyin!


1

Kabuk , 7 bayt

=¹mmṀ_T

Çevrimiçi deneyin!

Nasıl?

Bunun yerine çalışması gerektiğini unutmayın mm , ancak kullanmamı engelleyen can sıkıcı bir hata var :(

= ¹mmṀ_T - Tam program. Komut satırı argümanlarından girişleri, tuples listelerinin bir listesi olarak alır.
  m T - Girişin tranposundaki her liste için ...
   mṀ_ - ... İçerdikleri her grubun son değerini ifade eder.
= ¹ - Bunun girişle aynı olup olmadığını kontrol edin.


1

C (GCC) , 107 103 , 100 bayt

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;}

Çevrimiçi deneyin!



@Steadybox Çok teşekkürler. Komik ... Birkaç saat önce aklımda tam olarak bu golf vardı - endeksleme yerine dereferencing - ama sadece unuttum ...
Jonathan Frech

@ ceilingcat Teşekkür ederim.
Jonathan Frech

0

Aslında 13 bayt

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

Çevrimiçi deneyin!

Nasıl çalışır?

Bu sunum aslında karmaşık sayıları kullanır. Karmaşık girdilerin bir matrisi olarak girdi alınmasına izin verilirse, 8 bayt olur .

┬⌠⌠Çá╫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 bayt

qCmm,hk_e

Açıklama:

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?

Test takımı .


Yanıtınız aslında 9 bayt ... Bir 9 bayt alternatiftir: qCmm*V_B1.
Bay Xcoder

Ben gönderme yaparken bir bayt kapalı golf, qCmm.e_Fbk... görünüşe göre son başvuru bayt sayısını düzenlemek unuttum. @ Mr.Xcoder Ne olursa olsun düzelttim, yakalamak için teşekkürler!
Steven H.

0

Cı,  111   110  108 bayt

Bir bayt tasarrufu için @Jonathan Frech ve iki bayt tasarrufu için @ ceilingcat sayesinde!

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;}

Çevrimiçi deneyin!

C (GCC) ,  106  104 bayt

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;}

Çevrimiçi deneyin!


Bence de r|=...|...işe yarıyor r+=...||....
Jonathan Frech

@JonathanFrech Evet, var. Teşekkürler!
Steadybox

0

Aslında 13 bayt

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

Çevrimiçi deneyin!

Açıklama:

;┬⌠⌠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
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.