# Qiskitライブラリーを導入
from qiskit import *

# 描画のためのライブラリーを導入
import matplotlib.pyplot as plt
%matplotlib inline

# Qiskitバージョンの確認
qiskit.__qiskit_version__

# 2量子ビット回路を用意してください
qc=QuantumCircuit(2,2)

# 回路を描画します
qc.draw(output="mpl")

# EveがEPRペアを作ってAliceとBobに渡します
qc.h(0)
qc.cx(0,1)
qc.barrier()

# 回路を描画します
qc.draw(output="mpl")

# Aliceが送りたい２古典ビットをセットします
msg = "11"    # 送りたいメッセージの入力

if msg == "00":
    pass
elif msg == "10":    #10の場合
    qc.x(0)
elif msg == "01":    #01の場合
    qc.z(0)
elif msg == "11":    #01の場合
    qc.z(0)
    qc.x(0)

# 回路を描画します
qc.draw(output="mpl")

# BobはAliceからEPRビットをもらい、復元のためのゲートを適用します
qc.cx(0,1)
qc.h(0)
qc.barrier()

# 回路を描画します
qc.draw(output="mpl")

# Bobが測定します
qc.measure(0,0)
qc.measure(1,1)

# 回路を描画します
qc.draw(output="mpl")

# qasm_simulator で実行して、AliceからBobに２ビットが転送されたか確認します。
backend = Aer.get_backend('qasm_simulator')
job_sim = execute(qc,backend)
sim_result = job_sim.result()
print(sim_result.get_counts(qc))

from qiskit.visualization import plot_histogram
plot_histogram(sim_result.get_counts(qc))

# 初めて実デバイスで実行する人はこちらを実行
from qiskit import IBMQ
IBMQ.save_account('MY_API_TOKEN')    # ご自分のトークンを入れてください

# アカウント情報をロードして、使える量子デバイスを確認します
IBMQ.load_account()
provider = IBMQ.get_provider(hub='ibm-q')
provider.backends()

# 最もすいているバックエンドを選びます
from qiskit.providers.ibmq import least_busy
large_enough_devices = IBMQ.get_provider().backends(filters=lambda x: x.configuration().n_qubits > 3 and not x.configuration().simulator) 
print(large_enough_devices)
real_backend = least_busy(large_enough_devices)   

print("ベストなバックエンドは " + real_backend.name())

# 上記のバックエンドで実行します
job = execute(qc,real_backend)

# ジョブの実行状態を確認します
from qiskit.tools.monitor import job_monitor
job_monitor(job)

# 結果を確認します
real_result= job.result()
print(real_result.get_counts(qc))
plot_histogram(real_result.get_counts(qc))

