Matrice hermitienne?


18

Notez que ce défi ne nécessite aucune manipulation ou compréhension des nombres complexes.

Étant donné une matrice carrée non vide où chaque élément est une liste entière à deux éléments (Re, Im), déterminez (en donnant toutes les valeurs véridiques / fausses ou deux valeurs cohérentes) si cela représente une matrice hermitienne.

Notez que l'entrée est un tableau 3D d'entiers; pas un tableau 2D de nombres complexes. Si votre langue ne peut pas prendre directement un tableau 3D, vous pouvez prendre une liste plate (et la forme n × n ou n × n × 2 si cela vous aide).

Une matrice est hermitienne si elle est égale à sa propre transposition conjuguée . En d'autres termes, si vous le retournez sur sa diagonale en haut à gauche à en bas à droite et annulez le deuxième élément de toutes les listes de feuilles à deux éléments, il est identique à la matrice d'entrée. Notez que l'ordre de retournement et de négation n'est pas pertinent, vous pouvez donc annuler d'abord et retourner ensuite.

Exemple pratique

Cet exemple utilise JSON avec un espace blanc superflu pour faciliter la lecture:

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

Transposer (inverser la diagonale NW — SE):

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

Nier les deuxièmes éléments des listes de feuilles:

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

Comme c'est identique à l'entrée, la matrice est hermitienne.

Cas de test

Hermitien

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

