概要
- Cirq について, Custom Gates に関するサンプルをいくつか動かしてみた.
- 動作環境は, Google Colaboratory で行った
感想
- 量子物理学に関する知識(用語, 数式の意味ほか)は, 徐々に身につけていく必要があると感じた.
- 時間を見つけて, 今後も, チュートリアルの残りの部分を進めていこうと思う.
Gates and operations
- cirq.NamedQubit を 使う サンプル
- cirq.Gate を 使う サンプル
- cirq.TwoQubitGate を 使う サンプル
- cirq.ThreeQubitGate を 使う サンプル
- ユニタリ行列の確認
1 2 3 4 5 6 7 8 9 10 11 12 13 |
[編集内容(cirq.NamedQubit)] import cirq # This examples uses named qubits to remain abstract. # However, we can also use LineQubits or GridQubits to specify a geometry a, b, c = cirq.NamedQubit('a'), cirq.NamedQubit('b'), cirq.NamedQubit('c') # Example Operations, that correspond to the moments above print(cirq.X(a), cirq.X(b), cirq.X(c)) print(cirq.Y(a), cirq.Z(a), cirq.H(a), cirq.S(a), cirq.T(a)) print(cirq.CNOT(a, b), cirq.CNOT(b, c), cirq.SWAP(a, b)) print(cirq.CCNOT(a, b, c), cirq.ISWAP(a, b)) print(cirq.measure(a, b, c)) |
1 2 3 4 5 6 |
[出力結果] X(a) X(b) X(c) Y(a) Z(a) H(a) S(a) T(a) CNOT(a, b) CNOT(b, c) SWAP(a, b) TOFFOLI(a, b, c) ISWAP(a, b) cirq.MeasurementGate(3, 'a,b,c', ())(a, b, c) |
Custom gates
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 |
[編集内容(cirq.Gate)] import cirq import numpy as np """Define a custom single-qubit gate.""" class ExOneQubitGate(cirq.Gate): def __init__(self): super(ExOneQubitGate, self) def _num_qubits_(self): return 1 def _unitary_(self): return np.array([ [1.0, 1.0], [-1.0, 1.0] ]) / np.sqrt(2) def _circuit_diagram_info_(self, args): return " Gate 0 " my_gate = ExOneQubitGate() """Use the custom gate in a circuit.""" circ = cirq.Circuit( my_gate.on(cirq.LineQubit(0)) ) print("Circuit with custom gates:") print(circ) """Simulate a circuit with a custom gate.""" sim = cirq.Simulator() res = sim.simulate(circ) print(res) |
1 2 3 4 5 |
[出力結果] Circuit with custom gates: 0: ─── Gate 0 ─── measurements: (no measurements) output vector: 0.707|0⟩ - 0.707|1⟩ |
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 |
[編集内容(cirq.TwoQubitGate)] import cirq import numpy as np """Define a custom two-qubit gate.""" class ExTwoQubitGate(cirq.TwoQubitGate): def __init__(self): super(ExTwoQubitGate, self) def _unitary_(self): return np.array([ [1.0, -1.0, 0.0, 0.0], [0.0, 0.0, 1.0, 1.0], [1.0, 1.0, 0.0, 0.0], [0.0, 0.0, 1.0, -1.0] ]) / np.sqrt(2) def _circuit_diagram_info_(self, args): return " Gate 0 ", " Gate 1 " this_gate = ExTwoQubitGate() """Use the custom two-qubit gate in a circuit.""" circ = cirq.Circuit( this_gate.on(*cirq.LineQubit.range(2)) ) print("Circuit with custom two-qubit gate:") print(circ) """Simulate a circuit with a custom gate.""" sim = cirq.Simulator() res = sim.simulate(circ) print(res) |
1 2 3 4 5 6 7 |
[出力結果] Circuit with custom two-qubit gate: 0: ─── Gate 0 ─── │ 1: ─── Gate 1 ─── measurements: (no measurements) output vector: 0.707|00⟩ + 0.707|10⟩ |
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 |
[編集内容(cirq.ThreeQubitGate)] import cirq import numpy as np """Define a custom three-qubit gate.""" class ExThreeQubitGate(cirq.ThreeQubitGate): def __init__(self): super(ExThreeQubitGate, self) def _unitary_(self): return np.array([ [1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], [-1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], [0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0], [0.0, 0.0, -1.0, 1.0, 0.0, 0.0, 0.0, 0.0], [0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0], [0.0, 0.0, 0.0, 0.0, -1.0, 1.0, 0.0, 0.0], [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0], [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -1.0, 1.0] ]) / np.sqrt(2) def _circuit_diagram_info_(self, args): return " Gate 0 ", " Gate 1 ", " Gate 2 " this_gate = ExThreeQubitGate() """Use the custom three-qubit gate in a circuit.""" circ = cirq.Circuit( this_gate.on(*cirq.LineQubit.range(3)) ) print("Circuit with custom three-qubit gate:") print(circ) """Simulate a circuit with a custom gate.""" sim = cirq.Simulator() res = sim.simulate(circ) print(res) |
1 2 3 4 5 6 7 8 9 |
[出力結果] Circuit with custom three-qubit gate: 0: ─── Gate 0 ─── │ 1: ─── Gate 1 ─── │ 2: ─── Gate 2 ─── measurements: (no measurements) output vector: 0.707|000⟩ - 0.707|001⟩ |
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 |
[編集内容(Check Unitary Matrix)] import numpy as np a0 = np.array([ [1.0, 1.0], [-1.0, 1.0] ]) / np.sqrt(2) b0 = np.array([ [1.0, -1.0], [1.0, 1.0] ]) / np.sqrt(2) a1 = np.array([ [1.0, -1.0, 0.0, 0.0], [0.0, 0.0, 1.0, 1.0], [1.0, 1.0, 0.0, 0.0], [0.0, 0.0, 1.0, -1.0] ]) / np.sqrt(2) b1 = np.array([ [1.0, 0.0, 1.0, 0.0], [-1.0, 0.0, 1.0, 0.0], [0.0, 1.0, 0.0, 1.0], [0.0, 1.0, 0.0, -1.0] ]) / np.sqrt(2) a2 = np.array([ [1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], [-1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], [0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0], [0.0, 0.0, -1.0, 1.0, 0.0, 0.0, 0.0, 0.0], [0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0], [0.0, 0.0, 0.0, 0.0, -1.0, 1.0, 0.0, 0.0], [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0], [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -1.0, 1.0] ]) / np.sqrt(2) b2 = np.array([ [1.0, -1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], [1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], [0.0, 0.0, 1.0, -1.0, 0.0, 0.0, 0.0, 0.0], [0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0], [0.0, 0.0, 0.0, 0.0, 1.0, -1.0, 0.0, 0.0], [0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0], [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0,-1.0], [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0] ]) / np.sqrt(2) print(np.around(np.dot(a0, b0), 3)) print(np.around(np.dot(a1, b1), 3)) print(np.around(np.dot(a2, b2), 3)) |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
[出力結果] [[1. 0.] [0. 1.]] [[ 1. 0. -0. 0.] [ 0. 1. 0. -0.] [-0. 0. 1. 0.] [ 0. -0. 0. 1.]] [[1. 0. 0. 0. 0. 0. 0. 0.] [0. 1. 0. 0. 0. 0. 0. 0.] [0. 0. 1. 0. 0. 0. 0. 0.] [0. 0. 0. 1. 0. 0. 0. 0.] [0. 0. 0. 0. 1. 0. 0. 0.] [0. 0. 0. 0. 0. 1. 0. 0.] [0. 0. 0. 0. 0. 0. 1. 0.] [0. 0. 0. 0. 0. 0. 0. 1.]] |