概要
- Python の 練習を兼ねて, 量子コンピュータのフレームワーク(Google社)のチュートリアルを確認してみた
- 動作環境は, Google Colaboratory で行った
感想
- チュートリアル時点で, すでに難しい概念が多く, だいぶ混乱したように思う.
- 難しい用語が多いので, 消化不良にならないように, 地道に見ていこうと思う.
- 時間を見つけて, 今後も, チュートリアルの残りの部分を進めていこうと思う.
Circuits and Devices
- Foxtail
- Bristlecone
- Sycamore
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 |
[編集内容(Foxtail)] import cirq # 量子ビット(Qubit)が隣接しているもの, 隣接していないオペレーション(Qubitたちを集めて作成した量子ゲート)を作成. q0, q1, q2 = cirq.GridQubit(0, 0), cirq.GridQubit(0, 1), cirq.GridQubit(0, 2) adjacent_op = cirq.CZ(q0, q1) nonadjacent_op = cirq.CZ(q0, q2) # デバイスの制約がない回路を設定. free_circuit = cirq.Circuit() # 両方のオペレーションとも問題なく出力(print(free_circuit))される. free_circuit.append(adjacent_op) free_circuit.append(nonadjacent_op) print('Unconstrained device:') print(free_circuit) print() # デバイス(Foxtail)の制約を追加. # デバイス(Foxtail)に含まれるオペレーションであれば, 出力される. print('Foxtail device:') foxtail_circuit = cirq.Circuit(device=cirq.google.Foxtail) foxtail_circuit.append(adjacent_op) print('Allowed.') print(foxtail_circuit) # デバイス(Foxtail)に含まれないオペレーションであれば, エラーとする. try: # デバイス(Foxtail)に含まれないオペレーションを追加. foxtail_circuit.append(nonadjacent_op) except ValueError as e: print('Not allowed. %s' % e) |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
[出力結果] Unconstrained device: (0, 0): ───@───@─── │ │ (0, 1): ───@───┼─── │ (0, 2): ───────@─── Foxtail device: Allowed. (0, 0): ───@─── │ (0, 1): ───@─── Not allowed. Non-local interaction: cirq.CZ(cirq.GridQubit(0, 0), cirq.GridQubit(0, 2)). |
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 |
import cirq # 量子ビット(Qubit)が隣接しているもの, 隣接していないオペレーション(Qubitたちを集めて作成した量子ゲート)を作成. q0, q1, q2 = cirq.GridQubit(0, 5), cirq.GridQubit(0, 6), cirq.GridQubit(1, 5) adjacent_op = cirq.CZ(q0, q1) nonadjacent_op = cirq.CZ(q1, q2) # デバイスの制約がない回路を設定. free_circuit = cirq.Circuit() # 両方のオペレーションとも問題なく出力(print(free_circuit))される. free_circuit.append(adjacent_op) free_circuit.append(nonadjacent_op) print('Unconstrained device:') print(free_circuit) print() # デバイス(Bristlecone)の制約を追加. # デバイス(Bristlecone)に含まれるオペレーションであれば, 出力される. print('Bristlecone device:') bristlecone_circuit = cirq.Circuit(device=cirq.google.Bristlecone) bristlecone_circuit.append(adjacent_op) print('Allowed.') print(bristlecone_circuit) # デバイス(Bristlecone)に含まれないオペレーションであれば, エラーとする. try: # デバイス(Bristlecone)に含まれないオペレーションを追加. bristlecone_circuit.append(nonadjacent_op) except ValueError as e: print('Not allowed. %s' % e) |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
[出力結果] Unconstrained device: (0, 5): ───@─────── │ (0, 6): ───@───@─── │ (1, 5): ───────@─── Bristlecone device: Allowed. (0, 5): ───@─── │ (0, 6): ───@─── Not allowed. Non-local interaction: cirq.CZ(cirq.GridQubit(0, 6), cirq.GridQubit(1, 5)). |
デバイス(Sycamore)については, 使い方が良く分かってないため, ここでは詳細は確認できなかった.
※FSimGateなどの使い方を含めて理解する必要がありそう.
Simulation
- 量子回路は, Simulation によって計算されるとのこと.
- Simulation に, 20量子ビットの上限制約あるとのこと.
- Bell State
- Greenberger–Horne–Zeilinger state
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 |
[編集内容(Bell State)] import cirq # ベル状態の量子回路作成. # ( |00> + |11> ) / sqrt(2) bell_circuit = cirq.Circuit() q0, q1 = cirq.LineQubit.range(2) bell_circuit.append(cirq.H(q0)) bell_circuit.append(cirq.CNOT(q0, q1)) print(bell_circuit) # Simulator初期化. s = cirq.Simulator() print('Simulate the circuit:') results = s.simulate(bell_circuit) print(results) print() # サンプリングの場合, 最後に測定値を追加する必要があるとのこと. bell_circuit.append(cirq.measure(q0, q1, key='result')) print('Sample the circuit:') samples = s.run(bell_circuit, repetitions=1000) # ヒストグラム表示. print(samples.histogram(key='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 |
[出力結果] ---[1回目]-------------------- 0: ───H───@─── │ 1: ───────X─── Simulate the circuit: measurements: (no measurements) output vector: 0.707|00⟩ + 0.707|11⟩ Sample the circuit: Counter({3: 532, 0: 468}) ------------------------------ ---[2回目]-------------------- 0: ───H───@─── │ 1: ───────X─── Simulate the circuit: measurements: (no measurements) output vector: 0.707|00⟩ + 0.707|11⟩ Sample the circuit: Counter({0: 501, 3: 499}) ------------------------------ -> Counter は, プログラム実行ごとに違った値が出力される. |
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 |
[編集内容(Greenberger–Horne–Zeilinger state)] import cirq # GHZ状態の量子回路作成. # https://qiskit.org/documentation/locale/ja_JP/tutorials/circuits/1_getting_started_with_qiskit.html # -> GHZ状態について, Hadamardゲート, 制御NOT演算子(0, 1), 制御NOT演算子(0, 2) を 適用して作成することが紹介されている. # ( |000> + |111> ) / sqrt(2) ghz_circuit = cirq.Circuit() q0, q1, q2 = cirq.LineQubit.range(3) ghz_circuit.append(cirq.H(q0)) ghz_circuit.append(cirq.CNOT(q0, q1)) # ghz_circuit.append(cirq.CNOT(q1, q2)) # q1, q2 でも, output vector: 0.707|000⟩ + 0.707|111⟩ は 同じになることを確認. ghz_circuit.append(cirq.CNOT(q0, q2)) print(ghz_circuit) # Simulator初期化. s = cirq.Simulator() print('Simulate the circuit:') results = s.simulate(ghz_circuit) print(results) print() # サンプリングの場合, 最後に測定値を追加する必要があるとのこと. ghz_circuit.append(cirq.measure(q0, q1, q2, key='result')) print('Sample the circuit:') samples = s.run(ghz_circuit, repetitions=1000) # ヒストグラム表示. print(samples.histogram(key='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 |
[出力結果] ---[1回目]-------------------- 0: ───H───@───@─── │ │ 1: ───────X───┼─── │ 2: ───────────X─── Simulate the circuit: measurements: (no measurements) output vector: 0.707|000⟩ + 0.707|111⟩ Sample the circuit: Counter({0: 510, 7: 490}) ------------------------------ ---[2回目]-------------------- 0: ───H───@───@─── │ │ 1: ───────X───┼─── │ 2: ───────────X─── Simulate the circuit: measurements: (no measurements) output vector: 0.707|000⟩ + 0.707|111⟩ Sample the circuit: Counter({7: 504, 0: 496}) ------------------------------ -> Counter は, プログラム実行ごとに違った値が出力される. |