概要
- Cirq について, 前回に続き, シュミレーションに関するサンプルをいくつか動かしてみた.
- 動作環境は, Google Colaboratory で行った
感想
- 量子物理学に関する知識(用語, 数式の意味ほか)は, 徐々に身につけていく必要があると感じた.
- 時間を見つけて, 今後も, チュートリアルの残りの部分を進めていこうと思う.
Mixed state simulations
cirq.DensityMatrixSimulator の 使い方 を 確認
- cirq.DensityMatrixSimulator を 使う サンプル
- cirq.DensityMatrixSimulator を 使う サンプル
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 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 |
[編集内容(cirq.DensityMatrixSimulator)] import cirq import numpy as np from cirq import Simulator # Pick one qubit and Use Symbol value. q = cirq.NamedQubit('a') # 以下のコメントを, 随時外して, 動作確認する. # 1. # circuit = cirq.Circuit(cirq.X(q)) # 2. # circuit = cirq.Circuit(cirq.Y(q)) # 3. # circuit = cirq.Circuit(cirq.Z(q)) # 4. # circuit = cirq.Circuit(cirq.H(q)) # 5. # circuit = cirq.Circuit(cirq.T(q)) # 6. # circuit = cirq.Circuit(cirq.S(q)) # 7. # circuit = cirq.Circuit(cirq.X(q), cirq.amplitude_damp(0.23)(q)) # 8. # circuit = cirq.Circuit(cirq.Y(q), cirq.amplitude_damp(0.34)(q)) # 9. # circuit = cirq.Circuit(cirq.Z(q), cirq.amplitude_damp(0.45)(q)) # 10. # circuit = cirq.Circuit(cirq.H(q), cirq.amplitude_damp(0.56)(q)) # 11. # circuit = cirq.Circuit(cirq.T(q), cirq.amplitude_damp(0.67)(q)) # 12. # circuit = cirq.Circuit(cirq.S(q), cirq.amplitude_damp(0.78)(q)) # Use cirq.DensityMatrixSimulator. simulator = cirq.DensityMatrixSimulator() result = simulator.simulate(circuit) # Display Final Density Matrix. print(np.around(result.final_density_matrix, 3)) |
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 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 |
[出力結果] # 1. の 場合(cirq.X(q)). [[0.+0.j 0.+0.j] [0.+0.j 1.+0.j]] # 2. の 場合(cirq.Y(q)). [[ 0.+0.j 0.-0.j] [-0.-0.j 1.-0.j]] # 3. の 場合(cirq.Z(q)). [[ 1.+0.j 0.-0.j] [-0.+0.j 0.-0.j]] # 4. の 場合(cirq.H(q)). [[0.5-0.j 0.5-0.j] [0.5-0.j 0.5-0.j]] # 5. の 場合(cirq.T(q)). [[1.+0.j 0.-0.j] [0.+0.j 0.-0.j]] # 6. の 場合(cirq.S(q)). [[1.+0.j 0.-0.j] [0.+0.j 0.-0.j]] # 7. の 場合(cirq.X(q), cirq.amplitude_damp(0.23)(q)). [[0.23+0.j 0. +0.j] [0. +0.j 0.77+0.j]] -> 100個の中で, 23個は, そのまま, 77個が, 反転したと理解. # 8. の 場合(cirq.Y(q), cirq.amplitude_damp(0.34)(q)). [[0.34+0.j 0. +0.j] [0. +0.j 0.66+0.j]] -> 100個の中で, 34個は, そのまま, 66個が, 反転したと理解. # 9. の 場合(cirq.Z(q), cirq.amplitude_damp(0.45)(q)). [[1.+0.j 0.+0.j] [0.+0.j 0.+0.j]] -> 100個の中で, 100個は, そのまま, 0個が, 反転したと理解. # 10. の 場合(cirq.H(q), cirq.amplitude_damp(0.56)(q)). [[0.78 +0.j 0.332+0.j] [0.332+0.j 0.22 +0.j]] -> もともと, 100個の中で, 50個は, そのまま, 50個が, 反転した状態だった. -> すでに反転済 の 50個のうち, 28個(56%)が, 反転しない状態に戻ってきたので, 100個の中で, 78個は, そのまま, 22個が, 反転したと理解? # 11. の 場合(cirq.T(q), cirq.amplitude_damp(0.67)(q)). [[1.+0.j 0.+0.j] [0.+0.j 0.+0.j]] -> 100個の中で, 100個は, そのまま, 0個が, 反転したと理解. # 12. の 場合(cirq.S(q), cirq.amplitude_damp(0.78)(q)). [[1.+0.j 0.+0.j] [0.+0.j 0.+0.j]] -> 100個の中で, 100個は, そのまま, 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 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 |
[編集内容(cirq.DensityMatrixSimulator)] import cirq import numpy as np from cirq import Simulator # Pick one qubit and Use Symbol value. q0, q1 = cirq.NamedQubit('a'), cirq.NamedQubit('b') # 以下のコメントを, 随時外して, 動作確認する. # 1. # 以下のように理解. # 1-1. ↑↑(2量子ビット, 00 と見る) を 用意. # 1-2. 1量子ビット目に, X ゲート を 操作. # ※ 1量子ビット目が, ↓ に 変わるはず. # 1-3. 2量子ビット目に, X ゲート を 操作. # ※ 2量子ビット目が, ↓ に 変わるはず. # -> ↓↓(2量子ビット, 11 と見る) が出力されるはず. # circuit = cirq.Circuit(cirq.X(q0), cirq.X(q1)) # 2. # 以下のように理解. # 2-1. ↑↑(2量子ビット, 00 と見る) を 用意. # 2-2. 1量子ビット目に, X ゲート を 操作. # ※ 1量子ビット目が, ↓ に 変わるはず. # 2-3. すべての量子ビットに, CNOT ゲート を 操作. # ※ 制御ビット(1量子ビット目)が, 1 なので, 2量子ビット目は, ↑ から ↓ に 変化する. # -> ↓↓(2量子ビット, 11 と見る) が出力されるはず. # circuit = cirq.Circuit(cirq.X(q0), cirq.CNOT(q0, q1)) # 3. # 以下のように理解. # 3-1. ↑↑(2量子ビット, 00 と見る) を 用意. # 3-2. 1量子ビット目に, X ゲート を 操作. # ※ 1量子ビット目が, ↓(0.8個) と ↑(0.2個) に 変わるはず. # 3-3. 2量子ビット目に, X ゲート を 操作. # ※ 2量子ビット目が, ↓(0.7個) と ↑(0.3個) に 変わるはず. # -> ↑↑(2量子ビット, 00 と見る, 0.06個), ↑↓(2量子ビット, 01 と見る, 0.14個) # , ↓↑(2量子ビット, 10 と見る, 0.24個), ↓↓(2量子ビット, 11 と見る, 0.56個) # が, 相互に独立した状態で, 出力されるはず. # circuit = cirq.Circuit(cirq.X(q0), cirq.X(q1), cirq.amplitude_damp(0.2)(q0), cirq.amplitude_damp(0.3)(q1)) # 4. 以下のように理解. # 4-1. ↑↑(2量子ビット, 00 と見る) を 用意. # 4-2. 1量子ビット目に, X ゲート を 操作. # ※ 1量子ビット目が, ↓(0.7個) と ↑(0.3個) に 変わるはず. # 4-3. すべての量子ビットに, CNOT ゲート を 操作. # ※ 2量子ビット目は, 60% の 確率で, ↑ から ↓ に 変化する? # -> ↑↑(2量子ビット, 00 と見る, 0.12個), ↑↓(2量子ビット, 01 と見る, 0.18個) # , ↓↑(2量子ビット, 10 と見る, 0.28個), ↓↓(2量子ビット, 11 と見る, 0.42個) # が, 相互に独立した状態で, 出力されるはず. # circuit = cirq.Circuit(cirq.X(q0), cirq.CNOT(q0, q1), cirq.amplitude_damp(0.3)(q0), cirq.amplitude_damp(0.4)(q1)) # Use cirq.DensityMatrixSimulator. simulator = cirq.DensityMatrixSimulator() result = simulator.simulate(circuit) # Display Final Density Matrix. print(np.around(result.final_density_matrix, 3)) |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
[出力結果] # 1. の 場合(cirq.X(q0), cirq.X(q1)). [[0.+0.j 0.+0.j 0.+0.j 0.+0.j] [0.+0.j 0.+0.j 0.+0.j 0.+0.j] [0.+0.j 0.+0.j 0.+0.j 0.+0.j] [0.+0.j 0.+0.j 0.+0.j 1.+0.j]] # 2. の 場合(cirq.X(q0), cirq.CNOT(q0, q1)). [[0.+0.j 0.+0.j 0.+0.j 0.+0.j] [0.+0.j 0.+0.j 0.+0.j 0.+0.j] [0.+0.j 0.+0.j 0.+0.j 0.+0.j] [0.+0.j 0.+0.j 0.+0.j 1.+0.j]] # 3. の 場合(cirq.X(q0), cirq.X(q1), cirq.amplitude_damp(0.2)(q0), cirq.amplitude_damp(0.3)(q1)). [[0.06+0.j 0. +0.j 0. +0.j 0. +0.j] [0. +0.j 0.14+0.j 0. +0.j 0. +0.j] [0. +0.j 0. +0.j 0.24+0.j 0. +0.j] [0. +0.j 0. +0.j 0. +0.j 0.56+0.j]] # 4. の 場合(cirq.X(q0), cirq.CNOT(q0, q1), cirq.amplitude_damp(0.3)(q0), cirq.amplitude_damp(0.4)(q1)). [[0.12+0.j 0. +0.j 0. +0.j 0. +0.j] [0. +0.j 0.18+0.j 0. +0.j 0. +0.j] [0. +0.j 0. +0.j 0.28+0.j 0. +0.j] [0. +0.j 0. +0.j 0. +0.j 0.42+0.j]] |