QISkit 4ビットグローバアルゴリズム

1. はじめに
参考文献2)では，2ビット，3ビットのグローバのアルゴリズムが紹介されている．本報告では，アルゴリズムの中核となる拡散変換について説明するとともに，４ビットの場合（拡張は可能）についてプログラムを作成したので報告する．
 
2.問題設定
1)４ビットのグローバアルゴリズムプログラムの作成
･拡散変換の明確化
2)解析システム
　　RaspberryPi4＋Python＋QISkit
3. 拡散変換
参考文献1),3)他を参考にして纏めておく．
1)目的
　図1に拡散変換の動作を参考文献1)より引用して示す．目的は，入力データを平均値を中心に反転させるものである．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2010670/59308344-45be-8a80-f66d-56a010e099dc.png)
　　　　　　　　図1　拡散変換の動作
2)定義
　下式により定義されている．
　　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2010670/0f3810d5-07e1-2731-34aa-f59a2afd4815.png)
まず，上式を簡略化するため下式を用いて第2項を変形する．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2010670/7fd19adb-b1a3-3fab-39cb-5e576b735fa3.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2010670/fc1de8fe-1750-4e85-5b40-a679850d09d3.png)
したがって，拡散変換式は下記となる．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2010670/60f9df0a-6eab-0ce0-0894-a9e1dc0ddb76.png)

(3)QISkitによる実装
　図2に拡散変換のブロック図を示す．
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2010670/04a960cd-e8ab-3317-b474-4d520232c64f.png)
　　　　　　　　　図2 拡散変換のブロック図

　CtrlZは入力が|11>のとき，位相をは暗転(-1)させるもので下記で定義される．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2010670/77509112-7bd9-313a-9d05-726094181394.png)
入力を反転(X)後CtrlZを作用させると下記となる．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2010670/9f9a72e7-0cf9-9b2a-55bf-8e718caa22a0.png)
拡散変換の定義を実現している．
(4)反転増幅の確認
　入力データは，CtrlZにより探索対象データの位相を反転させ位相反転回路に加えられる．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2010670/ac6a00d7-b32c-1c17-caff-d390cc258304.png)
データの確率は，下記のように増幅される．
非探索対象データ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2010670/aff3104e-a80a-2799-3a7f-064b4de8a285.png)
探索対象データ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2010670/ba53a1a3-7dff-39fc-ab5e-e49449196823.png)

3.4BITグローバアルゴリズムのプログラムの実装と説明
QISkitによる実装プログラムは下記の通り．
(1)ライブラリのインポート
from qiskit import *
from qiskit.tools.visualization import *
from qiskit.circuit.library.standard_gates import ZGate
(2)ccz変換
　4bit変換を可能にするためZGate().control(n)を使用する．ビット長はnにより変えることができる．
def ccz(qci,q0,q1,q2,q3)
qci.append(ZGate().control(3),[q[0],q[1],q[2],q[3]])
(3)グローバアルゴリズムの実行
def grover(qci,qO,q1,q2,q3):
    # marking target
　|1111>が探索対象の場合
    ccz(qci,q0,q1,q2,q3)
　拡散変換
    for i in [q0,q1,q2,q3]:
        qci.h(i)
        qci.x(i)
    ccz(qci,qO,q1,q2,q3)
    for i in [qO,q1,q2,q3]:
        qci.x(i)
        qci.h(i)
(3)レジスタ設定
bn= 4 
q = QuantumRegister(bn)
c = ClassicalRegister(bn)
qc = QuantumCircuit(q, c)
for i in range(bn):
    qc.h(q[i])
grover(qc,q[0],q[1],q[2],q[3])
(4)シミュレーション実行
for i in range(bn):
    qc.measure(q[bn-1-i],c[i])
backend_sim = Aer.get_backend('aer_simulator')#("qasm_simulator")
r = execute(qc,backend_sim, shots=10000).result()
rc = r.get_counts()
plt=plot_histogram (rc,figsize = (12,7))
plt.show()

シミュレーショ結果を図3に示す．計算結果と一致している．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2010670/409e36ec-b17e-26fe-0327-745375f29d1d.png)
　　　　　　　　　　　　図3 シミュレーション結果
[参考]
コメントのない実行ファイルを添付しておきます．
探索対象データは|1111>と|0011>である．結果を図4に示す．

```
from qiskit import *
from qiskit.tools.visualization import *
from qiskit.circuit.library.standard_gates import ZGate
def ccz(qci,q0,q1,q2,q3):
    qci.append(ZGate().control(3),[q[0],q[1],q[2],q[3]])   
def grover(qci,q0,q1,q2,q3):
    # marking target
    ccz(qci,q0,q1,q2,q3)
    qci.x(q0)
    qci.x(q1)    
    ccz(qci,q0,q1,q2,q3)
    qci.x(q1)
    qci.x(q0)
    for i in [q0,q1,q2,q3]:
        qci.h(i)
        qci.x(i)
    ccz(qci,q0,q1,q2,q3)
    for i in [q0,q1,q2,q3]:
        qci.x(i)
        qci.h(i)
bn= 4
q = QuantumRegister(bn)
c = ClassicalRegister(bn)
qc = QuantumCircuit(q, c)
for i in range(bn):
    qc.h(q[i])
grover(qc,q[0],q[1],q[2],q[3])
for i in range(bn):
    qc.measure(q[bn-1-i],c[i])
backend_sim = Aer.get_backend('aer_simulator')#("qasm_simulator")
r = execute(qc,backend_sim, shots=10000).result()
rc = r.get_counts()
plt=plot_histogram (rc,figsize = (12,7))
plt.show()
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2010670/5bf64bf8-04ac-cc62-01a2-ff58285f45b6.png)
　　　　　　　　図4　探索対象|1111>，|0011>の計算結果