Beispiel #1
0
def QC4QWG(G, step):
    # グラフ上量子ウォーク。グラフを工夫すれば2次元格子なども...
    from qiskit import QuantumCircuit
    from qiskit import QuantumRegister
    from qiskit import ClassicalRegister
    from qiskit import execute
    from CongX.extensions.standard.bmx import BMXGate
    import math
    import copy
    # 量子レジスタ(グラフに対応した探索空間)を用意
    result_prepare_register = prepare_register(G, step)
    #     print('result_prepare_register')
    #     print(result_prepare_register)
    register_list = result_prepare_register[0]
    state_register_list = copy.copy(register_list)
    initial_register = result_prepare_register[1]
    res_register = result_prepare_register[2]
    register_size = result_prepare_register[3]

    # 量子レジスタ(コイン空間)を用意
    degree_set = adj_to_coin(G)
    coins = prepare_coin(degree_set)
    coin_registers = coins[0]
    coin_registers_dict = dict(zip(coins[1], coins[0]))
    for coin_register in coin_registers:
        register_list.append(coin_register)

    # 観測結果を格納するための古典レジスタを用意
    cr = ClassicalRegister(register_size, 'result')
    register_list.append(cr)
    # 量子回路を用意(レジスタをまとめる)
    qc = QuantumCircuit(*register_list)
    for j in coin_registers:
        qc.h(j[0:])
    # 量子計算
    ## 初期状態を生成
    initial_distribution(G, qc, t0=initial_register)
    # エッジを遷移の情報ごとにまとめてゲートとして呼び出す
    for j in range(step):
        ops = graph_to_gate(G,
                            register_size,
                            degree_set,
                            state_register_list,
                            coin_registers_dict,
                            step_num=step)
        for op in ops:
            #             con_bin = op[0]
            #             con_regs = op[1]
            #             for register in con_regs:
            #                 register[0:]
            #             tgt_qubits = op[2]
            print('op')
            print(op)
            qc.bmx(*op)
    # 観測


#     qc.measure(res_register, cr)
    return qc