Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
quantum-kittens
GitHub Repository: quantum-kittens/platypus
Path: blob/main/translations/ja/ch-states/single-qubit-gates.ipynb
4073 views
Kernel: Python 3

単一量子ビットゲート

前のセクションでは、量子ビットが存在する可能性のあるすべての状態を調べました。量子ビットは2次元ベクトルで表すことができ、その状態は次の形式に制限されていることがわかりました。

q=cos(θ2)0+eiϕsenθ21|q\rangle = \cos{(\tfrac{\theta}{2})}|0\rangle + e^{i\phi}\sin{\tfrac{\theta}{2}}|1\rangle

θ\thetaおよびϕ\phi は実数です。このセクションでは、これらの状態間で量子ビットを変更する操作である ゲート について説明します。ゲートの数とゲート間の類似性のため、この章は単調になる危険性があります。 これを回避するため、章全体の適切な場所に重要な考え方を紹介するいくつかの余談を含めました。

計算の原子では、いくつかのゲートに出会い、それを使用して古典的な計算を実行しました。量子回路の重要な特徴は、量子ビットを初期化してから測定するまでの間で、演算(ゲート)が常に可逆的であることです。これらの可逆ゲートは、行列として、およびブロッホ球の周りの回転として表すことができます。

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=[0amp;1 1amp;0]=01+10X = \begin{bmatrix} 0 & 1 \ 1 & 0 \end{bmatrix} = |0\rangle\langle1| + |1\rangle\langle0|

ゲートが量子ビットに与える影響を確認するには、量子ビットの状態ベクトルにゲートを掛けます。 Xゲートが状態0|0\rangle1|1\rangleの振幅を切り替えることがわかります。

X0=[0amp;1 1amp;0][1 0]=[0 1]=1X|0\rangle = \begin{bmatrix} 0 & 1 \ 1 & 0 \end{bmatrix}\begin{bmatrix} 1 \ 0 \end{bmatrix} = \begin{bmatrix} 0 \ 1 \end{bmatrix} = |1\rangle

備忘

01+10=[0amp;1 0amp;0]+[0amp;0 1amp;0]=[0amp;1 1amp;0]=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} = XMv=[aamp;b camp;d][v0 v1]=[av0+bv1 cv0+dv1]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=01+10X = |0\rangle\langle1| + |1\rangle\langle0|

これは、行列を使用するよりも明確な場合があります。さまざまな乗算の結果を確認できるためです。

X1amp;=(01+10)1 amp;=011+101 amp;=0×1+1×0 amp;=0\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}

実際、次のようにケットとブラが乗算されているのを見てみます。

ab|a\rangle\langle b|

これは外積と呼ばれ、次のルールに従います。

ab=[a0b0amp;a0b1amp;amp;a0bn a1b0amp;amp;amp; amp;amp;amp; anb0amp;amp;amp;anbn ]|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}

We can see this does indeed result in the X-matrix as seen above:

Mv=[aamp;b camp;d][v0 v1]=[av0+bv1 cv0+dv1]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}

Qiskitでは、これを検証するための短い回路を作成できます。

# Let's do an X-gate on a |0> qubit qc = QuantumCircuit(1) qc.x(0) qc.draw()
Image in a Jupyter notebook

上記の結果を見てみましょう。 注意 ここでは、ブロッホベクトルの代わりに量子ビットの状態ベクトルを取る plot_bloch_multivector() を使用しています。

# Let's see the result qc.save_statevector() qobj = assemble(qc) state = sim.run(qobj).result().get_statevector() plot_bloch_multivector(state)
Image in a Jupyter notebook

確かに、量子ビットの状態は予想どおり 1|1\rangleです。 これは、ブロッホ球の x軸 を中心としたπ\piラジアンの回転と考えることができます。 Xゲートは、古典ゲートとの類似性からNOTゲートとも呼ばれます。

1.2 Y、Zゲート

Xゲートと同様に、YおよびZパウリ行列も量子回路のYおよびZゲートとして機能します。

Y=[0amp;i iamp;0]Z=[1amp;0 0amp;1]Y = \begin{bmatrix} 0 & -i \ i & 0 \end{bmatrix} \quad\quad\quad\quad Z = \begin{bmatrix} 1 & 0 \ 0 & -1 \end{bmatrix}Y=i01+i10Z=0011Y = -i|0\rangle\langle1| + i|1\rangle\langle0| \quad\quad Z = |0\rangle\langle0| - |1\rangle\langle1|

