#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 # 9つの量子ビットと7つの古典ビットを作成 # 量子ビットの内訳: # qr_A2[0], qr_A1[0], qr_B2[0], qr_B1[0]: 入力A2, A1, B2, B1 # qr_S3[0], qr_S2[0], qr_S1[0], : 合計(S3〜S1)の出力 # qr_C[0] : 繰上がり(C)の出力 # qr_an[0] : 中間計算用のアシリア qr_A2 = QuantumRegister(1, "A2") qr_A1 = QuantumRegister(1, "A1") qr_B2 = QuantumRegister(1, "B2") qr_B1 = QuantumRegister(1, "B1") qr_S3 = QuantumRegister(1, "S3") qr_S2 = QuantumRegister(1, "S2") qr_S1 = QuantumRegister(1, "S1") qr_C = QuantumRegister(1, "C") qr_an = QuantumRegister(1, "an") # 古典ビットの内訳: # cr_inputs[0] : 入力A2の測定結果 # cr_inputs[1] : 入力A1の測定結果 # cr_inputs[2] : 入力B2の測定結果 # cr_inputs[3 ]: 入力B1の測定結果 # cr_outputs[0]: 出力S3の測定結果 # cr_outputs[1]: 出力S2の測定結果 # cr_outputs[2]: 出力S1の測定結果 # 不要 cr_outputs[3]: 繰上C の測定結果 # 不要 cr_outputs[4]: 中間anの測定結果 cr_inputs = ClassicalRegister(4, "inputs") cr_outputs = ClassicalRegister(3, "outputs") qc = QuantumCircuit(qr_A2, qr_A1, qr_B2, qr_B1, qr_S3, qr_S2, qr_S1, qr_C, qr_an, cr_inputs, cr_outputs) # --- 入力値設定(重ね合わせの性質を用いる) --- qc.h(qr_A2[0]) qc.h(qr_A1[0]) qc.h(qr_B2[0]) qc.h(qr_B1[0]) qc.barrier() # --- 1桁目の加算器の量子回路ロジック --- # Step 1: S1 = A1 XOR B1 と C = 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_C[0]) # C = A1 AND B1 qc.barrier() # --- 2桁目の加算器の量子回路ロジック --- # Step 2: an = A2 XOR B2 と S2 = an(=A2 XOR B2) XOR Cを計算 qc.cx(qr_A2[0], qr_an[0]) # an = A2 qc.cx(qr_B2[0], qr_an[0]) # an = A2 XOR B2 qc.cx(qr_an[0], qr_S2[0]) # S2 = an qc.cx(qr_C[0], qr_S2[0]) # an = an(=A2 XOR B2) XOR C qc.barrier() # --- 3桁目の加算器の量子回路ロジック --- # Step 3: S3 = A2 & B2 + {an(=A2 XOR B2)} & C を計算 qc.ccx(qr_A2[0], qr_B2[0], qr_S3[0]) # S3 = A2 & B2 qc.ccx(qr_an[0], qr_C[0], qr_S3[0]) # S3 = A2 & B2 + {an(=A2 XOR B2)} & C qc.barrier() # --- 結果の測定 --- # 入力量子ビットを古典ビットに測定します。 qc.measure(qr_A2[0], cr_inputs[0]) qc.measure(qr_A1[0], cr_inputs[1]) qc.measure(qr_B2[0], cr_inputs[2]) qc.measure(qr_B1[0], cr_inputs[3]) qc.measure(qr_S3[0], cr_outputs[0]) qc.measure(qr_S2[0], cr_outputs[1]) qc.measure(qr_S1[0], cr_outputs[2]) # 不要 qc.measure(qr_C[0], cr_outputs[3]) # 不要 qc.measure(qr_an[0], cr_outputs[4]) # おまじない(計算を実行して値を取得する。 ) 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]) B1_in = int(inputs_str[0]) B2_in = int(inputs_str[1]) A1_in = int(inputs_str[2]) A2_in = int(inputs_str[3]) expected_sum_decimal = (A2_in * 2) + A1_in + (B2_in * 2) + B1_in expected_sum_binary = f"{expected_sum_decimal:03b}" print(f"入力 (A2A1 B2B1): '{A2_in}{A1_in} {B2_in}{B1_in}', 出力 (S3 S2 S1): '{S3_out}{S2_out}{S1_out}', 取得回数: {v}回, 検証: {A2_in}{A1_in} + {B2_in}{B1_in} = {S3_out}{S2_out}{S1_out} (期待値: {expected_sum_binary})") import matplotlib.pyplot as plt fig, axes = plt.subplots(1, 2, figsize=(20, 5)) # おまじない(作成した量子回路を画像で表示する。) qc.draw("mpl", ax=axes[0]) # 観測結果をグラフで表示 plot_histogram(counts, ax=axes[1])