■サンプルファイルのダウンロードについて
本書掲載のサンプルファイルは、一部を除いてインターネット上のダウンロードサービスからダウンロードすることができます。詳しい手順については、本書の巻末にある袋とじの内容をご覧ください。
なお、ダウンロードサービスのご利用にはユーザー登録と袋とじ内に記されている番号が必要です。そのため、本書を中古書店から購入されたり、他者から貸与、譲渡された場合にはサービスをご利用いただけないことがあります。あらかじめご承知おきください。

・本書の内容についてのご意見、ご質問は、お名前、ご連絡先を明記のうえ、小社出版部宛文書（郵送または E-mail）でお送りください。
・電話によるお問い合わせはお受けできません。
・本書の解説範囲を越える内容のご質問や、本書の内容と無関係なご質問にはお答えできません。
・匿名のフリーメールアドレスからのお問い合わせには返信しかねます。
本書で取り上げられているシステム名／製品名は、一般に開発各社の登録商標／商品名です。本書では、™ および ® マークは明記していません。本書に掲載されている団体／商品に対して、その商標権を侵害する意図は一切ありません。本書で紹介している URL や各サイトの内容は変更される場合があります。

はじめに
近年目覚ましい発展を遂げるナノメートルサイズの精密制御技術が、これまで全くの空想でしかなかった量子コンピュータの実現を期待させるようになってきました。特に、人工知能（AI）技術の中核をなすニューラル・ネットワークによる深層学習（ディープラーニング）と相性が良いこと
も、期待に拍車をかけています。そのような状況に伴って、量子コンピュータに関する啓蒙書や量子コンピュータを動作させることで有用な計算を行うための量子アルゴリズムに関する専門書も多数出版されており、これらの書籍によって「そもそも量子コンピュータとは何か？」「そもそもな
ぜ並列計算が可能なのか？」「どのようにして有用な計算を行うことができるのか？」といった基本的な問に答えられる知識は得られます。その一方、「概念は理解できたが、なんだか抽象的すぎて腑に落ちない！」と思っている方は私だけではないと思います。腑に落ちるための必要な道筋は人によって異なると思いますが、自分の場合、基礎方程式を用いて数値シミュレーションを行って想定どおりの結果を得ることができると、現象や動作原理を理解できたという実感がようやく湧いてきます。本書は、量子コンピュータの動作原理を理解するための、私なりの腑に落ちるために必要な手順をまとめたものです。
現在、量子コンピュータは物理的な原理の違いによって大きく 2 つの方式に分けられます。1
つ目は量子アニーリング（量子焼きなまし法）と呼ばれる物理現象を動作原理として最適化問題を解くことに特化した「量子アニーリング方式」、2 つ目は汎用的な量子コンピュータを目指す「量子ゲート方式」です。両者とも数学的には同等の計算が可能とされています。本書では、量子力学を勉強して初めに学習する「量子井戸」を用いる量子ドットコンピュータを題材として、量子ビッ
ト・量子ゲート・量子もつれという量子コンピュータに必要不可欠な要素を、量子力学の基礎方程式であるシュレディンガー方程式を用いて数値シミュレーションを行います。以上の目的を達成するために、数値計算に必要な計算アルゴリズム導出はすべて端折らずに詳しく解説しています。その一方で、「量子力学についての詳しい解説」や「量子アルゴリズムについての解説」といった一般的な内容は省いていることをご了承ください。
本書の読者層は量子力学の初歩をすでに学習している方を想定していますが、これから量子力学を勉強したい方も、一般的な量子力学のテキストと一緒に本書を活用していただくことで、量子力学の基礎習得に役立つと考えています。また、量子コンピュータの動作原理、量子アルゴリズムについて深く学習したい方は、参考文献として次の 2 冊をお勧めします。本書はこれらの書籍を学習する上での基礎となります。
（1） 量子情報理論（佐川 弘幸 著、吉田 宣章 著、丸善出版、第 3 版 2019 年）（2） 量子アルゴリズム（中山 茂 著、技報堂出版、2014 年、ISBN:4765533433）

iii

最後に、本書の執筆の機会を頂きました株式会社カットシステムの石塚勝敏さん、非常に丁寧な編集を行なって頂きました同社編集部の皆さん、また、本書の内容について貴重なコメントを頂きました東北大学理学部物理学科 4 年生の李俊錫（이준석、イ・ジュンソク）さん、Python 版サン
プルプログラム作成に協力頂きました東北大学工学部 3 年生の日比龍平さん、日常的に議論に付き合って頂いている特定非営利活動法人 natural science の皆さんには、深く感謝申し上げます。

自己紹介
僕は「シミュ君」です。物理現象をシミュレーションするのが僕の趣味です。わからないことはいつもプログラム仙人に質問して指導してもらっているよ。今回は、これまで疑問に思っていた量子コンピュータの動作原理に指導してもらうよ。

わしは「プログラム仙人」と呼ばれているぞ。シミュ君の趣味に付き合うのを老後の楽しみとしているのじゃ。今回は量子コンピュータの要である「量子ビット」「量子ゲート」「量子もつれ」を最小構成 14
日で理解してもらえるよう努力するぞ。

iv

目

次

