Pauli 행렬 곱하기


12

파울리 행렬은 양자 물리학에서 매우 일반적으로 표시되는 2 × 2 행렬의 집합입니다 (아니, 당신은이 문제에 대한 양자 물리학을 알 필요가 없습니다). 집합에 항등을 포함하면 네 가지 행렬은 다음과 같습니다.

 σ0 =      σ1 =      σ2 =      σ3 = 
[1  0]    [0  1]    [0 -i]    [1  0]
[0  1]    [1  0]    [i  0]    [0 -1]

승산 이 복잡한 위상 중 하나에 의해 승산 될 수 있지만 항상 다른 파울리 매트릭스를 제공 이들 중 둘 1, i, -1, -i. 예를 들어 .σ1σ3 = -iσ2

당신의 임무는 많은 Pauli 행렬을 곱하고 결과 행렬과 위상을 반환하는 것입니다. 입력은 숫자의 비어 있지 않은 문자열로 주어집니다 03매트릭스 대표 로를 . 출력이 생성 된 행렬에 대해 하나의 숫자를 포함하는 문자열 임의로 선행되어야한다 , 또는 (위상을 나타 내기 위한 것이다 ).σ0σ3i--i--1

STDIN (또는 가장 가까운 대안), 명령 행 인수 또는 함수 인수를 통해 입력을 받고 STDOUT (또는 가장 가까운 대안), 함수 리턴 값 또는 함수 (out) 매개 변수를 통해 결과를 출력하는 프로그램 또는 함수를 작성할 수 있습니다.

Pauli 매트릭스와 관련된 내장 (또는 타사) 기능을 사용해서는 안됩니다.

이것은 코드 골프이며, 가장 짧은 대답 (바이트)이 이깁니다.

테스트 사례

1 => 1
13 => -i2
000 => 0
123 => i0
03022 => 3
02132230 => -i3
1320130100032 => i2
311220321030322113103 => -2
0223202330203313021301011023230323 => -i0
1323130203022111323321112122313213130330103202032222223 => -1

3
추상 대수 태그를 추가했습니다. 왜냐하면 이것이 본질적으로 일반화 된 쿼터니언 그룹 에서 단어의 단순화를 요구하기 때문 입니다.
피터 테일러

답변:


3

Pyth, 47 바이트

나는 이것이 여전히 골프 가능하다고 생각합니다. 그러나 CJam을 많이 능가합니다.

p.U&-=T*q3l{[0bZ)^_1%-Zb3xbZmvdz@+c"i - -i")khT

온라인으로 사용해보십시오 : 데모 또는 테스트 스위트

설명

결과 행렬 유형을 결정하는 것은 단순히 모든 숫자를 조정하는 것입니다.

행렬 2 개를 곱하는 동안 A*B행렬이 아닌 행렬이 σ0및 이면 위상이 변경됩니다 A != B.

                                                 implicit: T=10, z=input string
                            mvdz                 evaluate each char of the input 
 .U                                              reduce: b=first value, for Y in mvdz[1:]
    -=T                                            T -= ...
        q3l{[0bZ)                                     (3 == len(set([0,b,Z])))
       *         ^_1%-Zb3                             * (-1)^((Z-b)%3)
   &                                               and
                         xbY                       update b by (b xor Y)
                                 +c"i - -i")k    the list ["i", "-", "-i", ""]
                                @            hT  take the element at index T+1 (modulo wrapping)
p                                                print phase and matrix

물론 Sp300과 동일한 알고리즘을 사용하면 44가 있습니다.
Optimizer

9

파이썬 2, 108 89 87 86 바이트

x=y=0
for m in map(int,raw_input()):x+=m*y and(m-y)%3*3/2;y^=m
print"--i"[~x%4::2]+`y`

(도움을 주신 @grc와 @xnor에게 감사합니다)

설명

계수와 기본 행렬을 나누겠습니다. 우리는 기본 매트릭스에 초점을 경우에만, 우리는 (예를 들어,이 구구단을 얻을 13것입니다 -i2우리가 넣어, 그래서 2) :

  0123

0 0123
1 1032
2 2301
3 3210

