書籍のコードと同様に textbook のコードでも $U_f: \ket{x}\ket{0} \to \ket{x} \ket{f_s(x)}$ と 2-to-1 の時に $f_s(s^*) = f_s(0)$ であることを確認する。オラクルの問い合わせ関数だけの回路を通すと 2 つ目のレジスタから $\ket{f_s(x)}$ が観測されるので、$x = 0$ を代入した場合と、$x = s$ を代入した場合で $\ket{f_s(0)} = \ket{f_s(s)}$ として同じものが観測されるはず、ということである。
b = '11' def simon_oracle_with_measure(b): b = b[::-1] n = len(b) qc = QuantumCircuit(n*2, n) for q in range(n): qc.cx(q, q+n) if '1' not in b: return qc i = b.find('1') for q in range(n): if b[q] == '1': qc.cx(i, (q)+n) return qc def construct_circuit_and_measure_2nd_register(input): simon_circuit = simon_oracle_with_measure(b) for i, ii in enumerate(reversed(input)): if ii == '1': simon_circuit.x(i) for i in range(n): simon_circuit.measure(i + n, i) backend = BasicAer.get_backend('qasm_simulator') shots = 128 results = execute(simon_circuit, backend=backend, shots=shots).result() answer = results.get_counts() print(answer) construct_circuit_and_measure_2nd_register('00') construct_circuit_and_measure_2nd_register(b)
を実行すると
{'00': 128} {'00': 128}
が表示されるので、確かになという感じである。