はじめに............................................................................................................................................... iii

0 日目

実行環境を整えよ！ .............................................. 1

0.1

Python のインストール..........................................................................................................1

0.2

外部モジュールのインストール............................................................................................4

0.3

テキストエディタ「Visual Studio Code」の準備.............................................................5

0.4

Python でグラフ描画..............................................................................................................8

0.5

Python でグラフアニメーション描画................................................................................100.6

数値積分の実行方法..............................................................................................................13

1 日目

量子力学の「超」基礎を習得せよ！ ...................... 15

1.1

電子は「粒」と「波」の性質を併せ持つ量子粒子！.....................................................15

1.2

シュレディンガー方程式......................................................................................................17

1.3

ポテンシャル項が時間に依存しない場合..........................................................................21

2 日目

自由空間中の電子の運動を計算せよ！ ................... 25

2.1

自由空間中の波動関数..........................................................................................................25

2.2

平面波の時間依存性..............................................................................................................29

2.3

平面波の規格化.......................................................................................................................33

3 日目

ディラックのデルタ関数を習得せよ！ ................... 37

3.1

ディラックのデルタ関数の導入..........................................................................................37

3.2

ディラックのデルタ関数を用いた平面波の規格化.........................................................42

v

4 日目

電子波束の運動を計算せよ！ ................................ 494.1

電子波束の作り方..................................................................................................................49

4.2

ガウス波束の運動シミュレーション..................................................................................524.3

波束の速度（群速度）の導出..............................................................................................58

5 日目

井戸型ポテンシャル中の電子の運動を計算せよ！.... 61

5.1

無限に深い井戸型ポテンシャルに対する固有状態.........................................................615.2電子の固有状態の運動アニメーション..............................................................................64

5.3

エネルギー固有関数の直交性の確認..................................................................................67

6 日目

量子井戸に静電場を加える方法を解説するぞ！ ....... 73

6.1

静電場を加えたときのハミルトニアンと固有方程式.....................................................736.2

展開係数が満たす連立方程式の導出..................................................................................786.3行列の固有値と固有ベクトル..............................................................................................83

7 日目

静電場を加えたときの電子の運動を計算せよ！ ....... 87

7.1 〈m | V | n〉の数値積分だ！....................................................................................................877.2行列の固有値問題の数値計算しよう！..............................................................................897.3

固有関数の空間依存性を調べよう！..................................................................................967.4

静電場強度依存性を確かめよう！......................................................................................997.5

空間分布の中心を計算しよう！....................................................................................... 102

8 日目

vi

量子井戸の形状を改良するぞ！ ........................... 107

8.1

量子井戸の固有状態と量子ビットの関係....................................................................... 107

8.2

ポテンシャル障壁あり量子井戸の固有状態................................................................... 109

8.3

ポテンシャル障壁あり量子井戸に静電場を加えてみよう！...................................... 111

目次

9 日目

量子井戸へ電磁波を加える方法を解説するぞ！ ..... 115

9.1

マクスウェル方程式の復習だ！....................................................................................... 115

9.2

電磁場中の電子のハミルトニアン................................................................................... 122

9.3

計算アルゴリズムの導出................................................................................................... 125

9.4

電磁波を入射するための方法........................................................................................... 129

10 日目

量子井戸に電磁波を入射せよ！ ........................... 133

10.1 一番簡単な系でルンゲ・クッタ法の動作確認！.......................................................... 133
10.2 Xnm の計算確認.................................................................................................................... 137
10.3 電磁波で状態遷移をシミュレーション！....................................................................... 138
10.4 角振動数をずらしたときのラビ振動を確認................................................................... 143
10.5 ラビ振動の解析解............................................................................................................... 145

11 日目

1 量子ビット量子ゲートを完成させるぞ！ ........... 149

11.1 改良版量子井戸でラビ振動を確認せよ！....................................................................... 149
11.2 1 量子ビットの基本量子ゲートについて....................................................................... 153
11.3 量子ゲートと物理的操作の対応....................................................................................... 157
11.4 1 量子ビットの全ユニタリーゲートの完成！............................................................... 159

12 日目

量子井戸を並べる方法を解説するぞ！ ................. 161

12.1 2 粒子に対するシュレディンガー方程式....................................................................... 161
12.2 2 つの量子井戸のクーロン相互作用................................................................................ 165
12.3 クーロン相互作用を考慮したときの固有状態の計算法.............................................. 168
12.4 量子井戸を改良したときの固有状態の計算法............................................................... 170
12.5 独立した 2 電子の確率分布の計算方法........................................................................... 171vii

13 日目

2 量子井戸の定常状態を計算せよ！ ..................... 175

13.1 〈l1,l2 | V12 | m1,m2〉の計算.................................................................................................. 175
13.2 クーロン相互作用のみを考慮したときの固有状態の計算.......................................... 178
13.3 改良量子井戸でクーロン相互作用のみを考慮したときの固有状態の計算.............. 185
13.4 改良量子井戸でクーロン相互作用と静電場を考慮したときの固有状態の計算..... 188

14 日目

2 量子井戸のラビ振動を計算せよ！ ..................... 193

