common.title
Cloud support

Nobisuke

Dekisugi

RAG


autoQAOA
RAG for dev
Fortune telling app
Annealing
DEEPSCORE
Translation

Overview
Service 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(2cos1l/n)RY(2cos^{-1}\sqrt{l/n})

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

SCS2,1SCS_{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})

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

U3,1=>SCS3,1+SCS2,1U_{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})

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

U3,2=>SCS3,2+SCS2,1U_{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})

できました!完璧です!

© 2024, blueqat Inc. All rights reserved