概要
- Qiskit について, 学習サイト の サンプルプログラムを動かしてみた.
- 動作環境は, Google Colaboratory で行った
- 実行プログラム, 解説は, 下記の参照サイトをご覧ください
感想
- 本家のサイトの学習教材が非常に詳しいので, 今後も, 時間を見つけて, 確認していこうと思う.
単一量子ビットゲート(練習問題含む)
- 演算(X, H, Z)
- 演算(X, Y, Z)
- 演算(T, X, S, H, Y)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
[編集内容] from qiskit import * from math import pi import numpy as np from qiskit.visualization import plot_bloch_multivector # 量子ビットに対してゲート作用させてみる. qc = QuantumCircuit(1) # X, H, Zゲート作用. qc.x(0) qc.h(0) qc.z(0) # ユニタリ行列に変換. backend = Aer.get_backend('unitary_simulator') unitary = execute(qc,backend).result().get_unitary() # ユニタリ行列表示. print(unitary) # 行列計算チェック. c = 1 / np.sqrt(2) z = np.array([[1, 0],[0, -1]]) h = np.array([[c, c],[c, -c]]) x = np.array([[0, 1],[1, 0]]) zhx = z @ h @ x print(zhx) |
1 2 3 4 5 6 |
[出力結果] [[ 0.70710678+0.00000000e+00j 0.70710678-8.65956056e-17j] [ 0.70710678+1.57009246e-16j -0.70710678+8.65956056e-17j]] [[ 0.70710678 0.70710678] [ 0.70710678 -0.70710678]] ※ 計算結果が一致していると理解できる. |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
[編集内容] from qiskit import * from math import pi import numpy as np from qiskit.visualization import plot_bloch_multivector # 量子ビットに対してゲート作用させてみる. qc = QuantumCircuit(1) # X, Y, Zゲート作用. qc.x(0) qc.y(0) qc.z(0) # ユニタリ行列に変換. backend = Aer.get_backend('unitary_simulator') unitary = execute(qc,backend).result().get_unitary() # ユニタリ行列表示. print(unitary) # 行列計算チェック. z = np.array([[1, 0],[0, -1]]) y = np.array([[0, -1j],[1j, 0]]) x = np.array([[0, 1],[1, 0]]) zyx = z @ y @ x print(zyx) |
1 2 3 4 5 6 |
[出力結果] [[6.123234e-17-1.j 0.000000e+00+0.j] [0.000000e+00+0.j 6.123234e-17-1.j]] [[0.-1.j 0.+0.j] [0.+0.j 0.-1.j]] ※ 計算結果が一致していると理解できる. |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
[編集内容] from qiskit import * from math import pi import numpy as np from qiskit.visualization import plot_bloch_multivector # 量子ビットに対してゲート作用させてみる. qc = QuantumCircuit(1) # T, X, S, H, Yゲート作用. qc.t(0) qc.x(0) qc.s(0) qc.h(0) qc.y(0) # ユニタリ行列に変換. backend = Aer.get_backend('unitary_simulator') unitary = execute(qc,backend).result().get_unitary() # ユニタリ行列表示. print(unitary) # 行列計算チェック. c = 1 / np.sqrt(2) y = np.array([[0, -1j],[1j, 0]]) h = np.array([[c, c],[c, -c]]) s = np.array([[1, 0],[0, 1j]]) x = np.array([[0, 1],[1, 0]]) t = np.array([[1, 0],[0, c + c * 1j]]) yhsxt = y @ h @ s @ x @ t print(yhsxt) |
1 2 3 4 5 6 |
[出力結果] [[-0.70710678-8.65956056e-17j 0.5 -5.00000000e-01j] [-0.70710678-8.65956056e-17j -0.5 +5.00000000e-01j]] [[-0.70710678+0.j 0.5 -0.5j] [-0.70710678+0.j -0.5 +0.5j]] ※ 計算結果が一致していると理解できる. |
複数量子ビットゲート(練習問題含む)
- 演算(CNOT)
- 演算(H, CNOT)
- ベル状態
- ベル状態(続き)
- ベル状態(続き)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
[編集内容] from qiskit import * from math import pi import numpy as np from qiskit.visualization import plot_bloch_multivector # 量子ビットに対してゲート作用させてみる. qc = QuantumCircuit(2) # CNOTゲート作用. qc.cx(0, 1) # ユニタリ行列に変換. backend = Aer.get_backend('unitary_simulator') unitary = execute(qc,backend).result().get_unitary() # ユニタリ行列表示. print(unitary) # 行列計算チェック. cx = np.array([[1, 0, 0, 0],[0, 0, 0, 1],[0, 0, 1, 0],[0, 1, 0, 0]]) print(cx) |
1 2 3 4 5 6 7 8 9 10 |
[出力結果] [[1.+0.j 0.+0.j 0.+0.j 0.+0.j] [0.+0.j 0.+0.j 0.+0.j 1.+0.j] [0.+0.j 0.+0.j 1.+0.j 0.+0.j] [0.+0.j 1.+0.j 0.+0.j 0.+0.j]] [[1 0 0 0] [0 0 0 1] [0 0 1 0] [0 1 0 0]] ※ 計算結果が一致していると理解できる. |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
[編集内容] from qiskit import * from math import pi import numpy as np from qiskit.visualization import plot_bloch_multivector # 量子ビットに対してゲート作用させてみる. qc = QuantumCircuit(2) # H, CNOTゲート作用. qc.h(0) qc.cx(0, 1) # ユニタリ行列に変換. backend = Aer.get_backend('unitary_simulator') unitary = execute(qc,backend).result().get_unitary() # ユニタリ行列表示. print(unitary) # 行列計算チェック. c = 1 / np.sqrt(2) h = np.array([[c, c, 0, 0],[c, -c, 0, 0],[0, 0, c, c],[0, 0, c, -c]]) cx = np.array([[1, 0, 0, 0],[0, 0, 0, 1],[0, 0, 1, 0],[0, 1, 0, 0]]) cxh = cx @ h print(cxh) |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
[出力結果] [[ 0.70710678+0.00000000e+00j 0.70710678-8.65956056e-17j 0. +0.00000000e+00j 0. +0.00000000e+00j] [ 0. +0.00000000e+00j 0. +0.00000000e+00j 0.70710678+0.00000000e+00j -0.70710678+8.65956056e-17j] [ 0. +0.00000000e+00j 0. +0.00000000e+00j 0.70710678+0.00000000e+00j 0.70710678-8.65956056e-17j] [ 0.70710678+0.00000000e+00j -0.70710678+8.65956056e-17j 0. +0.00000000e+00j 0. +0.00000000e+00j]] [[ 0.70710678 0.70710678 0. 0. ] [ 0. 0. 0.70710678 -0.70710678] [ 0. 0. 0.70710678 0.70710678] [ 0.70710678 -0.70710678 0. 0. ]] ※ 計算結果が一致していると理解できる. |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
[編集内容] from qiskit import * from math import pi import numpy as np from qiskit.visualization import plot_bloch_multivector, plot_histogram from qiskit_textbook.tools import array_to_latex # 量子ビットに対してゲート作用させてみる. qc = QuantumCircuit(2) # X, H, CNOTゲート作用. qc.x(1) qc.h(0) qc.cx(0, 1) # 量子回路を表示. qc.draw('mpl') |
1 2 3 4 5 6 7 |
[編集内容] # Statevector. backend = Aer.get_backend('statevector_simulator') final_state = execute(qc, backend).result().get_statevector() # Statevector表示. array_to_latex(final_state, pretext="\\text{Statevector = }") |
1 2 3 |
[編集内容] results = execute(qc, backend).result().get_counts() plot_histogram(results) |