에르 미트 행렬?


18

이 문제는 복소수를 처리하거나 이해하지 않아도됩니다.

모든 요소가 2 요소 (Re, Im) 정수 목록 인 비어 있지 않은 정사각 행렬이 주어지면 이것이 허미 시안 행렬인지 여부를 결정합니다 (진실 / 거짓 값 또는 2 개의 일관된 값 제공).

입력은 정수의 3D 배열입니다. 복소수의 2D 배열이 아닙니다. 언어가 3D 배열을 직접 사용할 수없는 경우 간단한 목록 (및 도움이되는 경우 n × n 또는 n × n × 2 모양)을 사용할 수 있습니다.

행렬이 자신의 켤레 전치 와 같으면 Hermitian 입니다. 즉, 왼쪽 상단에서 오른쪽 하단 대각선으로 뒤집어 두 요소 리프 목록의 두 번째 요소를 모두 부정하면 입력 행렬과 동일합니다. 뒤집기 및 부정의 순서는 관련이 없으므로 먼저 부정하고 나중에 뒤집을 수 있습니다.

워크 쓰루 예제

이 예제에서는 불필요한 공백이있는 JSON을 사용하여 쉽게 읽을 수 있습니다.

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

조바꿈

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

리프 목록의 두 번째 요소를 무효화하십시오.

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

이것은 입력과 동일하므로 행렬은 에르 미트 (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]]]

비 에르 미트 인