14.1 2 量子井戸へ電磁波を加える方法.................................................................................... 194
14.2 Xnm =〈n | x1+x2 | m〉を計算.............................................................................................. 196
14.3 2 量子井戸のラビ振動の計算結果.................................................................................... 199
14.4 制御 NOT ゲートの定義..................................................................................................... 203
14.5 量子もつれ（量子エンタングルメント）の生成方法.................................................. 205
14.6 |10〉→ |01〉間接遷移による量子もつれの生成........................................................... 207

終わりに........................................................................................................................................... 210
索引................................................................................................................................................... 211

viii

0日目

実行環境を整えよ！

0 日目 実行環境を整えよ！

量子コンピュータの動作原理を指導するためのプログラミング環境を整えてもらうぞ。今回は、Python という様々なハードウェアやプラットフォーム上で動作する汎用プログラミング言語を用いるぞ。Python の優位性は様々な分野で豊富なモジュー
ルが無料で公開されているので、アニメーションの描画や複雑な数値計算等を比較的簡単に行うことができるぞ。

0.1 Python のインストール
Python の 公 式 ペ ー ジ（https://www.python.org/） に ア ク セ ス し、 ト ッ プ メ ニ ュ ー の「Downloads」にマウスカーソルを乗せると表示されるプルダウンメニューの中央にあるボタン
をクリックすれば、利用中の環境に合ったインストーラーが現れるな。OS が Windows の場合には、「Download for Windows」の下のボタン（図の②）をクリックすると、「python-3.8.2.exe」という実行ファイルがダウンロードされるな。

1

0

日目

実行環境を整えよ！

図 0.1 ● Python の公式ダウンロードページ（2020 年 3 月現在の様子。ボタンに表示されるバージョン番号はページへのアクセス日時によって変わります）①ここにマウスカーソルを合わせる②ʼ②ボタンをクリックする

ちなみに、この手順でダウンロードされるのは 32 ビット版のインストーラーじゃ。64 ビット版のインストーラーが欲しければ、ボタンの左にある「Windows」というリンク（図の②’）をクリックして現在入手可能なインストーラーの一覧ページに移動し、「Download Windows x86-64

executable installer」というリンクを探してクリックすればよい。
図 0.2 ●バージョン 3.8.2 の Windows 64 ビット版インストーラーへのリンク（https://www.python.
org/downloads/windows/ の一部抜粋）

2

0.1 Python のインストール

図 0.3 ● Python のインストーラー実行ファイル

0
1
2
3

ダウンロードしたインストーラーのファイルをダブルクリックして実行すると、図 0.4 のような4画面が現れるぞ。まず、一番下にある「Add Python 3.8 to PATH」のチェックボックスにチェックを入れておこう。これを忘れると後で OS の環境設定で Path を別途設定する必要が出てきてし5

まうからな。そうしたら「Install Now」をクリックするのじゃ。インストールはあっという間に
終わるぞ。

6

図 0.4 ● Python インストーラー実行画面（64 ビット版）

7
8
9
10
11
12
13

Python が正しくインストールできていることを確認するぞ。Windows メニュー一覧から

14「Windows システムツール」をクリックして表示される「コマンドプロンプト」を起動せよ。
図 0.5 のような画面が表示されるな。Python はこのコマンドプロンプトで命令文を入力することで利用することができるのじゃ。

3

0

日目

実行環境を整えよ！

図 0.5 ●コマンドプロンプトの起動画面

パソコンにインストールされた Python のバージョンを確認する命令文「python -V」を入力

してエンターキーを入力せよ。「V」は大文字じゃぞ。すると「Python 3.8.2」というように、インストールされているバージョンが表示されるぞ。
> python -V

以降、コマンドプロンプトに対する入力を太字で示します。

Python 3.8.2

0.2 外部モジュールのインストール
次に、後で利用する 3 つの外部モジュールもついでにインストールしておくぞ。それにはPython に付属する「pip」というユーティリティを利用するのじゃ。先程のコマンドプロンプ「pip install scipy」「pip install matplotlib」といトで「pip install numpy」

う命令文をそれぞれ入力するだけで外部モジュールをインストールすることができるぞ。最後に「Successfully」と表示されればインストール完了じゃ。
表 0.1 ●インストールする外部モジュール
モジュール名numpy
scipy

matplotlib

説明
ベクトルや行列を型付の多次元配列として扱うことができ、行列計算を高速に行うことができるモジュール。
科学計算で利用する数値解析用モジュール。本書では数値積分を行うために利用。

Numpy で作成したデータをグラフ描画するためのモジュール。

これらのモジュールが正しくインストールできているかを調べるには、「pip list」という命令文で表示されるモジュール一覧を確認するのが簡単じゃ。次に示すように、外部モジュールの一4

0.3 テキストエディタ「Visual Studio Code」の準備

覧がバージョンとともに表示されるぞ。ここに「numpy」「scipy」「matplotlib」が表示されてい0

れば OK じゃ。
> pip list

1

Package

Versioncycler

0.10.0matplotlib

3.2.1--------------- -------

2

kiwisolver

3

numpy

1.1.0

1.18.220.0.2

4python-dateutil 2.8.1

5pip

pyparsing

2.4.6

scipy

1.4.1

six

1.14.0setuptools

41.2.067