そして当然のことながら、それらはそれぞれブロッホ球のy軸とz軸を中心に[[π\pi|2π2\pi|π2\frac{\pi}{2}]]だけ回転する作用をうみます。

以下は、ブロッホ球で量子ビットの状態を表示するウィジェットです。いずれかのボタンを押すと、量子ビットにゲートが実行されます。

# Run the code in this cell to see the widget from qiskit_textbook.widgets import gate_demo gate_demo(gates='pauli')

Qiskitでは、次の方法でYゲートとZゲートを回路に適用できます。

qc.y(0) # Do Y-gate on qubit 0 qc.z(0) # Do Z-gate on qubit 0 qc.draw()
Image in a Jupyter notebook

2. 余談: X、Y、Z基底

備忘:

行列の固有ベクトルベクトルに行列を掛けると、次のようなベクトルになることがわかりました。
Mv=v新しいベクトルM|v\rangle = |v'\rangle \leftarrow \text{新しいベクトル}Mv=λvM|v\rangle = \lambda|v\rangleZ0amp;=0 Z1amp;=1\begin{aligned} Z|0\rangle & = |0\rangle \ Z|1\rangle & = -|1\rangle \end{aligned}

量子ビットが0|0\rangleまたは1|1\rangleにあるとき、Zゲートが量子ビットに影響を与えないように見えることもあります。これは、状態0|0\rangleおよび1|1\rangleがZゲートの2つの 固有状態 であるためです。 実際、 計算基底 (状態0|0\rangleおよび1|1\rangleによって形成される基底)は、Z基底と呼ばれることがよくあります。 Z基底は、私たちが使用できる唯一の基底ではありません。そのほかの基底として一般的なものは、Xゲートの固有状態によって形成されるX基底です。X基底の2つのベクトルを+|+\rangleおよび|-\rangleと呼びます。

+=12(0+1)=12[1 1]|+\rangle = \tfrac{1}{\sqrt{2}}(|0\rangle + |1\rangle) = \tfrac{1}{\sqrt{2}}\begin{bmatrix} 1 \ 1 \end{bmatrix}=12(01)=12[1 1]|-\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つの直交ベクトルが必要です。エルミート行列とユニタリー行列の両方の固有ベクトルはベクトル空間の基底を形成します。この特性により、XゲートとYゲートの固有状態が実際に単一量子ビット状態の基底を形成していることを確認できます(これについては、付録の線形代数のページを参照してください)。

練習問題

  1. +|+\rangleおよび|-\rangleが実際にXゲートの固有状態であることを確認してください。

  2. 上の状態は、どのような固有値を持っていますか。

  3. Yゲートの固有状態と、ブロッホ球上の座標を見つけてください。

パウリゲートのみを使用すると、初期化された量子ビットを0|0\rangleまたは1|1\rangle以外の状態に移動することはできません。つまり、重ね合わせを行うことはできません。これは、従来のビットと異なる動作が見られないことを意味します。より興味深い状態を作成するには、より多くのゲートが必要になります。

3.アダマールゲート

アダマールゲート(Hゲート)は基本的な量子ゲートです。これにより、ブロッホ球の極から離れて、0 | 0 \rangle1|1 \rangleの重ね合わせを作成できます。それは以下のような行列です。

H=12[1amp;1 1amp;1]H = \tfrac{1}{\sqrt{2}}\begin{bmatrix} 1 & 1 \ 1 & -1 \end{bmatrix}

これにより、以下の変換が実行されることがわかります。

H0=+H|0\rangle = |+\rangleH1=H|1\rangle = |-\rangle

この変換は、ブロッホベクトル [1,0,1](x軸とz軸の間の線)を中心とする回転、またはXとZの基底間の量子ビットの状態の変換と考えることができます。

以下のウィジェットを使用して、これらのゲートを体感してみてください。

# Run the code in this cell to see the widget from qiskit_textbook.widgets import gate_demo gate_demo(gates='pauli+h')