비트 xor를 수행하는 것과 똑같은 일이 발생합니다.

이제 계수에 초점을 맞추겠습니다. 각각을 0123표시 하면 다음과 같이 나타납니다 1,i,-1,-i.

  0123

0 0000
1 0031
2 0103
3 0310

이를 위해 먼저 m*y왼쪽 열과 맨 위 행을 처리 하여을 수행하여 두 숫자 중 하나가 0인지 확인합니다 . (m-y)%3그런 다음 추가하면 다음이 제공됩니다.

  0123

0 0000
1 0021
2 0102
3 0210

우리가 2대신 하는 것을 제외하고는 가깝습니다 3. 이를 수행하여이를 설명 *3/2합니다.

인덱싱의 경우 문자열을 가져 와서 "--i"인덱스에서 시작하여 두 번째 문자를 모두 선택 0123하면을 얻습니다 "-i","-","i","".


좋은 문자열 슬라이싱, 나는 이것 에 대해 잊었다 . 나는 당신이 할 수있는 생각 3-n%4으로 ~n%4. 나는 당신 m*y and(m-y)%3*3/2이 마술 줄로 더 짧게 표현할 수 있다고 생각 하지만 첫 번째 시도 877449216>>2*m+8*y는 묶여 있습니다. 또한 대수적 수식이 있는데 Y=m^y,이 식은 (m-y)*(y-Y)*(Y-m)/2이지만 길이가 깁니다.
xnor

@ xnor 오 ~, 멋져요-한 사람이 나를 귀찮게했습니다 : / 나는 m*y and(m-y)%3*3/2너무 단축 될 수 있다고 확신 하지만 밤새도록 보냈고 아무데도 가지 못했습니다 ... 시간이. 어쩌면 내가 자유 모드 4를 가지고 있다는 사실이 도움이 될 수 있습니다.
Sp3000

6

레티 나 , 77 바이트

이 기회를 통해 새로운 Retina 기능인 다단계 루프를 선보일 것이라고 생각했습니다. 이는 많은 작업을 상당히 단축해야합니다 (특히 조건부 교체).

ii
-
+`(.)\1|0

(.)-|(\d)(\d)
-$1$3$2
12
i3
23
i1
31
i2
)`(\d)i
i$1
^\D*$
$&0

Retina는 내 정규식 기반 프로그래밍 언어입니다. 소스 코드는 여러 단계로 그룹화 할 수 있습니다. 각 단계는 두 줄로 구성되며 첫 번째 줄에는 정규식 (및 일부 구성)이 포함되고 두 번째 줄은 대체 문자열입니다. 그런 다음 스테이지는 순서대로 STDIN에 적용되고 최종 결과는 STDOUT에 인쇄됩니다.

위의 -s명령 줄 스위치를 사용하여 소스 파일로 직접 사용할 수 있습니다 . 그러나 각 줄을 별도의 파일에 넣을 수 있기 때문에 스위치를 계산하지 않습니다 (그런 다음 줄 바꿈은 15 바이트를 잃지 만 추가 파일에는 +15를 추가하십시오).

설명

