解説
計算基底状態 それぞれの複素振幅 に をかけていくことを考えます。
をかける操作自体は ゲート を利用できます。 ゲートは計算基底状態 はそのままに、計算基底状態 を に変換するような量子ゲートです。
では、重ね合わせ状態の中の特定の計算基底状態 にのみ ゲートを作用させるにはどうすればよいでしょうか?
これは次のように実現できます。
- のうち、 であるようなインデックス に対して、 ゲートを作用させる。こうして、 を に変換する。
- ビットを制御ビット、残りの ビットを標的ビットとする複数制御 ゲート1を作用させます。このとき、 ゲートは重ね合わせ状態の中の計算基底状態 にのみ作用します。
-
- の逆操作を行い、 を に戻す。
よって、この操作を計算基底状態 それぞれに対して行うことで、この問題を解くことができます。
解答例
解答例は以下の通りです。
from qiskit import QuantumCircuit
from qiskit.circuit.library import ZGate
def solve(n: int, L: int) -> QuantumCircuit:
qc = QuantumCircuit(n)
for l in range(L):
for i in range(n):
# check if i-th bit of l is 0 or 1
if not ((l >> i) & 1):
qc.x(i)
if n == 1:
qc.z(0)
else:
# apply multiple controlled Z gate
qc.append(ZGate().control(n - 1), range(n))
for i in range(n):
if not ((l >> i) & 1):
qc.x(i)
return qc