練習問題

  1. Hゲートをベクトル0|0\rangle1|1\rangle+|+\rangleおよび |-\rangleの外積として記述してください。

  2. Sゲートを連ねたHZHを任意の量子ビット状態に適用することは、Xゲートを適用することと同等であることを示してください。

  3. Yゲート(グローバルフェーズを無視)と同等のX、Z、Hゲートの組み合わせを見つけてください。

4. 余談: 異なる基底での測定

Z軸は本質的に特別なものではなく、他にも無限に多くの基底があることがわかりました。 測定と同様に、常に計算ベース(Z基底)で測定する必要はなく、任意の基底で量子ビットを測定できます。

例として、X基底で測定してみましょう。+|+\rangleまたは|-\rangleを測定する確率を計算できます。

p(+)=+q2,p()=q2p(|+\rangle) = |\langle+|q\rangle|^2, \quad p(|-\rangle) = |\langle-|q\rangle|^2

そして測定をすると重ね合わせは破壊されます。 QiskitではZ基底での測定しか許可されていないため、アダマールゲートを使用して独自のゲートを作成する必要があります。

# Create the X-measurement function: 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)] # Initialize our qubit and measure it qc = QuantumCircuit(1,1) qc.initialize(initial_state, 0) x_measurement(qc, 0, 0) # measure qubit 0 to classical bit 0 qc.draw()
Image in a Jupyter notebook

前の練習問題では2つのHゲートの間にZゲートを挟むことでXゲートを作成できることを確認しました。

X=HZHX = HZH

Z基底から始めて、Hゲートは量子ビットをX基底に切り替え、ZゲートはX基底でNOTを実行し、最後のHゲートは量子ビットをZ基底に戻します。行列を乗算することで、これが常にXゲートのように動作することを確認できます。

$$ HZH = \tfrac{1}{\sqrt{2}}[1amp;1 1amp;1]\begin{bmatrix} 1 & 1 \ 1 & -1 \end{bmatrix} [1amp;0 0amp;1]\begin{bmatrix} 1 & 0 \ 0 & -1 \end{bmatrix} \tfrac{1}{\sqrt{2}}[1amp;1 1amp;1]\begin{bmatrix} 1 & 1 \ 1 & -1 \end{bmatrix}

[0amp;1 1amp;0]\begin{bmatrix} 0 & 1 \ 1 & 0 \end{bmatrix}

同じロジックに従って、測定前にX基底からZ基底に変換することでX測定を作成しました。測定プロセスはシステムによって異なる影響を与える可能性があるため(たとえば、一部のシステムは測定後に常に量子ビットを0|0\rangleに戻しますが、他のシステムは測定状態のままにする場合があります)、量子ビットの測定後の状態は未定義であり、再度使用する場合はリセットする必要があります。

アダマールゲートが実際にZ基底からX基底に移動する理由を確認する別の方法があります。 X基底で測定したい量子ビットが(正規化された)状態a0+b1a |0\rangle + b |1\rangleにあると仮定します。 X基底で測定するために、最初に状態を+|+\rangle and |-\rangleの線形結合として表現します。0=++2|0\rangle = \frac{|+\rangle + |-\rangle}{\sqrt{2}}および1=+2|1\rangle = \frac{|+\rangle - |-\rangle}{\sqrt{2}}という関係を使用することで、状態はa+b2++ab2\frac{a + b}{\sqrt{2}}|+\rangle + \frac{a - b}{\sqrt{2}}|-\rangleになります。 X基底の確率振幅は、Z基底で表される状態ベクトルにアダマール行列を適用することで取得できることに注意してください。

結果を見てみましょう。

qobj = assemble(qc) # Assemble circuit into a Qobj that can be run counts = sim.run(qobj).result().get_counts() # Do the simulation, returning the state vector plot_histogram(counts) # Display the output on measurement of state vector
Image in a Jupyter notebook

量子ビットを状態|-\rangle で初期化しましたが、測定後、量子ビットを状態1|1\rangleに戻したことがわかります。セルを再度実行すると、同じ結果が表示されます。これは、X基底の上では、状態|-\rangleが基底状態であり、Xに沿って測定すると常に同じ結果が得られるためです。

練習問題

  1. 量子ビットを状態+|+\rangleで初期化する場合、状態|-\rangleが測定される確率はどれくらいですか?

  2. Qiskitを使用して、+|+\rangle|-\rangle の状態で0|0\rangle量子ビットを測定する確率を表示してください。(ヒント: .get_counts() および plot_histogram()を使用することができます。)

  3. Y基底で測定する関数を作成してみてください。

