- はじめに
参考文献2)では,2ビット,3ビットのグローバのアルゴリズムが紹介されている.本報告では,アルゴリズムの中核となる拡散変換について説明するとともに,4ビットの場合(拡張は可能)についてプログラムを作成したので報告する.
2.問題設定
1)4ビットのグローバアルゴリズムプログラムの作成
・拡散変換の明確化
2)解析システム
RaspberryPi4+Python+QISkit
3. 拡散変換
参考文献1),3)他を参考にして纏めておく.
1)目的
図1に拡散変換の動作を参考文献1)より引用して示す.目的は,入力データを平均値を中心に反転させるものである.
図1 拡散変換の動作
2)定義
下式により定義されている.
まず,上式を簡略化するため下式を用いて第2項を変形する.
したがって,拡散変換式は下記となる.
(3)QISkitによる実装
図2に拡散変換のブロック図を示す.
図2 拡散変換のブロック図
CtrlZは入力が|11>のとき,位相をは暗転(-1)させるもので下記で定義される.
入力を反転(X)後CtrlZを作用させると下記となる.
拡散変換の定義を実現している.
(4)反転増幅の確認
入力データは,CtrlZにより探索対象データの位相を反転させ位相反転回路に加えられる.
データの確率は,下記のように増幅される.
非探索対象データ
探索対象データ
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に示す.計算結果と一致している.
図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()