Magicode logo
Magicode
1
6 min read

量子クリフォード回路 Part 1. パウリ紐演算子とは?

https://cdn.apollon.ai/media/notebox/blob_1GAdTqV

1. はじめに

この記事は量子クリフォード回路の道具箱(下記リンクの1番)についての解説です。
この記事を開いて、状態とはなんじゃらほい、量子力学とはなんじゃらほい?って思った人がいると思います。自分でもぐちゃぐちゃ書いてみたんですか、いかんせん、JJサクライパイセンやEMANパイセンのようにはいかないし、記事の文字数もかなりな事になってしまって、これじゃ埒があかないので、量子力学が全くわかんないよって人は勉強してから戻ってきてください☆。
量子ビット(qubit)とパウリ行列がなにかわかればわかるはずです。。。

2. パウリ行列とは?

パウリ行列とは、(右手座標系の)にあるスピンのz軸方向を上と下とした時のx,y,z,各軸方向のスピンの状態を固有値±1\pm 1 (+は向きが+方向の場合、-は向きが-方向の場合)にもつ行列で以下のような物を言うんですね。
σ0=(1001),σ1=(0110),σ2=(0ii0),σ3=(1001)\sigma_0= \begin{pmatrix} 1& 0\\ 0 & 1 \end{pmatrix}, \sigma_1= \begin{pmatrix} 0& 1\\ 1 & 0 \end{pmatrix}, \sigma_2= \begin{pmatrix} 0& -i\\ i & 0 \end{pmatrix}, \sigma_3= \begin{pmatrix} 1& 0\\ 0 & -1 \end{pmatrix}
ここで、添字1,2,3はx,y,z軸に対応します。
x,y,z軸に平行なスピンの状態をそれぞれ|\rightarrow\rangle (|\leftarrow\rangle), +|+\rangle (|-\rangle), |\uparrow\rangle (|\downarrow\rangle)と置くと(括弧の中の状態はマイナス方向に平行な状態)以下の関係性がなりたちます。まぁ、そう定義したのでとうぜんっちゃ当然ですね。
σ1=1×σ1=1×σ2+=1×+σ2=×1σ3=1×σ3=1×\sigma_1 |\rightarrow\rangle=1\times |\rightarrow\rangle\\ \sigma_1 |\leftarrow\rangle=-1\times |\leftarrow\rangle\\ \sigma_2 |+\rangle=1\times |+\rangle\\ \sigma_2 |-\rangle=-\times |-1\rangle\\ \sigma_3 |\uparrow\rangle=1\times |\uparrow\rangle\\ \sigma_3 |\downarrow\rangle=-1\times |\downarrow\rangle
magicodeさんの素晴らしい所はこれを実際コードにおこして試せちゃう所ですね。さっそくベクトル表示がどんなもんか試してみましょう。
import numpy as np

# Pauli matrices
s1=np.array([[0,1],[1,0]])
s2=np.array([[0,-1j],[1j,0]])
s3=np.array([[1,0],[0,-1]])

print(np.linalg.eig(s1))
print(np.linalg.eig(s2))
print(np.linalg.eig(s3))
と思ったらコードの実行は昔はできたんですけど、もうできなくなってしまったみたいです。。。まぁランダムなコードを実行するのはいくらブラウザがサンドボックス化されてますっていっても怖いよね。ん~でももったいない
でも自分で手を動かしてみるのは大事だと思うのでOnline NumPy Compilerにコピペしてためしてみて!
上記の出力が
(array([ 1., -1.]), array([[ 0.70710678, -0.70710678],
       [ 0.70710678,  0.70710678]]))
(array([ 1.+0.j, -1.+0.j]), array([[-0.        -0.70710678j,  0.70710678+0.j        ],
       [ 0.70710678+0.j        ,  0.        -0.70710678j]]))
(array([ 1., -1.]), array([[1., 0.],
       [0., 1.]]))
