概要
- Cirq の 理解を, さらに深めるため, 量子ビットの表示順などのサンプルをいくつか動かしてみた.
- 動作環境は, Google Colaboratory で行った
感想
- Google社 の Simulation に 関する記事を少しずつ進めることが出来たと思う.
- 量子物理学に関する知識(用語, 数式の意味ほか)は, 徐々に身につけていく必要があると感じた.
- 時間を見つけて, 今後も, チュートリアルの残りの部分を進めていこうと思う.
Qubit and Amplitude Ordering
量子ビットの出力順を操作出来るとのこと.
numpy.kron に 類似しているとのこと.
- numpy.kron の サンプル
- ループ の サンプル
- 量子ビット表示順 の サンプル
- 量子ビット表示順 の サンプル
- 量子ビット表示順 の サンプル
- 量子ビット表示順 の サンプル
- 量子ビットのデバッグ表示 の サンプル
1 2 3 4 5 |
[編集内容(numpy.kron)] import numpy as np o, i = [9, 0, 8], [1, 2, 3, 4, 5, 6, 7] print(np.kron(o, i)) |
1 2 3 |
[出力結果] [ 9 18 27 36 45 54 63 0 0 0 0 0 0 0 8 16 24 32 40 48 56] ※ np.kron は, 引数は, 二個までしか取れないので要注意. |
1 2 3 4 5 6 7 |
[編集内容(loop)] i = 0 for a0 in [0, 1]: for a1 in [0, 1]: for a2 in [0, 1]: print('amps[{}] is for a0={}, a1={}, a2={}'.format(i, a0, a1, a2)) i += 1 |
1 2 3 4 5 6 7 8 9 |
[出力結果] amps[0] is for a0=0, a1=0, a2=0 amps[1] is for a0=0, a1=0, a2=1 amps[2] is for a0=0, a1=1, a2=0 amps[3] is for a0=0, a1=1, a2=1 amps[4] is for a0=1, a1=0, a2=0 amps[5] is for a0=1, a1=0, a2=1 amps[6] is for a0=1, a1=1, a2=0 amps[7] is for a0=1, a1=1, a2=1 |
量子ビット表示順
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
[編集内容(qubit flip)] import cirq import numpy as np from cirq import Simulator # 1. q_stay = [1 0], q_flip = [1 0] を 用意. # 2. Xゲートを適用して, q_flip = [0 1] に 変更. # 3. q_stay を 内側と見て, 量子ビットを並べる. # -> 出力結果のイメージ => [0 * q_stay 1 * q_stay] = [0 * [1 0] 1 * [1 0]] = [0 0 1 0] q_stay = cirq.NamedQubit('q_stay') q_flip = cirq.NamedQubit('q_flip') c = cirq.Circuit(cirq.X(q_flip)) # first qubit in order flipped simulator = Simulator() result = simulator.simulate(c, qubit_order=[q_flip, q_stay]) print(abs(result.final_state_vector).round(3)) |
1 2 |
[出力結果] [0. 0. 1. 0.] |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
[編集内容(qubit flip)] import cirq import numpy as np from cirq import Simulator # 1. q_stay = [1 0], q_flip = [1 0] を 用意. # 2. Xゲートを適用して, q_flip = [0 1] に 変更. # 3. q_flip を 内側と見て, 量子ビットを並べる. # -> 出力結果のイメージ => [1 * q_flip 0 * q_flip] = [1 * [0 1] 0 * [0 1]] = [0 1 0 0] q_stay = cirq.NamedQubit('q_stay') q_flip = cirq.NamedQubit('q_flip') c = cirq.Circuit(cirq.X(q_flip)) # second qubit in order flipped simulator = Simulator() result = simulator.simulate(c, qubit_order=[q_stay, q_flip]) print(abs(result.final_state_vector).round(3)) |
1 2 |
[出力結果] [0. 1. 0. 0.] |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
[編集内容(qubit flip)] import cirq import numpy as np from cirq import Simulator # 1. q0 = [1 0], q1 = [1 0], q2 = [1 0] を 用意. # 2. Xゲートを適用して, q1 = [0 1] に 変更. # 3. Xゲートを適用して, q2 = [0 1] に 変更. # 4. q2 を 内側と見て, 量子ビットを並べる. # -> 出力結果のイメージ # => まず, [q1, q2] = q12 について [0 * q2 1 * q2] = [0 * [0 1] 1 * [0 1]] = [0 0 0 1] # => 次に, [q0, q12] について [1 * q12 0 * q12] = [1 * [0 0 0 1] 0 * [0 0 0 1]] = [0 0 0 1 0 0 0 0] q0, q1, q2 = cirq.NamedQubit('q0'), cirq.NamedQubit('q1'), cirq.NamedQubit('q2') c = cirq.Circuit() c.append(cirq.X(q1)) c.append(cirq.X(q2)) simulator = Simulator() result = simulator.simulate(c, qubit_order=[q0, q1, q2]) print(abs(result.final_state_vector).round(3)) |
1 2 |
[出力結果] [0. 0. 0. 1. 0. 0. 0. 0.] |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
[編集内容(qubit flip)] import cirq import numpy as np from cirq import Simulator # 1. q0 = [1 0], q1 = [1 0], q2 = [1 0] を 用意. # 2. Xゲートを適用して, q0 = [0 1] に 変更. # 3. Yゲートを適用して, q1 = [0 1] に 変更([0 i]でなく, [0 1]とみなす). # 4. Zゲートを適用して, q2 = [1 0] に 変更. # 5. q2 を 内側と見て, 量子ビットを並べる. # -> 出力結果のイメージ # => まず, [q0, q2] = q02 について [0 * q2 1 * q2] = [0 * [1 0] 1 * [1 0]] = [0 0 1 0] # => 次に, [q1, q02] について [0 * q02 1 * q02] = [0 * [0 0 1 0] 1 * [0 0 1 0]] = [0 0 0 0 0 0 1 0] q0, q1, q2 = cirq.NamedQubit('q0'), cirq.NamedQubit('q1'), cirq.NamedQubit('q2') c = cirq.Circuit() c.append(cirq.X(q0)) c.append(cirq.Y(q1)) c.append(cirq.Z(q2)) simulator = Simulator() result = simulator.simulate(c, qubit_order=[q1, q0, q2]) print(abs(result.final_state_vector).round(3)) |
1 2 |
[出力結果] [0. 0. 0. 0. 0. 0. 1. 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 |
[編集内容(debug display qubits)] import cirq from cirq import Simulator # Pick three qubits. q0, q1, q2 = cirq.GridQubit(0, 0), cirq.GridQubit(1, 0), cirq.GridQubit(2, 0) # X, H, CSWAP Operations. op_1, op_2, op_3 = cirq.X(q0) ** 0.6, cirq.H(q1), cirq.CSWAP(q0, q1, q2) # Create a circuit circuit = cirq.Circuit() circuit.append(op_1) circuit.append(op_2) circuit.append(op_3) circuit.append(cirq.measure(q0, key='q0')) circuit.append(cirq.measure(q1, key='q1')) circuit.append(cirq.measure(q2, key='q2')) print("Circuit:") print(circuit) print("----- debug display qubits start -------------------------") simulator = cirq.Simulator() for i, step in enumerate(simulator.simulate_moment_steps(circuit)): print('state at step %d: %s' % (i, np.around(step.state_vector(), 3))) print("----- debug display qubits end ---------------------------") # Simulate the circuit several times. result = simulator.run(circuit, repetitions=1) print("Results:") print(result) |
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 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 |
[出力結果] ※1回目(1量子ビット目, 2量子ビット目が, ともに, 0 -> 1 に変化したので, 2量子ビット目 と 3量子ビット目が入れ替わった). Circuit: (0, 0): ───X^0.6───@───M('q0')─── │ (1, 0): ───H───────×───M('q1')─── │ (2, 0): ───────────×───M('q2')─── ----- debug display qubits start ------------------------- state at step 0: [ 0.244+0.336j 0. +0.j 0.244+0.336j -0. +0.j 0.463-0.336j 0. +0.j 0.463-0.336j -0. +0.j ] state at step 1: [ 0.244+0.336j 0. +0.j 0.244+0.336j -0. +0.j 0.463-0.336j 0.463-0.336j 0. +0.j -0. +0.j ] state at step 2: [0. +0.j 0. +0.j 0. +0.j 0. +0.j 0. +0.j 0.809-0.588j 0. +0.j 0. +0.j ] ----- debug display qubits end --------------------------- Results: q0=1 q1=0 q2=1 ※2回目(1量子ビット目, 2量子ビット目が, ともに, 0 のまま変化しなかったので, 2量子ビット目, 3量子ビット目の入れ替えは発生しなかった). Circuit: (0, 0): ───X^0.6───@───M('q0')─── │ (1, 0): ───H───────×───M('q1')─── │ (2, 0): ───────────×───M('q2')─── ----- debug display qubits start ------------------------- state at step 0: [ 0.244+0.336j 0. +0.j 0.244+0.336j -0. +0.j 0.463-0.336j 0. +0.j 0.463-0.336j -0. +0.j ] state at step 1: [ 0.244+0.336j 0. +0.j 0.244+0.336j -0. +0.j 0.463-0.336j 0.463-0.336j 0. +0.j -0. +0.j ] state at step 2: [0. +0.j 0. +0.j 0. +0.j 0. +0.j 0.809-0.588j 0. +0.j 0. +0.j 0. +0.j ] ----- debug display qubits end --------------------------- Results: q0=0 q1=0 q2=0 ※3回目(1量子ビット目のみ, 0 -> 1 に変化したので, 2量子ビット目 と 3量子ビット目の入れ替えは発生しなかった). Circuit: (0, 0): ───X^0.6───@───M('q0')─── │ (1, 0): ───H───────×───M('q1')─── │ (2, 0): ───────────×───M('q2')─── ----- debug display qubits start ------------------------- state at step 0: [ 0.244+0.336j 0. +0.j 0.244+0.336j -0. +0.j 0.463-0.336j 0. +0.j 0.463-0.336j -0. +0.j ] state at step 1: [ 0.244+0.336j 0. +0.j 0.244+0.336j -0. +0.j 0.463-0.336j 0.463-0.336j 0. +0.j -0. +0.j ] state at step 2: [0. +0.j 0. +0.j 0. +0.j 0. +0.j 0.809-0.588j 0. +0.j 0. +0.j 0. +0.j ] ----- debug display qubits end --------------------------- Results: q0=1 q1=0 q2=0 ※4回目(1量子ビット目, 2量子ビット目が, ともに, 0 -> 1 に変化したので, 2量子ビット目 と 3量子ビット目が入れ替わった). Circuit: (0, 0): ───X^0.6───@───M('q0')─── │ (1, 0): ───H───────×───M('q1')─── │ (2, 0): ───────────×───M('q2')─── ----- debug display qubits start ------------------------- state at step 0: [ 0.244+0.336j 0. +0.j 0.244+0.336j -0. +0.j 0.463-0.336j 0. +0.j 0.463-0.336j -0. +0.j ] state at step 1: [ 0.244+0.336j 0. +0.j 0.244+0.336j -0. +0.j 0.463-0.336j 0.463-0.336j 0. +0.j -0. +0.j ] state at step 2: [0. +0.j 0. +0.j 0. +0.j 0. +0.j 0. +0.j 0.809-0.588j 0. +0.j 0. +0.j ] ----- debug display qubits end --------------------------- Results: q0=1 q1=0 q2=1 ※5回目(2量子ビット目のみ, 0 -> 1 に変化したので, 2量子ビット目 と 3量子ビット目の入れ替えは発生しなかった). Circuit: (0, 0): ───X^0.6───@───M('q0')─── │ (1, 0): ───H───────×───M('q1')─── │ (2, 0): ───────────×───M('q2')─── ----- debug display qubits start ------------------------- state at step 0: [ 0.244+0.336j 0. +0.j 0.244+0.336j -0. +0.j 0.463-0.336j 0. +0.j 0.463-0.336j -0. +0.j ] state at step 1: [ 0.244+0.336j 0. +0.j 0.244+0.336j -0. +0.j 0.463-0.336j 0.463-0.336j 0. +0.j -0. +0.j ] state at step 2: [0. +0.j 0. +0.j 0. +0.j 0. +0.j 0. +0.j 0.809-0.588j 0. +0.j 0. +0.j ] ----- debug display qubits end --------------------------- Results: q0=0 q1=1 q2=0 |