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