Hermitianische Matrix?


17

Beachten Sie, dass für diese Herausforderung keine komplexen Zahlen verarbeitet oder verstanden werden müssen.

Bei einer nicht leeren quadratischen Matrix, in der jedes Element eine ganzzahlige Liste mit zwei Elementen (Re, Im) ist, bestimmen Sie (unter Angabe von Wahrheits- / Falschheitswerten oder zwei konsistenten Werten), ob dies eine hermitische Matrix darstellt.

Beachten Sie, dass die Eingabe ein 3D-Array von Ganzzahlen ist. kein 2D-Array komplexer Zahlen. Wenn Ihre Sprache ein 3D-Array nicht direkt aufnehmen kann, können Sie eine flache Liste (und die Form n × n oder n × n × 2, falls dies hilfreich ist) verwenden.

Eine Matrix ist hermitisch, wenn sie ihrer eigenen konjugierten Transponierung entspricht . Mit anderen Worten, wenn Sie es über die Diagonale von links oben nach rechts unten drehen und das zweite Element aller Blattlisten mit zwei Elementen negieren, ist es identisch mit der Eingabematrix. Beachten Sie, dass die Reihenfolge des Umdrehens und Negierens irrelevant ist. Sie können also zuerst negieren und anschließend umdrehen.

Walk-through-Beispiel

In diesem Beispiel wird JSON mit überflüssigen Leerzeichen verwendet, um das Lesen zu vereinfachen:

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

Transponieren (Umblättern der NW-SE-Diagonale):

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

Negiere zweite Elemente von Blattlisten:

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

Da dies mit der Eingabe identisch ist, ist die Matrix hermitisch.

Testfälle

Hermitian

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

Nicht-Hermitianer

