たのしい工学

プログラミングを学んで、モノをつくりたいひと、効率的に仕事をしたい人のための硬派なブログになりました

【Python】量子ゲート方式と量子プログラミング

   

今回は量子ゲート方式の量子コンピュータで量子アルゴリズムを実装するための量子プログラミングについてです。

pythonの量子計算ライブラリqiskitを利用すると量子プログラムは下記のように書くことができます。


from qiskit import * 
q = QuantumRegister(1) #1つの 量子 レジスタqの 生成 
c = ClassicalRegister(1) #1つの 古典 的 レジスタcの 生成 
qc = QuantumCircuit(q, c) #量子 回路 qcの 生成 

★

qc.measure(q, c) #量子 レジスタqを 測 定 して 古典 的 レジスタcに 入 れる 
#量子 回路 を 実 行 し、 結 果 rに 代入 する
#Use Aer's qasm_simulator
backend_sim = BasicAer.get_backend('qasm_simulator')
r = execute(qc, backend_sim, shots=100).result()
#量子 回路 名 cnの 量子 プログラムの 実 行 結 果 rからカウント 結 果 取得 し 表示 する
print(r.get_counts()) 

上記を実行すると、量子レジスタビットの初期の値|0>が得られます

量子計算によって、特定の問題を解くためには、アルゴリズムを準備する必要があります。では、どうやって量子計算用のアルゴリズムをつくるのかというと、上記のプログラムの★のところに量子ゲートを実装します。このように、量子ゲートによってアルゴリズムを構成することが可能なのが量子ゲート式の量子コンピュータです。これは2019年10月23日にGoogleがNatureの論文で発表した量子超越性の計算に用いられた方式でもあります。量子コンピュータには、すでに商用化されているものがありますが、それは量子アニーリング式とよばれるしくみのものです。
量子アニーリング式についてはこちらの記事からどうぞ
【量子コンピュータの仕組み】量子ゲート型と量子アニーリング型

pythonコードで使用する基本的な量子ゲートには、つぎの4つのゲートがあります。

そして、これらは、ユニタリ演算子Uであり、つぎのようにユニタリ行列で定義できます。そして、量子ゲートX、Y、Zはパウリ演算子と呼ばれます。

恒等演算 iden(q)
量子ビットqに恒等演算を加える

Id=[]

ビット反転演算x(q)
量子ビットqにビット反転演算Xを加える

位相反転演算 z(q)
量子ビットqに位相反転演算Zを加える

位相・ビット反転演算 y(q)
量子ビットqに位相・ビット反転演算Yを加える

では、以降でこれらの量子ゲートのおこなう演算を解説してしていきましょう。

ビット反転演算X


from qiskit import * 
q = QuantumRegister(1) #1つの 量子 レジスタqの 生成 
c = ClassicalRegister(1) #1つの 古典 的 レジスタcの 生成 
qc = QuantumCircuit(q, c) #量子 回路 qcの 生成 

# 量子ゲート(ビット反転演算操作)
qc.x(q[0])

qc.measure(q, c) #量子 レジスタqを 測 定 して 古典 的 レジスタcに 入 れる 
#量子 回路 を 実 行 し、 結 果 rに 代入 する
#Use Aer's qasm_simulator
backend_sim = BasicAer.get_backend('qasm_simulator')
r = execute(qc, backend_sim, shots=100).result()
#量子 回路 名 cnの 量子 プログラムの 実 行 結 果 rからカウント 結 果 取得 し 表示 する
print(r.get_counts()) 

上記を実行すると、量子レジスタビットの初期の値|0>を判定した値 |1>が得られます

位相反転演算Z

実装コードはこちら


## 位相反転演算
from qiskit import * 
from qiskit.tools.visualization import plot_histogram
q = QuantumRegister(1) #1つの 量子 レジスタqの 生成 
c = ClassicalRegister(1) #1つの 古典 的 レジスタcの 生成 
qc = QuantumCircuit(q, c) #量子 回路 qcの 生成 
qc.x(q[0]) # 量子状態|1>の生成
qc.z(q[0]) 
qc.measure(q, c) #量子 レジスタqを 測 定 して 古典 的 レジスタcに 入 れる 
#量子 回路 を 実 行 し、 結 果 rに 代入 する
# Use Aer's qasm_simulator
backend_sim = BasicAer.get_backend('qasm_simulator')
r = execute(qc, backend_sim, shots=100).result()
#量子 回路 名 cnの 量子 プログラムの 実 行 結 果 rからカウント 結 果 取得 し 表示 する
rc = r.get_counts()
print(rc)
plot_histogram(rc)

量子レジスタビットに量子状態|1>を生成し、それに対して、位相反転演算をほどこしていますが、上記を実行すると測定結果は|1>の状態が100%観測されていることがわかります。

つまり、これは、古典的ビットの観測では、マイナスの位相は実行結果にはあらわれないことを意味します。

位相ビット反転演算Y


## 位相ビット反転演算
from qiskit import * 
from qiskit.tools.visualization import plot_histogram
q = QuantumRegister(1) #1つの 量子 レジスタqの 生成 
c = ClassicalRegister(1) #1つの 古典 的 レジスタcの 生成 
qc = QuantumCircuit(q, c) #量子 回路 qcの 生成 
qc.y(q[0]) 
qc.measure(q, c) #量子 レジスタqを 測 定 して 古典 的 レジスタcに 入 れる 
#量子 回路 を 実 行 し、 結 果 rに 代入 する
# Use Aer's qasm_simulator
backend_sim = BasicAer.get_backend('qasm_simulator')
r = execute(qc, backend_sim, shots=100).result()
#量子 回路 名 cnの 量子 プログラムの 実 行 結 果 rからカウント 結 果 取得 し 表示 する
rc = r.get_counts()
print(rc)
plot_histogram(rc)

量子ビットのブロッホ球モデルのy軸のまわりに角度πだけ回転させる演算です

上記を実行して得られる結果は、'1'が100%です。量子レジスタビットの状態|0>に対して、位相ビット反転演算を実行すると、Y|0>=i|1>となりますが、虚数は位相因子を表し、測定できない量であり無視ができます。そのため1が100%観測されます。

古典計算とのハイブリッド


# 乱数生成による量子ゲート選択

from qiskit import * 
from qiskit.tools.visualization import plot_histogram
from numpy.random import *

q = QuantumRegister(1) #1つの 量子 レジスタqの 生成 
c = ClassicalRegister(1) #1つの 古典 的 レジスタcの 生成 
qc = QuantumCircuit(q, c) #量子 回路 qcの 生成 

if rand()>0.5:
    qc.x(q[0])

qc.measure(q, c) #量子 レジスタqを 測 定 して 古典 的 レジスタcに 入 れる 
#量子 回路 を 実 行 し、 結 果 rに 代入 する
# Use Aer's qasm_simulator
backend_sim = BasicAer.get_backend('qasm_simulator')
r = execute(qc, backend_sim, shots=100).result()
#量子 回路 名 cnの 量子 プログラムの 実 行 結 果 rからカウント 結 果 取得 し 表示 する
rc = r.get_counts()
print(rc)
plot_histogram(rc)

## この計算結果は、{'0':100}のときもあれば{'1':100}のときもあり、乱数でビット反転演算Xの量子ゲートが選択されていることがわかります。

今回はここまでです

 - 量子コンピュータ