と、上記のパウリ行列が見事にz-軸方向の状態を基底として書かれている事がわかりますね。そして、ある一方向に状態が決定(測定)されると、他の方向について不確定になる事がわかります。

3. パウリ紐演算子とは!?

いよいよこの記事の本題ですが、パウリ紐演算子はパウリ行列をテンソル積でつなげた演算子です。 一例を上げれば
σ1σ3σ1σ1\sigma_1\otimes\sigma_3\otimes\sigma_1\otimes\sigma_1
σ2σ0σ3σ3\sigma_2\otimes\sigma_0\otimes\sigma_3\otimes\sigma_3
などがそれです。NN量子ビットの系には一つの量子ビットに対してパ取れるパウリ行列はσ0\sigma_0, σ1\sigma_1, σ2\sigma_2, σ3\sigma_3なので、4×4N4\times4^{N}本のパウリ紐演算子をつくる事ができます。最初の4×4\timesは位相1,1,i,i1,-1,i,-i分からです。位相が必要な理由がY=iXZ=iZXY=iXZ=-iZXNN-量子ビットで作れるパウリ紐演算子を考えた時、パウリ紐演算子同士のかけ算(テンソル積ではなくて行列積)が別なパウリ紐演算子になるようにするためです。つまり、積で閉じているようにしたいわけですね。
また、 I(N)=σ0σ0σ0I^{(\otimes N)} =\sigma_0 \otimes \sigma_0 \otimes \dots \otimes \sigma_0 も有効なパウリ紐演算子です。これはほかのどんな演算子をかけてもそれ自身にうつす紐演算子となります。 さらに
σλ2=I\sigma_\lambda^2=I
import numpy as np

# Pauli matrices
s1=np.array([[0,1],[1,0]])
s2=np.array([[0,-1j],[1j,0]])
s3=np.array([[1,0],[0,-1]])

print(s1@s1)
print(s2@s2)
print(s2@s2)
[[1 0]
 [0 1]]
[[1.+0.j 0.+0.j]
 [0.+0.j 1.+0.j]]
[[1.+0.j 0.+0.j]
 [0.+0.j 1.+0.j]]
という事実をつかえば、パウリ紐演算子にそれ自身を掛けるとI(N)I^{(\otimes N)}になる事がわかります。つまり任意のパウリ紐演算子P{P(N)}\mathcal{P} \in \{ \mathcal{P}^{(\otimes N)}\}に単位元(I(N)I^{(\otimes N)})が存在し、逆元=P=\mathcal{P}も存在し、さらにここでいうかけ算は行列積なので結合法則もなりたつので、パウリ紐演算子はをなす事がわかります。すばらしいですね。

σ1σ2σ0σ3\sigma_1\otimes\sigma_2\otimes\sigma_0\otimes\sigma_3 の行列表示
import numpy as np

# Pauli matrices
s0=np.array([[1,0],[0,1]])
s1=np.array([[0,1],[1,0]])
s2=np.array([[0,-1j],[1j,0]])
s3=np.array([[1,0],[0,-1]])

print(np.real(np.kron(np.kron(np.kron(s1,s2),s0),s3)))
print(np.imag(np.kron(np.kron(np.kron(s1,s2),s0),s3)))
print(np.kron(np.kron(np.kron(s0,s0),s0),s0))
print(np.real(np.kron(np.kron(np.kron(s1,s2),s0),s3)@np.kron(np.kron(np.kron(s1,s2),s0),s3)))
print(np.imag(np.kron(np.kron(np.kron(s1,s2),s0),s3)@np.kron(np.kron(np.kron(s1,s2),s0),s3)))

4. おわりに。

まぁぐちゃぐちゃ書きましたが、パウリ紐演算子ってのはパウリ行列のテンソル積であらわされる演算子で、群をなすよって事です。これの何がいいのって思ってる人もいるかもしれませんが、群である事やパウリ行列のテンソル積である事が後々量子コンピュータを古典的にシミュレートする上で効いてきます。乞御期待!

Discussion

コメントにはログインが必要です。