さまざまな基底で測定することで、ハイゼンベルクの有名な不確実性原理を確認することができます。 Z基底で状態を測定する確実性があると、X基底で特定の状態を測定する確実性がすべて失われ、その逆も同様です。 よくある誤解は、不確実性は機器の制限によるものであるというものですが、ここでは不確かさが実際に量子ビットの性質の一部であることがわかります。

たとえば、量子ビットを0|0\rangle状態にした場合、Z基底での測定は0|0\rangleであることが確実ですが、X基底での測定は完全にランダムです! 同様に、量子ビットを|-\rangle状態にした場合、X基底での測定は|-\rangleであることが確実ですが、Z基底での測定は完全にランダムになります。

より一般的には、 量子システムの状態がどのようなものであっても、特定の結果をもたらす測定が常に存在します。

Hゲートの導入により、いくつかの興味深い現象を探ることができましたが、量子操作にはまだ非常に制限があります。 ここで、新しいタイプのゲートを紹介しましょう。

5.Pゲート

Pゲート(位相ゲート)はパラメーター化されています。つまり、ゲートに振る舞いを伝えるには、数値(ϕ\phi)が必要です。 Pゲートは、Z軸方向を中心にϕ\phiの回転を実行する行列形式です。

P(ϕ)=[1amp;0 0amp;eiϕ]P(\phi) = \begin{bmatrix} 1 & 0 \ 0 & e^{i\phi} \end{bmatrix}

ここで、ϕ\phi は実数です。

以下のウィジェットを使用してPゲートを試して、スライダーを使用して ϕ\phi を指定できます。

