#Qiskitのインストール !pip install qiskit #作図に使用するpylatexencのインストール !pip install pylatexenc #ノイズの有無にかかわらず量子回路を実行するQiskit-Aerのインストール !pip install qiskit-aer # おまじない(qiskitをインポートする。) from qiskit import QuantumCircuit, QuantumRegister, ClassicalRegister, transpile from qiskit_aer import AerSimulator from qiskit.visualization import plot_histogram # 12の量子ビットと10の古典ビットを作成 # 量子ビットの内訳: # qr_A3[0], qr_A2[0], qr_A1[0], qr_B3[0], qr_B2[0], qr_B1[0] # : 入力 A3, A2, A1, B3, B2, B1 # qr_S4[0], S3[0], qr_S2[0], qr_S1[0], : 合計(S4〜S1)の出力 # qr_C2[0], C1[0] : 繰上がり(C2,C1)の出力 qr_A3 = QuantumRegister(1, "A3") qr_A2 = QuantumRegister(1, "A2") qr_A1 = QuantumRegister(1, "A1") qr_B3 = QuantumRegister(1, "B3") qr_B2 = QuantumRegister(1, "B2") qr_B1 = QuantumRegister(1, "B1") qr_S4 = QuantumRegister(1, "S4") qr_S3 = QuantumRegister(1, "S3") qr_S2 = QuantumRegister(1, "S2") qr_S1 = QuantumRegister(1, "S1") qr_C2 = QuantumRegister(1, "C2") qr_C1 = QuantumRegister(1, "C1") # 古典ビットの内訳: # cr_inputs[0] : 入力A3の測定結果 # cr_inputs[1] : 入力A2の測定結果 # cr_inputs[2] : 入力A1の測定結果 # cr_inputs[3] : 入力B3の測定結果 # cr_inputs[4] : 入力B2の測定結果 # cr_inputs[5] : 入力B1の測定結果 # cr_outputs[0]: 出力S4の測定結果 # cr_outputs[1]: 出力S3の測定結果 # cr_outputs[2]: 出力S2の測定結果 # cr_outputs[3]: 出力S1の測定結果 cr_inputs = ClassicalRegister(6, "inputs") cr_outputs = ClassicalRegister(4, "outputs") qc = QuantumCircuit(qr_A3, qr_A2, qr_A1, qr_B3, qr_B2, qr_B1, qr_S4, qr_S3, qr_S2, qr_S1, qr_C2, qr_C1, cr_inputs, cr_outputs) # --- 入力値設定(重ね合わせの性質を用いる) --- qc.h(qr_A3[0]) qc.h(qr_A2[0]) qc.h(qr_A1[0]) qc.h(qr_B3[0]) qc.h(qr_B2[0]) qc.h(qr_B1[0]) qc.barrier() # --- 1桁目の加算器の量子回路ロジック --- # Step 1: S1 = A1 XOR B1 と C1 = A1 AND B1 を計算 qc.cx(qr_A1[0], qr_S1[0]) # S1 = A1 qc.cx(qr_B1[0], qr_S1[0]) # S1 = A1 XOR B1 qc.ccx(qr_A1[0], qr_B1[0], qr_C1[0]) # C1 = A1 AND B1 qc.barrier() # --- 2桁目の加算器の量子回路ロジック --- # Step 2: S2 = A2 XOR B2 XOR C1 と C2 = A2 & B2 + B2 & C1 + C1 & A2 を計算 qc.cx(qr_A2[0], qr_S2[0]) # S2 = A2 qc.cx(qr_B2[0], qr_S2[0]) # S2 = A2 XOR B2 qc.cx(qr_C1[0], qr_S2[0]) # S2 = A2 XOR B2 XOR C1 qc.barrier() qc.ccx(qr_A2[0], qr_B2[0], qr_C2[0]) # C2 = A2 & B2 qc.ccx(qr_B2[0], qr_C1[0], qr_C2[0]) # C2 = A2 & B2 + B2 & C1 qc.ccx(qr_C1[0], qr_A2[0], qr_C2[0]) # C2 = A2 & B2 + B2 & C1 + C1 & A2 qc.barrier() # --- 3桁目の加算器の量子回路ロジック --- # Step 3: S3 = A3 XOR B3 XOR C2 と S4 = A3 & B3 + B3 & C2 + C2 & A3 を計算 qc.cx(qr_A3[0], qr_S3[0]) # S3 = A3 qc.cx(qr_B3[0], qr_S3[0]) # S3 = A3 XOR B3 qc.cx(qr_C2[0], qr_S3[0]) # S3 = A3 XOR B3 XOR C2 qc.barrier() qc.ccx(qr_A3[0], qr_B3[0], qr_S4[0]) # S4 = A3 & B3 qc.ccx(qr_B3[0], qr_C2[0], qr_S4[0]) # S4 = A3 & B3 + B3 & C2 qc.ccx(qr_C2[0], qr_A3[0], qr_S4[0]) # S4 = A3 & B3 + B3 & C2 + C2 & A3 qc.barrier() # --- 結果の測定 --- # 入力量子ビットを古典ビットに測定します。 qc.measure(qr_A3[0], cr_inputs[0]) qc.measure(qr_A2[0], cr_inputs[1]) qc.measure(qr_A1[0], cr_inputs[2]) qc.measure(qr_B3[0], cr_inputs[3]) qc.measure(qr_B2[0], cr_inputs[4]) qc.measure(qr_B1[0], cr_inputs[5]) qc.measure(qr_S4[0], cr_outputs[0]) qc.measure(qr_S3[0], cr_outputs[1]) qc.measure(qr_S2[0], cr_outputs[2]) qc.measure(qr_S1[0], cr_outputs[3]) # おまじない(計算を実行して値を取得する。 ) simulator = AerSimulator() compiled_circuit = transpile(qc, simulator) job = simulator.run(compiled_circuit, shots=10000) # 試行回数10000 result = job.result() counts = result.get_counts(compiled_circuit) print(f"観測回数: {10000}回") for k, v in counts.items(): outputs_str, inputs_str = k.split(" ") S1_out = int(outputs_str[0]) S2_out = int(outputs_str[1]) S3_out = int(outputs_str[2]) S4_out = int(outputs_str[3]) B1_in = int(inputs_str[0]) B2_in = int(inputs_str[1]) B3_in = int(inputs_str[2]) A1_in = int(inputs_str[3]) A2_in = int(inputs_str[4]) A3_in = int(inputs_str[5]) expected_sum_decimal = (A3_in * 4) + (A2_in * 2) + A1_in + (B3_in * 4) + (B2_in * 2) + B1_in expected_sum_binary = f"{expected_sum_decimal:04b}" print(f"入力 (A3A2A1 B3B2B1): '{A3_in}{A2_in}{A1_in} {B3_in}{B2_in}{B1_in}', 出力 (S4S3S2S1): '{S4_out}{S3_out}{S2_out}{S1_out}', 取得回数: {v}回, 検証: {A3_in}{A2_in}{A1_in} + {B3_in}{B2_in}{B1_in} = {S4_out}{S3_out}{S2_out}{S1_out} (期待値: {expected_sum_binary})") import matplotlib.pyplot as plt fig, axes = plt.subplots(1, 2, figsize=(40, 10)) # おまじない(作成した量子回路を画像で表示する。) qc.draw("mpl", ax=axes[0] , fold=-1) # 観測結果をグラフで表示 plot_histogram(counts, ax=axes[1])