[[[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 Ich denke immer noch. Irgendwelche Ideen?
Adám

Für die Aufzeichnung eine neue Meta-Post . (Ich habe nicht gewählt, um zu schließen, aber ich sehe, dass jemand hat, also bin ich neugierig, was die Community darüber denkt).
Stewie Griffin

5
@Adam Ich würde es so deutlich wie möglich machen, aber es liegt an dir. Flexibilität bei Eingabe- und Ausgabeformaten ist normalerweise erwünscht, kann jedoch nicht standardmäßig abgeleitet werden, insbesondere wenn Sie sagen, dass die Eingabe ein 3D-Array von reellen Zahlen ist. kein 2D-Array komplexer Zahlen . Es ist nicht klar, wie umfassend Ihr Konzept des 3D-Array-Eingabeformats ist
Luis Mendo

3
@ Adám Kann ein Paar 2D-Matrizen (eine für den Realteil, eine für den Imaginärteil) als Eingabe verwendet werden?
Dylnan

1
@dylnan Nummer Eingang hat eine einzige Struktur zu repräsentieren , eine Art 3-Dimensionalität , wo die Blattabmessung das Re-Im - Paar enthält.
Adám

Antworten:


10

R 71 48 47 Bytes

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

Nimmt ein 3D-Array von reellen Zahlen auf, erstellt ein 2D-Array von imaginären Zahlen, transponiert, konjugiert und vergleicht.

Vielen Dank an @ Giuseppe für die Reduzierung der Byteanzahl um erstaunliche 23 Bytes und an @ Vlo für die letzte 1!

Probieren Sie es online!

Beispiel:

> 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]*1isollte ein paar Bytes sparen.
Giuseppe

@GIuseppe arf Ich dachte, ich habe das versucht, aber anscheinend nicht. Vielen Dank!
Plannapus,

1
Auch isSymmetricexistiert und arbeitet für hermitischen komplexen Matrices aber der 1x1Fall ist , da heikel [Tropfen Attribute und es ergibt sich ein complexeher als einmatrix
Giuseppe

2
function(A)all(Conj(t(B<-A[,,1]+A[,,2]*1i))==B)In-Line-Zuordnung speichert 1.
Vlo

7

Oktave , 39 34 31 Bytes

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

Probieren Sie es online!

3 Bytes gespart dank Luis Mendo, der mich über die Klarstellungen im Challenge-Text informiert hat.

Erläuterung:

In MATLAB und Octave 'ist die konjugierte komplexe Transponierte nicht die "reguläre" Transponierte.

Wir erstellen eine Variable yinline, die die erste Ebene der 3D-Matrix plus die zweite Ebene multipliziert mit der komplexen Einheit ist j, dh eine komplexe Matrix, bei der der Realterm die erste "Ebene" und die Imaginäre die zweite "Ebene" ist. Wir prüfen dann, ob es sich um ein komplexes transponiertes Konjugat handelt.

Dies gibt eine Matrix aus, die nur 1true enthält, und eine Matrix, die mindestens 0false enthält. Diese werden in Octave (Proof) als wahr und falsch betrachtet .



5

APL (Dyalog Unicode) , 22 15 9 7 Bytes

⍉≡⊢∘-

Probieren Sie es online!

Tacit-Präfix-Funktion.

Vielen Dank an Adám für 7 Bytes im Dfn und an Adám und ErikTheOutgolfer , die meine Dummheit ertragen und mir geholfen haben, die stillschweigende Version zu finden.

Danke an ngn für 2 Bytes in der stillschweigenden Version.

Wie?

⍉≡⊢∘- 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 Language (Mathematica) , 45 34 33 26 21 18 Bytes

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

Probieren Sie es online!



@alephalpha Vielen Dank; Ich weiß, dass dies 0xf3c7der Transponierungsoperator ist, aber was ist das 0xf3c8?
Jonathan Frech

1
@alephalpha gibt es auch 0xf3c9( Wolfram-Dokumentation ).
Jonathan Frech

4

Java 8, 137 136 134 126 119 Bytes

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

Gibt zurück, 1wenn Hermitian, 0sonst.

Erläuterung:

Probieren Sie es online aus.

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 Bytes

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

Probieren Sie es online!

Erläuterung

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

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


3

Gelee ,  6  5 Bytes

Z×Ø+⁼

Ein monadischer Link, der 1für eine Hermitianische Eingabe und 0sonstiges zurückkehrt.

Probieren Sie es online!

Wie?

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

Ich glaube, dass moderne Gelee hat Ø+.
Lirtosiast

@ Lirtosiast in der Tat sind Sie richtig, aktualisiert, um es zu verwenden; Vielen Dank!
Jonathan Allan

2

05AB1E , 9 Bytes

øεεX®‚*]Q

Probieren Sie es online!

Erläuterung

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

Alte Zählung: 50 Bytes ( +2für a0). Nicht schlecht für eine Sprache, die keine eingebaute Transponierung hat (ich bin überhaupt nicht eifersüchtig, nein, Sirree)

Geben Sie mit die Eingabematrix auf STDIN ein , zwischen Real- und Imaginärteil an, z. B .:

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

Wird 1für Einsiedler gedruckt , sonst nichts

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

Probieren Sie es online!


1

Schale , 7 Bytes

=¹mmṀ_T

Probieren Sie es online!

Wie?

Beachten Sie, dass das funktionieren sollte mm , aber es gibt einen nervigen Bug , der mich daran hindert, es zu verwenden :(

= ¹mmṀ_T - Volles Programm. Übernimmt Eingaben von Befehlszeilenargumenten als Liste von Tupellisten.
  m T - Für jede Liste in der Übergabe der Eingabe ...
   mṀ_ - ... Negiere den letzten Wert jedes Tupels, das sie enthalten.
= ¹ - Prüfen Sie, ob dies mit der Eingabe übereinstimmt.


1

C (GCC) , 107 103 100 Bytes

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

Probieren Sie es online!



@Steadybox Vielen Dank. Lustig ... Vor ein paar Stunden hatte ich genau dieses Golf im Sinn - Dereferenzieren statt Indexieren - aber einfach vergessen ...
Jonathan Frech

@ceilingcat Vielen Dank.
Jonathan Frech

0

Eigentlich 13 Bytes

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

Probieren Sie es online!

Wie es funktioniert?

Diese Vorlage verwendet tatsächlich komplexe Zahlen. Wenn die Eingabe als Matrix komplexer Einträge zulässig wäre, wären dies 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 Bytes

qCmm,hk_e

Erläuterung:

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?

Testsuite .


Ihre Antwort ist eigentlich 9 Byte ... A 9-Byte - Alternative: qCmm*V_B1.
Mr. Xcoder

Ich habe bei der Übermittlung ein Byte abgespielt, von qCmm.e_Fbk... anscheinend habe ich vergessen, die Anzahl der Bytes in der endgültigen Übermittlung zu bearbeiten. @ Mr.Xcoder Ich habe es trotzdem behoben, danke für den Haken!
Steven H.

0

C  111   110  108 Bytes

Danke an Jonathan Frech für das Speichern eines Bytes und danke an Ceilingcat für das Speichern von zwei Bytes!

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

Probieren Sie es online!

C (GCC) ,  106  104 Bytes

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

Probieren Sie es online!


Ich denke r|=...|...funktioniert genauso gut wie r+=...||....
Jonathan Frech

@ JonathanFrech Ja, das tut es. Vielen Dank!
Steadybox

0

Eigentlich 13 Bytes

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

Probieren Sie es online!

Erläuterung:

;┬⌠⌠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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.