らんだむな記憶

blogというものを体験してみようか!的なー

Qiskit (27) ― Simon のアルゴリズム

書籍のコードと同様に 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}

が表示されるので、確かになという感じである。