1
0

More than 1 year has passed since last update.

QISkit ドイチ・ジョサのアルゴリズム

Last updated at Posted at 2022-02-28
  1. はじめに
    参考文献2)では,2ビットのドイチ・ジョサのアルゴリズムが紹介されている.本報告では,アルゴリズムの定式化について説明するとともに,4ビットの場合(拡張は可能)についてプログラムを作成したので報告する.

2.問題設定
1)ドイチ・ジョサのアルゴリズムの定式化
2)2ビット,4ビットのドイチ・ジョサのアルゴリズムの作成
3)解析システム
  RaspberryPi4+Python+QISkit
3. ドイチ・ジョサのアルゴリズム
参考文献1),2),3)他を参考にして纏めておく.
3.1目的
ビット列を入力として受け取り,0 または1のいずれかを返す以下のようなブール関数fがあるとき,
f({x0,x1,x2,...})→0または1(ここで,xnは0または1)
このブール関数の特性は,分布型か定値型かのどちらかである.定値型の場合は,任意の入力に対してすべて0またはすべて1を返しますが,分布型の場合は、半分の入力に対して0を返し、残りの半分の入力には1を返します.問題は,与えられた関数が分布型か定値型かを判断することである.
ドイチ-ジョサ問題は、1ビットであるドイチ問題のnビットへの拡張である.
3.1 定式化
ドイチ-ジョサのアルゴリズムの一般的な回路を図1に示す.
image.png

     図1 ドイチ-ジョサのアルゴリズムの一般的な回路

 ステップ1,2,3での出力を,ψ1,ψ2,ψ3とする.
 ステップ1出力はステップ0をH変換の公式を利用して変換すると下記となる.
    image.png
 ステップ2出力はステップ1出力にオラクルを加えると下記となる.
   image.png
 ステップ3出力はステップ2出力をアダマール変換し下記となる.
   image.png
 最後の式変形の参考に2ビットの場合の変形例を下記に示しておく.
   image.png

3.2 計算例2ビット
 3.1の計算例として2ビットの場合を下記に示しておく.
  image.png
4. QISkitによるプログラム作成
 2ビットのドイチ・ジョサのアルゴリズムは下記の通り.
(1)ライブラリのインポート
import numpy as np
from qiskit import IBMQ, Aer
from qiskit.providers.ibmq import least_busy
from qiskit import QuantumCircuit, assemble, transpile
from qiskit.visualization import plot_histogram
(2)オラクル作成
 与えられたb_strに従って制御not回路(cx)を構成.

def dj_oracle(n, b_str):
oracle_qc = QuantumCircuit(n+1)
print(b_str)
for qubit in range(len(b_str)):
print("str=",b_str[qubit])
if b_str[n-1-qubit] == '1':
oracle_qc.cx(qubit, n)
print(oracle_qc.draw())
oracle_gate = oracle_qc.to_gate()
oracle_gate.name = "Oracle" # To show when we display the circuit
return oracle_gate
(3)ドイチ・ジョサのアルゴリズムの実行
def dj_algorithm(oracle, n):
dj_circuit = QuantumCircuit(n+1, n)
# Set up the output qubit:
dj_circuit.x(n)
dj_circuit.h(n)
# And set up the input register:
for qubit in range(n):
dj_circuit.h(qubit)
# Let's append the oracle gate to our circuit:
dj_circuit.append(oracle, range(n+1))
# Finally, perform the H-gates again:
for qubit in range(n):
dj_circuit.h(qubit)
return dj_circuit
(4)メイン部
 nは変更可能
n = 2
  オラクル設定
oracle_gate = dj_oracle(n, "10")
dj_circuit = dj_algorithm(oracle_gate, n)
print(dj_circuit.draw())
(5)シミュレーション実行
for i in range(n):
dj_circuit.measure(i, i)

aer_sim = Aer.get_backend('aer_simulator')
transpiled_dj_circuit = transpile(dj_circuit, aer_sim)
qobj = assemble(transpiled_dj_circuit)
results = aer_sim.run(qobj).result()
answer = results.get_counts()
fig=plot_histogram(answer)
fig.show()
 図2に計算結果を示す.
image.png
    図2 2ビットのドイチ・ジョサのアルゴリズム計算結果

[参考]
コメントのない実行ファイル(4ビット)を添付する.

# initialization
import numpy as np
from qiskit import IBMQ, Aer
from qiskit.providers.ibmq import least_busy
from qiskit import QuantumCircuit, assemble, transpile
from qiskit.visualization import plot_histogram

def dj_oracle(n, b_str):
    oracle_qc = QuantumCircuit(n+1)  
    print(b_str)
    
    for qubit in range(len(b_str)):
            print("str=",b_str[qubit])
            if b_str[n-1-qubit] == '1':
                oracle_qc.cx(qubit, n)          
    print(oracle_qc.draw()) 
    
    oracle_gate = oracle_qc.to_gate()
    oracle_gate.name = "Oracle" # To show when we display the circuit
    return oracle_gate

def dj_algorithm(oracle, n):
    dj_circuit = QuantumCircuit(n+1, n)
    # Set up the output qubit:
    dj_circuit.x(n)
    dj_circuit.h(n)
    # And set up the input register:
    for qubit in range(n):
        dj_circuit.h(qubit)
    # Let's append the oracle gate to our circuit:
    dj_circuit.append(oracle, range(n+1))
    # Finally, perform the H-gates again:
    for qubit in range(n):
        dj_circuit.h(qubit)     
    return dj_circuit

n = 4
oracle_gate = dj_oracle(n, "1010")
dj_circuit = dj_algorithm(oracle_gate, n)
print(dj_circuit.draw())

for i in range(n):
    dj_circuit.measure(i, i)
    
aer_sim = Aer.get_backend('aer_simulator')
transpiled_dj_circuit = transpile(dj_circuit, aer_sim)
qobj = assemble(transpiled_dj_circuit)
results = aer_sim.run(qobj).result()
answer = results.get_counts()
fig=plot_histogram(answer,figsize = (12,7))
fig.show()

計算結果を図3に示す.
image.png
      図3 4ビットのドイチ・ジョサのアルゴリズム計算結果

5.おわりに
 ドイチ・ジョサのアルゴリズムの定式化を行うとともに,2bit,4bitデータ対象としたアルゴリズムプログラムを作成した.

参考文献
(1)竹内繁樹:量子コンピュータ(BLUEBACKS)
(2)中山茂:Python量子プログラミング入門(Gaia教育シリーズ8)
(3)Qiskitを使った量子計算の学習:ドイチ-ジョサのアルゴリズム

1
0
1

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