なお、ここでの作業の際に、「新しいバージョンが使えるから pip のアップグレードを検討すべきだ」と通知されることがある。そのための命令文も提示されるから実行してしまうのがよいじゃ

8

ろう。

9
10

0.3 テキストエディタ「Visual Studio Code」の準備

11

Python のプログラムは、コマンドプロンプトと「メモ帳」があれば開発できないこともない。

12じゃが、高機能なテキストエディタを使えば、開発の効率は格段に向上するぞ。ここでは「Visual

Studio Code」というテキストエディタを紹介しよう。

13

Visual Studio Code は、Microsoft 社が無料で公開しているテキストエディタじゃ。Python 言語の文法に沿って文字の色や書体を変えて表示するシンタックスハイライト機能や、変数名やメソ

14

ッド名などを入力中に補ってくれるコード補完機能、さらにはプログラムの修正作業を支援するデバッガーまで付いているぞ。これらは非常に便利なので、是非とも利用してもらいたい。

Visual Studio Code をインストールするには、公式ページ（https://azure.microsoft.

com/ja-jp/products/visual-studio-code/）から OS に対応したインストーラーをダウ

ンロードして実行するだけじゃ。ここまでは簡単なので省略して、Python に対応させる拡張機能（Extensions）の導入方法を解説するぞ。Visual Studio Code を起動し、次の手順で行えばよい。

5

0

日目

実行環境を整えよ！

図 0.6 ● Python を利用するための拡張機能の導入

⑤

②

③

④

①

① 左メニューの機能拡張ボタンをクリックする。
② テキストボックスに「python」と入力する。
③ Python に関係する拡張機能の一覧が表示されるので、先頭に表示される「Python」をクリックする。
④ 選択した拡張機能の説明が表示されるので、「install」をクリックしてインストールする。
⑤ インストールが完了したら、タブのクローズボタンをクリックする。
これで導入作業は完了じゃ。①の機能拡張ボタンをもう一度クリックすれば、拡張機能の一覧を非表示にすることができるぞ。
それでは、Visual Studio Code を用いた Python プログラムコードの記述の方法とプログラムの実行方法を解説するぞ。プログラムソース「HelloWorld.py」をダブルクリックしてみよ。Visual

Studio Code のインストール時に拡張子「py」の関連付けがうまく行っていれば、Visual Studio
Code が起動するはずじゃ。もし、Visual Studio Code が起動しない場合には、ソースファイルを右クリックして「プログラムから開く」にマウスオーバーし、Visual Studio Code を選択するのじゃぞ。
このファイルに記述されている内容は次に示すたった 1 行だけじゃ。
print("Hello World")

6

0.3 テキストエディタ「Visual Studio Code」の準備「print」はターミナルへ文字列を表示するための関数で、このプログラムソースを実行すると0「Hello World」という文字列をターミナルに表示するのじゃ。このプログラムを次の手順で実行してみよう。

1

図 0.7 ●プログラムの実行手順

2
②ʼ

②

3

③

4
5

①

6
7
8
9
① 左メニューの実行ボタンをクリックする。

10② 「Run and Debug（実行とデバッグ）」ボタンをクリックする。
③ 「Python File」をクリックする。

11

この実行方法は「デバックモードによる実行」と呼ばれ、プログラムソースにバグが存在した場

12

合に、エラー発生時の変数の値などの情報を得ることができるのじゃ。その分だけプログラムの実

13

行速度は遅くなるが、開発時はデバックモードで実行するほうが効率は上がるぞ。ちなみに、デバッグモードではプログラム開発で非常に有用なブレークポイントの利用もできるぞ。早速プログラ

14

ムソース「HelloWorld.py」をデバッグモードで実行して、ターミナルに表示されていることを確認せよ。
一方、プログラムの完成後は、右上の「▷」ボタン（図の②’）をクリックすることで「通常実行」を行うことができるぞ。デバッグモードと比較して速度は数倍程度早くなるぞ。

7

0

日目

実行環境を整えよ！

0.4 Python でグラフ描画
Python では、先にインストールした matplotlib モジュールを利用することで簡単にグラフ描画を行うことができるぞ。次のプログラムソースでは y = sin(πx) の 2 次元グラフを描画しているぞ。サンプルプログラムの graph_test.py を開いて確認してみよ。
プログラムソース 0.1 ●グラフ描画のテスト（graph_test.py）
import math< -------------------------------------------------------------------------------------------------------------（※1）< ----------------------------------------------------------------------------（※2）

import matplotlib.pyplot as plt# 描画範囲x_min = -1.0
x_max = 1.0# 描画区間数
N = 100# リストの生成
xl = []
yl = []< ----------------------------------------------------------------------------------------------------------------- （※3-1）< ----------------------------------------------------------------------------------------------------------------- （※3-2）# データの生成

for i in range(N+1):<-----------------------------------------------------------------------------------------------（※4）<--------------------------------------------------------------------- （※5-1）
y = math.sin( math.pi * x ) < ------------------------------------------------------------------------- （※5-2）
xl.append(x) < -------------------------------------------------------------------------------------------------- （※6-1）
yl.append(y) < -------------------------------------------------------------------------------------------------- （※6-2）
x = x_min + (x_max -x_min)*i/N# 描画範囲を設定

