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

[レビュー&実装]確定的Dicke状態のSCS量子回路をblueqatSDKで実装

Yuichiro Minato

2022/11/07 02:42

Dicke状態生成について実際に量子回路を作ってみます。
前回の記事はこちらです。

https://blueqat.com/yuichiro_minato2/850cb9fd-5f84-49ce-b099-71a2346914fc

使う論文は、

https://arxiv.org/pdf/1904.07358.pdf

まずは01の古典ビットから01/10のDicke状態を作ってみたいと思います。

回路はCXとCRYを使うそうですが、角度は、

RY(2cos^{-1}\sqrt{l/n})

のようです。blueqatに生存していたnumpyバックエンドを使います。(22/11/7現在TNバックエンドにCRYの実装を忘れていました)

SCS_{2,1}

|0> -----C--RY--C--
         |  |   |
|0> --X--X--C---X--
from blueqat import Circuit
import numpy as np

l=1
n=2

circ = Circuit(2).x[1].cx[0,1].cry(2*np.arccos(np.sqrt(l/n)))[1,0].cx[0,1]
circ.run(backend="numpy")
array([0.        +0.j, 0.70710678+0.j, 0.70710678+0.j, 0.        +0.j])
circ.m[:].run(backend="numpy",shots=1000)
Counter({'10': 530, '01': 470})

できました!もっと大きいのやります。

U_{3,1} => SCS_{3,1} + SCS_{2,1}

|001> + |010> + |100>

|0> ---------------C--RY--C--
                   |  |   |
|0> -----C--RY--C--X--C---X--
         |  |   |
|0> --X--X--C---X------------
circ2 = Circuit(3).x[2].cx[1,2].cry(2*np.arccos(np.sqrt(1/3)))[2,1].cx[1,2].cx[0,1].cry(2*np.arccos(np.sqrt(1/2)))[1,0].cx[0,1]
circ2.run(backend="numpy")
array([0.        +0.j, 0.57735027+0.j, 0.57735027+0.j, 0.        +0.j,
       0.57735027+0.j, 0.        +0.j, 0.        +0.j, 0.        +0.j])
circ2.m[:].run(backend="numpy",shots=1000)
Counter({'100': 360, '001': 299, '010': 341})

せっかくなのでU_{3,2}をやってみます。

U_{3,2} => SCS_{3,2} + SCS_{2,1}

|011> + |110> + |101>

|0> ---------------C--RY--C--C--RY--C--
                   |  |   |  |  |   |
|0> --X--C--RY--C--|--C---|--X--C---X--
         |  |   |  |  |   |
|0> --X--X--C---X--X--C---X------

CCRYを準備できてないので、CCRY = RY(theta)-CCX-RY(-theta)-CCXを使います。

https://qiita.com/gyu-don/items/7c52c0d20f9998022803

circ3 = Circuit(3).x[1,2].cx[1,2].cry(2*np.arccos(np.sqrt(1/3)))[2,1].cx[1,2].cx[0,2].ry(np.arccos(np.sqrt(2/3)))[0].ccx[2,1,0].ry(-np.arccos(np.sqrt(2/3)))[0].ccx[2,1,0].cx[0,2].cx[0,1].cry(2*np.arccos(np.sqrt(1/2)))[1,0].cx[0,1]
circ3.run(backend="numpy")
array([0.        +0.j, 0.        +0.j, 0.        +0.j, 0.57735027+0.j,
       0.        +0.j, 0.57735027+0.j, 0.57735027+0.j, 0.        +0.j])
circ3.m[:].run(backend="numpy",shots=1000)
Counter({'101': 314, '011': 339, '110': 347})

できました!完璧です!

© 2025, blueqat Inc. All rights reserved