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

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

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

q = QuantumCircuit(1)    # １量子ビット回路を用意

q.x(0)   # Xゲートを0番目の量子ビットに操作します。

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

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

plot_bloch_multivector(result)    # ブロッホ球の表示

q = QuantumCircuit(1)    # １量子ビット回路を用意

q.h(0)   # Hゲートを0番目の量子ビットに操作します。

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

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

plot_bloch_multivector(result)    # ブロッホ球の表示

q = QuantumCircuit(1)    # １量子ビット回路を用意 

# Xゲートを0番目の量子ビットに操作します。
q.x(0)

# 次にHゲートを0番目の量子ビットに操作します。
q.h(0)

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

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

plot_bloch_multivector(result)    # ブロッホ球の表示

q = QuantumCircuit(2)    # 2量子ビット回路を用意  

q.h(0)    # Hゲートを0番目の量子ビットに操作します。
q.h(1)    # Hゲートを1番目の量子ビットに操作します。

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

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

plot_bloch_multivector(result)    # ブロッホ球の表示

q = QuantumCircuit(2)    # 2量子ビット回路を用意

# q0=1, q1=0の場合：q0を1にします。
q.x(0)

# CXゲートの制御ビットをq0、目標ビットをq1にセットします。
q.cx(0,1)

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

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

plot_bloch_multivector(result)    # ブロッホ球の表示

q = QuantumCircuit(2)    # 2量子ビット回路を用意

# q0とq1をそれぞれ|+⟩にします
q.h(0)
q.h(1)

# CXゲートの制御ビットをq0、目標ビットをq1にセットします。
q.cx(0,1)

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

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

plot_bloch_multivector(result)    # ブロッホ球の表示

q = QuantumCircuit(2)    # 2量子ビット回路を用意

# q0を|+⟩、q1を|−⟩にします
q.h(0)
q.x(1)
q.h(1)

# CXゲートの制御ビットをq0、目標ビットをq1にセットします。
q.cx(0,1)

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

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

plot_bloch_multivector(result)    # ブロッホ球の表示

q = QuantumCircuit(4)    # 4量子ビット回路を用意

# q0、q1、q2をそれぞれ|1⟩にします
q.x(0)
q.x(1)
q.x(2)

# cxゲートを3つ追加します。制御/目標のペアは、q0/q3、q1/q3、q2/q3です。
q.cx(0,3)
q.cx(1,3)
q.cx(2,3)

q.draw(output='mpl')

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

# ブロッホ球の表示
plot_bloch_multivector(result)