plt.xlim([-1.0,1.0])
plt.ylim([-1.2,1.2])# グラフの描画

plt.plot(xl,yl)# グラフの表示
plt.show()<-------------------------------------------------------------------------------------------- （※7-1）<-------------------------------------------------------------------------------------------- （※7-2）< -------------------------------------------------------------------------------------------------------（※8）< ---------------------------------------------------------------------------------------------------------------（※9）（※ 1） 三角関数や指数関数、対数関数といった高等学校で学習する初等関数を利用する際に、mathというモジュールをインポートする必要があるぞ。このモジュールで定義される関数や定数を利用する場合には math.xxx という形（xxx は関数名や定数名）に記述するぞ。

（※ 2） matplotlib.pyplot は、matplotlib の中の pyplot という意味じゃ。（※ 1）の mathのように、インポートした関数や定数を利用するには matplotlib.pyplot.xxx という形にする必要があるのじゃが、インポート時に「as plt」と記述することで、matplotlib.
pyplot.xxx ではなく plt.xxx と記述することができるようになるぞ。

（※ 3） C 言語などでお馴染みの配列は、Python ではリストと呼ばれるぞ。グラフ描画に必要な x 軸

8

0.4 Python でグラフ描画

データと y 軸データを格納するリストの初期化を行っているぞ。

（※ 4） i = 0, 1, 2, ……, N まで、N + 1 回の繰り返し文じゃな。C 言語などでは for 文や if 文の範

0（※ 5） グラフ描画点 (x, y) の値を計算しているぞ。x は x_min から x_max までを等間隔として与1（※ 6） append メソッドを用いると、リストの最後に新しい要素を追加することができるぞ。

2

囲は「{」から「}」で表すのじゃが、Python はインデント（字下げ）の範囲で表すぞ。
え、その x に対応する sin(πx) の値を y に与えているぞ。

（※ 7） xlim メソッドと ylim メソッドでグラフ描画時の x 軸と y 軸の範囲をそれぞれ指定すること3（※ 8） （※ 6）で作成したリスト xl、yl を用いてグラフ描画を行うメソッドを実行しているぞ。た4ができるぞ。

だし、この時点ではまだグラフが表示されるわけではないことに注意が必要じゃ。

（※ 9） 実際にグラフを表示するメソッドを実行しているぞ。実行結果は下図のとおりじゃ。意図通5りにグラフ描画できていることがわかるな。

6

図 0.8 ● Python によるグラフ描画の様子

7
8
9
10
11
12
13
14

9

0

日目

実行環境を整えよ！

0.5 Python でグラフアニメーション描画
matplotlib モジュールを利用すると、パラメータを徐々に変化させてグラフ描画させることでアニメーションを作成することも簡単にできるぞ。次のプログラムソースでは sin(2πx + φ) に対して φ = 0 → 2π まで変化させたときのアニメーションを作成しているぞ。サンプルプログラ
ムの「animation_test.py」を開いて確認してみよ。ただし、デバッグモードで実行するとアニメーションがなめらかに表示されない場合があるから、その時は通常実行で試してみると良いぞ。
プログラムソース 0.2 ●グラフアニメーション描画のテスト（animation_test.py）
import mathimport matplotlib.pyplot as plt

import matplotlib.animation as animation<--------------------------------------------------------------（※1）

import matplotlib

print(matplotlib.matplotlib_fname())# 図全体

fig = plt.figure(figsize=(10, 6))< -------------------------------------------------------------------------（※2）# 描画範囲x_min = -1.0
x_max = 1.0# アニメーション作成用
ims=[]< ----------------------------------------------------------------------------------------------------------------------（※3）# 描画区間数
N = 100# アニメーション分割数
AN = 30# アニメーションの各グラフを生成
for a in range(AN):phi = 2.0 * math.pi * a / AN
# リストの生成
xl = []
yl = []# データの生成

for i in range(N+1):x = x_min + (x_max -x_min)*i/N

y = math.sin( math.pi * x + phi)10

0.5 Python でグラフアニメーション描画

xl.append(x)0yl.append(y)# 各コマのグラフの描画

img = plt.plot(xl, yl, color="blue", linewidth=3.0, linestyle="solid" )ims.append( img )# グラフタイトルの設定

2

plt.title("sin function")# x軸ラベル・y軸ラベルの設定
plt.xlabel("x-axis")
plt.ylabel("y-axis")# 描画範囲を設定

1< ----（※4）< ----------------------------------------------------------------------------------- （※5-1）

3<-------------------------------------------------------------------------------------------- （※5-2）<-------------------------------------------------------------------------------------------- （※5-3）

4

plt.xlim([-1.0,1.0])

5

plt.ylim([-1.0,1.0])# アニメーションの生成

ani = animation.ArtistAnimation(fig, ims, interval=50)<---------------------------------------（※6）

