common.title

Docs
Quantum Circuit
TYTAN CLOUD

QUANTUM GAMING


Desktop RAG

Overview
Terms of service

Privacy policy

Contact
Research

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