이 솔루션의 새로운 점은 )두 번째 단계입니다. 다단계 루프가 닫힙니다. 일치하는 것이 없습니다. (즉, 첫 번째 단계에서 루프가 암시 적으로 시작됩니다. 따라서 처음 7 단계는 7 단계를 완전히 통과하면 결과 변경이 중지 될 때까지 반복됩니다. 이 7 단계는 단순히 문자열의 행렬 수를 점차적으로 줄이고 위상을 결합하는 다양한 변환을 수행합니다. 최종 결과에 도달하면 7 가지 패턴 중 어느 것도 더 이상 일치하지 않고 루프가 종료됩니다. 이후 결과에 숫자가 없으면 0을 추가합니다 (위 단계에서는 결과를 포함하여 모든 ID를 간단히 삭제하므로).

개별 단계는 다음과 같습니다.

ii
-

모든 쌍의 결합 i으로 -위상 문자를 절감 할 수 있습니다.

+`(.)\1|0
<empty>

이제 두 개의 연속 된 동일한 문자가 남아 있으면 --동일한 행렬입니다. 두 경우 모두 곱하면 정체성이됩니다. 그러나 우리는 신원이 필요하지 않으므로 모든 신원과 명시 적 신원도 제거합니다 0. 이 단계는 +결과 변경이 중지 될 때까지 자체적으로 반복됩니다 . 이렇게하면 123321다음 단계에서 모든 숫자 쌍이 고유하다고 가정 할 수있는 등의 문제가 완전히 해결됩니다.

(.)-|(\d)(\d)
-$1$3$2

이것은 실제로 하나의 골퍼 레이션을위한 두 개의 개별 변환입니다. 첫 번째 대안이 일치 $2하고 $3비어 있고 두 번째 대안이 일치 하면 $1비어 있습니다. 따라서이 두 단계로 분해 할 수 있습니다.

(\d)(\d)
-$2$1

이것은 모든 숫자 쌍을 바꾸고 빼기 부호를 추가합니다. 우리는 모두 제거 이후 0의 모든 동일한 쌍을, 이것은 단지 일치 12, 23, 31, 21, 32, 13. 이 단계는 이상하게 보일지 모르지만 나중에 처리 할 수없는 항목은 다음 반복에서 여기로 바뀌기 때문에 나중에이 사례의 절반 만 확인할 수 있습니다.

위 단계의 다른 부분은 다음과 같습니다.

(.)-
-$1

이것은 서서히 -왼쪽 끝까지 표지판을 움직입니다 (반복 당 한 위치). 나는 궁극적으로 그들이 서로 옆에 있고 이전 단계에서 해결되도록 그렇게합니다.

12
i3
23
i1
31
i2

이 세 단계는 이제 단순히 세 쌍의 제품을 해결합니다. 위에서 말했듯이, 이것은 관련 사례의 절반 만 잡을 것이지만, 이전 단계가 모든 쌍을 교환 한 후 다른 절반은 다음 반복에서 처리됩니다.

)`(\d)i
i$1

이것이 루프의 마지막 단계입니다. 를 -제외하고 왼쪽으로 이동 하는 것과 비슷합니다 i. 가장 큰 차이점은이 i숫자는 숫자 만 교체한다는 것 입니다. 내가 (.)ia -i또는 i-2를 얻는 경우에 사용하면 무기한으로 교환되고 프로그램이 종료되지 않습니다. 따라서 이것은 -표지판 의 오른쪽으로 만 바꿉니다 . 이것으로 충분합니다-모든 것이 -있고 i어느 시점에 함께 나타나면 정확하게 해결 될 수 있습니다.

^\D*$
$&0

마지막 단계 (루프 외부). 우리는 항상 모든 아이덴티티를 삭제 했으므로 결과가 실제로 아이덴티티 (시간 단계) 인 경우 출력에 필요한 숫자가 더 이상 없으므로 다시 추가합니다.

예를 들어, 모든 중간 형태 0223202330203313021301011023230323(변경을 수행하지 않는 건너 뛰기 단계)는 다음과 같습니다.

0223202330203313021301011023230323

321321312        # Remove identities
-23-31-12-132    # Swap all pairs
-23-31-i3-132    # Resolve 12
-i1-31-i3-132    # Resolve 23
-i1-i2-i3-132    # Resolve 31
-i-1i-2i-3-312   # Move - to the left and swap pairs
-i-1i-2i-3-3i3   # Resolve 12
-i-i1-i2-3-i33   # Move i to the left
-i-i1-i2-3-i     # Remove identities
--ii-1i-2-3i     # Move - to the left
--ii-i1-2-i3     # Move i to the left
----i1-2-i3      # Resolve ii
i1-2-i3          # Remove identities
i-1-2i3          # Move - to the left
i-1-i23          # Move i to the left
-i-1i-32         # Move - to the left and swap pairs
-i-i1-32         # Move i to the left
--ii-1-23        # Move - to the left and swap pairs
--ii-1-i1        # Resolve 23
----1-i1         # Resolve ii
1-i1             # Remove identities
-1i1             # Move - to the left
-i11             # Move i to the left
-i               # Remove identities. Now the loop can't change this any longer.
-i0              # Fix the result by adding in the 0.

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