1
0

More than 1 year has passed since last update.

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

Last updated at Posted at 2022-02-19
  1. はじめに 参考文献2)では,2ビット,3ビットのグローバのアルゴリズムが紹介されている.本報告では,アルゴリズムの中核となる拡散変換について説明するとともに,4ビットの場合(拡張は可能)についてプログラムを作成したので報告する.

2.問題設定
1)4ビットのグローバアルゴリズムプログラムの作成
・拡散変換の明確化
2)解析システム
  RaspberryPi4+Python+QISkit
3. 拡散変換
参考文献1),3)他を参考にして纏めておく.
1)目的
 図1に拡散変換の動作を参考文献1)より引用して示す.目的は,入力データを平均値を中心に反転させるものである.
image.png
        図1 拡散変換の動作
2)定義
 下式により定義されている.
  image.png
まず,上式を簡略化するため下式を用いて第2項を変形する.
image.png
image.png
したがって,拡散変換式は下記となる.
image.png

(3)QISkitによる実装
 図2に拡散変換のブロック図を示す.
image.png
         図2 拡散変換のブロック図

 CtrlZは入力が|11>のとき,位相をは暗転(-1)させるもので下記で定義される.
image.png
入力を反転(X)後CtrlZを作用させると下記となる.
image.png
拡散変換の定義を実現している.
(4)反転増幅の確認
 入力データは,CtrlZにより探索対象データの位相を反転させ位相反転回路に加えられる.
image.png
データの確率は,下記のように増幅される.
非探索対象データ
image.png
探索対象データ
image.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
            図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
        図4 探索対象|1111>,|0011>の計算結果

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0