解説
0 0 0 以上 2 n 2^n 2 n 未満の整数 x x x について、量子状態 ∣ x ⟩ \ket{x} ∣ x ⟩ に演算子 2 ∣ 0 ⟩ ⟨ 0 ∣ − I 2\ket{0}\bra{0} - I 2 ∣ 0 ⟩ ⟨ 0 ∣ − I を作用させた結果は次式で表されます。
( 2 ∣ 0 ⟩ ⟨ 0 ∣ − I ) ∣ x ⟩ = 2 ∣ 0 ⟩ ⟨ 0 ∣ x ⟩ − ∣ x ⟩ = { ∣ x ⟩ ( x = 0 ) − ∣ x ⟩ ( x ≠ 0 ) \begin{align}
(2\ket{0}\bra{0} - I) \ket{x} &= 2\ket{0} \braket{0|x} - \ket{x} \nonumber \\
&=
\begin{cases}
\ket{x} & (x = 0) \\
-\ket{x} & (x \neq 0)
\end{cases}
\end{align} ( 2 ∣ 0 ⟩ ⟨ 0 ∣ − I ) ∣ x ⟩ = 2 ∣ 0 ⟩ ⟨ 0∣ x ⟩ − ∣ x ⟩ = { ∣ x ⟩ − ∣ x ⟩ ( x = 0 ) ( x = 0 )
実装方針は複数考えられます。
解法1
この問題ではグローバル位相の変化を問わないことから、以下の操作を実装することを考えます。
∣ x ⟩ → { − ∣ x ⟩ ( x = 0 ) ∣ x ⟩ ( x ≠ 0 ) \begin{equation}
\ket{x} \xrightarrow{}
\begin{cases}
- \ket{x} & (x = 0) \\
\ket{x} & (x\neq 0)
\end{cases}
\end{equation} ∣ x ⟩ { − ∣ x ⟩ ∣ x ⟩ ( x = 0 ) ( x = 0 )
全ての量子ビットに X X X ゲートを作用させると、 ∣ 0 ⟩ \ket{0} ∣ 0 ⟩ は ∣ 2 n − 1 ⟩ \ket{2^n-1} ∣ 2 n − 1 ⟩ になります。
さらに、どれか 1 1 1 ビットを標的ビット、残りの ( n − 1 ) (n-1) ( n − 1 ) ビットを制御ビットとして複数制御 Z Z Z ゲートを作用させると、重ね合わせにある計算基底状態のうち ∣ 2 n − 1 ⟩ \ket{2^n-1} ∣ 2 n − 1 ⟩ のみの符号を反転させることができます。
再度全ての量子ビットに X X X ゲートを作用させて戻すと、操作を実装できたことになります。
n = 3 n = 3 n = 3 の場合の回路図は、以下の通りです。
解法2
解法1と同様に、グローバル位相の変化を問わないことを利用します。
x x x の下位 ( n − 1 ) (n-1) ( n − 1 ) ビットを x l x_l x l 、上位 1 1 1 ビットを x h x_h x h とします。また、 x l , x h x_l,\ x_h x l , x h の全てのビットを反転させた数を、それぞれ ¬ x l , ¬ x h \lnot x_l,\ \lnot x_h ¬ x l , ¬ x h で表すことにします。
すなわち ∣ x ⟩ = ∣ x l ⟩ n − 1 ∣ x h ⟩ 1 \ket{x} = \ket{x_l}_{n-1} \ket{x_h}_1 ∣ x ⟩ = ∣ x l ⟩ n − 1 ∣ x h ⟩ 1 が成り立ちます。
∣ x ⟩ \ket{x} ∣ x ⟩ に X X X ゲートを作用させた後、 n n n ビット目に H H H ゲートを作用させると、以下のようになります。
∣ x ⟩ → X ∣ ¬ x l ⟩ n − 1 ∣ ¬ x h ⟩ 1 → H { 1 2 ( ∣ ¬ x l ⟩ n − 1 ∣ 0 ⟩ 1 − ∣ ¬ x l ⟩ n − 1 ∣ 1 ⟩ 1 ) ( x h = 0 ) 1 2 ( ∣ ¬ x l ⟩ n − 1 ∣ 0 ⟩ 1 + ∣ ¬ x l ⟩ n − 1 ∣ 1 ⟩ 1 ) ( x h = 1 ) \begin{equation}
\ket{x} \xrightarrow{X} \ket{\lnot x_l}_{n-1} \ket{\lnot x_h}_1 \xrightarrow{H}
\begin{cases}
\frac{1}{\sqrt{2}} (\ket{\lnot x_l}_{n-1} \ket{0}_1 - \ket{\lnot x_l}_{n-1} \ket{1}_1) & (x_h=0) \\
\frac{1}{\sqrt{2}} (\ket{\lnot x_l}_{n-1} \ket{0}_1 + \ket{\lnot x_l}_{n-1} \ket{1}_1) & (x_h=1)
\end{cases}
\end{equation} ∣ x ⟩ X ∣ ¬ x l ⟩ n − 1 ∣ ¬ x h ⟩ 1 H { 2 1 ( ∣ ¬ x l ⟩ n − 1 ∣ 0 ⟩ 1 − ∣ ¬ x l ⟩ n − 1 ∣ 1 ⟩ 1 ) 2 1 ( ∣ ¬ x l ⟩ n − 1 ∣ 0 ⟩ 1 + ∣ ¬ x l ⟩ n − 1 ∣ 1 ⟩ 1 ) ( x h = 0 ) ( x h = 1 )
さらに、 n n n ビット目を除いた ( n − 1 ) (n-1) ( n − 1 ) ビットを制御ビット、n n n ビット目を標的ビットとして複数制御 X X X ゲートを作用させると、以下のようになります。
{ 1 2 ( ∣ ¬ x l ⟩ n − 1 ∣ 0 ⟩ 1 − ∣ ¬ x l ⟩ n − 1 ∣ 1 ⟩ 1 ) ( x h = 0 ) 1 2 ( ∣ ¬ x l ⟩ n − 1 ∣ 0 ⟩ 1 + ∣ ¬ x l ⟩ n − 1 ∣ 1 ⟩ 1 ) ( x h = 1 ) → M C X { 1 2 ( ∣ ¬ x l ⟩ n − 1 ∣ 1 ⟩ 1 − ∣ ¬ x l ⟩ n − 1 ∣ 0 ⟩ 1 ) ( x l = 0 , x h = 0 ) 1 2 ( ∣ ¬ x l ⟩ n − 1 ∣ 1 ⟩ 1 + ∣ ¬ x l ⟩ n − 1 ∣ 0 ⟩ 1 ) ( x l = 0 , x h = 1 ) 1 2 ( ∣ ¬ x l ⟩ n − 1 ∣ 0 ⟩ 1 − ∣ ¬ x l ⟩ n − 1 ∣ 1 ⟩ 1 ) ( x l ≠ 0 , x h = 0 ) 1 2 ( ∣ ¬ x l ⟩ n − 1 ∣ 0 ⟩ 1 + ∣ ¬ x l ⟩ n − 1 ∣ 1 ⟩ 1 ) ( x l ≠ 0 , x h = 1 ) \begin{equation}
\begin{cases}
\frac{1}{\sqrt{2}} (\ket{\lnot x_l}_{n-1} \ket{0}_1 - \ket{\lnot x_l}_{n-1} \ket{1}_1) & (x_h=0) \\
\frac{1}{\sqrt{2}} (\ket{\lnot x_l}_{n-1} \ket{0}_1 + \ket{\lnot x_l}_{n-1} \ket{1}_1) & (x_h=1)
\end{cases}
\xrightarrow{MCX}
\begin{cases}
\frac{1}{\sqrt{2}} (\ket{\lnot x_l}_{n-1} \ket{1}_1 - \ket{\lnot x_l}_{n-1} \ket{0}_1) & (x_l=0, \ x_h=0) \\
\frac{1}{\sqrt{2}} (\ket{\lnot x_l}_{n-1} \ket{1}_1 + \ket{\lnot x_l}_{n-1} \ket{0}_1) & (x_l=0, \ x_h=1) \\
\frac{1}{\sqrt{2}} (\ket{\lnot x_l}_{n-1} \ket{0}_1 - \ket{\lnot x_l}_{n-1} \ket{1}_1) & (x_l\neq 0, \ x_h=0) \\
\frac{1}{\sqrt{2}} (\ket{\lnot x_l}_{n-1} \ket{0}_1 + \ket{\lnot x_l}_{n-1} \ket{1}_1) & (x_l\neq 0, \ x_h=1)
\end{cases}
\end{equation} { 2 1 ( ∣ ¬ x l ⟩ n − 1 ∣ 0 ⟩ 1 − ∣ ¬ x l ⟩ n − 1 ∣ 1 ⟩ 1 ) 2 1 ( ∣ ¬ x l ⟩ n − 1 ∣ 0 ⟩ 1 + ∣ ¬ x l ⟩ n − 1 ∣ 1 ⟩ 1 ) ( x h = 0 ) ( x h = 1 ) MCX ⎩ ⎨ ⎧ 2 1 ( ∣ ¬ x l ⟩ n − 1 ∣ 1 ⟩ 1 − ∣ ¬ x l ⟩ n − 1 ∣ 0 ⟩ 1 ) 2 1 ( ∣ ¬ x l ⟩ n − 1 ∣ 1 ⟩ 1 + ∣ ¬ x l ⟩ n − 1 ∣ 0 ⟩ 1 ) 2 1 ( ∣ ¬ x l ⟩ n − 1 ∣ 0 ⟩ 1 − ∣ ¬ x l ⟩ n − 1 ∣ 1 ⟩ 1 ) 2 1 ( ∣ ¬ x l ⟩ n − 1 ∣ 0 ⟩ 1 + ∣ ¬ x l ⟩ n − 1 ∣ 1 ⟩ 1 ) ( x l = 0 , x h = 0 ) ( x l = 0 , x h = 1 ) ( x l = 0 , x h = 0 ) ( x l = 0 , x h = 1 )
1 2 ( ∣ ¬ x l ⟩ n ∣ 1 ⟩ 1 − ∣ ¬ x l ⟩ n ∣ 0 ⟩ 1 ) = − 1 2 ( ∣ ¬ x l ⟩ n ∣ 0 ⟩ 1 − ∣ ¬ x l ⟩ n ∣ 1 ⟩ 1 ) \frac{1}{\sqrt{2}}(\ket{\lnot x_l}_n\ket{1}_1-\ket{\lnot x_l}_n\ket{0}_1)=-\frac{1}{\sqrt{2}}(\ket{\lnot x_l}_n\ket{0}_1-\ket{\lnot x_l}_n\ket{1}_1) 2 1 ( ∣ ¬ x l ⟩ n ∣ 1 ⟩ 1 − ∣ ¬ x l ⟩ n ∣ 0 ⟩ 1 ) = − 2 1 ( ∣ ¬ x l ⟩ n ∣ 0 ⟩ 1 − ∣ ¬ x l ⟩ n ∣ 1 ⟩ 1 ) と 1 2 ( ∣ ¬ x l ⟩ n ∣ 1 ⟩ 1 + ∣ ¬ x l ⟩ n ∣ 0 ⟩ 1 ) = 1 2 ( ∣ ¬ x l ⟩ n ∣ 0 ⟩ 1 + ∣ ¬ x l ⟩ n ∣ 1 ⟩ 1 ) \frac{1}{\sqrt{2}}(\ket{\lnot x_l}_n\ket{1}_1+\ket{\lnot x_l}_n\ket{0}_1)=\frac{1}{\sqrt{2}}(\ket{\lnot x_l}_n\ket{0}_1+\ket{\lnot x_l}_n\ket{1}_1) 2 1 ( ∣ ¬ x l ⟩ n ∣ 1 ⟩ 1 + ∣ ¬ x l ⟩ n ∣ 0 ⟩ 1 ) = 2 1 ( ∣ ¬ x l ⟩ n ∣ 0 ⟩ 1 + ∣ ¬ x l ⟩ n ∣ 1 ⟩ 1 ) に注目して、 n n n ビット目に H H H ゲートを作用させた後、全ての量子ビットに X X X ゲートを作用させると、以下のようになり、操作が実装できたことになります。
{ 1 2 ( ∣ ¬ x l ⟩ n − 1 ∣ 1 ⟩ 1 − ∣ ¬ x l ⟩ n − 1 ∣ 0 ⟩ 1 ) ( x l = 0 , x h = 0 ) 1 2 ( ∣ ¬ x l ⟩ n − 1 ∣ 1 ⟩ 1 + ∣ ¬ x l ⟩ n − 1 ∣ 0 ⟩ 1 ) ( x l = 0 , x h = 1 ) 1 2 ( ∣ ¬ x l ⟩ n − 1 ∣ 0 ⟩ 1 − ∣ ¬ x l ⟩ n − 1 ∣ 1 ⟩ 1 ) ( x l ≠ 0 , x h = 0 ) 1 2 ( ∣ ¬ x l ⟩ n − 1 ∣ 0 ⟩ 1 + ∣ ¬ x l ⟩ n − 1 ∣ 1 ⟩ 1 ) ( x l ≠ 0 , x h = 1 ) → H { − ∣ ¬ x l ⟩ n − 1 ∣ ¬ x h ⟩ 1 ( x l = 0 , x h = 0 ) ∣ ¬ x l ⟩ n − 1 ∣ ¬ x h ⟩ 1 ( x l ≠ 0 ∨ x h = 1 ) → X { − ∣ x ⟩ ( x = 0 ) ∣ x ⟩ ( x ≠ 0 ) \begin{align}
\begin{cases}
\frac{1}{\sqrt{2}} (\ket{\lnot x_l}_{n-1} \ket{1}_1 - \ket{\lnot x_l}_{n-1} \ket{0}_1) & (x_l=0, \ x_h=0) \\
\frac{1}{\sqrt{2}} (\ket{\lnot x_l}_{n-1} \ket{1}_1 + \ket{\lnot x_l}_{n-1} \ket{0}_1) & (x_l=0, \ x_h=1) \\
\frac{1}{\sqrt{2}} (\ket{\lnot x_l}_{n-1} \ket{0}_1 - \ket{\lnot x_l}_{n-1} \ket{1}_1) & (x_l\neq 0, \ x_h=0) \\
\frac{1}{\sqrt{2}} (\ket{\lnot x_l}_{n-1} \ket{0}_1 + \ket{\lnot x_l}_{n-1} \ket{1}_1) & (x_l\neq 0, \ x_h=1)
\end{cases}
& \xrightarrow{H}
\begin{cases}
-\ket{\lnot x_l}_{n-1} \ket{\lnot x_h}_1 & (x_l=0, \ x_h=0) \\
\ket{\lnot x_l}_{n-1} \ket{\lnot x_h}_1 & (x_l\neq 0\lor x_h=1)
\end{cases} \\
& \xrightarrow{X}
\begin{cases}-\ket{x} & (x=0) \\
\ket{x} & (x\neq 0)
\end{cases}
\end{align} ⎩ ⎨ ⎧ 2 1 ( ∣ ¬ x l ⟩ n − 1 ∣ 1 ⟩ 1 − ∣ ¬ x l ⟩ n − 1 ∣ 0 ⟩ 1 ) 2 1 ( ∣ ¬ x l ⟩ n − 1 ∣ 1 ⟩ 1 + ∣ ¬ x l ⟩ n − 1 ∣ 0 ⟩ 1 ) 2 1 ( ∣ ¬ x l ⟩ n − 1 ∣ 0 ⟩ 1 − ∣ ¬ x l ⟩ n − 1 ∣ 1 ⟩ 1 ) 2 1 ( ∣ ¬ x l ⟩ n − 1 ∣ 0 ⟩ 1 + ∣ ¬ x l ⟩ n − 1 ∣ 1 ⟩ 1 ) ( x l = 0 , x h = 0 ) ( x l = 0 , x h = 1 ) ( x l = 0 , x h = 0 ) ( x l = 0 , x h = 1 ) H { − ∣ ¬ x l ⟩ n − 1 ∣ ¬ x h ⟩ 1 ∣ ¬ x l ⟩ n − 1 ∣ ¬ x h ⟩ 1 ( x l = 0 , x h = 0 ) ( x l = 0 ∨ x h = 1 ) X { − ∣ x ⟩ ∣ x ⟩ ( x = 0 ) ( x = 0 )
n = 3 n = 3 n = 3 の場合の回路図は、以下の通りです。
解答例
解答例は以下の通りです。
解法1
from qiskit import QuantumCircuit
from qiskit.circuit.library import ZGate
def solve ( n : int ) -> QuantumCircuit:
qc = QuantumCircuit(n)
qc.x( range (n))
qc.append(ZGate().control(n - 1 ), range (n))
qc.x( range (n))
return qc
解法2
from qiskit import QuantumCircuit
def solve ( n : int ) -> QuantumCircuit:
qc = QuantumCircuit(n)
qc.x( range (n))
qc.h(n - 1 )
qc.mcx( list ( range (n - 1 )), n - 1 )
qc.h(n - 1 )
qc.x( range (n))
return qc