概要
- Python の 練習を兼ねて, 量子コンピュータのフレームワーク(Google社)のチュートリアルを確認してみた
- 動作環境は, Google Colaboratory で行った
感想
- 難しい用語が多いので, 消化不良にならないように, 地道に見ていこうと思う.
- 時間を見つけて, 今後も, チュートリアルの残りの部分を進めていこうと思う.
Using parameter sweeps
- Cirq, SymPy, matplotlib の install.
- Sweeping の サンプル①
- Sweeping の サンプル②
- Sweeping の サンプル③
- ユニタリ行列 の サンプル
1 2 3 4 5 6 7 8 9 10 11 |
[編集内容] try: import cirq import sympy import matplotlib except ImportError: print("installing ...") !pip install --quiet cirq !pip install --quiet sympy !pip install --quiet matplotlib print("installed.") |
1 2 3 4 |
[出力結果] installing ... |████████████████████████████████| 1.6MB 13.9MB/s installed. |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
[編集内容(Using parameter sweeps)] import cirq import matplotlib.pyplot as plt import sympy # Perform an X gate with variable exponent q = cirq.GridQubit(1, 1) circuit = cirq.Circuit(cirq.X(q) ** sympy.Symbol('t'), cirq.measure(q, key='m')) # Sweep exponent from zero (off) to one (on) and back to two (off) param_sweep = cirq.Linspace('t', start=0, stop=2, length=200) # Simulate the sweep s = cirq.Simulator() trials = s.run_sweep(circuit, param_sweep, repetitions=1000) # Plot all the results x_data = [trial.params['t'] for trial in trials] y_data = [trial.histogram(key='m')[1] / 1000.0 for trial in trials] plt.scatter('t','p', data={'t': x_data, 'p': y_data}) |
1 2 3 |
[出力結果] <matplotlib.collections.PathCollection at 0x7f59204c05d0> ※ 正規分布っぽいグラフが表示された. |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
[編集内容(Using parameter sweeps)] import cirq import matplotlib.pyplot as plt import sympy # Perform an Y gate with variable exponent q = cirq.GridQubit(1, 1) circuit = cirq.Circuit(cirq.Y(q) ** sympy.Symbol('t'), cirq.measure(q, key='m')) # Sweep exponent from zero (off) to one (on) and back to two (off) param_sweep = cirq.Linspace('t', start=0, stop=2, length=200) # Simulate the sweep s = cirq.Simulator() trials = s.run_sweep(circuit, param_sweep, repetitions=1000) # Plot all the results x_data = [trial.params['t'] for trial in trials] y_data = [trial.histogram(key='m')[1] / 1000.0 for trial in trials] plt.scatter('t','p', data={'t': x_data, 'p': y_data}) |
1 2 3 |
[出力結果] <matplotlib.collections.PathCollection at 0x7f592050ec90> ※ 正規分布っぽいグラフが表示された. |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
[編集内容(Using parameter sweeps)] import cirq import matplotlib.pyplot as plt import sympy # Perform an Z gate with variable exponent q = cirq.GridQubit(1, 1) circuit = cirq.Circuit(cirq.Z(q) ** sympy.Symbol('t'), cirq.measure(q, key='m')) # Sweep exponent from zero (off) to one (on) and back to two (off) param_sweep = cirq.Linspace('t', start=0, stop=2, length=200) # Simulate the sweep s = cirq.Simulator() trials = s.run_sweep(circuit, param_sweep, repetitions=1000) # Plot all the results x_data = [trial.params['t'] for trial in trials] y_data = [trial.histogram(key='m')[1] / 1000.0 for trial in trials] plt.scatter('t','p', data={'t': x_data, 'p': y_data}) |
1 2 3 |
[出力結果] <matplotlib.collections.PathCollection at 0x7f5920306250> ※ X軸上に描画される形でグラフが表示された. |
Unitary matrices and decompositions
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 |
[編集内容(Unitary matrices and decompositions)] import cirq print('Unitary of the X gate') print(cirq.unitary(cirq.X)) print('Unitary of the Y gate') print(cirq.unitary(cirq.Y)) print('Unitary of the Z gate') print(cirq.unitary(cirq.Z)) print('Unitary of the H gate') print(cirq.unitary(cirq.H)) print('Unitary of the S gate') print(cirq.unitary(cirq.S)) print('Unitary of the T gate') print(cirq.unitary(cirq.T)) print('Unitary of SWAP operator on two qubits.') q0, q1 = cirq.LineQubit.range(2) print(cirq.unitary(cirq.SWAP(q0, q1))) print('Unitary of CNOT operator on two qubits.') q2, q3 = cirq.LineQubit.range(2) print(cirq.unitary(cirq.CNOT(q2, q3))) print('Unitary of CCNOT operator on three qubits.') q4, q5, q6 = cirq.GridQubit(0, 0), cirq.GridQubit(0, 1), cirq.GridQubit(0, 2) print(cirq.unitary(cirq.CCNOT(q4, q5, q6))) print('Unitary of a sample circuit 1.') print(cirq.unitary(cirq.Circuit(cirq.X(q0), cirq.SWAP(q0, q1)))) print('Unitary of a sample circuit 2.') print(cirq.unitary(cirq.Circuit(cirq.ISWAP(q, q + 1) for q in cirq.LineQubit.range(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 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 |
[出力結果] Unitary of the X gate [[0.+0.j 1.+0.j] [1.+0.j 0.+0.j]] Unitary of the Y gate [[0.+0.j 0.-1.j] [0.+1.j 0.+0.j]] Unitary of the Z gate [[ 1.+0.j 0.+0.j] [ 0.+0.j -1.+0.j]] Unitary of the H gate [[ 0.70710678+0.j 0.70710678+0.j] [ 0.70710678+0.j -0.70710678+0.j]] Unitary of the S gate [[1.+0.j 0.+0.j] [0.+0.j 0.+1.j]] Unitary of the T gate [[1. +0.j 0. +0.j ] [0. +0.j 0.70710678+0.70710678j]] Unitary of SWAP operator on two qubits. [[1.+0.j 0.+0.j 0.+0.j 0.+0.j] [0.+0.j 0.+0.j 1.+0.j 0.+0.j] [0.+0.j 1.+0.j 0.+0.j 0.+0.j] [0.+0.j 0.+0.j 0.+0.j 1.+0.j]] Unitary of CNOT operator on two qubits. [[1.+0.j 0.+0.j 0.+0.j 0.+0.j] [0.+0.j 1.+0.j 0.+0.j 0.+0.j] [0.+0.j 0.+0.j 0.+0.j 1.+0.j] [0.+0.j 0.+0.j 1.+0.j 0.+0.j]] Unitary of CCNOT operator on three qubits. [[1.+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 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 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 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 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 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] [0.+0.j 0.+0.j 0.+0.j 0.+0.j 0.+0.j 0.+0.j 1.+0.j 0.+0.j]] Unitary of a sample circuit 1. [[0.+0.j 0.+0.j 1.+0.j 0.+0.j] [1.+0.j 0.+0.j 0.+0.j 0.+0.j] [0.+0.j 0.+0.j 0.+0.j 1.+0.j] [0.+0.j 1.+0.j 0.+0.j 0.+0.j]] Unitary of a sample circuit 2. [[ 1.+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 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.-1.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.+1.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] [ 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 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.+1.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 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 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 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 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.+1.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.+1.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 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 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 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 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.+1.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 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 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.+1.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.-1.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 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]] |