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

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

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

# 2量子ビット回路を用意
qe = QuantumCircuit(2)    # 今回は量子ビットのみ用意します。

# 回路を描画
qe.draw(output="mpl")

#qe # ← 修正して回路を完成させてください。片方の量子ビットに重ね合わせを掛けます。
qe.draw(output='mpl')

# 状態ベクトルシミュレーターの実行
vector_sim = Aer.get_backend('statevector_simulator')
job = execute(qe, vector_sim )

counts = job.result().get_counts(qe) # 実行結果の詳細を取り出し
print(counts)

# ヒストグラムで測定された確率をプロット
from qiskit.visualization import *
plot_histogram( counts )

# qe # ← cxゲートを使って回路を完成させてください。順番に注意してください。
qe.draw(output='mpl')

# 状態ベクトルシミュレーターの実行
vector_sim = Aer.get_backend('statevector_simulator')
job = execute(qe, vector_sim )
# result = job.result().get_statevector(qe, decimals=3)
# print(result)

counts = job.result().get_counts(qe) # 実行結果の詳細を取り出し
print(counts)

# ヒストグラムで測定された確率をプロット
from qiskit.visualization import *
plot_histogram( counts )

# 2量子ビット回路を用意
qe2 = QuantumCircuit(2,2)    # 量子ビットと古典レジスターを用意します

# 量子回路を設計
qe2.h(0) 
qe2.cx(0,1) 

# 回路を測定
qe2.measure(0,0)
qe2.measure(1,1)

# 回路を描画
qe2.draw(output="mpl")

# QASMシミュレーターで実験
simulator = Aer.get_backend('qasm_simulator')
job = execute(qe2, backend=simulator, shots=1024)
result = job.result()

#  測定された回数を表示
counts = result.get_counts(qe2)
print(counts)

# ヒストグラムで測定された確率をプロット
from qiskit.visualization import *
plot_histogram( counts )

from qiskit import IBMQ
IBMQ.save_account('MY_API_TOKEN')

# IBM Q アカウントをロードします。
provider = IBMQ.load_account()

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("The best backend is " + real_backend.name())
print('run on real device!')

real_result = execute(qe2,real_backend).result()    # 計算を実行します

print(real_result.get_counts(qe2))    # 結果を表示
plot_histogram(real_result.get_counts(qe2))    # ヒストグラムを表示