ani.save("output.html", writer=animation.HTMLWriter()< ----------------------------------------（※7）# アニメーションの保存# グラフの表示

6
7

plt.show()8（※ 1） アニメーションを実装するために必要なモジュールじゃ。「as animation」とあるので、

9定数やメソッドには animation.xxx でアクセスができるな。

（※ 2） 図全体に対する様々な設定を行うことのできるインスタンスを生成しているぞ。前項のよう10にグラフが 1 個の場合は省略することができるが、アニメーションのように異なる図を複数描画する場合には必須となるぞ。引数の「figsize=(10, 6)」は生成する図のサイズを表11

すぞ。単位は 1 が 100px を表すぞ。デフォルトは（8.6）じゃ。

（※ 3） 異なるパラメータで生成した図を格納するリストを用意しておくぞ。

12（※ 4） 各 コ マ の グ ラ フ 描 画 を 行 っ て い る ぞ。 前 回 の グ ラ フ 描 画 時 に 加 え て、 線 色 を 青 色に 指 定（color="blue"）、 線 幅 を 3px に 指 定（linewidth=3.0）、 線 種 を 実 線

13（linestyle="solid"）にしているぞ。ちなみに線色を与える方法はキーワードに加え、RGB（R 値 G 値 B 値 を リ ス ト で 表 し た 値。 例：[0, 0, 1]）、16 進 数（ 例：#0000FF）

14、 破 線（"dashed"）、破点線
も あ る ぞ。 ま た、 線 種 は 実 線 の 他 に 点 線（"dotted"）（"dashdot"）などがあるぞ。

（※ 5） 前項では省略したが、グラフにはタイトルや x 軸と y 軸のラベルも設定することができるぞ。

（※ 6） アニメーションの生成は引数に（※ 1）と（※ 3）で生成した fig と imgs を引数としたArtistAnimation メソッドで行うぞ。第 3 引数の「interval=50」は各コマの時間間隔をミリ秒で設定しているぞ。50 ミリ秒の場合、1 秒あたり 20 コマ（フレームレート：20）

であることを意味するぞ。
（※ 7） 生成したアニメーションを HTML 形式で再生できるように出力することもできるぞ。図 0.12

11

0

日目

実行環境を整えよ！

は生成した HTML ファイルをウェブブラウザで実行したときの様子じゃ。再生・停止などをマウスで操作することができるぞ。HTML では各コマのグラフを PNG 形式の静止画像ファ
イルに保存しておいて、それをフレームレートに合わせて差し替えるということを行っているのじゃな。PNG ファイルはフォルダに格納されているぞ。なお、外部エンコーダ等を用意すると、アニメーション GIF や MP4 形式の動画にも出力することもできるぞ。
図 0.9 ● HTML でアニメーション（ウェブブラウザとして Google Chrome を利用）

12

0.6 数値積分の実行方法

図 0.10 ●あらかじめ生成された静止画（PNG 形式）が格納されたフォルダ

0
1
2
3
4
5
6
7
8
9
10
11
12

0.6 数値積分の実行方法

13
14

最後に、Python で数値積分を行う方法を解説するぞ。次のプログラムソースはガウス・ルジャ
ンドル法という計算アルゴリズムで任意の関数を積分するためのサンプルプログラムじゃ。先にインストールした scipy モジュールを利用するぞ。数値積分の誤差を調べるために、解析解が得ら
れる

I=

 1

sin(πx)dx

（0.1）

0

13

0

日目

実行環境を整えよ！

の積分を計算してみるぞ。解析解は I = 2/π じゃな。サンプルプログラムの「integral_test.py」
を開いて確認してみよ。
プログラムソース 0.3 ●数値積分：ガウス・ルジャンドル積分（integral_test.py）
import mathimport scipy.integrate as integrate< ----------------------------------------------------------------------（※1）# 積分区間x_min = 0.0
x_max = 1.0# 被積分関数def integrand(x):<----------------------------------------------------------------------------------------------------（※2）< --------------------------------------------------------------------------- 式（0.1）

return math.sin(math.pi*x)# 解析値

exact = 2.0 / math.pi# 数値積分の実行

result = integrate.quad(integrand,x_min,x_max)< ----------------------------------------------------（※3）# 計算結果を表示

print("積分結果：" + str(result[0]))# 計算誤差と推定誤差を表示

print("計算誤差：" + str(result[0]-exact) + " (推定誤差：" + str(result[1]) + ")")<-（※4）（※ 1） 数値積分を実行するには scipy モジュールの中の integrate をインポートする必要があるぞ。

（※ 2） 被積分関数を Python の関数として定義するぞ。
（※ 3） 実際の数値積分は第 1 引数に被積分関数、第 2 引数と第 3 引数に積分範囲の下端と上端を与えた quad メソッドで実行することができるぞ。戻り値はタプル（要素の変更ができないリスト）で、第 1 要素に計算結果、第 2 要素に推定誤差が格納されているぞ。

（※ 4） ターミナルに出力した計算結果を次に示そう。解析値と比較した結果は 0 となったな。今回の積分はおとなしい関数じゃからか、驚くことに 15 桁まで計算誤差が無いことを表しているぞ。
積分結果：0.6366197723675814

計算誤差：0.0 (推定誤差：7.067899292141149e-15)

14

1日目

量子力学の「超」基礎を習得せよ！

1 日目 量子力学の「超」基礎を習得せよ！

1.1 電子は「粒」と「波」の性質を併せ持つ量子粒子！
1 日目は、量子ドットコンピュータの主役となる電子の性質を解説するぞ。電子のよ
うに軽い粒子（量子粒子）の運動は量子力学という理論で記述できることが知られているぞ。量子粒子の最大の特徴は「粒」であると同時に「波」の性質を持つというところじゃ。これは「粒子と波動の二重性」と呼ばれ、過去の様々な実験によって確かめられている
事実なのじゃ。
図 1.1 ●粒子と波動の二重性

「粒子」

「波動」

15

1

日目

量子力学の「超」基礎を習得せよ！

電子って電気の元となる物質だよね。電子を扱う理論は「電磁気学」があったけれど
も、これじゃだめなの？ 「量子力学」と何が違うの？
電磁気学で扱う電子は、点電荷といって粒子として扱っているんじゃよ。波動の性質は全く利用していないのじゃ。その結果、電磁気学では実は、原子核のまわりを回る
電子を説明できないのじゃ。
そうだったんだね。電子に波動の性質があるから原子は存在できるってことなんだね。そんな量子粒子を表現できる量子力学ってすごいね。
量子力学では量子粒子の状態を「波動関数」という複素数のスカラー関数（ベクトルではない）で表すぞ。1 次元の場合、位置 x 、時刻 t の量子粒子の波動関数は

波動関数：
位置

時刻

と表されるぞ。 ψ はプサイというギリシャ文字じゃ。この波動関数で波動の性質を表現すると同時に、なんと |ψ(x, t)| がその地点（位置 x 、時刻 t ）に粒子が存在する確率を表しているぞ。こ2

れは「ボルンの確率解釈」と呼ばれ、まだ誰にも証明されていないけれども、すべての実験で矛盾なく確かめられている事実なのじゃ。
じゃあ、ボルンの確率解釈は量子力学の原理（証明不要で用いることができる事象）ってことだね。それにしても波動関数はすごいね。 ψ(x, t) はそのままで波動性を有しつつ、|ψ(x, t)|2 で粒子性も担保できるなんて。
そうなんじゃ。そして、この波動関数が従う方程式が「シュレディンガー方程式」じゃ。今日は、シュレディンガー方程式の基本的な解き方を解説するぞ。

16

1.2 シュレディンガー方程式

1.2 シュレディンガー方程式

0（1）シュレディンガー方程式とは

21波動関数 ψ(x, t) は時間と空間を引数に持つ 2 変数関数なので、微分方程式ではなく

3

偏微分方程式となる点に注意が必要じゃ。シュレディンガー方程式の導出はさてお

4

き、次のとおりじゃ。
基礎方程式

5

シュレディンガー方程式---------------------------------------------------------------------------（1.1）

6--------------------------------------------------------------------------------------------------------------------------------7i∂ψ(x, t)= Ĥ(x, t)ψ(x, t)∂tĤ(x, t) はハミルトニアンと呼ばれるもので、次で詳しく解説するぞ。「 i」は虚数、「  」はデ8

ィラック定数（ 1.055 × 10−34 [Js]）と呼ばれ、プランク定数（ h = 6.626 × 10−34 [Js]）という
量子力学で基本となる量を 2π で割った量で定義されるぞ。プランク定数の意味は後で詳しく解説

9

するぞ。

∂ψ(x, t)/∂t が時刻 t による偏微分を表しているのじゃが、これは t 以外を定数とみなして、t で10微分を行うという数学的操作を表すのじゃ。通常の微分の場合には「 d 」の記号を用いたが、偏微分は ∂ の記号を用いるぞ。
数学定義

11

偏微分の定義------------------------------------------------------------------------------------------f (x + ∆x, y) − f (x, y)∂f (x, y)
≡ lim
∆x→0
∂x
∆x

12

（1.2）

13

--------------------------------------------------------------------------------------------------------------------------------

14式（1.1）のシュレディンガー方程式は、対象とする問題に対応するハミルトニアンを与えることではじめて波動関数に対する偏微分方程式が完成するのじゃ。

（2）古典力学のハミルトニアンと量子力学のハミルトニアン
古典力学のハミルトニアンはエネルギーに対応する量で、粒子に加わる力が速度に依存しない場合、運動エネルギー（ T ）とポテンシャルエネルギー（ V ）の和で表され
るぞ。

17

1

日目

量子力学の「超」基礎を習得せよ！

定義

ハミルトニアン（古典力学）----------------------------------------------------------------------（1.3）

H =T +V-------------------------------------------------------------------------------------------------------------------------------ポテンシャルエネルギーが陽に時間に依存しない場合、ハミルトニアンは一定値となり、エネル
ギー保存則に対応するぞ。古典力学の運動エネルギーは粒子の質量 m 、速度 v あるいは運動量 p（ = mv ）を用いて

T =

1
p2
mv 2 =
22m（1.4）となるな。ポテンシャルエネルギー V は粒子が受ける力 F の源を表す量で、力 F と

F =−

dV
,
dx

V =−



F dx

（1.5）

の関係があるわけじゃな。つまり、ポテンシャルエネルギーの空間的な傾きが粒子が受ける力であることを表しているな。次に量子力学のハミルトニアンについてだけれども、古典力学の場合と形式的には同じじゃ。粒子に加わる力が速度に依存しない場合には運動エネルギーとポテンシャルエ
ネルギーの和で表されるぞ。
定義

ハミルトニアン（量子力学）----------------------------------------------------------------------（1.6）

Ĥ = T̂ + V̂-------------------------------------------------------------------------------------------------------------------------------それぞれの記号の上の「^」は「ハット（帽子）」と呼ばれ、古典力学から量子力学への変換は、
位置 x と運動量 p を位置演算子 x̂ 、運動量演算子 p̂ に置き換えることに対応するぞ。

T =

p2
p̂2
→ T̂ =,2m
2m

V (x, t) → V̂ (x̂, t)

この x̂ と p̂ は古典的な数ではなく、演算子であることに注意が必要だ。

（3）位置演算子と運動量演算子の正準交換関係
位置演算子 x̂ と運動量演算子 p̂ は古典的な数ではないことは先に述べたが、次に示す
正準交換関係と呼ばれる関係を要請することで、古典力学からの量子力学への移行が完成するぞ。まず、交換関係という数学的操作を次のとおりに定義するぞ。

18

1.2 シュレディンガー方程式

数学

交換関係の定義- --------------------------------------------------------------------------------------

0[A, B] ≡ AB − BA1--------------------------------------------------------------------------------------------------------------------------------A や B が普通の数の場合、積は順番に依らないので 0 になるが、演算子や行列の場合、積の順

2番で結果が異なるので 0 にはならないな。先の位置演算子 x̂ と運動量演算子 p̂ の交換関係に次の関係を要請するぞ。

3

物理

4

正準交換関係------------------------------------------------------------------------------------------[x̂, p̂] = x̂p̂ − p̂x̂ = i

（1.7）

5

-------------------------------------------------------------------------------------------------------------------------------この x̂ と p̂ の関係は正準交換関係と呼ばれ、この関係を課すことは量子化と呼ばれるぞ。先に6導入した波動関数は位置と時刻を引数とする関数としたが、実は位置演算子 x̂ を通常の変数 x とみなすことができるという性質を持つのじゃ。このような波動関数 ψ(x, t) は位置表示と呼ばれる

7

ぞ。反対に、運動量と時刻を引数とする波動関数 ψ(p, t) も定義することができて、この場合には8

運動量演算子 p̂ を通常の変数 p とみなすことができるのじゃ。このような波動関数 ψ(p, t) は運動量表示と呼ばれるぞ。

9

話を元に戻して、シュレディンガー方程式を位置表示の波動関数に対応させるには、運動量演算子 p̂ を変数 x で表す必要があるのじゃ。式（1.7）の正準交換関係を満たす p̂ は次のように表され

10

るぞ。
物理

11

位置表示における運動量演算子-------------------------------------------------------------------

 ∂
i ∂x

（1.8）

12

--------------------------------------------------------------------------------------------------------------------------------

13

p̂ =

x の偏微分となっているのは、 p̂ は 2 変数関数である ψ(x, t) に作用することを前提にしている14

ためじゃ。 p̂ を式（1.8）に与えた場合に式（1.7）の正準交換関係を満たすことは【メモ 1】で確認するぞ。

（4）位置表示におけるシュレディンガー方程式
シュレディンガー方程式（1.1）に式（1.6）の量子化したハミルトニアンを代入して、位置表示の波動関数であることを考慮すると、シュレディンガー方程式は次のとおりになるぞ。

19

1

日目

量子力学の「超」基礎を習得せよ！

基礎方程式

i

シュレディンガー方程式----------------------------------------------------------------------------
2 ∂ 2∂ψ(x, t)= −+Vψ(x, t)∂t2m ∂x2（1.9）--------------------------------------------------------------------------------------------------------------------------------（5）波動関数の規格化条件|ψ(x, t)|2 は時刻 t に粒子が位置 x に存在する確率を表すことは述べたが、確率は全空間で保存されている必要があるぞ。そのため波動関数は全確率を 1 として次の式が要請されるぞ。

 ∞|ψ(x, t)|2 dx = 1（1.10）−∞

これは波動関数の規格化条件と呼ばれ、すべての時刻で成り立つ必要があるぞ。

【メモ 1】位置表示における正準交換関係の確認
もともと演算子は波動関数に作用することを前提としているので、式（1.7）の正準交換関係を確認するに右から位置表示波動関数 ψ(x, t) を作用させてから x̂ と p̂ の交換関係を計算する必要があるぞ。

 ∂ψ  ∂−(xψ)
i ∂x 
i ∂x

 ∂ψ

 ∂ψ
−
ψ+ x
=x
i ∂x
i
i ∂x

= − ψ = iψi[x̂, p̂]ψ(x, t) = x̂

（1.11）

左辺と右辺最後の式を見比べると式（1.7）の正準交換関係が満たされていることが確認できたかな。ちなみに、上記の計算で注意が必要なのは 2 点あって、1 つ目は x̂ は ψ(x, t) とその導関数に作用することで演算子からただの変数 x に置き換わること、2 つ目は p̂ は直後の x だけでなくその後に続く ψ にも作用する点じゃ。ちなみに分母に虚数 i がある場合、分母と分子に i を掛けることで分母の i はなくなるぞ。

20