3 양자 비트에서의 GHZ 상태를 행렬 계산해 보았다 (with Python)
속편입니다.
혼란스러워질 것 같아서 타이틀 바꾸었습니다. (아직 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를 하고 있습니다만, 여기가 양자 비트의 본질이 아닌 것도 중대히 알고 있으므로, 앞으로도 공부를 계속해 양자 엔지니어 목표로 합니다!
Reference
이 문제에 관하여(3 양자 비트에서의 GHZ 상태를 행렬 계산해 보았다 (with Python)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/m_rafa0110/items/b540786ab2332f218854
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
아래 그림은 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를 하고 있습니다만, 여기가 양자 비트의 본질이 아닌 것도 중대히 알고 있으므로, 앞으로도 공부를 계속해 양자 엔지니어 목표로 합니다!
Reference
이 문제에 관하여(3 양자 비트에서의 GHZ 상태를 행렬 계산해 보았다 (with Python)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/m_rafa0110/items/b540786ab2332f218854
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
$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를 하고 있습니다만, 여기가 양자 비트의 본질이 아닌 것도 중대히 알고 있으므로, 앞으로도 공부를 계속해 양자 엔지니어 목표로 합니다!
Reference
이 문제에 관하여(3 양자 비트에서의 GHZ 상태를 행렬 계산해 보았다 (with Python)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/m_rafa0110/items/b540786ab2332f218854
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
\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}
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를 하고 있습니다만, 여기가 양자 비트의 본질이 아닌 것도 중대히 알고 있으므로, 앞으로도 공부를 계속해 양자 엔지니어 목표로 합니다!
Reference
이 문제에 관하여(3 양자 비트에서의 GHZ 상태를 행렬 계산해 보았다 (with Python)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/m_rafa0110/items/b540786ab2332f218854
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
Reference
이 문제에 관하여(3 양자 비트에서의 GHZ 상태를 행렬 계산해 보았다 (with Python)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/m_rafa0110/items/b540786ab2332f218854텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)