概要
- Cirq について, Heatmaps, Qudits に関するサンプルをいくつか動かしてみた.
- 動作環境は, Google Colaboratory で行った
感想
- 量子物理学に関する知識(用語, 数式の意味ほか)は, 徐々に身につけていく必要があると感じた.
- 時間を見つけて, 今後も, ドキュメントの残りの部分を進めていこうと思う.
Heatmaps for Custom Data
- Heatmaps を 使う サンプル
- TwoQubitInteractionHeatmap を 使う サンプル
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
[編集内容(Heatmaps)] import cirq cirq.Heatmap({ (cirq.GridQubit(0, 0),): 0.07, (cirq.GridQubit(0, 2),): 0.002, (cirq.GridQubit(0, 4),): 0.15, (cirq.GridQubit(1, 1),): 0.08, (cirq.GridQubit(1, 3),): 0.14, (cirq.GridQubit(2, 0),): 0.001, (cirq.GridQubit(2, 2),): 0.09, (cirq.GridQubit(2, 4),): 0.003, (cirq.GridQubit(3, 1),): 0.12, (cirq.GridQubit(3, 3),): 0.10, (cirq.GridQubit(4, 0),): 0.13, (cirq.GridQubit(4, 2),): 0.004, (cirq.GridQubit(4, 4),): 0.11, }, plot_colorbar = True, colorbar_position = 'right', colorbar_size = '3%', colorbar_pad = '5%', title = "Heatmap Sample").plot() |
1 2 |
[出力結果] ※Heatmapsが表示された. |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
[編集内容(TwoQubitInteractionHeatmap)] import cirq cirq.TwoQubitInteractionHeatmap({ (cirq.GridQubit(0, 0), cirq.GridQubit(0, 1)): 0.1, (cirq.GridQubit(0, 1), cirq.GridQubit(0, 2)): 0.2, (cirq.GridQubit(0, 1), cirq.GridQubit(1, 1)): 0.3, # ValueError: (1, 1)-(2, 2) is not supported because they are not nearest neighbors # (cirq.GridQubit(1, 1), cirq.GridQubit(2, 2)): 0.4, (cirq.GridQubit(2, 0), cirq.GridQubit(2, 1)): 0.5, (cirq.GridQubit(2, 0), cirq.GridQubit(3, 0)): 0.6, (cirq.GridQubit(3, 0), cirq.GridQubit(3, 1)): 0.7, (cirq.GridQubit(3, 1), cirq.GridQubit(2, 1)): 0.8, (cirq.GridQubit(2, 1), cirq.GridQubit(2, 2)): 0.9, (cirq.GridQubit(3, 1), cirq.GridQubit(3, 2)): 1.0, (cirq.GridQubit(3, 1), cirq.GridQubit(3, 2)): 1.1, (cirq.GridQubit(2, 2), cirq.GridQubit(3, 2)): 1.2, (cirq.GridQubit(5, 0), cirq.GridQubit(5, 1)): 1.3, (cirq.GridQubit(5, 1), cirq.GridQubit(4, 1)): 1.4, (cirq.GridQubit(5, 1), cirq.GridQubit(5, 2)): 1.5, }, annotation_format="0.3f", title = 'Dummy Two Qubit Manual Plot').plot() |
1 2 |
[出力結果] ※TwoQubitInteractionHeatmapが表示された. |
Qudits
- Qudits を 使う サンプル
- Qudits を 使う サンプル
- Qudits を 使う サンプル
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 |
[編集内容(Qudits)] import numpy as np import cirq class QutritPlusGate1(cirq.SingleQubitGate): def _qid_shape_(self): return (3,) def _unitary_(self): return np.array([[0, 0, 1], [1, 0, 0], [0, 1, 0]]) def _circuit_diagram_info_(self, args): return '[+1]' class QutritPlusGate2(cirq.SingleQubitGate): def _qid_shape_(self): return (3,) def _unitary_(self): return np.array([[0, 1, 0], [0, 0, 1], [1, 0, 0]]) def _circuit_diagram_info_(self, args): return '[+2]' # 以下のように理解. # [前提] # 量子ビットの取り得る値が, 三通りあると見る. # 列ベクトル [1, 0, 0], [0, 1, 0], [0, 0, 1] を それぞれ, 状態 0, 1, 2 を 取ると見る. # # [操作] # 1. ↑(1量子ビット, 0 と見る) を 用意. # 2-1. QutritPlusGate1 ゲート を 操作する場合. # -> 状態 0 から 1 に変わったとみる(ここでは, q0 の 出力が, 1 のようになるはず). # 2-2. QutritPlusGate2 ゲート を 操作する場合. # -> 状態 0 から 2 に変わったとみる(ここでは, q1 の 出力が, 2 のようになるはず). Gate1, Gate2 = QutritPlusGate1(), QutritPlusGate2() # Pick two qubits. q0, q1 = cirq.LineQid(0, dimension=3), cirq.LineQid(1, dimension=3) for y in range(3): circuit = cirq.Circuit() op_1, op_2 = Gate1.on(q0), Gate2.on(q1) circuit.append([op_1, op_2]) circuit.append([cirq.measure(q0, key='q0'), cirq.measure(q1, key='q1')]) print("Circuit with a custom rotation gate: ", y, "times") print(circuit) # Simulate 5 times. simulator = cirq.Simulator() results = simulator.run(circuit, repetitions=5) # Output result. print(results) print("") |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
[出力結果] Circuit with a custom rotation gate: 0 times 0 (d=3): ───[+1]───M('q0')─── 1 (d=3): ───[+2]───M('q1')─── q0=11111 q1=22222 Circuit with a custom rotation gate: 1 times 0 (d=3): ───[+1]───M('q0')─── 1 (d=3): ───[+2]───M('q1')─── q0=11111 q1=22222 Circuit with a custom rotation gate: 2 times 0 (d=3): ───[+1]───M('q0')─── 1 (d=3): ───[+2]───M('q1')─── q0=11111 q1=22222 |
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 |
[編集内容(Qudits)] import numpy as np import cirq class QutritPlusGate(cirq.SingleQubitGate): r = -1 def __init__(self): self.r = int(np.random.rand() * 3) def _qid_shape_(self): return (3,) def _unitary_(self): if self.r < 1: return np.array([[1, 0, 0], [0, 1, 0], [0, 0, 1]]) elif self.r < 2: return np.array([[0, 0, 1], [1, 0, 0], [0, 1, 0]]) else: return np.array([[0, 1, 0], [0, 0, 1], [1, 0, 0]]) def _circuit_diagram_info_(self, args): if self.r < 1: return '[+0]' elif self.r < 2: return '[+1]' else: return '[+2]' # 以下のように理解. # [前提] # 量子ビットの取り得る値が, 三通りあると見る. # 列ベクトル [1, 0, 0], [0, 1, 0], [0, 0, 1] を それぞれ, 状態 0, 1, 2 を 取ると見る. # # [操作] # 1. ↑(1量子ビット, 0 と見る) を 用意. # 2. QutritPlusGate ゲート を 操作する場合. # -> r の 値(0, 1, 2) に応じて, q0 の 出力が, 以下のように変化するはず. # r = 0: q0 の 出力 は, 0. # r = 1: q0 の 出力 は, 1. # r = 2: q0 の 出力 は, 2. for y in range(5): q0 = cirq.LineQid(0, dimension=3) Gate = QutritPlusGate() circuit = cirq.Circuit( Gate.on(q0) ) circuit.append([cirq.measure(q0, key='q0')]) print("Circuit with a custom rotation gate: ", y, "times") print(circuit) # Simulate 5 times. simulator = cirq.Simulator() results = simulator.run(circuit, repetitions=5) # Output result. print("r = " + str(Gate.r)) print(results) print("") |
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 |
[出力結果] 測定を繰り返すと, 出力結果 も 変化. Circuit with a custom rotation gate: 0 times 0 (d=3): ───[+1]───M('q0')─── r = 1 q0=11111 Circuit with a custom rotation gate: 1 times 0 (d=3): ───[+2]───M('q0')─── r = 2 q0=22222 Circuit with a custom rotation gate: 2 times 0 (d=3): ───[+0]───M('q0')─── r = 0 q0=00000 Circuit with a custom rotation gate: 3 times 0 (d=3): ───[+2]───M('q0')─── r = 2 q0=22222 Circuit with a custom rotation gate: 4 times 0 (d=3): ───[+0]───M('q0')─── r = 0 q0=00000 |
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 |
[編集内容(Qudits)] import numpy as np import cirq class QutritPlusGate(cirq.SingleQubitGate): r = -1 def __init__(self): self.r = int(np.random.rand() * 5) def _qid_shape_(self): return (5,) def _unitary_(self): if self.r < 1: return np.array([[1, 0, 0, 0, 0], [0, 1, 0, 0, 0], [0, 0, 1, 0, 0], [0, 0, 0, 1, 0], [0, 0, 0, 0, 1]]) elif self.r < 2: return np.array([[0, 0, 0, 0, 1], [1, 0, 0, 0, 0], [0, 1, 0, 0, 0], [0, 0, 1, 0, 0], [0, 0, 0, 1, 0]]) elif self.r < 3: return np.array([[0, 0, 0, 1, 0], [0, 0, 0, 0, 1], [1, 0, 0, 0, 0], [0, 1, 0, 0, 0], [0, 0, 1, 0, 0]]) elif self.r < 4: return np.array([[0, 0, 1, 0, 0], [0, 0, 0, 1, 0], [0, 0, 0, 0, 1], [1, 0, 0, 0, 0], [0, 1, 0, 0, 0]]) else: return np.array([[0, 1, 0, 0, 0], [0, 0, 1, 0, 0], [0, 0, 0, 1, 0], [0, 0, 0, 0, 1], [1, 0, 0, 0, 0]]) def _circuit_diagram_info_(self, args): if self.r < 1: return '[+0]' elif self.r < 2: return '[+1]' elif self.r < 3: return '[+2]' elif self.r < 4: return '[+3]' else: return '[+4]' # 以下のように理解. # [前提] # 量子ビットの取り得る値が, 五通りあると見る. # 列ベクトル [1, 0, 0, 0, 0], [0, 1, 0, 0, 0], [0, 0, 1, 0, 0], [0, 0, 0, 1, 0], [0, 0, 0, 0, 1] # を それぞれ, 状態 0, 1, 2, 3, 4 を 取ると見る. # # [操作] # 1. ↑(1量子ビット, 0 と見る) を 用意. # 2. QutritPlusGate ゲート を 操作する場合. # -> r の 値(0, 1, 2, 3, 4) に応じて, q0 の 出力が, 以下のように変化するはず. # r = 0: q0 の 出力 は, 0. # r = 1: q0 の 出力 は, 1. # r = 2: q0 の 出力 は, 2. # r = 3: q0 の 出力 は, 3. # r = 4: q0 の 出力 は, 4. for y in range(7): q0 = cirq.LineQid(0, dimension=5) Gate = QutritPlusGate() circuit = cirq.Circuit( Gate.on(q0) ) circuit.append([cirq.measure(q0, key='q0')]) print("Circuit with a custom rotation gate: ", y, "times") print(circuit) # Simulate 5 times. simulator = cirq.Simulator() results = simulator.run(circuit, repetitions=5) # Output result. print("r = " + str(Gate.r)) print(results) print("") |
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 |
[出力結果] 測定を繰り返すと, 出力結果 も 変化. Circuit with a custom rotation gate: 0 times 0 (d=5): ───[+1]───M('q0')─── r = 1 q0=11111 Circuit with a custom rotation gate: 1 times 0 (d=5): ───[+3]───M('q0')─── r = 3 q0=33333 Circuit with a custom rotation gate: 2 times 0 (d=5): ───[+1]───M('q0')─── r = 1 q0=11111 Circuit with a custom rotation gate: 3 times 0 (d=5): ───[+4]───M('q0')─── r = 4 q0=44444 Circuit with a custom rotation gate: 4 times 0 (d=5): ───[+3]───M('q0')─── r = 3 q0=33333 Circuit with a custom rotation gate: 5 times 0 (d=5): ───[+2]───M('q0')─── r = 2 q0=22222 Circuit with a custom rotation gate: 6 times 0 (d=5): ───[+0]───M('q0')─── r = 0 q0=00000 |