A2: Controlled Gate I

実行時間制限:3 秒

メモリ制限:512 MiB

配点:200点

Writer:PSL

解説

kn=00...0n\ket{k}_n = \ket{00 ... 0}_n のときのみ、m\ket{m} にアダマールゲート HH を作用させる量子回路を実装する問題です。

では、重ね合わせ状態の中の特定の計算基底状態 kn=00...0n\ket{k}_n = \ket{00 ... 0}_n のときのみ、m\ket{m} にアダマールゲート HH を作用させるにはどうすれば良いでしょうか?

これは次の操作を順に行うことによって実現できます。

  • 操作 1 : kn=k0k1...kn1n\ket{k}_n = \ket{k_0 k_1 ... k_{n - 1}}_n の全ての量子ビットに対して XX ゲートを作用させる。
  • 操作 2 : k0k1...kn1n\ket{k_0 k_1 ... k_{n - 1}}_n を制御ビット、m\ket{m} を標的ビットとする複数制御アダマールゲート1を作用させる。
  • 操作 3 : 操作 1 の逆操作を行い、kn\ket{k}_n を元の状態に戻す。

よって、kn=00...0n\ket{k}_n = \ket{00 ... 0}_nのとき

m00...0n操作 1 m11...1n操作 2 Hm11...1n操作 3 Hm00...0n\begin{align} \ket{m}\ket{00 ... 0}_n &\xrightarrow{\text{操作 1 }} \ket{m}\ket{11 ... 1}_n \\ &\xrightarrow{\text{操作 2 }} H \ket{m}\ket{11 ... 1}_n \\ &\xrightarrow{\text{操作 3 }} H \ket{m}\ket{00 ... 0}_n \end{align}

という状態遷移が成り立つため、この問題を解くことができます。

n=3n = 3 の場合の量子回路は次のように表されます。

回路の深さは 33 です。

解答例

解答例は以下の通りです。

from qiskit import QuantumCircuit, QuantumRegister
from qiskit.circuit.library import HGate
 
 
def solve(n: int) -> QuantumCircuit:
    m, k = QuantumRegister(1), QuantumRegister(n)
    qc = QuantumCircuit(m, k)
 
    qc.x(k)
 
    qc.compose(HGate().control(len(k)), [*k, m[0]], inplace=True)
 
    qc.x(k)
 
    return qc

通常、制御ビットは 11 で制御を行いますが、次のように 00 を使って制御する方法で記述することもできます。

from qiskit import QuantumCircuit, QuantumRegister
from qiskit.circuit.library import HGate
 
 
def solve(n: int) -> QuantumCircuit:
    m, k = QuantumRegister(1), QuantumRegister(n)
    qc = QuantumCircuit(m, k)
 
    qc.compose(HGate().control(len(k), ctrl_state=0), [*k, m[0]], inplace=True)
 
    return qc

Footnotes

  1. Qiskit では複数制御ゲートを各ゲートクラスのもつ control メソッドを使って実装できます。