common.title

Docs
Quantum Circuit
TYTAN CLOUD

QUANTUM GAMING


Overview
Contact
Event
Project
Research

Terms of service (Web service)

Terms of service (Quantum and ML Cloud service)

Privacy policy


Sign in
Sign up
common.title

001,010,100の量子もつれや0001,0010,0100,1000の量子もつれを作る

Yuichiro Minato

2021/01/22 05:27

はじめに

量子もつれは大事ですのでみてみます。

2量子ビット

こちらは基本ですね。

from blueqat import Circuit
Circuit().h[0].cx[0,1].m[:].run(shots=100)
#Counter({'00': 54, '11': 46})
Counter({'11': 42, '00': 58})

00と11のもつれになりました。片方にXをかけると、

Circuit().h[0].cx[0,1].x[0].m[:].run(shots=100)
#Counter({'01': 54, '10': 46})
Counter({'01': 58, '10': 42})

001,010,100のもつれ

こちらは確率振幅を\frac{1}{\sqrt{3}}を作ることを目指します。今回作りたいのは、

001
010
100

のもつれ

Ry(\theta) = \begin{bmatrix} \cos\left(\frac{\theta}{2}\right) & -\sin\left(\frac{\theta}{2}\right)\\ \sin\left(\frac{\theta}{2}\right) & \cos\left(\frac{\theta}{2}\right) \end{bmatrix}

これを利用します。

初期状態の

\begin{bmatrix} 1\\ 0 \end{bmatrix}

をRyゲートを使って回転させると、

\begin{bmatrix} \cos\left(\frac{\theta}{2}\right) & -\sin\left(\frac{\theta}{2}\right)\\ \sin\left(\frac{\theta}{2}\right) & \cos\left(\frac{\theta}{2}\right) \end{bmatrix} \begin{bmatrix} 1\\ 0 \end{bmatrix} = \begin{bmatrix} \cos\left(\frac{\theta}{2}\right)\\ \sin\left(\frac{\theta}{2}\right) \end{bmatrix}

|0>の確率振幅を\frac{1}{\sqrt{3}}にするには、

\cos\left(\frac{\theta}{2}\right) = \frac{1}{\sqrt{3}}

これは、

arccos(\frac{1}{\sqrt{3}})

を計算すればよく、numpyを使って、

import numpy as np
np.arccos(1/np.sqrt(3))
#0.9553166181245092
0.9553166181245092

出ました。そこで、Ryゲートには、この倍の角度を適用すればよく、

Circuit().ry(0.9553166181245092*2)[0].run()
#array([0.57735027+0.j, 0.81649658+0.j])
array([0.57735027+0.j, 0.81649658+0.j])

できました。

1/np.sqrt(3)

#0.5773502691896258
0.5773502691896258

いい感じです。あとは、残りの確率振幅を等分すればいいので、

np.arccos(1/np.sqrt(2))
#0.7853981633974484
0.7853981633974484

を使って、

Circuit().ry(0.9553166181245092*2)[0].cry(0.7853981633974484*2)[0,1].run()
#array([0.57735027+0.j, 0.57735027+0.j, 0.        +0.j, 0.57735027+0.j])
array([0.57735027+0.j, 0.57735027+0.j, 0.        +0.j, 0.57735027+0.j])

できました。

Circuit().ry(0.9553166181245092*2)[0].cry(0.7853981633974484*2)[0,1].m[:].run(shots=100)
#Counter({'00': 36, '10': 32, '11': 32})
Counter({'00': 41, '10': 31, '11': 28})

この回路に3量子ビット目を追加してみます。

Circuit(3).ry(0.9553166181245092*2)[0].cry(0.7853981633974484*2)[0,1].m[:].run(shots=100)
#Counter({'000': 32, '100': 28, '110': 40})
Counter({'110': 34, '100': 36, '000': 30})

あとはこれを調整してみますが、

Circuit(3).ry(0.9553166181245092*2)[0].cry(0.7853981633974484*2)[0,1].x[2].cx[0, 2].cx[1, 0].m[:].run(shots=100)
#Counter({'001': 33, '010': 38, '100': 29})
Counter({'001': 35, '010': 36, '100': 29})

でできます。

000
100
110

の状態から、x[2]で、

001
101
111

cx[0,2]で、

001
100
110

cx[1,0]で、

001
100
010

となって無事できました。

0001,0010,0100,1000のもつれ

続いてこの調子で。まずは2量子ビットを使って、00,01,10,11のもつれを

Circuit().h[0,1].m[:].run(shots=100)
#Counter({'00': 22, '01': 28, '10': 25, '11': 25})
Counter({'11': 25, '10': 19, '01': 28, '00': 28})

これにより、

00
01
10
11

ができます。ここにさらに2量子ビット付けます。

Circuit(4).h[0,1].m[:].run(shots=100)
#Counter({'0000': 17, '0100': 35, '1000': 28, '1100': 20})
Counter({'0100': 29, '0000': 29, '1000': 18, '1100': 24})
0000
0100
1000
1100

続いて、一番最後にXかけて、

0001
0101
1001
1101

二番目をコントロールビットにして四番目CX

0001
0100
1001
1100

一番目をコントロールビットにして四番目CX

0001
0100
1000
1101

一番目と二番目をコントロールビットにして三番目CCX

0001
0100
1000
1111

あとは三番目をコントロールビットにして順番に1、2、4をCXして

0001
0100
1000
0010

できました!

Circuit().h[0,1].x[3].cx[1,3].cx[0,3].ccx[0,1,2].cx[2,0].cx[2,1].cx[2,3].m[:].run(shots=100)
#Counter({'0001': 27, '0010': 28, '0100': 27, '1000': 18})
Counter({'0001': 17, '1000': 29, '0010': 19, '0100': 35})

いい量子コンピュータライフを!

© 2025, blueqat Inc. All rights reserved