14
26

More than 1 year has passed since last update.

楽しい量子力学 -1時間目-

Last updated at Posted at 2023-08-30

概要

量子コンピュータへの理解を深めたかったのですが、私は「シュレディンガーの猫」の話の延長線上にある知識くらいしか持っていなかったため量子力学の勉強と簡単な量子回路の作り方を調べてまとめてみました。
1時間目なので今回は、量子の重ね合わせとそれを用いた量子回路のシミュレーションの作成という初歩的な箇所にフォーカスしています。

目次

1. 量子の重ね合わせの基礎
2. 量子回路の基礎
3. Qiskitを用いた量子回路の実装
4. 感想
5. 参考

量子の重ね合わせの基礎

スーパーポジション

0と1の両方を重ね合わせて持っている状態のこと。
観測することで0と1のどちらかの状態に確定する。

量子ビット

1ビットの情報を持つ量子のビットのこと。
これをスーパーポジション状態にしたり観測して確定させたりする。
また、普通のコンピュータで使われるものは古典ビットと呼ばれる。

説明だと0となる割合と1となる割合は50%:50%にすることが多いが(シュレディンガーの猫等)、この割合は任意で設定することができる。

ブロッホ球

image.png

量子ビットの状態をベクトルと球を用いて視覚的に図示したもの。
地球に見立てて、0地点を北極、1地点を南極、それらと等距離にある球上の線を赤道と読んだりする。

量子ビットを観測した際に0と1のどちらが観測されやすい状態かというのを北極と南極からの距離を見ることで

量子回路の基礎

量子回路

量子ビットがスーパーポジション状態のまま演算を行い、出力を観測することで値を確定させる。
この手順は量子ビットの特性上毎回出力が異なるため、繰り返し実行することで出力分布を得る。(モンテカルロ法のような)

アダマールゲート (Hadamarl Gate)

量子をスーパーポジション状態にするためのゲート

Qiskitを用いた量子回路の実装

実装コード

sample.py
from qiskit import QuantumCircuit, Aer, transpile, assemble
from qiskit.visualization import plot_histogram

# 1つの量子ビットと1つの古典ビットを持つ回路を作成
qc = QuantumCircuit(1, 1)

# 入力状態を準備
qc.h(0)
qc.t(0)
qc.h(0)

# 測定を行い、結果を古典ビットに格納
qc.measure(0, 0)  # 量子ビット0の結果を古典ビット0に測定

# ローカルシミュレータで実行
simulator = Aer.get_backend('qasm_simulator')
compiled_circuit = transpile(qc, simulator)
job = simulator.run(assemble(compiled_circuit))
result = job.result()
counts = result.get_counts()

# 結果を表示
print("Measurement results:", counts)
plot_histogram(counts)

コード説明

量子回路のコードでの実装はQiskitというライブラリを用いて行いました。
コメントで補足しきれていない重要な箇所だけ説明していきます。

sample.py
# 1つの量子ビットと1つの古典ビットを持つ回路を作成
qc = QuantumCircuit(1, 1)

# 入力状態を準備
qc.h(0)
qc.t(0)
qc.h(0)

# 測定を行い、結果を古典ビットに格納
qc.measure(0, 0)  # 量子ビット0の結果を古典ビット0に測定

量子回路を作成して、それぞれのゲートを配置している箇所です。
このコードだと、Hゲート、Tゲート、Hゲートの順に量子ビットを通過させています。
それぞれのゲートの細かい挙動は割愛しますが、この結果下図のような π/8 位相シフトの演算が行えます。

image.png

ブロッホ球の北極側にベクトルが向いているため、0を測定しやすい状態になっているということですね。
細かい計算は割愛しますが、大体85%の確率で0が観測されるような重ね合わせ方になっています。

最後の行では量子ビットを観測して、その結果を古典ビットに反映させる作業を行っています。

qiskit.py
# ローカルシミュレータで実行
simulator = Aer.get_backend('qasm_simulator')
compiled_circuit = transpile(qc, simulator)
job = simulator.run(assemble(compiled_circuit))
result = job.result()
counts = result.get_counts()

先ほど組んだ回路を用いてシミュレートを行います。
具体的には「3つのゲートを通す → 出力された量子ビットを確認する」の流れを1024回繰り返して結果を見ています。

出力結果

image.png

1024回の出力結果をグラフにしたものがこちらです。
今回は量子ビットを約85%の確率で0が示す状態にしてそれを観測するという回路なので、予測通りの結果が得られました。

感想

今回は量子ビットの理解を深めて簡単な回路を組むところまでの作業を行いました。
もし、2時間目の記事を投稿することになったときは量子のもつれを活用した回路の作成になるかと思います。

参考

14
26
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
14
26