# Run the code in this cell to see the widget from qiskit_textbook.widgets import gate_demo gate_demo(gates='pauli+h+p')
VBox(children=(HBox(children=(Button(description='X', layout=Layout(height='3em', width='3em'), style=ButtonSt…
Image(value=b'\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x01 \x00\x00\x01 \x08\x06\x00\x00\x00\x14\x83\xae\x8…

Qiskitでは、 p(phi, qubit)を使用してPゲートを指定します。

qc = QuantumCircuit(1) qc.p(pi/4, 0) qc.draw()
Image in a Jupyter notebook

ZゲートはPゲートの特殊なケースであり、ϕ=π\phi = \piであることに気付くかもしれません。実際にこの章で言及する、より一般的に参照される3つのゲートがあります。これらはすべて、Pゲートの特殊なケースです。

6. I、S、Tゲート

6.1 Iゲート

まずIゲート(別名「Idゲート」または「Identityゲート」)があります。 これは単に何もしないゲートです。 その行列は単位行列です。

I=[1amp;0 0amp;1]I = \begin{bmatrix} 1 & 0 \ 0 & 1\end{bmatrix}

回路内の任意の場所にIゲートを適用しても、量子ビットの状態には影響がないため、これは何もしないゲートと見なすこともできます。 このゲートの存在理由は主に2つの理由があります。1つは、計算でよく使用されるためです。たとえば、Xゲートが自分自身の逆行列であることを証明します。

I=XXI = XX

2つ目は、実際のハードウェアを検討するときに、「何もしない」または「なし」の操作を指定することがしばしば役立つためです。

練習問題

  1. Iゲートの固有状態は何でしょうか。

6.2 Sゲート

次のゲートはSゲート(Z\sqrt{Z}ゲートとも呼ばれます)です。これはϕ=π/2\phi = \pi/2のPゲートです。ブロッホ球の周りを4分の1回転します。これまでこの章で紹介したすべてのゲートとは異なり、Sゲートの大切な点は自身の逆行列と等しくないことです。その結果、Sゲート(「S-dagger」、「Sdg」、またはZ\sqrt{Z}^\daggerゲート)はしばしば見かけるでしょう。 S ゲートは明らかに ϕ=π/2\phi = -\pi/2 のPゲートです。

S=[1amp;0 0amp;eiπ2],S=[1amp;0 0amp;eiπ2]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}

Z\sqrt{Z}ゲート」という名前は、2つの連続して適用されたSゲートが1つのZゲートと同じ効果を持つという事実によるものです。

SSq=ZqSS|q\rangle = Z|q\rangle

この表記法は、量子計算全体で共通です。

QiskitでSゲートを追加するには、

qc = QuantumCircuit(1) qc.s(0) # Apply S-gate to qubit 0 qc.sdg(0) # Apply Sdg-gate to qubit 0 qc.draw()
Image in a Jupyter notebook

6.3 Tゲート

Tゲートは非常に一般的に使用されるゲートであり、ϕ=π/4\phi = \pi/4のPゲートです。

T=[1amp;0 0amp;eiπ4],T=[1amp;0 0amp;eiπ4]T = \begin{bmatrix} 1 & 0 \ 0 & e^{\frac{i\pi}{4}} \end{bmatrix}, \quad T^\dagger = \begin{bmatrix} 1 & 0 \ 0 & e^{-\frac{i\pi}{4}} \end{bmatrix}

Sゲートと同様に、TゲートはZ4\sqrt[4]{Z}ゲートとしても知られています。

Qiskitでは、

qc = QuantumCircuit(1) qc.t(0) # Apply T-gate to qubit 0 qc.tdg(0) # Apply Tdg-gate to qubit 0 qc.draw()
Image in a Jupyter notebook

以下のウィジェットを使用して、この章でこれまでに紹介したすべてのゲートを試すことができます。

# Run the code in this cell to see the widget from qiskit_textbook.widgets import gate_demo gate_demo()

7.Uゲート

前に見たように、I、Z、S、Tゲートはすべて一般的なPゲートの特殊なケースでした。同様に、Uゲートはすべての単一量子ビット量子ゲートの中で最も一般的です。これは、次の形式のパラメーター化されたゲートです。

U(θ,ϕ,λ)=[cos(θ2)amp;eiλsen(θ2) eiϕsen(θ2)amp;ei(ϕ+λ)cos(θ2)]U(\theta, \phi, \lambda) = \begin{bmatrix} \cos(\frac{\theta}{2}) & -e^{i\lambda}\sin(\frac{\theta}{2}) \ e^{i\phi}\sin(\frac{\theta}{2}) & e^{i(\phi+\lambda)}\cos(\frac{\theta}{2}) \end{bmatrix}

この章のすべてのゲートはU(θ,ϕ,λ)U(\theta,\phi,\lambda)として指定できますが、これを回路図で見るのは珍しいです。おそらく読み解くのが難しいためです。

例として、HゲートとPゲートにそれぞれ相当するUゲートの特定のケースをいくつか示します。

U(π2,0,π)=12[1amp;1 1amp;1]=Hamp;amp;U(0,0,λ)=[1amp;0 0amp;eiλ ]=P\begin{aligned} U(\tfrac{\pi}{2}, 0, \pi) = \tfrac{1}{\sqrt{2}}\begin{bmatrix} 1 & 1 \ 1 & -1 \end{bmatrix} = H & \quad & U(0, 0, \lambda) = \begin{bmatrix} 1 & 0 \ 0 & e^{i\lambda}\ \end{bmatrix} = P \end{aligned}
# Let's have U-gate transform a |0> to |+> state qc = QuantumCircuit(1) qc.u(pi/2, 0, pi, 0) qc.draw()
Image in a Jupyter notebook
# Let's see the result qc.save_statevector() qobj = assemble(qc) state = sim.run(qobj).result().get_statevector() plot_bloch_multivector(state)
Image in a Jupyter notebook

このことから明らかに、取り得るゲートの数は無限であり、ここでは言及されていませんが、これにはRxゲートとRyゲートも含まれています。また、標準の計算基準として採用されていることを除いて、Z基底について特別なことは何もないことにも注意する必要があります。 Qiskitは、SおよびSdgゲートと同等のX、つまりそれぞれSXゲートおよびSXdgゲートも提供しています。これらのゲートは、ブロック球の周りのX軸に対して1/4回転し、Rxゲートの特殊なケースです。

実際のIBM量子ハードウェアで実行する前に、すべての単一量子ビット操作はIIXXSXSX、およびRzR_{z}にコンパイルされます。このため、これらのゲートは物理ゲートと呼ばれることもあります。

8.追加のリソース

コミュニティで作成されたチートシートには、いくつかの一般的な量子ゲートとその性質がここ記載されています。

import qiskit.tools.jupyter %qiskit_version_table