はじめに
今回は勉強会を毎回しているのですが、その資料をいつでも見返せるようにこちらに掲載します。
IBMQとは?
IBMが提供する量子コンピュータのプラットフォームです。全世界で利用されています。今回はそのツールのQiskitを使ってみたいと思います。
語と入手方法
入手方法は簡単です。Pytonという言語を用意し、実行環境を整えます。pipというパッケージ導入をしておいて、
!pip3 install qiskit
で完了いたします。
早速書いてみる
早速python環境を立ち上げて書いてみましょう。量子コンピュータでは、
1、初期化
2、回路をかく
3、測定をする
の3ステップで行います。今回は重ね合わせという0と1が50%ずつで重なった回路を見てみたいと思います。
回路
今回の回路は、
0----H----M
0からスタートし、Hゲートを適用し、Measurement(測定)をします。この3ステップだけです。まずはコピペでやってみましょう。インストールがうまくいかない人はあとで見返してゆっくりやってみてください。
まずはサンプリング
サンプリングは実機に近い形での実行です。今回はシミュレータを使います。使うシミュレータもqiskitに用意されています。
#まずはツールを読み込みます
from qiskit import *
from qiskit import Aer
#シミュレータを指定
backend = Aer.get_backend('qasm_simulator')
#回路を準備
circ = QuantumCircuit(1,1)
#ためしにアダマールゲートをかけて見る
circ.h(0)
#測定を設置する必要があります
circ.measure(range(1),range(1))
#ジョブの実行
job = execute(circ, backend, shots=1024)
#結果を取り出します
result = job.result()
#結果のオブジェクトからカウントを取り出します
counts = result.get_counts(circ)
#カウントを表示
print(counts)
{'0': 492, '1': 532}
こうなります。
{'0': 492, '1': 532}
0と1が半々で出ました。
次に状態ベクトル
状態ベクトルと呼ばれるシミュレータでしかとれないベクトルを取得してみます。
#まずはツールを読み込みます
from qiskit import *
from qiskit import Aer
#今回バックエンドのシミュレータはstatevector_simulatorにします
backend = Aer.get_backend('statevector_simulator')
#回路を準備
circ = QuantumCircuit(1)
#ためしにアダマールゲートをかけて見る
circ.h(0)
#ジョブの実行
job = execute(circ, backend)
#計算結果の取り出しと状態ベクトルの表示
result = job.result()
outputstate = result.get_statevector(circ, decimals=3)
print(outputstate)
[0.70710678+0.j 0.70710678+0.j]
こちらは0が出る確率が0.707*0.707=0.5、1が出る確率も同様となりました。
[0.707+0.j 0.707+0.j]
次に量子もつれ回路
#まずはツールを読み込みます
from qiskit import *
from qiskit import Aer
#シミュレータを指定
backend = Aer.get_backend('qasm_simulator')
#回路を準備
circ = QuantumCircuit(2,2)
#ためしにアダマールゲートをかけて見る
circ.h(0)
circ.cx(0,1)
#測定を設置する必要があります
circ.measure(range(2),range(2))
#ジョブの実行
job = execute(circ, backend, shots=1024)
#結果を取り出します
result = job.result()
#結果のオブジェクトからカウントを取り出します
counts = result.get_counts(circ)
#カウントを表示
print(counts)
{'00': 496, '11': 528}
こうなりました。00と11だけが出て、01と10が出ないのがもつれ回路です。作り方によって数を変えることができます。
{'00': 528, '11': 496}
足し算回路
4量子ビット使って足し算回路を作ります。まずは0+1=1をやってみます。1はXゲートを適用することで作れます。
0---*--*---
0-X-*--|-*-
| | |
0---|--X-X-M
0---X------M
#まずはツールを読み込みます
from qiskit import *
from qiskit import Aer
#シミュレータを指定
backend = Aer.get_backend('qasm_simulator')
#回路を準備
circ = QuantumCircuit(4,4)
#ためしにアダマールゲートをかけて見る
circ.x(1)
circ.ccx(0,1,3)
circ.cx(0,2)
circ.cx(1,2)
#測定を設置する必要があります
circ.measure(range(4),range(4))
#ジョブの実行
job = execute(circ, backend, shots=1024)
#結果を取り出します
result = job.result()
#結果のオブジェクトからカウントを取り出します
counts = result.get_counts(circ)
#カウントを表示
print(counts)
{'0110': 1024}
実行結果は、
{'0110': 1024}
こうなりました。
量子もつれで足し算
入力の方に両方Hゲートを入れてみます。
0-H-*--*---
0-H-*--|-*-
| | |
0---|--X-X-M
0---X------M
#まずはツールを読み込みます
from qiskit import *
from qiskit import Aer
#シミュレータを指定
backend = Aer.get_backend('qasm_simulator')
#回路を準備
circ = QuantumCircuit(4,4)
#ためしにアダマールゲートをかけて見る
circ.h(0)
circ.h(1)
circ.ccx(0,1,3)
circ.cx(0,2)
circ.cx(1,2)
#測定を設置する必要があります
circ.measure(range(4),range(4))
#ジョブの実行
job = execute(circ, backend, shots=1024)
#結果を取り出します
result = job.result()
#結果のオブジェクトからカウントを取り出します
counts = result.get_counts(circ)
#カウントを表示
print(counts)
{'0000': 254, '0101': 248, '0110': 245, '1011': 277}
答えは、
{'0000': 266, '0110': 251, '0101': 250, '1011': 257}
全ての足し算が1つの回路で表現できました。
今回はこれで
まずは簡単な使い方を見てみました。応用的なものは上記のもので色々な回路を試してみて作ってみましょう。