[[[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 아직도 생각하고 있습니다. 어떤 아이디어?
Adám

기록을 위해 새로운 Meta-post . (닫기 위해 투표하지는 않았지만 누군가가 가지고있는 것을 보았으므로 커뮤니티가 이것에 대해 어떻게 생각하는지 궁금합니다.)
Stewie Griffin

5
@ Adám 가능한 한 명시 적으로 만들 것이지만, 그것은 당신에게 달려 있습니다. 입력 및 출력 형식의 유연성은 일반적으로 바람직하지만, 특히 입력이 실수의 3D 배열 이라고 말할 때 기본적으로 추론 할 수는 없습니다 . 복소수의 2D 배열이 아닙니다 . 3D 어레이 입력 형식의 개념이 얼마나 넓은 지 명확하지 않습니다.
Luis Mendo

3
@ Adám 한 쌍의 2D 행렬 (실제 부분에 대한 것, 가상 부분에 대한 것)을 입력으로 취할 수 있습니까?
dylnan

1
@dylnan No. 입력은 리프 차원에 Re-Im 쌍이 포함 된 일종의 3 차원을 나타내는 단일 구조 여야합니다 .
Adám

답변:


10

R, 71 48 47 바이트

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

실수의 3D 배열을 취하고, 허수의 2D 배열을 만들고, 전치, 결합 및 비교합니다.

놀라운 23 바이트로 바이트 수를 줄인 @Giuseppe 와 마지막 1 을 위해 @Vlo 에게 감사드립니다 !

온라인으로 사용해보십시오!

예:

> 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]*1i몇 바이트를 절약해야합니다.
주세페

@GIuseppe arf 나는 그것을 시도했지만 분명히 그렇지 않다고 생각했다. 감사!
plannapus

1
또한 isSymmetricHermitian complex matrix에 존재하고 작동하지만 속성이 떨어 1x1지기 때문에 까다로운 경우가 있습니다 .[complexmatrix
Giuseppe

2
function(A)all(Conj(t(B<-A[,,1]+A[,,2]*1i))==B)인라인 할당 1. 저장
VLO

7

옥타브 , 39 34 31 바이트

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

온라인으로 사용해보십시오!

도전 과제 텍스트의 설명에 대해 알려 주신 Luis Mendo에게 3 바이트를 절약했습니다.

설명:

MATLAB과 Octave에서 ' 에서 "일반"조옮김이 아닌 복합 복합 조옮김입니다.

y3D 행렬의 첫 번째 레이어에 복소수 단위를 곱한 두 번째 레이어 인 가변 인라인을 만듭니다.j , 즉 실수가 첫 번째 "레이어"이고 가상이 두 번째 "레이어"인 복합 행렬을 만듭니다. 그런 다음 그것이 복잡한 켤레 전치와 같은지 확인합니다.

1true 인 경우 만 포함하는 행렬 과 0false 인 경우 하나 이상이 포함 된 행렬이 출력 됩니다. 이들은 Octave (Proof) 에서 참과 거짓으로 간주됩니다 .



5

APL (Dyalog Unicode) , 22 15 9 7 바이트

⍉≡⊢∘-

온라인으로 사용해보십시오!

암묵적 접두사 기능.

Dfn에서 7 바이트의 Adám과 어리 석음에 적응 한 Adám과 ErikTheOutgolfer 덕분에 암묵적인 버전을 찾을 수있었습니다.

암묵적 인 버전에서 2 바이트의 ngn 덕분입니다.

어떻게?

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

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

온라인으로 사용해보십시오!



@alephalpha 감사합니다. 나는 그것이 0xf3c7전치 연산자 라는 것을 알고 있지만 무엇 0xf3c8입니까?
Jonathan Frech

1
@alephalpha 0xf3c9( Wolfram Documentation )도 있습니다.
Jonathan Frech

4

자바 (8) 137 136 134 126 119 116 바이트

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 덕분에 -3 바이트 .

1에르 미트 인 0경우 , 그렇지 않은 경우를 반환 합니다 .

설명:

온라인으로 사용해보십시오.

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`






1

Perl 5 , -a0 48 바이트

오래된 계산 : 50 바이트 ( +2for a0). 기본적으로 조옮김이없는 언어에는 나쁘지 않습니다. 전혀 질투하지 않습니다.

STDIN에 입력 행렬을 ,실수와 허수 사이 에 제공하십시오 . 예를 들면 다음과 같습니다.

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

1은둔자를 위해 인쇄 합니다.

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

온라인으로 사용해보십시오!


1

껍질 , 7 바이트

=¹mmṀ_T

온라인으로 사용해보십시오!

어떻게?

그 주 대신에 작업을해야 mm 하지만, 성가신 버그가있다 에서 방지 내가 그것을 사용하는 것으로는 :(

= ¹mmṀ_T – 전체 프로그램. 튜플 목록으로 명령 줄 인수에서 입력을받습니다.
  m T – 입력 조옮김의 각 목록에 대해 ...
   mṀ_ – ... 포함 된 각 튜플의 마지막 값을 무효화합니다.
= ¹ – 입력과 동일한 지 확인하십시오.


1

C (gcc) , 107 (103) 100 바이트

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

온라인으로 사용해보십시오!



@Steadybox 감사합니다. Funny ... 몇 시간 전에 나는이 골프를 염두에
두었다

@ceilingcat 감사합니다.
Jonathan Frech

0

실제로 13 바이트

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

온라인으로 사용해보십시오!

어떻게 작동합니까?

이 제출은 실제로 복소수를 사용합니다. 복잡한 항목의 행렬로 입력이 허용 된 경우 8 바이트가 됩니다.

┬⌠⌠Çá╫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 바이트

qCmm,hk_e

설명:

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?

테스트 스위트 .


당신의 대답은 실제로 9 바이트입니다 ... 9 바이트 대안 : qCmm*V_B1.
Mr. Xcoder

제출을 할 때 1 바이트를 떨어 뜨 렸습니다. qCmm.e_Fbk... 최종 제출에서 바이트 수를 편집하는 것을 잊었습니다. @ Mr.Xcoder 캐치 주셔서 감사합니다.
Steven H.

0

C,  111   (110)  108 바이트

바이트를 저장 한 @Jonathan Frech와 2 바이트를 저장 한 @ceilingcat에게 감사드립니다!

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

온라인으로 사용해보십시오!

C (gcc) ,  106104  바이트

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

온라인으로 사용해보십시오!


나는 r|=...|...잘 작동 한다고 생각 합니다 r+=...||....
Jonathan Frech

@JonathanFrech 그렇습니다. 감사!
Steadybox

0

실제로 13 바이트

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

온라인으로 사용해보십시오!

설명:

;┬⌠⌠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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.