[[[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 Je pense toujours. Des idées?
Adám

Pour mémoire, un nouveau Meta-post . (Je n'ai pas voté pour fermer, mais je vois que quelqu'un l'a fait, alors je suis curieux de savoir ce que la communauté en pense).
Stewie Griffin

5
@ Adám, je voudrais que ce soit aussi explicite que possible, mais cela dépend de vous. La flexibilité dans les formats d'entrée et de sortie est généralement souhaitée, mais ne peut pas être déduite par défaut, spécialement lorsque vous dites que l'entrée est un tableau 3D de nombres réels; pas un tableau 2D de nombres complexes . On ne sait pas à quel point votre concept de format d'entrée de matrice 3D est large
Luis Mendo

3
@ Adám Une paire de matrices 2D (une pour la partie réelle, une pour la partie imaginaire) peut-elle être prise en entrée?
dylnan

1
@dylnan No. L'entrée doit être une structure unique représentant une sorte de 3-dimensionnalité où la dimension de feuille contient les paires Re-Im.
Adám

Réponses:


10

R, 71 48 47 octets

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

Prend un tableau 3D de nombres réels, crée un tableau 2D de nombres imaginaires, transpose, conjugue et compare.

Merci à @Giuseppe d' avoir réduit le nombre d'octets d'un incroyable 23 octets, et à @Vlo pour le dernier 1!

Essayez-le en ligne!

Exemple:

> 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]*1idevrait économiser quelques octets.
Giuseppe

@GIuseppe arf Je pensais avoir essayé, mais apparemment pas. Merci!
plannapus

1
Existe également isSymmetricet fonctionne pour les matrices complexes hermitiennes, mais le 1x1cas est délicat car il [supprime les attributs et il en résulte un complexplutôt qu'unmatrix
Giuseppe

2
function(A)all(Conj(t(B<-A[,,1]+A[,,2]*1i))==B)L'affectation en ligne sauve 1.
Vlo

7

Octave , 39 34 31 octets

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

Essayez-le en ligne!

Enregistré 3 octets grâce à Luis Mendo qui m'a informé des clarifications dans le texte du challenge.

Explication:

Dans MATLAB et Octave, 'c'est la transposition complexe conjuguée, pas la transposition "régulière".

Nous créons une variable y ligne qui est la première couche de la matrice 3D plus la deuxième couche multipliée par l'unité complexe j, c'est-à-dire une matrice complexe où le terme réel est la première "couche" et l'imaginaire est la deuxième "couche". On vérifie ensuite si elle est égale à un conjugué complexe transposé.

Cela produira une matrice contenant uniquement 1si vrai, et une matrice contenant au moins un 0si faux. Celles-ci sont considérées comme vraies et fausses dans Octave (Proof) .



5

APL (Dyalog Unicode) , 22 15 9 7 octets

⍉≡⊢∘-

Essayez-le en ligne!

Fonction de préfixe tacite.

Merci à Adám pour 7 octets sur le Dfn, et à Adám et ErikTheOutgolfer pour avoir supporté ma stupidité en m'aidant à trouver la version tacite.

Merci à ngn pour 2 octets sur la version tacite.

Comment?

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

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

Essayez-le en ligne!



@alephalpha Merci beaucoup; Je sais que 0xf3c7c'est l'opérateur de transposition, mais qu'est-ce que c'est 0xf3c8?
Jonathan Frech

1
@alephalpha Il y en a aussi 0xf3c9( Documentation Wolfram ).
Jonathan Frech

4

Java 8, 137 136 134 126 119 116 octets

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

-3 octets grâce à @ceilingcat .

Retourne 1si hermitien, 0sinon.

Explication:

Essayez-le en ligne.

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 octets

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

Essayez-le en ligne!

Explication

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

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


3

Gelée ,  6  5 octets

Z×Ø+⁼

Un lien monadique revenant 1pour une entrée hermitienne et 0autrement.

Essayez-le en ligne!

Comment?

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

Je crois que la Jelly moderne l'a fait Ø+.
lirtosiast

@lirtosiast en effet vous avez raison, mis à jour pour l'utiliser; Merci!
Jonathan Allan

2

05AB1E , 9 octets

øεεX®‚*]Q

Essayez-le en ligne!

Explication

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

Ancien comptage: 50 octets ( +2poura0 ). Pas mal pour une langue qui n'a pas de transposition intégrée (je ne suis pas du tout jaloux, pas de sirree)

Donnez la matrice d'entrée sur STDIN avec ,entre la partie réelle et imaginaire, par exemple:

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

Imprime 1pour hermitien, rien d'autre

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

Essayez-le en ligne!


1

Husk , 7 octets

=¹mmṀ_T

Essayez-le en ligne!

Comment?

Notez que cela devrait fonctionner au lieu de mm , mais il y a un bug ennuyeux qui m'empêche de l'utiliser :(

= ¹mmṀ_T - Programme complet. Prend l'entrée des arguments de ligne de commande, comme une liste de listes de tuples.
  m T - Pour chaque liste dans le but de l'entrée ...
   mṀ_ - ... Nie la dernière valeur de chaque tuple qu'ils contiennent.
= ¹ - Vérifiez si c'est la même chose que l'entrée.


1

C (gcc) , 107 103 100 octets

  • Enregistré quatre octets grâce à Steadybox ; joué A[0]au golf à *Adeux reprises.
  • Enregistré trois octets grâce à ce plafond .
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;}

Essayez-le en ligne!



@Steadybox Merci beaucoup. Drôle ... Il y a quelques heures, j'avais exactement ce golf en tête - déréférencer au lieu d'indexer - mais j'ai simplement oublié ...
Jonathan Frech

@ceilingcat Merci.
Jonathan Frech

0

En fait , 13 octets

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

Essayez-le en ligne!

Comment ça fonctionne?

Cette soumission utilise en fait des nombres complexes. Si la prise d'entrée comme matrice d'entrées complexes était autorisée, ce serait 8 octets .

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

qCmm,hk_e

Explication:

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 de tests .


Votre réponse est en fait 9 octets ... Une alternative 9 octets: qCmm*V_B1.
M. Xcoder

J'ai joué un octet au cours de la soumission, à partir de qCmm.e_Fbk... apparemment, j'ai oublié de modifier le nombre d'octets dans la soumission finale. @ Mr.Xcoder Je l'ai corrigé malgré tout, merci pour la capture!
Steven H.

0

C,  111   110  108 octets

Merci à @Jonathan Frech d'avoir sauvé un octet et merci à @ceilingcat d'avoir sauvé deux octets!

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

Essayez-le en ligne!

C (gcc) ,  106104  octets

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

Essayez-le en ligne!


Je pense que ça r|=...|...marche aussi bien r+=...||....
Jonathan Frech

@JonathanFrech Oui, c'est le cas. Merci!
Steadybox

0

En fait , 13 octets

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

Essayez-le en ligne!

Explication:

;┬⌠⌠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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.