概要
- Qiskit について, サンプルプログラムを動かしてみた.
- 動作環境は, Google Colaboratory で行った
- 実行プログラム, 解説は, 下記の参照サイトをご覧ください
感想
- 本家のサイトにあるように, 量子ゲートの解説が, 非常に豊富だと驚いた.
- 時間を見つけて, 今後も, ドキュメントの残りの部分を進めていこうと思う.
Summary of Quantum Operations
- Controlled rotation Gates
- Three-qubit gates
1 2 3 4 5 6 7 8 |
[編集内容(Controlled rotation Gates)] q = QuantumRegister(2) qc = QuantumCircuit(q) qc.crz(pi / 2, q[0], q[1]) qc.cu1(pi / 2, q[0], q[1]) qc.cu3(pi / 2, pi / 2, pi / 2, q[0], q[1]) qc.swap(q[0], q[1]) qc.draw() |
1 2 3 4 5 6 7 8 9 |
[出力結果] /usr/local/lib/python3.7/dist-packages/ipykernel_launcher.py:17: DeprecationWarning: The QuantumCircuit.cu1 method is deprecated as of 0.16.0. It will be removed no earlier than 3 months after the release date. You should use the QuantumCircuit.cp method instead, which acts identically. /usr/local/lib/python3.7/dist-packages/ipykernel_launcher.py:18: DeprecationWarning: The QuantumCircuit.cu3 method is deprecated as of 0.16.0. It will be removed no earlier than 3 months after the release date. You should use the QuantumCircuit.cu method instead, where cu3(ϴ,φ,λ) = cu(ϴ,φ,λ,0). q0_0: ─────■──────■─────────────────■──────────X─ ┌────┴────┐ │U1(π/2) ┌────────┴────────┐ │ q0_1: ┤ RZ(π/2) ├─■────────┤ U3(π/2,π/2,π/2) ├─X─ └─────────┘ └─────────────────┘ |
1 2 3 4 5 6 |
[編集内容(Three-qubit gates)] q = QuantumRegister(3) qc = QuantumCircuit(q) qc.ccx(q[0], q[1], q[2]) qc.cswap(q[0], q[1], q[2]) qc.draw() |
1 2 3 4 5 6 7 |
[出力結果] q1_0: ──■───■─ │ │ q1_1: ──■───X─ ┌─┴─┐ │ q1_2: ┤ X ├─X─ └───┘ |
Non-unitary operations
- Measurements
- Reset
- Conditional operations
1 2 3 4 5 6 7 8 9 10 11 12 13 |
[編集内容(Measurements)] q, c = QuantumRegister(1), ClassicalRegister(1) qc = QuantumCircuit(q, c) qc.x(q) qc.y(q) qc.z(q) qc.h(q) qc.measure(q, c) qc.draw() backend = BasicAer.get_backend('qasm_simulator') job = execute(qc, backend, shots=1024) job.result().get_counts(qc) |
1 2 3 4 5 6 7 8 9 10 |
[出力結果] ※qc.draw() で 表示される出力. ┌───┐┌───┐┌───┐┌───┐┌─┐ q7_0: ┤ X ├┤ Y ├┤ Z ├┤ H ├┤M├ └───┘└───┘└───┘└───┘└╥┘ c6: 1/═════════════════════╩═ 0 ※job.result().get_counts(qc) で 表示される出力(実行するごとに変化する). {'0': 520, '1': 504} |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
[編集内容(Reset)] q, c = QuantumRegister(1), ClassicalRegister(1) qc = QuantumCircuit(q, c) qc.x(q) qc.y(q) qc.z(q) qc.h(q) qc.reset(q[0]) qc.measure(q, c) qc.draw() backend = BasicAer.get_backend('qasm_simulator') job = execute(qc, backend, shots=1024) job.result().get_counts(qc) |
1 2 3 4 5 6 7 8 9 10 |
[出力結果] ※qc.draw() で 表示される出力. ┌───┐┌───┐┌───┐┌───┐ ┌─┐ q33_0: ┤ X ├┤ Y ├┤ Z ├┤ H ├─|0>─┤M├ └───┘└───┘└───┘└───┘ └╥┘ c10: 1/══════════════════════════╩═ 0 ※job.result().get_counts(qc) で 表示される出力. {'0': 1024} |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
[編集内容(Conditional operations)] q, c = QuantumRegister(1), ClassicalRegister(1) qc = QuantumCircuit(q, c) # qc.x(q).c_if(c, 0) qc.x(q).c_if(c, 1) qc.y(q) qc.z(q) qc.s(q) qc.t(q) qc.measure(q, c) qc.draw() backend = BasicAer.get_backend('qasm_simulator') job = execute(qc, backend, shots=1024) job.result().get_counts(qc) |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
[出力結果] ①qc.x(q).c_if(c, 0) の 場合. ※qc.draw() で 表示される出力. ┌───┐ ┌───┐┌───┐┌───┐┌───┐┌─┐ q72_0: ─┤ X ├─┤ Y ├┤ Z ├┤ S ├┤ T ├┤M├ └─╥─┘ └───┘└───┘└───┘└───┘└╥┘ ┌──╨──┐ ║ c18: 1/╡ = 0 ╞═════════════════════╩═ └─────┘ 0 ※job.result().get_counts(qc) で 表示される出力. {'0': 1024} ②qc.x(q).c_if(c, 1) の 場合. ※qc.draw() で 表示される出力. ┌───┐ ┌───┐┌───┐┌───┐┌───┐┌─┐ q91_0: ─┤ X ├─┤ Y ├┤ Z ├┤ S ├┤ T ├┤M├ └─╥─┘ └───┘└───┘└───┘└───┘└╥┘ ┌──╨──┐ ║ c21: 1/╡ = 1 ╞═════════════════════╩═ └─────┘ 0 ※job.result().get_counts(qc) で 表示される出力. {'1': 1024} |
Arbitrary initialization
- Initialize
- Initialize
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
# Initializing a ont-qubit quantum state import math desired_vector = [ 1 / math.sqrt(2) * complex(1, 0), 1 / math.sqrt(2) * complex(0, 1)] q = QuantumRegister(1) qc = QuantumCircuit(q) qc.initialize(desired_vector, [q[0]]) qc.draw() # qc_state backend = BasicAer.get_backend('statevector_simulator') job = execute(qc, backend) qc_state = job.result().get_statevector(qc) qc_state # state_fidelity state_fidelity(desired_vector, qc_state) |
1 2 3 4 5 6 7 8 9 10 11 |
[出力結果] ※qc.draw() で 表示される出力. ┌──────────────────────────────┐ q93_0: ┤ initialize(0.70711,0.70711j) ├ └──────────────────────────────┘ ※qc_state で 表示される出力. array([7.07106781e-01+0.j , 4.32978028e-17+0.70710678j]) ※state_fidelity で 表示される出力. 0.9999999999999996 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
# Initializing a two-qubit quantum state import math desired_vector = [ 1 / math.sqrt(2) * complex(1, 0), 1 / math.sqrt(3) * complex(0, 1), 1 / math.sqrt(12) * complex(1, 0), 1 / math.sqrt(12) * complex(0, 1)] q = QuantumRegister(2) qc = QuantumCircuit(q) qc.initialize(desired_vector, [q[0], q[1]]) qc.draw() # qc_state backend = BasicAer.get_backend('statevector_simulator') job = execute(qc, backend) qc_state = job.result().get_statevector(qc) qc_state # state_fidelity state_fidelity(desired_vector, qc_state) |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
[出力結果] ※qc.draw() で 表示される出力. ┌────────────────────────────────────────────────┐ q95_0: ┤0 ├ │ initialize(0.70711,0.57735j,0.28868,0.28868j) │ q95_1: ┤1 ├ └────────────────────────────────────────────────┘ ※qc_state で 表示される出力. array([7.07106781e-01+3.77249733e-18j, 3.11797104e-17+5.77350269e-01j, 2.88675135e-01+1.68711209e-18j, 1.58101222e-17+2.88675135e-01j]) ※state_fidelity で 表示される出力. 1.0 |