3 양자 비트에서의 GHZ 상태를 행렬 계산해 보았다 (with Python)

양자의 Q 문자도 모르는 인간이 3 양자 비트에서 GHZ 상태를 계산해 보았다.
속편입니다.
혼란스러워질 것 같아서 타이틀 바꾸었습니다. (아직 Q의 글자도 모르겠어요 😭)

행렬 계산에 도전



선형 대수는 학부 1년째 이래이므로, 잘못하면 고교생보다 계산할 수 없습니다.
하지만 계산이 편해지면 이것을 계기로 도전입니다.

3 양자 비트 GHZ 상태 (오사라이)



아래 그림은 3 양자 비트에서 GHZ 상태를 생성하는 회로입니다.


계산 번호 첨부



왼쪽에서 순서대로 번호를 매기고 계산을 쉽게 볼 수 있습니다.


각 단계에서 행렬 계산



$CNOT_{c,t}$ 에서 $c$ 양자 비트 눈이 $\left|1\right>$일 때 $t$ 양자 비트 눈을 반전시킵니다.
\begin{align}
&⓪ \quad  q_{1} \otimes q_{2} \otimes q_{3} \\
&① \quad H \otimes H \otimes X \\
&② \quad CNOT_{2,3} \\
&③ \quad CNOT_{1,3} \\
&④ \quad H \otimes H \otimes H
\end{align}

게이트 별 행렬식



이 때 각 게이트의 행렬식은 다음과 같습니다.
\begin{align}
H =
\frac{1}{\sqrt{2}}
\left[ 
  \begin{array}{r} 
    1 & 1  \\
    1 & -1 \\
  \end{array} 
\right] &, \quad

X =
\left[ 
  \begin{array}{r} 
    0 & 1 \\
    1 & 0 \\
  \end{array} 
\right] \\ \\

CNOT_{2,3} = I \otimes CNOT
=
\left[ 
  \begin{array}{r} 
    1 & 0 \\
    0 & 1 \\
  \end{array} 
\right]
\left[ 
  \begin{array}{r} 
    1 & 0 & 0 & 0 \\
    0 & 1 & 0 & 0 \\
    0 & 0 & 0 & 1 \\
    0 & 0 & 1 & 0 \\
  \end{array} 
\right]
&=
\left[ 
  \begin{array}{r} 
    1 & 0 & 0 & 0 & 0 & 0 & 0 & 0 \\
    0 & 1 & 0 & 0 & 0 & 0 & 0 & 0 \\
    0 & 0 & 0 & 1 & 0 & 0 & 0 & 0 \\
    0 & 0 & 1 & 0 & 0 & 0 & 0 & 0 \\
    0 & 0 & 0 & 0 & 1 & 0 & 0 & 0 \\
    0 & 0 & 0 & 0 & 0 & 1 & 0 & 0 \\
    0 & 0 & 0 & 0 & 0 & 0 & 0 & 1 \\
    0 & 0 & 0 & 0 & 0 & 0 & 1 & 0 \\
  \end{array} 
\right], \\ \\

CNOT_{1,3}
&=
\left[ 
  \begin{array}{r} 
    1 & 0 & 0 & 0 & 0 & 0 & 0 & 0 \\
    0 & 1 & 0 & 0 & 0 & 0 & 0 & 0 \\
    0 & 0 & 1 & 0 & 0 & 0 & 0 & 0 \\
    0 & 0 & 0 & 1 & 0 & 0 & 0 & 0 \\
    0 & 0 & 0 & 0 & 0 & 1 & 0 & 0 \\
    0 & 0 & 0 & 0 & 1 & 0 & 0 & 0 \\
    0 & 0 & 0 & 0 & 0 & 0 & 0 & 1 \\
    0 & 0 & 0 & 0 & 0 & 0 & 1 & 0 \\
  \end{array} 
\right] \\
\end{align}

$CNOT_{1,3}$은 기합으로 써 보았습니다. 아마 이것이었을 것입니다…
이것을 모두 연결하여 $ GHZ_ {3} $로합시다.
GHZ_{3} = \bigl( H \otimes H \otimes H \bigr) \bullet CNOT_{1,3} \bullet CNOT_{2,3} \bullet \bigl( H \otimes H \otimes X \bigr) \bullet \bigl( q_{1} \otimes q_{2} \otimes q_{3} \bigr)

막상 계산



과연 손 계산이라고 죽을 것 같아서, 무난하게 Numpy 사용해 가고 싶습니다…

|000>에서 GHZ
#!/usr/bin/python
# -*- Coding: utf-8 -*-

import numpy as np

# calcs:行列積とテンソル積を行う高階関数
def calcs(func, *datas) :
    if len(datas) != 1 :
        return func(datas[0], calcs(func, *datas[1:]))
    else :
        return datas[0]

# 三項以上のテンソル積を求める関数
def krons(*datas) : return calcs(np.kron, *datas)

# 三項以上の行列積を求める関数
def prods(*datas) : return calcs(np.dot, *datas)

q1 = np.array([1,0])
q2 = np.array([1,0])
q3 = np.array([1,0])

H = 1 / np.sqrt(2) * np.array([[1,1],[1,-1]])
X = np.array([[0,1],[1,0]])

CNOT23 = np.array([ [1,0,0,0,0,0,0,0],
                    [0,1,0,0,0,0,0,0],
                    [0,0,0,1,0,0,0,0],
                    [0,0,1,0,0,0,0,0],
                    [0,0,0,0,1,0,0,0],
                    [0,0,0,0,0,1,0,0],
                    [0,0,0,0,0,0,0,1],
                    [0,0,0,0,0,0,1,0]])

CNOT13 = np.array([ [1,0,0,0,0,0,0,0],
                    [0,1,0,0,0,0,0,0],
                    [0,0,1,0,0,0,0,0],
                    [0,0,0,1,0,0,0,0],
                    [0,0,0,0,0,1,0,0],
                    [0,0,0,0,1,0,0,0],
                    [0,0,0,0,0,0,0,1],
                    [0,0,0,0,0,0,1,0]])

GHZ3 = prods(krons(H, H, H), CNOT13, CNOT23, krons(H, H, X), krons(q1, q2, q3))
print(GHZ3)

출력 결과
[ 0.70710678  0.          0.          0.          0.          0.
  0.         -0.70710678]

얽힌!

끝에



Python 라이브러리의 Numpy를 사용하여 행렬식으로 3 양자 비트 GHZ를 계산할 수있었습니다.
오로지 GHZ를 하고 있습니다만, 여기가 양자 비트의 본질이 아닌 것도 중대히 알고 있으므로, 앞으로도 공부를 계속해 양자 엔지니어 목표로 합니다!

좋은 웹페이지 즐겨찾기