前の章では、量子ビットが存在する可能性のあるすべての状態を調べました。量子ビットは2次元ベクトルで表すことができ、その状態は次の形式に制限されていることがわかりました。
$$ |q\rangle = \cos{(\tfrac{\theta}{2})}|0\rangle + e^{i\phi}\sin{(\tfrac{\theta}{2})}|1\rangle $$$\theta$および$\phi$は実数です。この章では、これらの状態間で量子ビットを変更する操作である ゲート について説明します。ゲートの数とゲート間の類似性のため、この章は単調になる危険性があります。 これを回避するため、章全体の適切な場所に重要な考え方を紹介するいくつかの余談を含めました。
目次
- パウリゲート
1.1 Xゲート
1.2 Y、Zゲート - 余談: X、Y、Z基底
- アダマールゲート
- 余談: 異なる基底での測定
- Pゲート
- I、S、Tゲート
6.1 Iゲート
6.2 Sゲート
6.3 Tゲート - 一般的なU3ゲート
原子で計算をおこなう では、いくつかのゲートに出会い、それらを使用して古典的な計算を実行しました。 量子回路の重要な特徴は、量子ビットの初期化と測定の間では、操作が いつも 可逆であることです。 その結果、量子回路で使用できるすべてのゲートも可逆です。 これらの可逆ゲートは、行列として表すか、ブロッホ球の周りの回転と考えることができます。
from qiskit import QuantumCircuit, assemble, Aer
from math import pi, sqrt
from qiskit.visualization import plot_bloch_multivector, plot_histogram
sim = Aer.get_backend('aer_simulator')
1. パウリゲート
線形代数の章のパウリ行列に精通している必要があります。 ここで紹介する数学のいずれかが初めての場合は、線形代数の章を使用して、理解してもらう必要があります。 この章ではパウリ行列が非常に一般的に使用されるいくつかの量子ゲートを表すことができることがわかります。
1.1 Xゲート
Xゲートは、パウリ-X行列で表されます。
$$ X = \begin{bmatrix} 0 & 1 \\ 1 & 0 \end{bmatrix} = |0\rangle\langle1| + |1\rangle\langle0| $$ゲートが量子ビットに与える影響を確認するには、量子ビットの状態ベクトルにゲートを掛けます。 Xゲートが状態$|0\rangle$と$|1\rangle$の振幅を切り替えることがわかります。
$$ X|0\rangle = \begin{bmatrix} 0 & 1 \\ 1 & 0 \end{bmatrix}\begin{bmatrix} 1 \\ 0 \end{bmatrix} = \begin{bmatrix} 0 \\ 1 \end{bmatrix} = |1\rangle$$備忘: ベクトルと行列の乗算 (ここをクリックして展開してください。)
行列の乗算は、前章で見た内積の一般化です。 (上記のように)ベクトルに行列を乗算する特定のケースでは、常にベクトルを返します。 $$ M|v\rangle = \begin{bmatrix}a & b \\ c & d \\\end{bmatrix}\begin{bmatrix}v_0 \\ v_1 \\\end{bmatrix} = \begin{bmatrix}a\cdot v_0 + b \cdot v_1 \\ c \cdot v_0 + d \cdot v_1\end{bmatrix} $$ 量子コンピューティングでは、基底ベクトルで行列を書くことができます。 $$X = |0\rangle\langle1| + |1\rangle\langle0|$$ これは、行列を使用するよりも明確な場合があります。さまざまな乗算の結果を確認できるためです。 $$ \begin{aligned} X|1\rangle & = (|0\rangle\langle1| + |1\rangle\langle0|)|1\rangle \\ & = |0\rangle\langle1|1\rangle + |1\rangle\langle0|1\rangle \\ & = |0\rangle \times 1 + |1\rangle \times 0 \\ & = |0\rangle \end{aligned} $$ 実際、次のようにケットとブラが乗算されているのを見てみます。 $$ |a\rangle\langle b| $$ これは外積と呼ばれ、次のルールに従います。 $$ |a\rangle\langle b| = \begin{bmatrix} a_0 b_0 & a_0 b_1 & \dots & a_0 b_n\\ a_1 b_0 & \ddots & & \vdots \\ \vdots & & \ddots & \vdots \\ a_n b_0 & \dots & \dots & a_n b_n \\ \end{bmatrix} $$ これが実際にX行列に結果として表示されることがわかります。 $$ |0\rangle\langle1| + |1\rangle\langle0| = \begin{bmatrix}0 & 1 \\ 0 & 0 \\\end{bmatrix} + \begin{bmatrix}0 & 0 \\ 1 & 0 \\\end{bmatrix} = \begin{bmatrix}0 & 1 \\ 1 & 0 \\\end{bmatrix} = X $$
Qiskitでは、これを検証するための短い回路を作成できます。
# |0> 量子ビットに対してゲート作用させてみましょう。
qc = QuantumCircuit(1)
qc.x(0)
qc.draw()
上記の結果を見てみましょう。 注意 ここでは、ブロッホベクトルの代わりに量子ビットの状態ベクトルを取る plot_bloch_multivector()
を使用しています。
# 結果を見てみましょう
qc.save_statevector()
qobj = assemble(qc)
state = sim.run(qobj).result().get_statevector()
plot_bloch_multivector(state)
確かに、量子ビットの状態は予想どおり$|1\rangle$です。 これは、ブロッホ球の x軸 を中心とした$\pi$ラジアンによる回転と考えることができます。 Xゲートは、古典回路との類似性からNOTゲートとも呼ばれます。
1.2 Y、Zゲート
Xゲートと同様に、YおよびZパウリ行列も量子回路のYおよびZゲートとして機能します。
$$ Y = \begin{bmatrix} 0 & -i \\ i & 0 \end{bmatrix} \quad\quad\quad\quad Z = \begin{bmatrix} 1 & 0 \\ 0 & -1 \end{bmatrix} $$$$ Y = -i|0\rangle\langle1| + i|1\rangle\langle0| \quad\quad Z = |0\rangle\langle0| - |1\rangle\langle1| $$そして当然のことながら、それらはそれぞれブロッホ球のy軸とz軸を中心に$\pi$だけ回転する作用をうみます。
以下は、ブロッホ球で量子ビットの状態を表示するウィジェットです。いずれかのボタンを押すと、量子ビットにゲートが実行されます。
# このセルのコードを実行してウィジェットを表示します。
from qiskit_textbook.widgets import gate_demo
gate_demo(gates='pauli')
Qiskitでは、次の方法でYゲートとZゲートを回路に適用できます。
qc.y(0) # 量子ビット0にYゲートを適用します。
qc.z(0) # 量子ビット0にZゲートを適用します。
qc.draw()
備忘: 行列の固有ベクトル (ここをクリックして展開してください。)
ベクトルと行列を乗算すると、ベクトルが生成されることを確認しました。 $$ M|v\rangle = |v'\rangle \leftarrow \text{新しいベクトル} $$ 適切なベクトルと行列を選択した場合、この行列乗算がスカラーによる乗算を実行するのと同じである場合を見つけることができます。 $$ M|v\rangle = \lambda|v\rangle $$ (上記では、$M$は行列で、$\lambda$はスカラーです)。 行列$M$の場合、この性質を持つベクトルは、$M$の固有ベクトルと呼ばれます。 たとえば、Z行列の固有ベクトルは$|0\rangle$および$|1\rangle$の状態です。 $$ \begin{aligned} Z|0\rangle & = |0\rangle \\ Z|1\rangle & = -|1\rangle \end{aligned} $$ 私たちは量子ビットの状態を記述するためにベクトルを使用するので、これらのベクトルをしばしば固有状態と呼びます。 固有ベクトルは量子計算で非常に重要であり、それらをしっかりと把握することが重要です。量子ビットが$|0\rangle$または$|1\rangle$にあるとき、Zゲートが量子ビットに影響を与えないように見えることもあります。これは、状態$|0\rangle$および$|1\rangle$がZゲートの2つの 固有状態 であるためです。 実際、 計算基底 (状態$|0\rangle$および$|1\rangle$によって形成される基底)は、Z基底と呼ばれることがよくあります。 Z基底は、私たちが使用できる唯一の基底ではありません。そのほかの基底として一般的なものは、Xゲートの固有状態によって形成されるX基底です。X基底の2つのベクトルを$|+\rangle$および$|-\rangle$と呼びます。
$$ |+\rangle = \tfrac{1}{\sqrt{2}}(|0\rangle + |1\rangle) = \tfrac{1}{\sqrt{2}}\begin{bmatrix} 1 \\ 1 \end{bmatrix}$$$$ |-\rangle = \tfrac{1}{\sqrt{2}}(|0\rangle - |1\rangle) = \tfrac{1}{\sqrt{2}}\begin{bmatrix} 1 \\ -1 \end{bmatrix} $$あまり一般的ではないもう1つの基底は、Yゲートの固有状態によって形成されるものです。 それは次のように記述されます。
$$ |\circlearrowleft\rangle, \quad |\circlearrowright\rangle$$これらの基底を計算する演習を用意しました。 事実、無数の基底があります。 1つの基底を構成するには、2つの直交ベクトルが必要です。
練習問題
- $|+\rangle$および$|-\rangle$が実際にXゲートの固有状態であることを確認してください。
- 上の状態は、どのような固有値を持っていますか。
- これらの固有値がブロッホ球に表示されないのはなぜですか?
- Yゲートの固有状態と、ブロッホ球上の座標を見つけてください。
パウリゲートのみを使用すると、初期化された量子ビットを$|0\rangle$または$|1\rangle$以外の状態に移動することは不可能です。つまり、重ね合わせを行うことはできません。 より興味深い状態を作成するには、より多くのゲートが必要になります!
3. アダマールゲート
アダマールゲート(Hゲート)は以下のような行列です。
$$ H = \tfrac{1}{\sqrt{2}}\begin{bmatrix} 1 & 1 \\ 1 & -1 \end{bmatrix} $$これにより、以下の変換が実行されることがわかります。
$$ H|0\rangle = |+\rangle $$$$ H|1\rangle = |-\rangle $$この変換は、ブロッホベクトル [1,0,1]
(x軸とz軸の間の線)を中心とする回転、またはXとZの基底間の量子ビットの状態の変換と考えることができます。
以下のウィジェットを使用して、これらのゲートを体感してみてください。
# このセルのコードを実行してウィジェットを表示します。
from qiskit_textbook.widgets import gate_demo
gate_demo(gates='pauli+h')
練習問題
- Hゲートをベクトル$|0\rangle$、$|1\rangle$、$|+\rangle$および$|-\rangle$の外積として記述してください。
- ゲートを連ねたHZHを任意の量子ビット状態に適用することは、Xゲートを適用することと同等であることを示してください。
- Yゲート(グローバルフェーズを無視)と同等のX、Z、Hゲートの組み合わせを見つけてください。
4. 余談: 異なる基底での測定
Z軸は本質的に特別なものではなく、他にも無限に多くの基底があることがわかりました。 測定と同様に、常に計算ベース(Z基底)で測定する必要はなく、任意の基底で量子ビットを測定できます。
例として、X基底で測定してみましょう。 $|+\rangle$または$|-\rangle$を測定する確率を計算できます。
$$ p(|+\rangle) = |\langle+|q\rangle|^2, \quad p(|-\rangle) = |\langle-|q\rangle|^2 $$そして測定後、これらの2つの状態のいずれかに量子ビットがあることが保証されます。 QiskitはZ基底でのみ測定できるため、X基底で測定するにはアダマールゲートを使用して独自に作成する必要があります。
# X測定関数を作成します。
def x_measurement(qc, qubit, cbit):
"""Measure 'qubit' in the X-basis, and store the result in 'cbit'"""
qc.h(qubit)
qc.measure(qubit, cbit)
return qc
initial_state = [1/sqrt(2), -1/sqrt(2)]
# 量子ビットを初期化して測定します。
qc = QuantumCircuit(1,1)
qc.initialize(initial_state, 0)
x_measurement(qc, 0, 0) # measure qubit 0 to classical bit 0
qc.draw()
以前2つのHゲートの間にZゲートを挟むことでXゲートを作成できることを確認しました。
$$ X = HZH $$これをZ基底に作用させると、Hゲートは量子ビットをX基底に変換し、ZゲートはX基底にNOTを作用させ、最後のHゲートがZ基底を返します。 これは行列を掛け合わせることで確かめられます: $$ HZH=\frac{1}{\sqrt{2}}\begin{bmatrix} 1 & 1\\ 1 & -1\end{bmatrix} \begin{bmatrix} 1 & 0\\ 0 & -1\end{bmatrix} \frac{1}{\sqrt{2}} \begin{bmatrix} 1 & 1 \\ 1 & -1\end{bmatrix} = \begin{bmatrix} 0 & 1 \\ 1 & 0\end{bmatrix} = X $$
これと同じ論理に従って、測定前にX基底をZ基底へと変換することで、X測定を作りました。
この測定処理は処理系に応じて異なった影響を及ぼしうるので(例えば、ある処理系では測定後にはいつも$|0\rangle$を返し、一方で他の処理系では測定された状態のままにする)、処理後の量子ビットは未定義であり、もう一度使うためにはリセットする必要があります。
なぜアダマールゲートによってZ基底での状態をX基底で測定できるのかについて、異なる観点から考えてみましょう。仮にX基底で測定したい量子ビットが(正規化された)状態$a|0\rangle + b|1\rangle$になっているとします。これをX基底で測定するには、まずこの状態を$|+\rangle$と$|-\rangle$の線形結合で表します。 $|0\rangle = \frac{|+\rangle + |-\rangle}{\sqrt{2}}$と$|1\rangle = \frac{|+\rangle - |-\rangle}{\sqrt{2}}$の関係を使うと、 状態は$\frac{a+b}{\sqrt{2}}|+\rangle + \frac{a-b}{\sqrt{2}}|-\rangle$となります。よって、X基底で確率の振幅を観測するには、Z基底で表現された状態ベクトルにアダマール行列を作用させればよいということが分かります。
それでは、結果を見てみましょう。
qobj = assemble(qc) # 実行可能なQobjに回路をアセンブルします。
counts = sim.run(qobj).result().get_counts() # シミュレーションを行い、状態ベクトルを返します。
plot_histogram(counts)
$|-\rangle$の状態で量子ビットを初期化しましたが、測定後、量子ビットが$|1\rangle$の状態に飛び移ることがわかります。 セルを再度実行しても、同じ結果が表示されます。というのも状態$|-\rangle$は、X-測定の標準基底であり、何度測定しても同じ結果となるからです。
練習問題
- $|+\rangle$状態で量子ビットを初期化する場合、$|-\rangle$状態でそれを測定する確率はどれくらいですか?
- Qiskitを使用して、$|+\rangle$と$|-\rangle$の状態で$|0\rangle$量子ビットを測定する確率を表示してください。(ヒント:
.get_counts()
およびplot_histogram()
を使用することができます。) - Y基底で測定する関数を作成してみてください。
さまざまな基底で測定することで、ハイゼンベルクの有名な不確実性原理を見ることができます。 Z基底で状態を測定する確実性があると、X基底で特定の状態を測定する確実性がすべて失われ、その逆も同様です。 よくある誤解は、不確実性は機器の制限によるものであるというものですが、ここでは不確かさが実際に量子ビットの性質の一部であることがわかります。
たとえば、量子ビットを$|0\rangle$状態にした場合、Z基底での測定は$|0\rangle$であることが確実ですが、X基底での測定は完全にランダムです! 同様に、量子ビットを$|-\rangle$状態にした場合、X基底での測定は$|-\rangle$であることが確実ですが、Z基底での測定は完全にランダムになります。
より一般的には、 量子システムの状態がどのようなものであっても、特定の結果をもたらす測定が常に存在します。
Hゲートの導入により、いくつかの興味深い現象を探ることができましたが、量子操作にはまだ非常に制限があります。 ここで、新しいタイプのゲートを紹介しましょう。
5. Pゲート
Pゲート(位相ゲート)は パラメータ化されたゲート です。つまり、何をすべきかを正確に伝えるには数字($\phi$)が必要です。Pゲートは、Z軸を中心に$\phi$の回転を実行します。 以下のような行列です。
$$ P(\phi) = \begin{bmatrix} 1 & 0 \\ 0 & e^{i\phi} \end{bmatrix} $$$\phi$は実数です。
以下のウィジェットを使用してPゲートを体感してみてください。スライダーを使用して$\phi$を指定してください。
# このセルのコードを実行してウィジェットを表示します。
from qiskit_textbook.widgets import gate_demo
gate_demo(gates='pauli+h+p')
Qiskitでは、p(phi,qubit)
を使用してPゲートを指定します。
qc = QuantumCircuit(1)
qc.p(pi/4, 0)
qc.draw()
ZゲートはPゲートの特殊なケースで、$\phi=\pi$であることに気付くでしょう。 実際、この章で言及する3つの一般的に参照されるゲートがあり、それらはすべてPゲートの特殊なケースです。
6. I、S、Tゲート
6.1 Iゲート
まずIゲート(別名「Idゲート」または「Identityゲート」)があります。 これは単に何もしないゲートです。 その行列は単位行列です。
$$ I = \begin{bmatrix} 1 & 0 \\ 0 & 1\end{bmatrix} $$回路内の任意の場所にIゲートを適用しても、量子ビットの状態には影響がないため、これは何もしないゲートと見なすこともできます。 このゲートの存在理由は主に2つの理由があります。1つは、計算でよく使用されるためです。たとえば、Xゲートが自分自身の逆行列であることを証明します。
$$ I = XX $$2つ目は、実際のハードウェアを検討するときに、「何もしない」または「なし」の操作を指定することがしばしば役立つためです。
練習問題
- Iゲートの固有状態は何でしょうか。
6.2 Sゲート
次に言及するゲートはSゲート($\sqrt{Z}$ゲートとも呼ばれます)です。これは、$\phi=\pi/2$のPゲートです。ブロッホ球の周りを1/4回転します。 この章でこれまでに紹介したすべてのゲートとは異なり、Sゲートは自分自身の逆行列では ない ことに注意してください。 その結果、S†ゲート(「Sダガー」、「Sdg」、または$\sqrt{Z}^\dagger$ゲートも同様)というものがあります。S†ゲートは$\phi=-\pi/2$のPゲートです。
$$ S = \begin{bmatrix} 1 & 0 \\ 0 & e^{\frac{i\pi}{2}} \end{bmatrix}, \quad S^\dagger = \begin{bmatrix} 1 & 0 \\ 0 & e^{-\frac{i\pi}{2}} \end{bmatrix}$$「$\sqrt{Z}$ゲート」という名前は、2つの連続して適用されたSゲートが1つのZゲートと同じ効果を持つという事実によるものです。
$$ SS|q\rangle = Z|q\rangle $$この表記法は、量子計算全体で共通です。
QiskitでSゲートを追加するには、
qc = QuantumCircuit(1)
qc.s(0) # Sゲートを量子ビット0に適用します。
qc.sdg(0) # Sdgゲートを量子ビット0に適用します。
qc.draw()
qc = QuantumCircuit(1)
qc.t(0) # Tゲートを量子ビット0に適用します。
qc.tdg(0) # Tdgゲートを量子ビット0に適用します。
qc.draw()
以下のウィジェットを使用して、この章でこれまでに紹介したすべてのゲートを試すことができます。
# このセルのコードを実行してウィジェットを表示します。
from qiskit_textbook.widgets import gate_demo
gate_demo()
7. 一般的なU3ゲート
前に見たように、I、Z、S、Tゲートはすべて、より一般的なPゲートの特殊なケースです。 同様に、U3ゲートは、すべての単一量子ビット量子ゲートの中で最も一般的です。 これは、次の形式でパラメータ化されたゲートです。
$$ U_3(\theta, \phi, \lambda) = \begin{bmatrix} \cos(\theta/2) & -e^{i\lambda}\sin(\theta/2) \\ e^{i\phi}\sin(\theta/2) & e^{i\lambda+i\phi}\cos(\theta/2) \end{bmatrix} $$この章のすべてのゲートは$U_3(\theta,\phi,\lambda)$として指定できますが、あまりみかけません。
Qiskitは、U2およびU1ゲートも提供します。これらは、$\theta=0$および$\theta=\phi=0$であるU3ゲートの特定のケースです。U1ゲートはPゲートと同等であることがわかります。
$$ \begin{aligned} U_3(\tfrac{\pi}{2}, \phi, \lambda) = U_2 = \tfrac{1}{\sqrt{2}}\begin{bmatrix} 1 & -e^{i\lambda} \\ e^{i\phi} & e^{i\lambda+i\phi} \end{bmatrix} & \quad & U_3(0, 0, \lambda) = U_1 = \begin{bmatrix} 1 & 0 \\ 0 & e^{i\lambda}\\ \end{bmatrix} \end{aligned} $$実際のIBM量子ハードウェアで実行する前に、すべての単一量子ビット操作は$U_1$、$U_2$、および$U_3$にコンパイルされます。 このため、 物理ゲート と呼ばれることもあります。
ここでは言及していませんが、可能なゲートの数は無限であり、これにはRxおよびRyゲートも含まれることは明らかです。 また、Z基底は、特別なことは何もないですが、標準の計算基底として選択されていることに注意してください。 そのため、SゲートとTゲートには名前がありますが、X基底とY基底におけるSやTに対応する名前はありません。(例:$\sqrt{X}$と$\sqrt[4]{Y}$)。
import qiskit.tools.jupyter
%qiskit_version_table