bitterharvest’s diary

A Bitter Harvestは小説の題名。作者は豪州のPeter Yeldham。苦闘の末に勝ちえた偏見からの解放は命との引換になったという悲しい物語

量子力学の世界を垣間見る(7):シュレディンガー方程式

昨日(9月22日)は、中学時代の同級生と大相撲秋場所を見に行った。
f:id:bitterharvest:20160923064550j:plain

横綱昇進がかかっていた稀勢の里が、前の日に敗れて3敗を喫したため、今場所の興味が薄れてしまった直後の観戦となった。他方で、先場所、休場した豪栄道が、信じられないほどの充実した相撲を取り続け、初めての優勝を勝ち取れるのかという方に興味が移ってきた日でもあった。

相撲の観戦は初めてではない。30年前に数回訪れたことはあるが、枡席が狭かったことが印象に残っている。週の初めごろから、何となく腰が重いので、あの狭いところに座るのはつらいだろうなと思い続けていたが、観戦の2日前にその対策をブログで調べていたら、アウトドア用のチェアマットがよいというのを見つけたので早速購入して、この日に備えた。
f:id:bitterharvest:20160923071049j:plain

席に着くときに、お茶屋さんが隣の席は来ないようなので、使っても大丈夫でしょうというので、連続した枡席で、それぞれ2名のゆったりした空間で、直前に入手したチェアマットを利用するまでもなく、3段目からの相撲を楽しみ始めた。十両の相撲に入ったころに、お茶屋さんの勘違いだったようで、我々が占拠している席の正規のお客さんが出現した。我々は、お茶屋さんが大丈夫だといっていたなどとぶつぶつ言いながら、狭い枡席に4人を詰め込む羽目になった。これが当たり前の状態なのだが、直前までの自由な空間と比較すると、身動きができないほど狭い。

チェアマットを利用したのだが、後ろの人にぶつかりそうになるので、その機能を生かすことができない。幸い、席の前は通路になっていた。人っ子一人通れるほどの狭い通路なのだが、通行人がいない時を見計らって、通路に足を投げ出して少しでも腰と足に負担がかからないように心掛けた。後ろに座って、あぐらをかいていた同級生の一人は、途中で足がつってしまい、痛い痛いと騒いでいた。また、前の方に座ったもう一人は、僕と同じように足を通路に投げ出している時、通行人にわざと踏まれたようで、こちらも不要な痛みをもらうこととなった。

行事や呼び出しの衣装はその階級によって変わってゆく。三段目あたりでは、裸足で、脛も露出している。いかにも使いぱっしりの小僧という感じだ。横綱大関を裁くような役柄になると、その相続は甚だ立派である。立行司ともなると短刀をさしている。このように、古いしきたりを守り続ける大相撲なのだが、畳での生活が日常的ではなくなった我々にとっては、枡席はいささか窮屈すぎるように思う。古い世代の男性4人であったので救われた部分もあるが、体格がよくなった若い世代の男性4人が枡席に押し込まれた姿は、想像するのさえ気持ちが悪い。

さて、量子力学の話に一区切りつけたいので、今回の記事は、量子力学で中心をなしているシュレディンガー方程式の話である。

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

粒子が相互に交換される記事で、それを表すハミルトニアンを次のようにした。
\begin{eqnarray}
\hat{H}=-g\sum_{l=-\infty}^\infty (\hat{a}^\dagger_{l+1} \hat{a}_l + \hat{a}^\dagger_{l} \hat{a}_{l+1})
\end{eqnarray}

12.1 運動エネルギー

エネルギーは、運動エネルギーとポテンシャルエネルギーで表される。上記の式が運動エネルギーだけを表すようにするために、少し変形する。上記の式では、二つの粒子が存在するので、これを打ち消すことを考える。このためには、二つの粒子を引き去ればよいと考えられるので、同じ位置で相互に交換される二つの粒子を前の式から差し引いた次の式を考える。
\begin{eqnarray}
\hat{H}'=-g\sum_{l=-\infty}^\infty (\hat{a}^\dagger_{l+1} \hat{a}_l + \hat{a}^\dagger_{l} \hat{a}_{l+1} - 2\hat{a}^\dagger_{l} \hat{a}_{l})
\end{eqnarray}

波数の1次元空間中での1粒子状態\(|\kappa> = \displaystyle \sum=m A e^{i\kappa m}\hat{a}^\dagger_m|0>\)に作用させると
\begin{eqnarray}
\hat{H}' |\kappa>=g(2sin \frac{\kappa}{2})^2 | \kappa>
\end{eqnarray}
となる。これより、\(|\kappa>\)が\(\hat{H}'\)の固有状態であることが分かる。

また、\(k=\kappa / d\)なので、分散関係
\begin{eqnarray}
E' = g(2sin \frac{\kappa}{2})^2=g(2sin \frac{k}{2} d)^2
\end{eqnarray}
である。これより、\(k=0\)の時、即ち、粒子が移動していないとき、エネルギーは0となる(これから、上記の式にはポテンシャルエネルギーが0であることが確認された)。

\begin{eqnarray}
\hat{H}=-g\sum_{l=-\infty}^\infty (\hat{a}^\dagger_{l+1} \hat{a}_l + \hat{a}^\dagger_{l} \hat{a}_{l+1} - 2\hat{a}^\dagger_{l} \hat{a}_{l})
\end{eqnarray}
を実空間に移すと、
\begin{eqnarray}
\hat{H}=\int_{-\infty}^\infty \hat{a}^\dagger(x) \left[ - \frac{\hbar^2}{2m} \frac{\partial^2}{\partial x^2} \right] \hat{a}(x) dx
\end{eqnarray}
なお、上の式で\(m\)は1粒子の重さである。

また、波数空間では
\begin{eqnarray}
\hat{H}=\int_{-\infty}^\infty \left[ \frac{(\hbar k)^2}{2m} \frac{\partial^2}{\partial x^2} \right] \hat{a}^\dagger(k) \hat{a}(k) dk
\end{eqnarray}

12.2 ポテンシャルエネルギー

ポテンシャルを\(V(x)\)で与えることにしよう。位置や運動量を表す演算子を考えてきたときと同じように、ポテンシャルを表す演算子を次のように用意しよう。
\begin{eqnarray}
\hat{V} = \int_{-\infty}^\infty V(x) \hat{a}^\dagger(x) \hat{a}(x) dx
\end{eqnarray}

位置\(x'\)に粒子が1つある状態\(\hat{a}^\dagger(x') | 0 > \)に\(\ \hat{V}\)を作用させると、

\begin{eqnarray}
\hat{V}\hat{a}^\dagger(x') | 0 > &=& \left[ \int_{-\infty}^\infty V(x) \hat{a}^\dagger(x) \hat{a}(x) dx \right] \hat{a}^\dagger(x') | 0 > \\
&=& V(x') \hat{a}^\dagger(x') | 0 >
\end{eqnarray}
となる。

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

それでは、運動量とポテンシャルを共に含んだ演算子を考えることにしよう。
\begin{eqnarray}
\hat{H} &=&\int_{-\infty}^\infty \left[ - \frac{\hbar^2}{2m} \hat{a}^\dagger(x) \frac{\partial^2}{\partial x^2} + V(x) \hat{a}^\dagger(x) \hat{a}(x) dx \right] \hat{a}(x) dx \\
&=& \hat{T} + \hat{V}
\end{eqnarray}

状態\(\)の時間発展方程式は次の式で表すことができた。
\begin{eqnarray}
i \hbar \frac{d}{dt}|\Psi(t)>=\hat{H}|\Psi(t)>
\end{eqnarray}

そこで、この式に先の演算子を代入すると、次のシュレディンガー方程式を得ることができる(なお、\(\psi(y, t)\)は波動関数である)。

\begin{eqnarray}
i \hbar \frac{\partial}{\partial t} \psi(y, t) = \left[ - \frac{\hbar^2}{2m} \frac{\partial^2}{\partial y^2} + V(y) \right] \psi(y,t)
\end{eqnarray}

随分と沢山の記事を書いたが、漸くシュレディンガー方程式までたどり着いた。

Haskellとの関連で残されている課題は、ケットとブラを連続な空間に拡張することである。この時、将来への拡張を考えて、1次元空間ではなく3次元空間への適用を考慮しておく必要がある。
現時点では、3次元の複素数のベクトル空間が考えられるが、これについては、また、時を改めて記事を書くこととしたい。

量子力学の世界を垣間見る(6):ハミルトニアンの活用

この3月に退職して以来、これまで専門としてきた情報科学の研究から離れて、日本の古代史(平安時代の終わりまで)を勉強している。

僕が高校生だった頃は、社会科の科目には、社会、世界史、日本史、地理の4科目が設けられていた。その内で、社会は必修で、残りの3科目の中から2科目を選択し、合わせて3科目を学習するようになっていた。

僕が入学したいと思っていた大学は、社会は受験科目に含まれておらず、世界史、日本史、地理の中から2科目を選んで受験することとなっていた。もともと地理は好きだったので、中学生の頃にはかなりのことが身についていて、そのまま、大学受験をしても大丈夫な程度の知識を有していた。このため、知識の量を増やすという観点に立てば、世界史と日本史を選択して高校時代を過ごせばよかったのだが、大学へ入学できることを最優先にして、高校では、地理と世界史を学んだ。そのため、日本史を学ぶ機会を失ってしまったため、この歳になって学びなおしてみたいと思うようになった。

幸いなことに、古代史の研究は、新たな遺跡の発見や発掘などの恩恵もあって、近年、大きな変貌を遂げている。もし、高校時代に学んでいたとすると、その時の知識が邪魔をして、今日の新しい考え方が素直に入ってこなかったのではないかと思い、変な意味で、高校時代に日本史を学ばなかったことに今感謝している。

しかし、新しい分野を学ぶということは大変なことで、頭の中にその分野の体系を形作るまでに、受験勉強にも勝る努力を必要とする。最近は、インターネットのおかげでとても便利な世の中になり、分からないことがあった時には、図書館を訪れるまでもなく、ウィキペディアで調べれば、瞬時に情報を得ることができる。知りたいと思っていた情報を得ることがかくも簡単になったので、学ばなくてもいいのだという暴言を吐く人もいるようだが、それに関連する知識をある程度有していないと、折角、情報を得たとしてもそれを理解することはできない。

ウィキペディアを利用するときは、それを確認するときという程度にまでなっていれば、その分野についての体系が頭の中にちゃんと構成されているのだろうと思う。この状態をめざして、そろそろ、半年になるが、勉強を続けている。

さて、勉強の仕方だ。一つは専門家から教えてもらった方が、良いだろうということで、カルチャセンターを利用して、古代史の専門家の講義を聞いている。専門家はその分野のツボを心得ているので、何となく言った言葉に深い知見が含まれていることが時々ある。沢山の知識を持っている素人の研究家と専門家の違いは、学問の核心を知っているかどうかだと思うが、その違いがちょっとした話の中に出てくることが多い。その意味では、その分野で業績を上げている人の話を聞くことは欠かすことができない。

二つ目は乱読である。その分野についての体系を得るためには、できるだけ、沢山の本を読んで、その概略を知ることが必要だと考えている。その時、あまり細かいことを気にする必要がない。自分の中で、大雑把なストーリーを構成していくのがよい。

沢山の本を読むことになるので、全ての本を購入したのでは費用もかさむし、その中に、欲しくない本も紛れ込むことになる。そこで、図書館を利用することを勧める。住んでいる市が小さいとそこの図書館で読みたいと思う本を見つけ出すことは大変だろうと思うが、幸い、僕の住んでいるところは人口が40万人の中規模な市なので、図書館の蔵書数もそれなりにある。このため、読みたいなと思った本が手に入る可能性は高い。4月から図書館の利用を始めたが、借りた本は15冊程度になっている。

もっとも、本当に良さそうな本は、電子書籍で購入しているので、すでに古代史の関連の本は25冊を超えて読んでいるものと思う。これだけ読むと、どの著者の本を読めばよいかが自ずと分かってくる。幸いに、カルチャーセンターでの先生は、『権記』、『御堂関白記』、最近では『小右記』の現代語訳を出版するなど、精力的に研究を行っている方で、優れた専門家の一人であることが分かった。

三つ目は精読なのだが、まだ、この段階には入っていない。

さて、古代史を勉強する傍らで、量子力学Haskellで表現する作業を続けている。時間を見つけての仕事となるので、飛び飛びになってしまう。前回は、発生演算子と消滅演算子を連続系で表現したので、今回は、これを用いて、ハミルトニアンの利用法を考えてみよう。

11.ハミルトニアンの活用

0)予備知識

1粒子状態で粒子を発見する確率を表す波動関数を\(\psi(x)\)で表すことにしよう。そして、これは規格化されているとする。即ち\(\psi(x)\psi^*(x)=1\)と仮定することにしよう。粒子の位置\(x\)を、粒子が発見される場所の平均値\(< x >\)で表すことにする。この時、\(< x >\)は、次の式で表すことができる。
\begin{eqnarray}
< x > = \int^{\infty}_{-\infty} \psi^*(x) x \psi(x)dx = \int^{\infty}_{-\infty} \rho (x) x dx
\end{eqnarray}

今、\(\rho (x)\)は確率密度関数と呼ばれるが、これがが次のガウス関数であったとしよう。
\begin{eqnarray}
\rho (x) = |A|^2 e ^{-x^2/D^2} \\
A=\frac{1}{\sqrt{D \sqrt{}\pi}}
\end{eqnarray}
このとき、粒子の位置は次のようになる。
\begin{eqnarray}
\int^{\infty}_{-\infty} |A|^2 e ^{-x^2/D^2} x dx = 0
\end{eqnarray}
なお、ガウス関数は次の図のように釣り鐘型をしており、\(\rho (x)\)は\(x=0\)で最大となり、\(x\)の絶対値が大きくなるとどんどん0に近付く。
f:id:bitterharvest:20160921145604p:plain

粒子の位置は\(x\)で、運動量は\(p=\hbar k\)、運動エネルギーは\(E=\frac{p^2}{2m}=\hbar \omega\)で表わさる。そこで、これらの平均値を考えることにしよう。

1) 位置を表す演算子

今、演算子\(\hat{X}\)を次のように定義しよう。
\begin{eqnarray}
\hat{X} = \int^{\infty}_{-\infty} x \hat{a}^\dagger(x) \hat{a}(x) dx
\end{eqnarray}

\(\hat{X}\)を\(\hat{a}^\dagger(x')|0>\)に作用させると

\begin{eqnarray}
&&\hat{X}\hat{a}^\dagger(x')|0> \\
&=& \int^{\infty}_{-\infty}[ x \hat{a}^\dagger(x) \hat{a}(x)] \hat{a}^\dagger(x') dx |0> \\
&=& \int^{\infty}_{-\infty} x \hat{a}^\dagger(x) [\hat{a}(x) \hat{a}^\dagger(x')] dx |0> \\
&=& \int^{\infty}_{-\infty} x \hat{a}^\dagger(x) \delta(x-x')] dx |0> \\
&=& x' \hat{a}^\dagger(x') |0>
\end{eqnarray}
となるので、\(\hat{a}^\dagger(x')|0>\)は、\(\hat{X}\)の固有状態であり、その固有値は\(x'\)である。

そこで、\(\hat{X}\)を1粒子状態の重ね合わせ\(\int^{\infty}_{-\infty} \psi (x) \hat{a}^\dagger(x) |0> dx \)に作用させると
\begin{eqnarray}
\hat{X} \int^{\infty}_{-\infty} \psi (x) \hat{a}^\dagger(x) |0> dx  = \int^{\infty}_{-\infty} \psi (x) x \hat{a}^\dagger(x) |0> dx
\end{eqnarray}
となる。これより、\(\psi (x)\)が規格化された波動関数である時、
\begin{eqnarray}
< \hat{X} > = \left[ < 0 | \int^{\infty}_{-\infty} \psi^* (x) \hat{a}(x) dx \right] \hat{X} \left[ \int^{\infty}_{-\infty} \psi (x') \hat{a}^\dagger(x') dx' |0>\right] = 0
\end{eqnarray}
となり、\(\hat{X} = \int^{\infty}_{-\infty} x \hat{a}^\dagger(x) \hat{a}(x) dx\)が位置を表す演算子であることが分かる。

なお、詳しい式の展開を知りたいときは、西野友年著『場の理論』を参考にして欲しい。以下同じである。

2)運動量を表す演算子

1粒子の運動量は、波数\(k\)を用いると、\(\hbar k\)となる。そこで、位置の平均値を求めた時と同じように、運動量の平均値を求めるために、\(x\)のところを\(\hbar k\)で置き換えて、次のような演算子を用意しよう。
\begin{eqnarray}
\hat{P} = \int^{\infty}_{-\infty} \hbar k \hat{a}^\dagger(k) \hat{a}(k) dk
\end{eqnarray}

そこで、前と同じように、\(<\hat{P}>\)を考えてみよう。なお、波数の空間での規格化された波動関数を\(\phi (k)\)とする。
\begin{eqnarray}
< \hat{P} > = \left[ < 0 | \int^{\infty}_{-\infty} \phi^* (k) \hat{a}(k) dk \right] \hat{P} \left[ \int^{\infty}_{-\infty} \phi (k') \hat{a}^\dagger(k') dk' |0>\right]
\end{eqnarray}
式を変形すると
\begin{eqnarray}
< \hat{P} > = <\hbar k>
\end{eqnarray}
となる。詳しくは、西野友年著『場の理論』を参考にして欲しい。

また、波数空間ではなく、実空間を用いて表すこともできる。この時は、
\begin{eqnarray}
\hat{P} = \int^{\infty}_{-\infty} \hat{a}^\dagger(x) \left[ -i \hbar \frac{d}{dx} \right] \hat{a}(x) dx
\end{eqnarray}
となる。

また、波数空間での波動関数を以下に示すガウス関数であると仮定する。
\begin{eqnarray}
\phi(k') = A D e^{- D^2 (k - k')^2 / 2 } = \phi^*(k')
\end{eqnarray}

この時、運動量の平均値は
\begin{eqnarray}
< \hat{p} > = \hbar k
\end{eqnarray}
となる。

3)運動エネルギーを表す演算子

1粒子を取り上げてきたので、今度は、2粒子の場合を取り上げてみることにしよう。複数の粒子がある場合には、ボーズ粒子であるのかフェルミ粒子であるのかが問題になる。ここでは、フェルミ粒子としよう。長さが\(L\)でポテンシャルが存在せず、運動エネルギーだけが存在する場合を考えることにしよう。運動エネルギーは\(E=\frac{p^2}{2m}=\frac{{(hk)}^2}{2m}\)で表すことができる。また、また、長さが有限な値\(L\)とすると、波数は有限個の異なる整数となる。このため、波数については積分ではなく、和となる。このことに注意して、位置を求めた時の演算子と同じように、次の演算子\(\hat{H}\)を定義する。
\begin{eqnarray}
&&\hat{H} == \displaystyle \sum_k \frac{(\hbar k)^2}{2m}\hat{c}^\dagger_k \hat{c}_k
\end{eqnarray}

二つの粒子が波数\(k_1\)と\(k_1\)を有する場合の状態\( \hat{c}^\dagger_{k_1} \hat{c}^\dagger_{k_2} | 0> \)にこの演算子を作用させてみよう。
\begin{eqnarray}
&&\left[\displaystyle \sum_k \frac{(\hbar k)^2}{2m}\hat{c}^\dagger_k \hat{c}_k \right] \hat{c}^\dagger_{k_1} \hat{c}^\dagger_{k_2} | 0> \\
&=& \left[\frac{(\hbar k_1)^2}{2m}+\frac{(\hbar k_2)^2}{2m} \right] \hat{c}^\dagger_{k_1} \hat{c}^\dagger_{k_2} | 0>
\end{eqnarray}

これから、それぞれの粒子のエネルギーの和となることが分かる。

有限の長さの時は、波数が離散的になるので、これまで展開してきた離散的なモデルでのHaskellを用いて、表現することができる。

2粒子状態に対する波動関数は、スレーター行列式で表すことができるが、これについては、西野友年著『場の理論』を参考にして欲しい。

量子力学の世界を垣間見る(5):離散系から連続系へ

これまで、Haskellと結びつけながら量子力学の世界を説明してきた。そのため、Haskellに邪魔されて量子力学の世界が分かりにくくなったかもしれない。

そこで、この記事では、これまでの話をまとめながら、量子力学の世界を、離散系から連続系へと展開させてみたい。

9.離散系

ここは、量子力学の初歩をHaskellで学ぶの中の、ブラとケットおよび重ね合わせの記事の要約である。

これまで、量子力学の世界を一次元空間の離散系として見てきた。この離散系は、下図に示すように、粒子は格子点で区切られた場所に存在する。
f:id:bitterharvest:20160915041232p:plain
この時、格子点間の距離を\(d\)とし、格子点を区別できるように番号\(l\)をつけて考えた。

粒子の状態は、ケットあるいはブラで表した。真空状態を\( | 0 > \)あるいは\( < 0 | \)で表した。状態からは、演算子を作用させることで新しい状態を作ることができる。演算子には、発生演算子\(\hat{a}^\dagger_l\)と消滅演算子\(\hat{a}_l\)がある。\(\hat{a}^\dagger_l\)は\(l\)番目の格子点に一つの粒子を生成し、\(\hat{a}_l\)は\(l\)番目の格子点から一つの粒子を消滅する。

\(l\)番目の格子点に粒子が一つ存在している状態は\(\hat{a}^\dagger_l | 0 > \)と表すことができる。量子力学では、一つの粒子しか存在しないのだが、それが存在する格子点の場所を特定できないという現象が存在する。しかし、観察すると粒子はどこかの格子点で見つかる。そこで、観察したときに、番号\(l\)で見つかる確率(頻度)を\(\varphi_l\)とする。そして、この現象を重ね合わせ状態\(\hat{\Psi}^\dagger | 0 > = \displaystyle \sum_l \psi_l\hat{a}^\dagger_l | 0 >\)で表す。あるいは、ブラで表現するとこの状態は\(< 0 | \hat{\Psi} = < 0 | \displaystyle \sum_l \hat{a}_l \psi^*_l \)である。なお、\(\psi_l\)と\(\psi^*_l\)は互いに共役な数である。

また、\(< 0 | \hat{\Psi} \hat{\Psi}^\dagger | 0 > = < 0 |\displaystyle \sum^\infty_{l=-\infty} \hat{a}_l \psi^*_l \psi_l \hat{a}^\dagger_l | 0 > = 1\)の時、即ち、\(\displaystyle \sum^\infty_{l=-\infty} \psi^*_l \psi_l = 1\)の時、確率\(\varphi_l\)は規格化されているという


9.1 飛び移る粒子の固有状態

ここは、有限系を説明した記事の要約である。

図のように粒子が隣の格子点に飛び移るモデルを考えてみよう。
f:id:bitterharvest:20160826082049p:plain

これに対するハミルトニアンは次のようになる。
\begin{eqnarray}
\hat{H}=-g \sum_l(\hat{a}^l_{l+1}\hat{a}_{l}+\hat{a}^l_{l}\hat{a}_{l+1})
\end{eqnarray}


そして、一つの粒子が重なり合っている状態\(| \Psi >= \displaystyle \sum_l\psi_l(t) \hat{a}^\dagger_l |0>\)に\(\hat{H}\)を作用させると、時間発展方程式\(i \hbar \frac{d}{dt} | \Psi(t)> = \hat{H}| \Psi(t)>\)は次のようになる。
\begin{eqnarray}
i \hbar \frac{d}{dt} \displaystyle \sum_l \psi_l(t)\hat{a}^\dagger_l |0> = -g \displaystyle \sum_l [\psi_{l-1}(t)+\psi_{l+1}(t)] \hat{a}^\dagger_l |0>
\end{eqnarray}


これから、次の微分方程式をえる。
\begin{eqnarray}
i \hbar \frac{d}{dt} \psi_m(t) = -g[ \psi_{m -1}(t)+\psi_{m +1}(t)]
\end{eqnarray}
この方程式の解は、
\begin{eqnarray}
\psi_l(t) = Ae^{-iwt}e^{i\kappa l}
\end{eqnarray}
で、\(\kappa\)は隣り合う格子点での位相差である。

また、上の解は次の分散関係を満たさなければならない。
\begin{eqnarray}
\psi_l(t) = Ae^{-iwt}e^{i\kappa l}=\phi_\omega(t) \varphi_{\kappa l}
\end{eqnarray}
ここで、
\begin{eqnarray}
\phi_\omega(t) &=& e^{-iwt} \\
\varphi_{\kappa l} &=& A e^{i\kappa l}
\end{eqnarray}

解は、時間に関係する関数\(e^{-iwt}\)と位置に関する\(e^{ikl}\)の積によって与えられる。

注意:任意の演算子\(\hat{O}\)に対して、平均値\(<\Psi(t)|\hat{O}|\Psi(t)>\)が時間\(t\)に関係しないとき、状態\(|\Psi(t)>\)を定常状態と呼ぶ。また、\(|\Psi(t)>\)が時間発展方程式の解であるとき、これを定常解という。従って、\(\psi_l(t) = Ae^{-iwt}e^{i\kappa l}\)は定常解である。

9.2 \(e^{i\kappa l}\)を係数に持つ重ね合わせ状態

\(e^{i\kappa l}\)を係数に持つ重ね合わせ状態を考えることにする。
\begin{eqnarray}
\displaystyle \sum_l \phi_{\kappa l} \hat{a}^\dagger_l |0> = \displaystyle \sum_l A e^{i\kappa l} \hat{a}^\dagger_l |0>
\end{eqnarray}

これに、飛び移る粒子に対するハミルトニアンを作用させると、

\begin{eqnarray}
\hat{H} \displaystyle \sum_l A e^{i\kappa l} \hat{a}^\dagger_l |0> = -2g \cos \kappa \displaystyle \sum_l A e^{i\kappa l} \hat{a}^\dagger_l |0> = E \displaystyle \sum_l A e^{i\kappa l} \hat{a}^\dagger_l |0>
\end{eqnarray}

但し、\(E=-2g \cos \kappa \)とする。なお、\(E\)は物理的な量としてはエネルギーである。

\(-2g \cos \kappa\)が係数なので、\(\displaystyle \sum_l A e^{ikl} \hat{a}^\dagger_l |0>\)は\(\hat{H}\)の固有状態、\(E=-2g \cos \kappa\)は\(\hat{H}\)の固有値である。

固有状態が見つかると、定常状態はこれより簡単に求めることができる。いま、固有状態を\(|\varepsilon>\)とすると、定常状態は
\begin{eqnarray}
| \Psi(t) > = e^{-i(E / \hbar)t} | \varepsilon> =e^{-iwt} | \varepsilon>
\end{eqnarray}
となる。

注意:ある状態\(|\Psi(t)>\)に演算子\(\hat{O}\)を作用させたとき、
\begin{eqnarray}
\hat{O} | \Psi(t) > = \lambda | \Psi(t) >
\end{eqnarray}
となるとき、 \(\lambda\)を固有値、\( | \Psi(t) > \)を固有状態という。なお、\(\lambda\)は係数である。

9.3 周期系

ここは、周期系を説明した記事の要約である。
f:id:bitterharvest:20160827104401p:plain
周期系での飛び移る粒子のハミルトニアンは次のようになる。
\begin{eqnarray}
\hat{H}_{periodic}=-g\sum_{l=0}^{N-1} (\hat{a}^\dagger_{l+1} \hat{a}_l + \hat{a}^\dagger_{l} \hat{a}_{l+1})
\end{eqnarray}
なお、\(l=N\)の時、\(l=0\)である。

このハミルトニアン\( \hat{H}_{periodic} \)の固有状態は平面波状態
\begin{eqnarray}
\displaystyle \sum^{N-1}_{l=0} \phi_{\kappa l} \hat{a}^\dagger_l |0> = \displaystyle \sum^{N-1}_{l=0} A e^{i\kappa l} \hat{a}^\dagger_l |0>
\end{eqnarray}
である。ここで、
\begin{eqnarray}
\kappa &=& \frac{2 \pi m}{N} \\
k= \frac{2 \pi m}{Nd} &=& \frac{2 \pi m}{L}
\end{eqnarray}
なお、\(m\)は整数である。これの取りうる値については後で述べる。また、 \(\kappa\)と\(k\)は離散的な値しか取れないことに注意。


固有状態が波数で表わされているので、この状態を\(|\kappa >\)で表すこととする。即ち、
\begin{eqnarray}
|\kappa > = \displaystyle \sum^{N-1}_{l=0} \phi_{\kappa l} \hat{a}^\dagger_l |0> = \displaystyle \sum^{N-1}_{l=0} A e^{i\kappa l} \hat{a}^\dagger_l |0>
\end{eqnarray}
とする。

また、規格化して\(A\)の値を得ておこう。
\begin{eqnarray}
\displaystyle \sum^{N-1}_{l=0} P'_{l} &=& 1 \\
P'_{l}=\varphi^*_{\kappa l}\varphi_{\kappa l} &=& A^2
\end{eqnarray}
より、\(A=\frac{1}{\sqrt N}\)
となる。

これより平面波状態は次のようになる。ついでにブラの方も示しておこう。
\begin{eqnarray}
|\kappa > = \displaystyle \sum^{N-1}_{l=0} \phi_{\kappa l} \hat{a}^\dagger_l |0> &=& \displaystyle \sum^{N-1}_{l=0} \frac{1}{\sqrt N} e^{i\kappa l} \hat{a}^\dagger_l |0> \\
<\kappa | = \displaystyle \sum^{N-1}_{l=0} <0| \hat{a}_l \phi^*_{\kappa l} &=& \displaystyle \sum^{N-1}_{l=0} <0| \hat{a}_l \frac{1}{\sqrt N} e^{-i\kappa l}
\end{eqnarray}

\begin{eqnarray}
<\kappa |\kappa ' > = \delta_{kk'}
\end{eqnarray}
である。\(\delta_{kk'}\)は\(k=k'\)の時1、そうでない時0である。従って、平面波状態は直交している。

平面波状態\( |\kappa > = \displaystyle \sum^{N-1}_{l=0} \phi_{\kappa l} \hat{a}^\dagger_l |0>\)は、生成演算子\(\hat{a}^\dagger_l\)の線形結合になっている。そこで、線形結合の部分を\(a^\dagger_{[\kappa]}\)で表すと、次のようになる。
\begin{eqnarray}
\hat{a}^\dagger_{[\kappa]} = \displaystyle \sum^{N-1}_{l=0} \phi_{\kappa l} \hat{a}^\dagger_l &=& \displaystyle \sum^{N-1}_{l=0} \frac{1}{\sqrt N} e^{i\kappa l} \hat{a}^\dagger_l \\
\hat{a}_{[\kappa]} = \displaystyle \sum^{N-1}_{l=0} \phi^*_{\kappa l} \hat{a}_l &=& \displaystyle \sum^{N-1}_{l=0} \frac{1}{\sqrt N} e^{-i\kappa l} \hat{a}_l
\end{eqnarray}

\(\hat{a}^\dagger_{[\kappa]}\)と\(\hat{a}_{[\kappa]}\)は波数\(k=\kappa / d\)の生成演算子、消滅演算子と考えることができる。

逆に\( \hat{a}^\dagger_{[\kappa]}\)と\(\hat{a}_{[\kappa]}\)を用いて、\( \hat{a}^\dagger_l\)と\(\hat{a}_l\)を次のように表すこともできる。
\begin{eqnarray}
\hat{a}^\dagger_l = \displaystyle \sum_\kappa \phi^*_{\kappa l} \hat{a}^\dagger_l &=& \displaystyle \sum_\kappa \frac{1}{\sqrt N} e^{-i\kappa l} \hat{a}^\dagger_{[\kappa]} \\
\hat{a}_l = \displaystyle \sum_\kappa \phi_{\kappa l} \hat{a}_l &=& \displaystyle \sum_\kappa \frac{1}{\sqrt N} e^{i\kappa l} \hat{a}_{[\kappa]}
\end{eqnarray}
なお、\(\kappa = \frac{2 \pi m}{N}\)で\(m=0,1,..,N-1\)の値をとる(他にも\(m\)の取り方はある。これは任意の\(i\)に対して\(j=m \times i + j\)なので、\(N\)個の独立な\(m\)の取り方はいかようにもなる。例えば、連続した\(m\)個の整数を取ってもよい) 。

10.連続系

10.1 周期系

今までは離散系で考えていたが、連続で考えたほうが分かりやすい場合もあるし、もっといいことには、数学的には取り扱いやすい場合も多い(逆に、情報科学の場合には面倒くさいことになる)。

波数の生成演算子\(\hat{a}^\dagger_{[\kappa]}\)を一次元の連続な空間で定義することとしよう。式の展開は大幅に省くので、詳しくは、西野友年著『場の理論』を参考にして欲しい。

\(x=ld\)とすると次の関係が成り立つ。
\begin{eqnarray}
\varphi_k(x)=\varphi_{kl} / \sqrt {d} \\
\hat{a}^\dagger(x) \leftarrow \hat{a}^\dagger_l / \sqrt {d} \ \ (d \leftarrow 0) \\
\hat{a}(x) \leftarrow \hat{a}_l / \sqrt {d} \ \ (d \leftarrow 0)
\end{eqnarray}

これを利用すると、
\begin{eqnarray}
&&\hat{a}^\dagger_{[\kappa]} \\
&=& \sum^{N-1}_{l=0} \varphi_{kl}\hat{a}^\dagger_{l} \\
&=& d \sum^{N-1}_{l=0} \frac{\varphi_{kl}}{\sqrt {d}} \frac{\hat{a}^\dagger_{l}}{\sqrt {d}} \\
&\rightarrow& d \sum^{N-1}_{l=0} \varphi_k (ld) \hat{a}^\dagger(ld) \ \ (d \leftarrow 0) \\
&=& \int^L_{x=0} \varphi_k (x) \hat{a}^\dagger(x) dx \\
&=& \int^L_{x=0} \frac{e^{ikx}}{\sqrt{L}} \hat{a}^\dagger(x) dx
\end{eqnarray}

上記の最後の式は、\(\kappa\)ではなく、波数\(k\)で表わされているので、\(\hat{a}^\dagger_{[\kappa]}\)を\(\hat{a}^\dagger_k\)で表すことにすると、
\begin{eqnarray}
\hat{a}^\dagger_k = \int^L_{x=0} \frac{e^{ikx}}{\sqrt{L}} \hat{a}^\dagger(x) dx
\end{eqnarray}

同様に
\begin{eqnarray}
\hat{a}_k = \int^L_{x=0} \frac{e^{-ikx}}{\sqrt{L}} \hat{a}(x) dx
\end{eqnarray}

また、
\(\hat{a}^\dagger(x)\)と\(\hat{a}(x)\)もそれぞれ波数での発生演算子の線形結合と消滅演算子での線形結合で表すことができる。これらをまとめたのが以下の表である。

\begin{array}{|c|c|c|}
\hline
& 離散系 & 連続系 \\
\hline
位& \hat{a}^\dagger_l = \displaystyle \sum^{N-1}_{l=0} \frac{e^{-i \kappa l}}{\sqrt{N}} \hat{a}^\dagger_{[\kappa]} & \hat{a}^\dagger(x) = \displaystyle \sum_k \frac{e^{-i k x}}{\sqrt{L}} \hat{a}^\dagger_k \\
置& \hat{a}_l = \displaystyle \sum^{N-1}_{l=0} \frac{e^{i \kappa l}}{\sqrt{N}} \hat{a}_{[\kappa]} & \hat{a}(x) = \displaystyle \sum_k \frac{e^{i k x}}{\sqrt{L}} \hat{a}_k \\
\hline
波& \hat{a}^\dagger_{[\kappa]} = \displaystyle \sum^{N-1}_{l=0}\frac{e^{i \kappa l}}{\sqrt{N}}\hat{a}^\dagger_l & \hat{a}^\dagger_k = \displaystyle \int^L_{x=0}\frac{e^{i k x}}{\sqrt{L}}\hat{a}^\dagger (x) dx \\
数& \hat{a}_{[\kappa]} = \displaystyle \sum^{N-1}_{l=0} \frac{e^{-i \kappa l}}{\sqrt{N}} \hat{a}_l & \hat{a}_k = \displaystyle \int^L_{x=0} \frac{e^{-i k x}}{\sqrt{L}} \hat{a}(x) dx \\
\hline
\end{array}

10.2 無限系

有限ではなく無限になった時も発生演算子、消滅演算子を求めることができる。ここでは結果だけを表に記載する。詳しくは西野友年著『場の理論』を参考にして欲しい。

\begin{array}{|c|c|c|}
\hline
& 有限 & 無限 \\
\hline
位 & \hat{a}^\dagger(x) = \displaystyle \sum_k \frac{e^{-i k x}}{\sqrt{L}} \hat{a}^\dagger_k & \hat{a}^\dagger (x) = \displaystyle \int^\infty_{-\infty}\frac{e^{-i k x}}{\sqrt{2 \pi}}\hat{a}^\dagger (k) dk\\
置 & \hat{a}(x) = \displaystyle \sum_k \frac{e^{i k x}}{\sqrt{L}} \hat{a}_k & \hat{a} (x) = \displaystyle \int^\infty_{-\infty} \frac{e^{i k x}}{\sqrt{2 \pi}} \hat{a}(k) dk\\
\hline
波 & \hat{a}^\dagger_k = \displaystyle \int^L_{x=0}\frac{e^{i k x}}{\sqrt{L}}\hat{a}^\dagger (x) dx & \hat{a}^\dagger_k = \displaystyle \int^\infty_{-\infty}\frac{e^{i k x}}{\sqrt{2 \pi}}\hat{a}^\dagger (x) dx \\
数 & \hat{a}_k = \displaystyle \int^L_{x=0} \frac{e^{-i k x}}{\sqrt{L}} \hat{a}(x) dx & \hat{a}_k = \displaystyle \int^\infty_{-\infty} \frac{e^{-i k x}}{\sqrt{2 \pi}} \hat{a}(x) dx \\
\hline
\end{array}

量子力学の世界を垣間見る(4):ボーズ粒子とフェルミ粒子

8.ボーズ粒子とフェルミ粒子

粒子には二つの種類がある。一つは、光子に代表されるボーズ粒子であり、他の一つは、電子を代表とするフェルミ粒子である。

ボーズ粒子が来るものは拒まずというような性質を有しているのに対して、フェルミ粒子は共存はできないという性格を持っている。

このような性質はどこから来るのであろうか。

今、二つの粒子\(a\),\(b\)があるとし、その位置を入れ替えることにしよう。入れ替える前の状態を\(|source>\)、後の状態を\(|target>\)で表すことにしよう。入れ替えるときの演算子を\(P\)とすると
\begin{eqnarray}
| target> = P | source>
\end{eqnarray}
となる。また、これを具体的に図で示すと
f:id:bitterharvest:20160912124028p:plain
なお、\(|source>=\hat{a}^\dagger_l \hat{a}^\dagger_k |0>\)で、\(|target>=\hat{a}^\dagger_k \hat{a}^\dagger_l |0>\)とする。即ち、\(a\)が発生演算子\(\hat{a}^\dagger_k\)によって格子点番号\(k\)に先に入り、\(b\)が\(\hat{a}^\dagger_l\)によって\(l\)に後で入って、状態\(|source>\)が作られたとする。さらに、\(a\)が\(\hat{a}^\dagger_l\)によって、\(l\)に先に入り、\(b\)が\(\hat{a}^\dagger_k\)によって\(k\)に後で入って、状態\(|target>\)が作られたとする。


また、\(|source>\)から\(|target>\)へは、次図のように、一つずつ粒子を移動させて得ることができる。
f:id:bitterharvest:20160912124058p:plain

この状態でもう一度入れ替えると、
\begin{eqnarray}
|source> = P |target> = P^2 |source>
\end{eqnarray}
となる。そこで、そこで上の式を満たす\(P\)は\(1\)あるいは\(-1\)となる。

これから、\(P\)の値によって二種類の粒子が存在することが分かるが、結論から言うと、\(P=1\)の場合がボーズ粒子であり、\(P=-1\)がフェルミ粒子である。そこで、この性質は、生成演算子同士、消滅演算子同士、あるいは生成演算子と消滅演算子の順序に由来していると考えてみよう。
そして、それぞれの粒子について、演算子の交換法則を定義してみよう。

8.1 ボーズ粒子

まず、ボーズ粒子から話を始めよう。\(P=1\)から演算子の順序を交換しても変わらないとし、次のことが成り立っていると考える。

二つの生成演算子\(\hat{a}^\dagger_k\)と\(\hat{a}^\dagger_l\)については、交換しても変わらないとする。即ち、
\begin{eqnarray}
\hat{a}^\dagger_k \hat{a}^\dagger_l= \hat{a}^\dagger_l \hat{a}^\dagger_k
\end{eqnarray}

二つの消滅演算子\(\hat{a}^\dagger_k\)と\(\hat{a}^\dagger_l\)についても、交換しても変わらないとする。
\begin{eqnarray}
\hat{a}^\dagger_k \hat{a}^\dagger_l = \hat{a}^\dagger_l \hat{a}^\dagger_k
\end{eqnarray}

消滅演算子\(\hat{a}_k\)と生成演算子\(\hat{a}^\dagger_l\)については、\(k \neq l\)の時は、交換しても変わらないとする。即ち、
\begin{eqnarray}
\hat{a}_k \hat{a}^\dagger_l = \hat{a}^\dagger_l \hat{a}_k
\end{eqnarray}

また、\(k = l\)の時は、生成させた後に消滅させることになる。これは何もしなかったことと同じなので、1ということにする。
\begin{eqnarray}
\hat{a}_k \hat{a}^\dagger_l= 1
\end{eqnarray}

そこで、
\begin{eqnarray}
\hat{a}^\dagger_l \hat{a}_l = 0
\end{eqnarray}
を考慮すると、
\begin{eqnarray}
\hat{a}_k \hat{a}^\dagger_l = \delta_{kl} + \hat{a}^\dagger_l \hat{a}_k
\end{eqnarray}
となる。なお、\(\delta_{kl}\)はδ関数で、\(k = l\)の時は\(1\)、\(k \neq l\)の時は\(0\)である。

交換カッコ\([\hat{A},\hat{B}]=\hat{A},\hat{B}-\hat{B},\hat{A}\)を用いると、上記の式は
\begin{eqnarray}
[\hat{a}^\dagger_k \hat{a}^\dagger_l] &=& \hat{a}^\dagger_l \hat{a}_l = 0 \\
[\hat{a}^\dagger_k \hat{a}^\dagger_l] &=& \hat{a}^\dagger_l \hat{a}^\dagger_k = 0 \\
[\hat{a}_k \hat{a}^\dagger_l] &=& \delta_{kl}
\end{eqnarray}
となる。

8.2 フェルミ粒子

次に、フェルミ粒子に移ろう。\(P=-1\)から順序を変えると変わってしまうと考え、次のことが成り立っていると考える。

二つの生成演算子\(\hat{c}^\dagger_k\)と\(\hat{c}^\dagger_l\)については、符号が変わるとする。即ち、
\begin{eqnarray}
\hat{c}^\dagger_k \hat{c}^\dagger_l= -\hat{c}^\dagger_l \hat{c}^\dagger_k
\end{eqnarray}

但し、\(k = l\)の時は、
\begin{eqnarray}
\hat{c}^\dagger_k \hat{c}^\dagger_k= -\hat{c}^\dagger_k \hat{c}^\dagger_k
\end{eqnarray}
となる。これを満足するのは、\(\hat{c}^\dagger_k \hat{c}^\dagger_k=0\)の時だけである。このことから、フェルミ粒子は、同じ場所では、複数が同時に存在できないということになる。

二つの消滅演算子\(\hat{c}^\dagger_k\)と\(\hat{c}^\dagger_l\)についても、符号が変わるとする。
\begin{eqnarray}
\hat{c}^\dagger_k \hat{c}^\dagger_l= -\hat{c}^\dagger_l \hat{c}^\dagger_k
\end{eqnarray}

消滅演算子\(\hat{c}_k\)と生成演算子\(\hat{c}^\dagger_l\)については、\(k \neq l\)の時は、符号が変わるとする。即ち、
\begin{eqnarray}
\hat{c}_k \hat{c}^\dagger_l= -\hat{c}^\dagger_l \hat{c}_k
\end{eqnarray}

また、\(k = l\)の時は、生成させた後に消滅させることになる。これは、ボーズ粒子の時と同様に、何もしなかったことと同じなので、1ということにする。
\begin{eqnarray}
\hat{c}_k \hat{c}^\dagger_l= 1
\end{eqnarray}

そこで、前と同じように、
\begin{eqnarray}
\hat{c}^\dagger_l \hat{c}_l = 0
\end{eqnarray}
を考慮すると、
\begin{eqnarray}
\hat{c}_k \hat{c}^\dagger_l = \delta_{kl} - \hat{c}^\dagger_l \hat{c}_k
\end{eqnarray}
となる。

反交換カッコ\({\hat{c},\hat{B}}=\hat{A},\hat{B}+\hat{B},\hat{c}\)を用いると、上記の式は
\begin{eqnarray}
{\hat{c}^\dagger_k \hat{c}^\dagger_l} &=& \hat{c}^\dagger_l \hat{c}_l = 0 \\
{\hat{c}^\dagger_k \hat{c}^\dagger_l} &=& \hat{c}^\dagger_l \hat{c}^\dagger_k = 0 \\
{\hat{c}_k \hat{c}^\dagger_l} &=& \delta_{kl}
\end{eqnarray}
となる。



8.3 Haskellで実装する

フェルミ粒子では、状態が符号を持つため、これまで説明してきたケットをそのまま用いてフェルミ粒子の状態を表すことはできない。ケットに符号の情報をつける必要があるので、符号とケットを対にして表すことにしよう。また、演算子は、生成演算子あるいは消滅演算子の並びで表すことにしよう。この二つのことを念頭に置いて、Haskellを用いて実装することにする。

上記の方針に基づいて、真空状態\(|0>\)への演算子、即ち、生成演算子と消滅演算子の並びを、配列で定義することにする。配列の要素は、生成か消滅かの区別と何番目の格子点であるかを示せるように対で表した。対の右側は、文字+,-でそれぞれ生成か消滅を表す。左側は、格子点の番号である。そこで、ボーズ粒子とフェルミ粒子それぞれに次のようなデータ型を用意した。

data Boson = Boson [(Char, Integer)] deriving (Show)

data Fermion = Fermion [(Char, Integer)] deriving (Show)

1)ボーズ粒子に関する実装

ボーズ粒子への演算子の作用は、先にケットを考えた時と同じであるが、記憶を呼び戻すために、図を用いて詳しく説明しよう。
f:id:bitterharvest:20160911165511p:plain

図は、配列で表された演算子を一つずつ順番に読み込んで、状態を作り出しているようすを示したものである。

①は、処理の途中を示したもので、演算子の配列はまだ処理していない演算子の並びを示したものである。符号は、1か-1である。フェルミ粒子はいずれかをとるが、ボーズ粒子の場合は常に1である。真空状態から始めて、いくつかの演算子の並びを作用させた結果、①のようになったと仮定し、ここを説明の出発点とする。

①では、現在の状態は、格子点の番号が1と2に粒子がある状態である。演算子の配列は右端から読み込む。従って、現在の状態は、配列の右側の要素(+ 3)で示される生成演算子\(\hat{a}^\dagger_3\)を作用させて、次の状態を得る。ボーズ粒子の場合は、生成演算子を作用させた場合には、いかなる状態においても、指定されている格子点番号に粒子を加えてよいので、②で示される状態になる。

②では、消滅演算子\(\hat{a}_2\)を作用させる。現在の状態の中に、この演算子で指定されている格子点の番号に粒子があれば、それを消去すればよい(この理由はすぐ後で説明する)。従って、③で示される状態になる。
なお、指定された場所に粒子がない場合には、状態はないものとする。即ち、0にする。

③では、生成演算子\(\hat{a}^\dagger_1\)を作用させる。生成演算子なので、これが指定しているところに粒子を追加し、④で示される状態になる。

④は、最終結果である。

ところで、②での処理は簡単に述べたが、実際には次の図で示すような行程により粒子が消去される。しかし、プログラムでは、効率を優先に、存在しているかいないかを判断して消去の処理を行う。
f:id:bitterharvest:20160911165634p:plain

それでは、プログラムを示そう。実際には、ケットでの生成演算子+^と消滅演算子-^の処理をそのまま用いる。

bose :: Boson -> (Integer, (Ket Integer))
bose (Boson a) = bose' (reverse a) (1, KetZero)

bose' [] b = b
bose' ((a, b):s) (c, k)
  | a == '+' = bose' s (c, b +^ k)
  | a == '-' = bose' s (c, b -^ k)
  | otherwise = error "unexpected error in bose operation."

発生演算子\(\hat{a}^\dagger_2\)と\(\hat{a}^\dagger_3\)を作用させてみる。

これは、配列では次のようになる。

a = [('+', 3), ('+', 2)]

これをボーズ粒子に作用する演算子の配列にすると、

*Test4> a
[('+',3),('+',2)]
*Test4> Boson a
Boson [('+',3),('+',2)]

となる。

この演算子を作用させると

*Test4> bose $ Boson a
(1,,a3+,a2+| ...00(0)00... >)

なお、上の結果は対になっていて、左側のa3+,a2+| ...00(0)00... >が状態を表し、右側の1が符号を表す。ボーズ粒子の場合には常に符号は1である。

プログラムが正しく動いているかどうかを確認してみよう。
\(\hat{a}^\dagger_2\)と\(\hat{a}^\dagger_3\)を作用させた後で、消滅演算子\(\hat{a}_3\)を作用させてみよう。

*Test4> b
[('-',3),('+',3),('+',2)]
*Test4> Boson b
Boson [('-',3),('+',3),('+',2)]
*Test4> bose $ Boson b
(1,,a2+| ...00(0)00... >)

\(\hat{a}^\dagger_2\)と\(\hat{a}^\dagger_3\)を作用させた後で、消滅演算子\(\hat{a}_2\)を作用させてみよう。

*Test4> c
[('-',2),('+',3),('+',2)]
*Test4> Boson c
Boson [('-',2),('+',3),('+',2)]
*Test4> bose $ Boson c
(1,,a3+| ...00(0)00... >)

\(\hat{a}^\dagger_2\)と\(\hat{a}^\dagger_3\)を作用させた後で、生成演算子\(\hat{a}^\dagger_2\)を作用させてみよう。

*Test4> d
[('+',2),('+',3),('+',2)]
*Test4> Boson d
Boson [('+',2),('+',3),('+',2)]
*Test4> bose $ Boson d
(1,,a2+,a3+,a2+| ...00(0)00... >)

上手く動いているようである。それでは、入れ替え操作を説明した図を参考にして、\(|source>=\hat{a}^\dagger_2 \hat{a}^\dagger_1 |0>\)から、粒子を入れ替えて\(|target>=\hat{a}^\dagger_1 \hat{a}^\dagger_2 |0>\)を作り出すことを考えよう。

これには、2番目の粒子を3番目に移し、次に1番目の粒子を2番目に移し、最後に3番目の粒子を1番目に移すとよいので、
\begin{eqnarray}
P= \hat{a}^\dagger_1 \hat{a}_3 \hat{a}^\dagger_2 \hat{a}_1 \hat{a}^\dagger_3 \hat{a}_2
\end{eqnarray}

となる。そこで、
\begin{eqnarray}
|target> = P \hat{a}^\dagger_2 \hat{a}^\dagger_1 |0>
\end{eqnarray}
が求めるものとなる。

そこで、演算子の配列は次のようになる。

*Test4> h
[('+',1),('-',3),('+',2),('-',1),('+',3),('-',2),('+',2),('+',1)]

これをボーズ粒子に作用する演算子の配列にすると、

*Test4> Boson h
Boson [('+',1),('-',3),('+',2),('-',1),('+',3),('-',2),('+',2),('+',1)]

となる。

この演算子を作用させると

*Test4> bose $ Boson h
(1,,a1+,a2+| ...00(0)00... >)

これより
\( |target> \) =(1,,a1+,a2+| ...00(0)00... >)
となる。また、
\( |source> \)=(1,,a2+,a1+| ...00(0)00... >)
であることから、\(|target>=|source>\)であることが分かり、\(P=1\)が確認できた。

2)フェルミ粒子に関する実装

フェルミ粒子への演算子の作用は、ボーズ粒子の場合と比べると少し複雑である。それらは以下の点による。
1) 演算子を交換すると符号が変わる。
2) 同じ格子点の番号には二つの粒子は同時に存在できない。

それでは、フェルミ粒子の処理を図を用いて詳しく説明しよう。
f:id:bitterharvest:20160911165705p:plain

図は、配列で表された演算子を一つずつ順番に読み込んで、状態を作り出しているようすを示したものである。

①は、生成演算子\(\hat{a}^\dagger_1\)を作用させる。ここでは、現在の状態の中に、この演算子で指定された場所に粒子が存在しているかどうか調べる。もし、存在していなければ、粒子を追加する。存在していれば、同じ場所に複数の粒子が入ることができないので、状態はないものとする。即ち、0にする。この場合には、格子点の番号1の場所には粒子が存在しないので、次の状態を得る。その結果、②となる。

②では、消滅演算子\(\hat{a}_2\)を作用させる。現在の状態の中に、この演算子で指定されている格子点の番号に粒子があれば、それを消去する。そうでない場合には、状態はないものとする。即ち、0にする。

ところで、消去する場合には、消去の対象となる粒子がどこにあるかで、状態の符号が変わる。これは次のようにして得る。この粒子の左隣に並ぶまでにいくつの粒子と交換しなければならないかを数える。図の場合には、消去しようとする粒子は格子点番号が2(a2+なので)である。このためには、格子点番号3(a3+なので)の粒子と交換しなければならないので、交換数は1である。交換数が偶数の場合には符号はそのまま、奇数の場合には符号を反転させる。この場合は、符号は反転させることになるので、-1となる。そして、③となる。

③では、生成演算子\(\hat{a}^\dagger_1\)を作用させる。生成演算子なので、この場所に粒子が存在しているかどうかを調べる。存在しているので、状態はないものとする。即ち、0にする。

④は、最終結果である。

ところで、②での処理は簡単に述べたが、実際には次の図で示すような行程により粒子が消去される。粒子が並んだ後、これらの粒子を最も右側に位置するように移動する。
f:id:bitterharvest:20160911165740p:plain

この時、どちらの粒子も同じ交換数となる。従って、並んだ後、右側に移動させたときの交換数は、両者の交換数の合計となるので、必ず、偶数となる。従って、符号がどのように変わるかを調べるためには、隣に並ぶまでの交換数を求めれば十分である。

それでは、プログラムを示そう。singleは、発生演算子が指定した場所に粒子を加えた場合、単独なのか複数になるのかを調べる関数である。deleteは、消滅演算子が指定した場所から粒子を取り去る関数である。signは隣に並ばせるまでの交換数を調べる関数である。

fermi :: Fermion -> (Integer, (Ket Integer))
fermi (Fermion a) = fermi' (reverse a) (1, KetZero)

fermi' [] b = b
fermi' ((a, b):s) (c, k)
      | a == '+' = fermi' s (fg c b k)
      | a == '-' = fermi' s (fd c b k)
      | otherwise = error "unexpected error in fermi operation."
  where
    fg m a b
      | single a b = (m, a +^b)
      | otherwise = (m * (-1) ^ n, Zero)
    fg' _ Zero = Zero
    single a KetZero = True
    single a (x :+: xs) 
      | a == x = False 
      | otherwise = single a xs        
    fd m a b
      | b == p = (m, Zero)
      | otherwise = (m * (-1) ^ n, p) 
    p = delete b k
    delete a KetZero = KetZero
    delete a (x :+: xs) 
      | a == x = xs 
      | otherwise = x :+: delete a xs
    n = sign b k
    sign a KetZero = 0
    sign a (x :+: xs)
      | a == x = 0
      | otherwise = 1 + sign a xs

ボーズ粒子の時と同じように、発生演算子\(\hat{c}^\dagger_2\)と\(\hat{c}^\dagger_3\)を作用させてみる。

これは、前と同じで、配列では次のようになる。

a = [('+', 3), ('+', 2)]

これをフェルミ粒子に作用する演算子の配列にすると、

*Test4> a
[('+',3),('+',2)]
*Test4> Fermion a
Fermion [('+',3),('+',2)]

となる。

この演算子を作用させると

*Test4> fermi $ Fermion a
(1,,a3+,a2+| ...00(0)00... >

なお、上の結果は、ボーズ粒子の時と同じように、対になっていて、左側のa3+,a2+| ...00(0)00... >が状態を表し、右側の1が符号を表す。

プログラムが正しく動いているかどうかを確認してみよう。
\(\hat{c}^\dagger_2\)と\(\hat{c}^\dagger_3\)を作用させた後で、消滅演算子\(\hat{c}_3\)を作用させてみよう。

*Test4> b
[('-',3),('+',3),('+',2)]
*Test4> Fermion b
Fermion [('-',3),('+',3),('+',2)]
*Test4> fermi $ Fermion b
(1,,a2+| ...00(0)00... >)

\(\hat{c}^\dagger_2\)と\(\hat{c}^\dagger_3\)を作用させた後で、消滅演算子\(\hat{c}_2\)を作用させてみよう。

*Test4> c
[('-',2),('+',3),('+',2)]
*Test4> Fermion c
Fermion [('-',2),('+',3),('+',2)]
*Test4> fermi $ Fermion c
(-1,,a3+| ...00(0)00... >)

\(\hat{c}^\dagger_2\)と\(\hat{c}^\dagger_3\)を作用させた後で、生成演算子\(\hat{c}^\dagger_2\)を作用させてみよう。

*Test4> d
[('+',2),('+',3),('+',2)]
*Test4> Fermion d
Fermion [('+',2),('+',3),('+',2)]
*Test4> fermi $ Fermion d
(-1,0)

上手く動いているようである。それではボーズの時と同様に、\(|source>=\hat{c}^\dagger_2 \hat{c}^\dagger_1 |0>\)から、粒子を入れ替えて\(|target>=\hat{c}^\dagger_1 \hat{c}^\dagger_2 |0>\)を作り出すことを考えよう。

それはボーズ粒子の時と同じで、2番目の粒子を3番目に移し、次に1番目の粒子を2番目に移し、最後に3番目の粒子を1番目に移すとよい。従って、
\begin{eqnarray}
P= \hat{c}^\dagger_1 \hat{c}_3 \hat{c}^\dagger_2 \hat{c}_1 \hat{c}^\dagger_3 \hat{c}_2
\end{eqnarray}

となる。そこで、
\begin{eqnarray}
|target> = -P \hat{c}^\dagger_2 \hat{c}^\dagger_1 |0>
\end{eqnarray}
が求めるものとなる。

そこで、演算子の配列は次のようになる。

*Test4> h
[('+',1),('-',3),('+',2),('-',1),('+',3),('-',2),('+',2),('+',1)]

これをフェルミ粒子に作用する演算子の配列にすると、

*Test4> Fermion h
Fermion [('+',1),('-',3),('+',2),('-',1),('+',3),('-',2),('+',2),('+',1)]

となる。

この演算子を作用させると

*Test4> fermi $ Fermion h
(1,,a1+,a2+| ...00(0)00... >)

これより
\( |target> \) =(1,,a1+,a2+| ...00(0)00... >)
となる。また、
\( |source> \) =(1,,a2+,a1+| ...00(0)00... >)
であることから、\(| target>=-|source>\)であることが分かり、\(P=-1\)が確認できた。

注意:なお、\(\hat{c}^\dagger_2,\hat{c}_l\)はプログラムではcl+,cl-ではなくal+,al-となっているので、注意すること。なお、気になるようであれば、プログラムを修正すること。

8.4 プログラムの全体

プログラムの全体を示す。

module Qtm.BoseFermi.BoseFermi (Boson (Boson), Fermion (Fermion), bose, fermi) where
import Qtm.KetBra.Ket

data Boson = Boson [(Char, Integer)] deriving (Show)

data Fermion = Fermion [(Char, Integer)] deriving (Show)

bose :: Boson -> (Integer, (Ket Integer))
bose (Boson a) = bose' (reverse a) (1, KetZero)

bose' [] b = b
bose' ((a, b):s) (c, k)
  | a == '+' = bose' s (c, b +^ k)
  | a == '-' = bose' s (c, b -^ k)
  | otherwise = error "unexpected error in bose operation."

fermi :: Fermion -> (Integer, (Ket Integer))
fermi (Fermion a) = fermi' (reverse a) (1, KetZero)

fermi' [] b = b
fermi' ((a, b):s) (c, k)
      | a == '+' = fermi' s (fg c b k)
      | a == '-' = fermi' s (fd c b k)
      | otherwise = error "unexpected error in fermi operation."
  where
    fg m a b
      | single a b = (m, a +^b)
      | otherwise = (m * (-1) ^ n, Zero)
    fg' _ Zero = Zero
    single a KetZero = True
    single a (x :+: xs) 
      | a == x = False 
      | otherwise = single a xs        
    fd m a b
      | b == p = (m, Zero)
      | otherwise = (m * (-1) ^ n, p) 
    p = delete b k
    delete a KetZero = KetZero
    delete a (x :+: xs) 
      | a == x = xs 
      | otherwise = x :+: delete a xs
    n = sign b k
    sign a KetZero = 0
    sign a (x :+: xs)
      | a == x = 0
      | otherwise = 1 + sign a xs

なおテストに用いたプログラムは以下の通りである。

module Test4 where

import Qtm.KetBra
import Qtm.BoseFermi.BoseFermi

a = [('+', 3), ('+', 2)]

b = [('-', 3), ('+', 3), ('+', 2)]

c = [('-', 2), ('+', 3), ('+', 2)]

d = [('+', 2), ('+', 3), ('+', 2)]

e = [('+',3), ('-',2), ('+',2), ('+',1)]

f = [('-',1), ('+',3), ('-',2), ('+',2), ('+',1)]

g = [('-',3), ('+',2), ('-',1), ('+',3), ('-',2), ('+',2), ('+',1)]

h = [('+',1), ('-',3), ('+',2), ('-',1), ('+',3), ('-',2), ('+',2), ('+',1)]

トーハクで「藤原行成の書」を鑑賞する

東京国立博物館に出かけてみた。
f:id:bitterharvest:20160903161325j:plain

初めてではないのだが、入館した記憶は1965年のツタンカーメン展だけだ。もしこれが正しければなんと51年ぶりになる。『黄金のマスク』を見るために、ずいぶんと長い時間並んだことを覚えている。

週の初めに、藤原行成(こうぜい)の書が展示されていると教えて頂いた。特に、『陣定定文案(じんていさだめぶんあん)』を見逃してはいけないということであった。

藤原行成(972-1028)のことを簡単に紹介しておこう。彼は、平安中期を、藤原道長(966-1028)とともに同時代を生きた人だ(なんと二人は同じ日に亡くなった)。

このころは摂政関白時代が頂点に達した時で、道長は、長女の彰子(しょうし)を一条天皇の、次女の妍子(けんし)を三条天皇の、四女の威子(いし)を後一条天皇の中宮にし、「一家立三后」を成し遂げた。

この時代のことを彼らは日記に残している、行成は『権記』に、道長は『御堂関白記』に、そしてもう一人、藤原実資(957-1046)は『小右記』に記しているので、この当時の貴族がどのような生活をしていたかが分かる。なお、御堂関白記は現存する最古の日記としてユネスコ記録遺産に登録されている。

話を元に戻そう。行成は、当代の能書家として三蹟の一人に数えられている。今回は、行成の書と彼の書風を真似た人たちの書の展示である。行成の書として、最初に展示されていたのは、国宝『白氏誌巻』である(写真は東京国立博物館ホームページよりの複写)。
f:id:bitterharvest:20160903170541j:plain
「経師」の筆を借りて書いたので、普段とは違っており、笑わないで欲しいと注釈に書かれているとのこと。いつもの筆であればこれにも増して素晴らしいのであろう。自信作を見る機会がないのが残念である。

次に展示されていたのが、お目当ての『陣定定文案』である。

陣定は、天皇から諮問のあった事項に対して、大臣以下の公卿と四位の参議以上の議政官が論じ、見解(一致しない場合には複数)を天皇に奏上する諮問機関である。

この書は奏上するための文案を書いたものなので、行成の普段の字だろうから是非見ておくべきだいうのが、この展示を紹介してくれた方の推奨理由であった。残念ながら東京国立博物館のホームページにこの書は掲載されていないので、お見せすることはできない。展示のパンフレットを購入したので手元では見ることができるが、急いで書いているにもかかわらず立派な字である。

三番目は『書状』であった。昇進したのにお祝いに来てくれないことを責めている手紙である。手紙の最初の文字が草名(花押の一種)になっているのが面白かった(写真は東京国立博物館ホームページよりの複写)。
f:id:bitterharvest:20160903213312j:plain

2011年に『源氏物語 千年の謎』という映画があった。藤原道長紫式部が関係があったという想定のもとに、式部自身の宮廷生活と源氏物語を同時に進行させたものだ。この映画の中で、いつも書籍を読んでいる学者肌の貴族が甲本雅裕演じる藤原行成である。
f:id:bitterharvest:20160903213754j:plain

展示は一部屋であったので、30分ぐらい見た後、埴輪から浮世絵までが展示されている常設展を見て本館を後にした。

本館前の風景は
f:id:bitterharvest:20160903174700j:plain

この日は暑く、人影も少ない。門の左側に位置する表慶館
f:id:bitterharvest:20160903175121j:plain
このあたりにも人影は見られない。

だいぶ暑かったが、恩賜公園を少し散策してみた。的屋さんの屋台とはずいぶんと異なるかわいらしい屋台がいくつも並んでいて、かなりの人ごみになっている一角があった。
後で調べたのだが、芸大の学生がアートマーケットをしていたとのことである。
f:id:bitterharvest:20160903175558j:plain

アートマーケットを通り過ぎて、少し行ったところに、子供のころによく訪れた上野動物園の入り口があった。
f:id:bitterharvest:20160903175758j:plain
当時とはずいぶんと変わっているのだろうと思ったが、暑さには勝てず、そのまま通り過ぎた。

しばらく行くと、上野東照宮が修復なったという掲示があった。前に来たときは、修復中だったので、どのように変わったのかを確認したくて、入り口まで行ってみる。
f:id:bitterharvest:20160903180202j:plain
金ぴかな門になっていた。中に入って参拝するほどの興味はわかなかったので、上野駅の方に向かう。

かつては、東北、信越地方への玄関口であった上野駅中央口の様子を眺めて、
f:id:bitterharvest:20160903180416j:plain

地下鉄を利用して、帰路についた。

量子力学の世界を垣間見る(3):粒子が相互に交換されるモデル:周期系

6.周期系

量子力学の世界をHaskellで覗けるようにするために、格子点の数が有限である場合を前回の記事で取り上げた。その時は端があるモデルについて考えたが、この記事では端同士がつながって輪のようになっている有限系について考えてみよう。これを周期系と呼ぶことにしよう。周期系のモデルを図示すると以下の様である。
f:id:bitterharvest:20160827104401p:plain

そこで、このモデルのハミルトニアンを\(\hat{H}_{periodic}\)とすると、
\begin{eqnarray}
\hat{H}_{periodic}=-g\sum_{l=0}^{N-1} (\hat{a}^\dagger_{l+1} \hat{a}_l + \hat{a}^\dagger_{l} \hat{a}_{l+1})
\end{eqnarray}
となる。なお、\(l=N\)の時、\(l=0\)である。

\(\hat{H}_{periodic}\)の固有状態は平面波状態
\begin{eqnarray}
\sum_{l=0}^{N-1} \varphi_{kl} \hat{a}^\dagger_l |0> = \sum_{l=0}^{N-1} Ae^{i \kappa l} \hat{a}^\dagger_l |0>
\end{eqnarray}
となる。但し、\(e^{i \kappa N} = 1\)である。即ち、\(\kappa N=2 \pi m\)である。

これより、規格化された固有状態は
\begin{eqnarray}
&&| \kappa > \\
&=& \sum_{l=0}^{N-1} \varphi_{kl} \hat{a}^\dagger_l |0> \\
&=& \sum_{l=0}^{N-1} \frac{1}{\sqrt N} e^{i \kappa l} |0>
\end{eqnarray}

これをブラで表すと、
\begin{eqnarray}
&&< \kappa | \\
&=& \sum_{l=0}^{N-1} <0| \hat{a}_l \varphi^*_{kl} \\
&=& \sum_{l=0}^{N-1} <0| \hat{a}_l \frac{1}{\sqrt N} e^{-i \kappa l}
\end{eqnarray}
となる。

7.Haskellでの表現

周期系の場合にも、前回と同様、固有状態を表示することができる。そこで、実現してみよう。
格子点lに粒子がある状態lattice m lを、規格化せれた割合との対として、次のように表すことにしよう。なお、説明のところで用いた区切りの数\(N\)はプログラムではnである。

lattice :: Integer -> Integer -> (Complex Double, Integer)
lattice m l = (b * cos theta  :+ b * sin theta, l)
  where
    theta = 2 * pi * fromInteger m * fromInteger l / fromInteger n

これを用いて、周期系での重ね合わせでの固有状態kappa mはケットでは次のようになる。なお、ここで、mは1からnまでの整数である。

kappa :: Integer -> Entangle (Complex Double) Integer
kappa m 
  | m < 1  = error $ "m should be 1 <= m <= " ++ show n ++ "."
  | m > 10 = error $ "m should be 1 <= m <= " ++ show n ++ "."
  | otherwise = kappa1 m (n - 1)
  where
    kappa1 m 0 = lattice m 0 :&: EnZero
    kappa1 m l = lattice m l :&: kappa1 m (l - 1)

そこで、\(N=10\)の場合について、詳しく調べてみよう。プログラムは次のようになる。

{-#LANGUAGE GADTs #-}

module Test3 where

import Data.Complex
import Qtm.KetBra
import Qtm.Entangle

n = 10
b = 1.0 / sqrt (fromInteger n)

lattice :: Integer -> Integer -> (Complex Double, Integer)
lattice m l = (b * cos theta  :+ b * sin theta, l)
  where
    theta = 2 * pi * fromInteger m * fromInteger l / fromInteger n

kappa :: Integer -> Entangle (Complex Double) Integer
kappa m 
  | m < 1  = error $ "m should be 1 <= m <= " ++ show n ++ "."
  | m > 10 = error $ "m should be 1 <= m <= " ++ show n ++ "."
  | otherwise = kappa1 m (n - 1)
  where
    kappa1 m 0 = lattice m 0 :&: EnZero
    kappa1 m l = lattice m l :&: kappa1 m (l - 1)

このプログラムをロードして、mの値を変えて、固有状態を見てみよう。

relude> :load "test3.hs"
[1 of 7] Compiling Qtm.KetBra.Ket   ( Qtm\KetBra\Ket.hs, interpreted )
[2 of 7] Compiling Qtm.KetBra.Bra   ( Qtm\KetBra\Bra.hs, interpreted )
[3 of 7] Compiling Qtm.Entangle.BraEntangle ( Qtm\Entangle\BraEntangle.hs, interpreted )
[4 of 7] Compiling Qtm.Entangle.KetEntangle ( Qtm\Entangle\KetEntangle.hs, interpreted )
[5 of 7] Compiling Qtm.Entangle     ( Qtm\Entangle.hs, interpreted )
[6 of 7] Compiling Qtm.KetBra       ( Qtm\KetBra.hs, interpreted )
[7 of 7] Compiling Test3            ( test3.hs, interpreted )
Ok, modules loaded: Qtm.KetBra, Qtm.Entangle, Qtm.Entangle.KetEntangle, Qtm.Entangle.BraEntangle, Qtm.KetBra.Bra, Qtm.KetBra.Ket, Test3.

m=1の場合は次のようになる。

*Test3> kappa 1
0.25583363680084636 :+ (-0.1858740172300923)_a9^ + 9.771975379242734e-2 :+ (-0.3007504775037729)_a8^ + (-9.771975379242745e-2) :+ (-0.3007504775037728)_a7^ + (-0.2558336368008464) :+ (-0.18587401723009223)_a6^ + (-0.31622776601683794) :+ 3.872545315192758e-17_a5^ + (-0.25583363680084636) :+ 0.18587401723009228_a4^ + (-9.771975379242738e-2) :+ 0.3007504775037729_a3^ + 9.771975379242741e-2 :+ 0.3007504775037728_a2^ + 0.25583363680084636 :+ 0.18587401723009225_a1^ + 0.31622776601683794 :+ 0.0_a0^

上手く動いているようなので、その他の場合も求めてみよう。

*Test3> kappa 2
9.771975379242727e-2 :+ (-0.30075047750377293)_a9^ + (-0.2558336368008465) :+ (-0.18587401723009214)_a8^ + (-0.2558336368008463) :+ 0.1858740172300923_a7^ + 9.771975379242749e-2 :+ 0.3007504775037728_a6^ + 0.31622776601683794 :+ (-7.745090630385516e-17)_a5^ + 9.771975379242734e-2 :+ (-0.3007504775037729)_a4^ + (-0.2558336368008464) :+ (-0.18587401723009223)_a3^ + (-0.25583363680084636) :+ 0.18587401723009228_a2^ + 9.771975379242741e-2 :+ 0.3007504775037728_a1^ + 0.31622776601683794 :+ 0.0_a0^
*Test3> kappa 3
(-9.77197537924276e-2) :+ (-0.3007504775037728)_a9^ + (-0.25583363680084625) :+ 0.1858740172300924_a8^ + 0.2558336368008465 :+ 0.18587401723009211_a7^ + 9.771975379242727e-2 :+ (-0.30075047750377293)_a6^ + (-0.31622776601683794) :+ 1.1617635945578272e-16_a5^ + 9.771975379242749e-2 :+ 0.3007504775037728_a4^ + 0.25583363680084636 :+ (-0.1858740172300923)_a3^ + (-0.2558336368008464) :+ (-0.18587401723009223)_a2^ + (-9.771975379242738e-2) :+ 0.3007504775037729_a1^ + 0.31622776601683794 :+ 0.0_a0^
*Test3> kappa 4
(-0.25583363680084653) :+ (-0.18587401723009203)_a9^ + 9.771975379242764e-2 :+ 0.30075047750377276_a8^ + 9.77197537924272e-2 :+ (-0.30075047750377293)_a7^ + (-0.25583363680084625) :+ 0.1858740172300924_a6^ + 0.31622776601683794 :+ (-1.549018126077103e-16)_a5^ + (-0.2558336368008465) :+ (-0.18587401723009214)_a4^ + 9.771975379242749e-2 :+ 0.3007504775037728_a3^ + 9.771975379242734e-2 :+ (-0.3007504775037729)_a2^ + (-0.25583363680084636) :+ 0.18587401723009228_a1^ + 0.31622776601683794 :+ 0.0_a0^
*Test3> kappa 5
(-0.31622776601683794) :+ 3.485290783673482e-16_a9^ + 0.31622776601683794 :+ (-3.098036252154206e-16)_a8^ + (-0.31622776601683794) :+ 2.7107817206349303e-16_a7^ + 0.31622776601683794 :+ (-2.3235271891156544e-16)_a6^ + (-0.31622776601683794) :+ 1.9362726575963788e-16_a5^ + 0.31622776601683794 :+ (-1.549018126077103e-16)_a4^ + (-0.31622776601683794) :+ 1.1617635945578272e-16_a3^ + 0.31622776601683794 :+ (-7.745090630385516e-17)_a2^ + (-0.31622776601683794) :+ 3.872545315192758e-17_a1^ + 0.31622776601683794 :+ 0.0_a0^
*Test3> kappa 6
(-0.25583363680084614) :+ 0.18587401723009261_a9^ + 9.771975379242705e-2 :+ (-0.300750477503773)_a8^ + 9.771975379242771e-2 :+ 0.30075047750377276_a7^ + (-0.25583363680084653) :+ (-0.18587401723009203)_a6^ + 0.31622776601683794 :+ (-2.3235271891156544e-16)_a5^ + (-0.25583363680084625) :+ 0.1858740172300924_a4^ + 9.771975379242727e-2 :+ (-0.30075047750377293)_a3^ + 9.771975379242749e-2 :+ 0.3007504775037728_a2^ + (-0.2558336368008464) :+ (-0.18587401723009223)_a1^ + 0.31622776601683794 :+ 0.0_a0^
*Test3> kappa 7
(-9.7719753792428e-2) :+ 0.30075047750377265_a9^ + (-0.25583363680084664) :+ (-0.1858740172300919)_a8^ + 0.2558336368008455 :+ (-0.18587401723009347)_a7^ + 9.771975379242771e-2 :+ 0.30075047750377276_a6^ + (-0.31622776601683794) :+ 2.7107817206349303e-16_a5^ + 9.77197537924272e-2 :+ (-0.30075047750377293)_a4^ + 0.2558336368008465 :+ 0.18587401723009211_a3^ + (-0.2558336368008463) :+ 0.1858740172300923_a2^ + (-9.771975379242745e-2) :+ (-0.3007504775037728)_a1^ + 0.31622776601683794 :+ 0.0_a0^
*Test3> kappa 8
9.771975379242794e-2 :+ 0.30075047750377265_a9^ + (-0.2558336368008461) :+ 0.18587401723009264_a8^ + (-0.25583363680084664) :+ (-0.1858740172300919)_a7^ + 9.771975379242705e-2 :+ (-0.300750477503773)_a6^ + 0.31622776601683794 :+ (-3.098036252154206e-16)_a5^ + 9.771975379242764e-2 :+ 0.30075047750377276_a4^ + (-0.25583363680084625) :+ 0.1858740172300924_a3^ + (-0.2558336368008465) :+ (-0.18587401723009214)_a2^ + 9.771975379242734e-2 :+ (-0.3007504775037729)_a1^ + 0.31622776601683794 :+ 0.0_a0^
*Test3> kappa 9
0.2558336368008474 :+ 0.18587401723009084_a9^ + 9.771975379242794e-2 :+ 0.30075047750377265_a8^ + (-9.7719753792428e-2) :+ 0.30075047750377265_a7^ + (-0.25583363680084614) :+ 0.18587401723009261_a6^ + (-0.31622776601683794) :+ 3.485290783673482e-16_a5^ + (-0.25583363680084653) :+ (-0.18587401723009203)_a4^ + (-9.77197537924276e-2) :+ (-0.3007504775037728)_a3^ + 9.771975379242727e-2 :+ (-0.30075047750377293)_a2^ + 0.25583363680084636 :+ (-0.1858740172300923)_a1^ + 0.31622776601683794 :+ 0.0_a0^
*Test3> kappa 10
0.31622776601683794 :+ (-6.970581567346964e-16)_a9^ + 0.31622776601683794 :+ (-6.196072504308412e-16)_a8^ + 0.31622776601683794 :+ (-5.421563441269861e-16)_a7^ + 0.31622776601683794 :+ (-4.647054378231309e-16)_a6^ + 0.31622776601683794 :+ (-3.8725453151927575e-16)_a5^ + 0.31622776601683794 :+ (-3.098036252154206e-16)_a4^ + 0.31622776601683794 :+ (-2.3235271891156544e-16)_a3^ + 0.31622776601683794 :+ (-1.549018126077103e-16)_a2^ + 0.31622776601683794 :+ (-7.745090630385516e-17)_a1^ + 0.31622776601683794 :+ 0.0_a0^

1より小さい値、あるいは、10より大きい値を指定した場合は次のようになる。

*Test3> kappa 0
*** Exception: m should be 1 <= m <= 10.
*Test3> kappa 11
*** Exception: m should be 1 <= m <= 10.

そこで、m=1,2,3の固有状態の実数部を図で表すと次のようになる。
f:id:bitterharvest:20160828113237p:plain
ついでに、ブラでの表現も加えて、プログラムを次のようにしよう。ここで、格子点lに粒子がある状態をlattice' m lで、ブラでの固有状態をkappa' mで表す。

{-#LANGUAGE GADTs #-}

module Test3 where

import Data.Complex
import Qtm.KetBra
import Qtm.Entangle

n = 10
b = 1.0 / sqrt (fromInteger n)

lattice :: Integer -> Integer -> (Complex Double, Integer)
lattice m l = (b * cos theta  :+ b * sin theta, l)
  where
    theta = 2 * pi * fromInteger m * fromInteger l / fromInteger n

kappa :: Integer -> Entangle (Complex Double) Integer
kappa m 
  | m < 1  = error $ "m should be 1 <= m <= " ++ show n ++ "."
  | m > 10 = error $ "m should be 1 <= m <= " ++ show n ++ "."
  | otherwise = kappa1 m (n - 1)
  where
    kappa1 m 0 = lattice m 0 :&: EnZero
    kappa1 m l = lattice m l :&: kappa1 m (l - 1)

lattice' :: Integer -> Integer -> (Integer, Complex Double)
lattice' m l = (l, b * cos theta  :+ (- b * sin theta))
  where
    theta = 2 * pi * fromInteger m * fromInteger l / fromInteger n

kappa' :: Integer -> CoEntangle Integer (Complex Double)
kappa' m 
  | m < 1  = error $ "m should be 1 <= m <= " ++ show n ++ "."
  | m > 10 = error $ "m should be 1 <= m <= " ++ show n ++ "."
  | otherwise = kappa1 m (n - 1)
  where
    kappa1 m 0 = EnZero' :|: lattice' m 0
    kappa1 m l = kappa1 m (l - 1) :|: lattice' m l

プログラムをロードして、ブラでの固有状態を調べてみよう。

*Test3> kappa' 1
a0_0.31622776601683794 :+ (-0.0) + a1_0.25583363680084636 :+ (-0.18587401723009225) + a2_9.771975379242741e-2 :+ (-0.3007504775037728) + a3_(-9.771975379242738e-2) :+ (-0.3007504775037729) + a4_(-0.25583363680084636) :+ (-0.18587401723009228) + a5_(-0.31622776601683794) :+ (-3.872545315192758e-17) + a6_(-0.2558336368008464) :+ 0.18587401723009223 + a7_(-9.771975379242745e-2) :+ 0.3007504775037728 + a8_9.771975379242734e-2 :+ 0.3007504775037729 + a9_0.25583363680084636 :+ 0.1858740172300923
*Test3> kappa' 2
a0_0.31622776601683794 :+ (-0.0) + a1_9.771975379242741e-2 :+ (-0.3007504775037728) + a2_(-0.25583363680084636) :+ (-0.18587401723009228) + a3_(-0.2558336368008464) :+ 0.18587401723009223 + a4_9.771975379242734e-2 :+ 0.3007504775037729 + a5_0.31622776601683794 :+ 7.745090630385516e-17 + a6_9.771975379242749e-2 :+ (-0.3007504775037728) + a7_(-0.2558336368008463) :+ (-0.1858740172300923) + a8_(-0.2558336368008465) :+ 0.18587401723009214 + a9_9.771975379242727e-2 :+ 0.30075047750377293


また、ケットとブラの内積も求めて見よう。

*Test3> kappa' 1 ^**^ kappa 1
1.0 :+ 0.0
*Test3> kappa' 2 ^**^ kappa 2
1.0 :+ 0.0

またブラとケットでmの値が異なるときは、

*Test3> kappa' 1 ^**^ kappa 2
(-5.551115123125783e-17) :+ (-2.7755575615628914e-17)
*Test3> kappa' 2 ^**^ kappa 3
(-5.551115123125783e-17) :+ 0.0
*Test3> kappa' 2 ^**^ kappa 4
(-3.122502256758253e-17) :+ 0.0

理論的には0であるが、実際は誤差のため0にはならない。しかし、0に限りなく近い値を結果として得る。

伊東箸祭り花火大会 手筒花火

伊東市では、夏になると、頻繁にどこかの海岸で花火大会が開催されている。その中で、最後を飾るのが、箸祭り花火大会である。箸の供養をするための祭りだそうだが、今年は8月22日(月曜日)に予定されていた。しかし、台風9号伊東市を暴風圏に巻き込んだため、延期され23日(火曜日)に実施された。

8時半から9時までの30分間、伊東のオレンジビーチで行われた。最初の10分は、手筒花火であった。打ち上げ花火や仕掛け花火はこれまでに見たことがあるが、手筒花火は初めてであった。ウィキペディアで調べてみると、愛知県や静岡県で行われているようである。

手筒花火は、上半身裸の男衆が、1メートルほどの筒の中に火薬を詰めて、それを抱えながら火の粉を噴き上げる。勇壮だが危険も伴っている。恐らく、箸供養への奉納なのだろう。

写真をいくつか載せておこう。
f:id:bitterharvest:20160826145334j:plain
f:id:bitterharvest:20160826145356j:plain
f:id:bitterharvest:20160826145416j:plain
f:id:bitterharvest:20160826145439j:plain
f:id:bitterharvest:20160826145503j:plain
f:id:bitterharvest:20160826145525j:plain
f:id:bitterharvest:20160826145547j:plain
f:id:bitterharvest:20160826145612j:plain
f:id:bitterharvest:20160826145636j:plain

量子力学の世界を垣間見る(2):粒子が相互に交換されるモデル:有限系

3.固有状態、固有値

隣り合う格子点の間で粒子が相互に交換されるモデルについて、西野友年著『場の理論』を参考にして、もう少し説明を加えておこう。このモデルは次の方程式(時間変化を与える発展方程式)で表される。
\begin{eqnarray}
i \hbar \frac{d}{dt}|\Psi(t)>=\hat{H}|\Psi(t)>
\end{eqnarray}
ここで、\(\hat{H}\)はハミルトニアンと呼ばれる演算子である。このモデルでは、\(\hat{H}\)は隣り合う粒子が相互に交換されるという運動を表していて、具体的には次のようになる。
\begin{eqnarray}
\hat{H}=-g\sum_{l=-\infty}^\infty (\hat{a}^\dagger_{l+1} \hat{a}_l + \hat{a}^\dagger_{l} \hat{a}_{l+1})
\end{eqnarray}
ここで、\(\hat{a}^\dagger_{l}\)は生成演算子、 \(\hat{a}_l\)は消滅演算子で、\(\hat{a}^\dagger_{l+1} \hat{a}_l\)は\(l\)番目の格子点から粒子を取り除き、そして、\(l+1\)番目の格子点に粒子を発生させること、すなわち、粒子を\(l\)から\(l+1\)に移動することを意味する。これより、
\begin{eqnarray}
i \hbar \frac{d}{dt}\psi_m(t) = -g [\psi_{m -1}(t) + \psi_{m+1}(t)]
\end{eqnarray}
を得る。この時の定常解は、
\begin{eqnarray}
\psi_l(t) = Ae^{-i \omega t+ i \kappa l}
\end{eqnarray}
である。

ただし、この解は \( i \hbar \frac{d}{dt}\psi_m(t) = -g [\psi_{m -1}(t) + \psi_{m+1}(t)] \) を満たす必要がある。満足する条件を求めてみよう。

左辺は、
\begin{eqnarray}
&& i \hbar \frac{d}{dt}\psi_l(t) \\ &=& i \hbar \frac{d}{dt}Ae^{-i \omega t+ i \kappa l} \\ &=& \hbar \omega Ae^{-i \omega t+ i \kappa l}
\end{eqnarray}

右辺は、
\begin{eqnarray}
&& -g [\psi_{l-1}(t) + \psi_{l+1}(t)] \\ &=& -gAe^{-i \omega t}e^{i( \kappa (l-1)+\kappa (l+1)} \\ &=& -gAe^{-i \omega t}e^{i\kappa l}(e^{-i\kappa}+e^{i\kappa}) \\ &=& -2g\cos \kappa Ae^{-i \omega t+i\kappa l}
\end{eqnarray}

従って、\(\hbar \omega=-2g\cos \kappa\)の時、\(\psi_l(t) = Ae^{-i \omega t+ i \kappa l}\)は定常解となる。

定常解は、時間に依存する部分\(\phi_\omega (t)=e^{-i \omega t}\)と場所に依存する部分\(\varphi_{kl}=Ae^{i \kappa l}\)とに分けると、
\begin{eqnarray}
\psi_l(t) = \phi_\omega (t) \varphi_{kl}
\end{eqnarray}
と表すことができる。

隣り合う格子点の間で粒子が相互に交換されるいるとき、次の重ね合わせ状態になっているときがある(例えば、\(t=0\))。
\begin{eqnarray}
\sum_{l=-\infty}^\infty \varphi_{kl} \hat{a}^\dagger_l |0> = \sum_{l=-\infty}^\infty Ae^{i \kappa l} \hat{a}^\dagger_l |0>
\end{eqnarray}

それでは、この重ね合わせ状態の時、隣り合う格子点の間で粒子を相互に交換させたらどのようになるだろうか。即ち、
\begin{eqnarray}
\hat{H}=-g\sum_{l=-\infty}^\infty (\hat{a}^\dagger_{l+1} \hat{a}_l + \hat{a}^\dagger_{l} \hat{a}_{l+1})
\end{eqnarray}
を作用させたらどうなうであろうか。

実際に式を変形してみる。

\begin{eqnarray}
&&\hat{H}\sum_{l=-\infty}^\infty \varphi_{kl} \hat{a}^\dagger_l |0> \\ &=&\hat{H} \sum_{l=-\infty}^\infty Ae^{i \kappa l} \hat{a}^\dagger_l |0> \\ &=&-g\sum_{l=-\infty}^\infty Ae^{i \kappa l}(\hat{a}^\dagger_{l+1} \hat{a}_l + \hat{a}^\dagger_{l-1} \hat{a}_l) \hat{a}^\dagger_l |0> \\ &=&-g\sum_{l=-\infty}^\infty Ae^{i \kappa l}(\hat{a}^\dagger_{l+1} + \hat{a}^\dagger_{l-1}) |0> \\ &=&-g\sum_{l=-\infty}^\infty A(e^{i \kappa (l-1)}\hat{a}^\dagger_l + e^{i \kappa (l+1)}\hat{a}^\dagger_l) |0> \\ &=&-g\sum_{l=-\infty}^\infty Ae^{i \kappa l}(e^{-i \kappa}+e^{i \kappa})\hat{a}^\dagger_l|0> \\ &=&-2g \cos\kappa\sum_{l=-\infty}^\infty Ae^{i \kappa l}\hat{a}^\dagger_l|0> \end{eqnarray}

今、\(E=-2g \cos\kappa(=\hbar \omega)\)とすると、
\begin{eqnarray}
&&\hat{H} \sum_{l=-\infty}^\infty Ae^{i \kappa l} \hat{a}^\dagger_l |0> \\
&=& E \sum_{l=-\infty}^\infty Ae^{i \kappa l}\hat{a}^\dagger_l|0>
\end{eqnarray}
上の式は、状態\(\sum_{l=-\infty}^\infty \varphi_{kl} \hat{a}^\dagger_l |0> = \sum_{l=-\infty}^\infty Ae^{i \kappa l} \hat{a}^\dagger_l |0>\)にハミルトニアン\(\hat{H}\)を作用させると、元の状態の\(E\)倍になるといっている。

演算子を作用させたとしても、係数が変わるだけで、元の状態から変化しないものを固有状態と呼ぶ。また、この時の係数は固有値と呼ばれる。従って、
\begin{eqnarray}
&&\sum_{l=-\infty}^\infty \varphi_{kl} \hat{a}^\dagger_l |0> \\
&=& \sum_{l=-\infty}^\infty Ae^{i \kappa l} \hat{a}^\dagger_l |0>
\end{eqnarray}
は固有状態であり、\(E\)は固有値である。

特に、演算子ハミルトニアンの場合には、固有値は固有エネルギーと呼べれ、状態も固有エネルギー状態と呼べれる。

ハミルトニアン\(\hat{H}\)の固有値が見つかれば、一般に、定常状態はすぐに求めることができる。ある固有状態\(|\epsilon>\)が、エネルギー\(E=\hbar \omega\)を有するならば、\(\hat{H}|\epsilon>=E|\epsilon>\)が成り立っていて、定常状態は次のようになる。
\begin{eqnarray}
&&|\Psi(t)> \\
&=& e^{-i(E/\hbar)t}|\epsilon> \\
&=& e^{-iwt}|\epsilon>
\end{eqnarray}

4.有限系

前回からの約束で、長さが有限である場合について考えることにしよう。

今、全長が\(L\)で、格子点の数が\(N\)の場合を考えることにする。この場合、隣合う格子点の距離は\(d=L/N\)となる。 この時、隣り合う格子点の間で粒子が相互に交換されるモデルでのハミルトニアン\(\hat{H}_{open}\)は、
\begin{eqnarray}
\hat{H}_{open}=-g\sum_{l=0}^{N-2} (\hat{a}^\dagger_{l+1} \hat{a}_l + \hat{a}^\dagger_{l} \hat{a}_{l+1})
\end{eqnarray}
f:id:bitterharvest:20160826073016p:plain
 
ハミルトニアン\(\hat{H}_{open}\)の固有状態は\(N\)個あり、次のようになる。
\begin{eqnarray}
&&| \xi_m > \\
&=& B \sum_{l = 0}^{N-1}[\sin \frac{m \pi (l + 1)}{N + 1}] \hat{a}^{\dagger}_l|0>
\end{eqnarray}ここで、\(m\)は、\(1\le m \le N\)である。また、\(B=\sqrt {\frac{2}{N+1}}\)の時、規格化されている。

5.Haskellでの表現

格子点の数が有限な場合には、固有状態を表示することができるので、実現してみよう。
格子点lに粒子がある状態lattice m lを、規格化せれた割合との対として、次のように表すことにしよう。なお、説明のところで用いた区切りの数\(N\)はプログラムではnである。

lattice :: Integer -> Integer -> (Complex Double, Integer)
lattice m l = (b * sin ( pi * fromInteger m * fromInteger (l + 1) / fromInteger (n + 1)) :+ 0, l)

これを用いて、有限系での重ね合わせでの固有状態eta mはケットでは次のようになる。なお、ここで、mは1からnまでの整数である。

eta :: Integer -> Entangle (Complex Double) Integer
eta m 
  | m < 1  = error $ "m should be 1 <= m <= " ++ show n ++ "."
  | m > 10 = error $ "m should be 1 <= m <= " ++ show n ++ "."
  | otherwise = eta1 m (n - 1)
  where
    eta1 m 0 = lattice m 0 :&: EnZero
    eta1 m l = lattice m l :&: eta1 m (l - 1)

そこで、\(N=10\)の場合について、詳しく調べてみよう。プログラムは次のようになる。

{-#LANGUAGE GADTs #-}

module Test2 where

import Data.Complex
import Qtm.KetBra
import Qtm.Entangle

n = 10
b = sqrt(2.0 /fromInteger (n + 1))

lattice :: Integer -> Integer -> (Complex Double, Integer)
lattice m l = (b * sin ( pi * fromInteger m * fromInteger (l + 1) / fromInteger (n + 1)) :+ 0, l)

eta :: Integer -> Entangle (Complex Double) Integer
eta m 
  | m < 1  = error $ "m should be 1 <= m <= " ++ show n ++ "."
  | m > 10 = error $ "m should be 1 <= m <= " ++ show n ++ "."
  | otherwise = eta1 m (n - 1)
  where
    eta1 m 0 = lattice m 0 :&: EnZero
    eta1 m l = lattice m l :&: eta1 m (l - 1) 

このプログラムをロードして、mの値を変えて、固有状態を見てみよう。

Prelude> :load "test2.hs" 
[1 of 7] Compiling Qtm.KetBra.Ket ( Qtm\KetBra\Ket.hs, interpreted ) 
[2 of 7] Compiling Qtm.KetBra.Bra ( Qtm\KetBra\Bra.hs, interpreted ) 
[3 of 7] Compiling Qtm.Entangle.BraEntangle ( Qtm\Entangle\BraEntangle.hs, interpreted ) 
[4 of 7] Compiling Qtm.Entangle.KetEntangle ( Qtm\Entangle\KetEntangle.hs, interpreted ) 
[5 of 7] Compiling Qtm.Entangle ( Qtm\Entangle.hs, interpreted ) 
[6 of 7] Compiling Qtm.KetBra ( Qtm\KetBra.hs, interpreted ) 
[7 of 7] Compiling Test2 ( test2.hs, interpreted ) 
Ok, modules loaded: Test2, Qtm.KetBra, Qtm.Entangle, Qtm.Entangle.KetEntangle, Qtm.Entangle.BraEntangle, Qtm.KetBra.Bra, Qtm.KetBra.Ket. 

m=1の場合は次のようになる。

*Test2> prEntangle $ eta 1 
"(0.12013116587858108 :+ 0.0)|...000000000000(0)000000001000...> + (0.23053001914523252 :+ 0.0)|...00000000000(0)00000001000...> + (0.32225270127555106 :+ 0.0)|...0000000000(0)0000001000...> + (0.38786838605913326 :+ 0.0)|...000000000(0)000001000...> + (0.4220612809463162 :+ 0.0)|...00000000(0)00001000...> + (0.4220612809463162 :+ 0.0)|...0000000(0)0001000...> + (0.38786838605913326 :+ 0.0)|...000000(0)001000...> + (0.32225270127555106 :+ 0.0)|...00000(0)01000...> + (0.23053001914523244 :+ 0.0)|...0000(0)1000...> + (0.12013116587858108 :+ 0.0)|...0001000...>" 

上手く動いているようなので、その他の場合も求めてみよう。

*Test2> prEntangle $ eta 2 
"((-0.23053001914523238) :+ 0.0)|...000000000000(0)000000001000...> + ((-0.3878683860591333) :+ 0.0)|...00000000000(0)00000001000...> + ((-0.4220612809463162) :+ 0.0)|...0000000000(0)0000001000...> + ((-0.32225270127555106) :+ 0.0)|...000000000(0)000001000...> + ((-0.12013116587858097) :+ 0.0)|...00000000(0)00001000...> + (0.12013116587858108 :+ 0.0)|...0000000(0)0001000...> + (0.32225270127555106 :+ 0.0)|...000000(0)001000...> + (0.4220612809463162 :+ 0.0)|...00000(0)01000...> + (0.38786838605913326 :+ 0.0)|...0000(0)1000...> + (0.23053001914523244 :+ 0.0)|...0001000...>" 
*Test2> prEntangle $ eta 3 
"(0.32225270127555156 :+ 0.0)|...000000000000(0)000000001000...> + (0.4220612809463162 :+ 0.0)|...00000000000(0)00000001000...> + (0.23053001914523225 :+ 0.0)|...0000000000(0)0000001000...> + ((-0.12013116587858114) :+ 0.0)|...000000000(0)000001000...> + ((-0.3878683860591333) :+ 0.0)|...00000000(0)00001000...> + ((-0.3878683860591331) :+ 0.0)|...0000000(0)0001000...> + ((-0.12013116587858097) :+ 0.0)|...000000(0)001000...> + (0.23053001914523252 :+ 0.0)|...00000(0)01000...> + (0.4220612809463162 :+ 0.0)|...0000(0)1000...> + (0.32225270127555106 :+ 0.0)|...0001000...>" 
*Test2> prEntangle $ eta 4 
"((-0.38786838605913326) :+ 0.0)|...000000000000(0)000000001000...> + ((-0.32225270127555083) :+ 0.0)|...00000000000(0)00000001000...> + (0.12013116587858118 :+ 0.0)|...0000000000(0)0000001000...> + (0.4220612809463162 :+ 0.0)|...000000000(0)000001000...> + (0.23053001914523225 :+ 0.0)|...00000000(0)00001000...> + ((-0.23053001914523238) :+ 0.0)|...0000000(0)0001000...> + ((-0.4220612809463162) :+ 0.0)|...000000(0)001000...> + ((-0.12013116587858097) :+ 0.0)|...00000(0)01000...> + (0.32225270127555106 :+ 0.0)|...0000(0)1000...> + (0.38786838605913326 :+ 0.0)|...0001000...>" 
*Test2> prEntangle $ eta 5 
"(0.4220612809463162 :+ 0.0)|...000000000000(0)000000001000...> + (0.12013116587858083 :+ 0.0)|...00000000000(0)00000001000...> + ((-0.38786838605913326) :+ 0.0)|...0000000000(0)0000001000...> + ((-0.2305300191452322) :+ 0.0)|...000000000(0)000001000...> + (0.32225270127555156 :+ 0.0)|...00000000(0)00001000...> + (0.3222527012755511 :+ 0.0)|...0000000(0)0001000...> + ((-0.23053001914523238) :+ 0.0)|...000000(0)001000...> + ((-0.3878683860591331) :+ 0.0)|...00000(0)01000...> + (0.12013116587858108 :+ 0.0)|...0000(0)1000...> + (0.4220612809463162 :+ 0.0)|...0001000...>" 
*Test2> prEntangle $ eta 6 
"((-0.42206128094631595) :+ 0.0)|...000000000000(0)000000001000...> + (0.12013116587858128 :+ 0.0)|...00000000000(0)00000001000...> + (0.38786838605913304 :+ 0.0)|...0000000000(0)0000001000...> + ((-0.2305300191452325) :+ 0.0)|...000000000(0)000001000...> + ((-0.32225270127555083) :+ 0.0)|...00000000(0)00001000...> + (0.32225270127555156 :+ 0.0)|...0000000(0)0001000...> + (0.23053001914523225 :+ 0.0)|...000000(0)001000...> + ((-0.3878683860591333) :+ 0.0)|...00000(0)01000...> + ((-0.12013116587858097) :+ 0.0)|...0000(0)1000...> + (0.4220612809463162 :+ 0.0)|...0001000...>" 
*Test2> prEntangle $ eta 7 
"(0.387868386059133 :+ 0.0)|...000000000000(0)000000001000...> + ((-0.32225270127555067) :+ 0.0)|...00000000000(0)00000001000...> + ((-0.12013116587858078) :+ 0.0)|...0000000000(0)0000001000...> + (0.4220612809463161 :+ 0.0)|...000000000(0)000001000...> + ((-0.2305300191452325) :+ 0.0)|...00000000(0)00001000...> + ((-0.2305300191452322) :+ 0.0)|...0000000(0)0001000...> + (0.4220612809463162 :+ 0.0)|...000000(0)001000...> + ((-0.12013116587858114) :+ 0.0)|...00000(0)01000...> + ((-0.32225270127555106) :+ 0.0)|...0000(0)1000...> + (0.38786838605913326 :+ 0.0)|...0001000...>" 
*Test2> prEntangle $ eta 8 
"((-0.3222527012755512) :+ 0.0)|...000000000000(0)000000001000...> + (0.4220612809463163 :+ 0.0)|...00000000000(0)00000001000...> + ((-0.23053001914523258) :+ 0.0)|...0000000000(0)0000001000...> + ((-0.12013116587858078) :+ 0.0)|...000000000(0)000001000...> + (0.38786838605913304 :+ 0.0)|...00000000(0)00001000...> + ((-0.38786838605913326) :+ 0.0)|...0000000(0)0001000...> + (0.12013116587858118 :+ 0.0)|...000000(0)001000...> + (0.23053001914523225 :+ 0.0)|...00000(0)01000...> + ((-0.4220612809463162) :+ 0.0)|...0000(0)1000...> + (0.32225270127555106 :+ 0.0)|...0001000...>" 
*Test2> prEntangle $ eta 9 
"(0.23053001914523197 :+ 0.0)|...000000000000(0)000000001000...> + ((-0.387868386059133) :+ 0.0)|...00000000000(0)00000001000...> + (0.4220612809463163 :+ 0.0)|...0000000000(0)0000001000...> + ((-0.32225270127555067) :+ 0.0)|...000000000(0)000001000...> + (0.12013116587858128 :+ 0.0)|...00000000(0)00001000...> + (0.12013116587858083 :+ 0.0)|...0000000(0)0001000...> + ((-0.32225270127555083) :+ 0.0)|...000000(0)001000...> + (0.4220612809463162 :+ 0.0)|...00000(0)01000...> + ((-0.3878683860591333) :+ 0.0)|...0000(0)1000...> + (0.23053001914523252 :+ 0.0)|...0001000...>" 
*Test2> prEntangle $ eta 10 
"((-0.1201311658785813) :+ 0.0)|...000000000000(0)000000001000...> + (0.23053001914523197 :+ 0.0)|...00000000000(0)00000001000...> + ((-0.3222527012755512) :+ 0.0)|...0000000000(0)0000001000...> + (0.387868386059133 :+ 0.0)|...000000000(0)000001000...> + ((-0.42206128094631595) :+ 0.0)|...00000000(0)00001000...> + (0.4220612809463162 :+ 0.0)|...0000000(0)0001000...> + ((-0.38786838605913326) :+ 0.0)|...000000(0)001000...> + (0.32225270127555156 :+ 0.0)|...00000(0)01000...> + ((-0.23053001914523238) :+ 0.0)|...0000(0)1000...> + (0.12013116587858108 :+ 0.0)|...0001000...>" 

1より小さい値、あるいは、10より大きい値を指定した場合は次のようになる。

*Test2> prEntangle $ eta 0 
*** Exception: m should be 1 <= m <= 10. 
"*Test2> 
*Test2> prEntangle $ eta 11 
*** Exception: m should be 1 <= m <= 10. 
"*Test2> 

そこで、m=1,2,3,4の固有状態を図で表すと次のようになる。
f:id:bitterharvest:20160826074953p:plain
ついでに、ブラでの表現も加えて、プログラムを次のようにしよう。ここで、格子点lに粒子がある状態をlattice' m lで、ブラでの固有状態をeta' mで表す。

{-#LANGUAGE GADTs #-}

module Test2 where

import Data.Complex
import Qtm.KetBra
import Qtm.Entangle

n = 10
b = sqrt(2.0 /fromInteger (n + 1))

lattice :: Integer -> Integer -> (Complex Double, Integer)
lattice m l = (b * sin ( pi * fromInteger m * fromInteger (l + 1) / fromInteger (n + 1)) :+ 0, l)

eta :: Integer -> Entangle (Complex Double) Integer
eta m 
  | m < 1  = error $ "m should be 1 <= m <= " ++ show n ++ "."
  | m > 10 = error $ "m should be 1 <= m <= " ++ show n ++ "."
  | otherwise = eta1 m (n - 1)
  where
    eta1 m 0 = lattice m 0 :&: EnZero
    eta1 m l = lattice m l :&: eta1 m (l - 1)

lattice' :: Integer -> Integer -> (Integer, Complex Double)
lattice' m l = (l, b * sin ( pi * fromInteger m * fromInteger (l + 1) / fromInteger (n + 1)) :+ 0)

eta' :: Integer -> CoEntangle Integer (Complex Double)
eta' m 
  | m < 1  = error $ "m should be 1 <= m <= " ++ show n ++ "."
  | m > 10 = error $ "m should be 1 <= m <= " ++ show n ++ "."
  | otherwise = eta1 m (n - 1)
  where
    eta1 m 0 = EnZero' :|: lattice' m 0
    eta1 m l = eta1 m (l - 1) :|: lattice' m l

プログラムをロードして、ブラでの固有状態を調べてみよう。

*Test2> eta' 1
a0_0.12013116587858108 :+ 0.0 + a1_0.23053001914523244 :+ 0.0 + a2_0.32225270127555106 :+ 0.0 + a3_0.38786838605913326 :+ 0.0 + a4_0.4220612809463162 :+ 0.0 + a5_0.4220612809463162 :+ 0.0 + a6_0.38786838605913326 :+ 0.0 + a7_0.32225270127555106 :+ 0.0 + a8_0.23053001914523252 :+ 0.0 + a9_0.12013116587858108 :+ 0.0
*Test2> eta' 2
a0_0.23053001914523244 :+ 0.0 + a1_0.38786838605913326 :+ 0.0 + a2_0.4220612809463162 :+ 0.0 + a3_0.32225270127555106 :+ 0.0 + a4_0.12013116587858108 :+ 0.0 + a5_(-0.12013116587858097) :+ 0.0 + a6_(-0.32225270127555106) :+ 0.0 + a7_(-0.4220612809463162) :+ 0.0 + a8_(-0.3878683860591333) :+ 0.0 + a9_(-0.23053001914523238) :+ 0.0


また、ケットとブラの内積も求めて見よう。

*Test2> eta' 1 ^**^ eta 1
1.0 :+ 0.0
*Test2> eta' 2 ^**^ eta 2
1.0 :+ 0.0
*Test2> 

またブラとケットでmの値が異なるときは、

*Test2> eta' 1 ^**^ eta 2
(-5.551115123125783e-17) :+ 0.0
*Test2> eta' 2 ^**^ eta 3
1.3877787807814457e-17 :+ 0.0
*Test2> eta' 2 ^**^ eta 4
4.163336342344337e-17 :+ 0.0

理論的には0であるが、実際は誤差のため0にはならない。しかし、0に限りなく近い値を結果として得る。

なお、参考のために、場の理論での演算子とプログラムでのそれとの対応を以下の表に示す。

量子力学ケットブラ
真空状態(ケット)\(|...00\dot000...>\)KetZero
真空状態(ブラ)\(<...00\dot000...|\)BraZero
区間1,2に1粒子(有)\(|...00\dot01100...>\)2 :+: 1 :+: KetZero
区間1,2に1粒子(待)\(<...00\dot01100...|\)BraZero :-: 1 :-: 2
生成演算子\(\hat{a}^\dagger_i\)i +^^+ i
消滅演算子\(\hat{a}_i\)i -^^- i
生成演算子使用例\(\hat{a}^\dagger_1|...00\dot000...>\)i +^ KetZero
生成演算子使用例\(<...00\dot000...|\hat{a}^\dagger_1\)BraZero ^+ i
消滅演算子使用例\(\hat{a}_1|...00\dot000...>\)1 -^ KetZero
消滅演算子使用例\(<...00\dot000...|\hat{a}_1\)BraZero ^- 1
内積 ^*^
内積使用例\(<...00\dot000...|...00\dot000...>\)BraZero ^*^ KetZero
状態でない\(0\)ZeroZero'

スキレットで目玉焼きを作る

別荘では、食事を一人ですることが多い。なんとか、楽しく料理でき、また、おいしく食べられないかと常々考えていた。そんな折、別の用事で立ち寄った、カインズでスキレットを発見した。

この製品、大変な人気になっているようで、大量に仕入れられていた。

直径が12,16,20cmの3種類が用意されていた。お店には、最も小さいものが一番たくさん置かれていたが、ちょっと小さすぎるように思われたので、16cmのものを購入した。

スキレットは、鉄の鋳物なので、熱伝導率が高く、調理しやすい道具だ。難点は、錆びやすいことである。かつては、家庭のフライパンも鉄の鋳物でつくられていたが、錆びやすいのが嫌われて、現在のフライパンに変わったものと思われる。

錆びないようにするためには、シーズニングという処理をしなければならない。そこで、購入後に次のように処理をした。
① 食器用洗剤で洗い、その後、拭いて水気をとった。
② 白っぽい煙が出るまで中火で加熱した。
③ 少しさました後で、オリーブオイル(なければサラダ油などの植物油)で全体に塗った。
f:id:bitterharvest:20160817155325j:plain

また、調理で使用した後も、
① 汚れ物を洗い落とす。
② 軽く火にかけて乾燥する。
③ オリーブオイルを塗っておく。

なお、加熱しているときに別の用事をすると、このことを忘れてしまい過熱しすぎという事故が起こりうるので、ガスコンロからは離れないように心がけよう。

さて、準備ができたので、最も簡単で、最も適しているように思える目玉焼きを作ることにした。

スキレットを加熱し、オリーブオイルを加えて、まず、ベーコンを焼いた。使ったのは、ハーフベーコン4切れである。
f:id:bitterharvest:20160817155430j:plain

焼きあがったところで、皿に移し、次にスキレットで目玉焼きを作った。
f:id:bitterharvest:20160817155520j:plain

焼けてきたところで、塩・胡椒をして、皿に移しておいたベーコンを目玉焼きの上にのせた。
f:id:bitterharvest:20160817155612j:plain

スキレットをプレートの上にのせ、そのまま食する。スキレットの保温効果のおかげで、最後まで、温かい目玉焼きを楽しめた。

なお、ベーコンを焼いた後で取り出さず、その上に卵を割って落として、焼き続けるとベーコンエッグができる。
f:id:bitterharvest:20160826090018j:plain

ムール貝のパエリア

お盆のこの時期、我家の食卓は賑やかになる。男の子ばかり5人の孫たちが押し掛けてくるからだ。幸いなことに、今年は、一人の子が受験のため不参加となったが、それでも育ち盛りの4人の男の子たちの胃袋を満たす食事を作らなければならない。手間をかけずに、作れる料理ということで、パエリアを作ることにした。都合のよいことに、いつもの格安スーパーでムール貝を一昨日購入してきたので、これを用いて作ることとした。

パエリアはスペインのバレンシア地方で生まれた料理で、コメと魚介類、肉などとの炊き込みご飯だ。パエリアという単語は、バレンシア語でフライパンを意味するそうだ。調理するときは、平底の浅くて丸いフライパンを用いているようだ。本場の調理法に従って、料理を作りたいのだが、夫婦二人の我が家には、多人数の料理を作れるようなフライパンもない。さらには、炊飯器も小さい。仕方がないので、作り方はかなり異なるが、ご飯と具を別々に調理して、後から混ぜることにした。

今日の料理に用いた食材は、ムール貝(400g)、パプリカ(一個)、インゲン(25本程度)、シーフード(200g)、米(4合)、コンソメ(2袋、1袋は4.5g)。ムール貝はトマトガーリックソース浸けで、味を出すのに使う。
f:id:bitterharvest:20160813085722j:plain

ご飯は、コンソメを入れて炊飯器で炊き上げる。
f:id:bitterharvest:20160813090543j:plain

炊き上がる時間を見計らって、具材を用意する。
インゲンは、筋を取った後(娘たちは筋はとったことはないといっていたが、僕が子供の頃は、嫌なことの一つであったが、インゲンの筋とりはよく手伝わさせられた)、電子レンジで茹でる。また、パプリカは食べやすい大きさ(6等分して5mmの幅で切った)に切っておく。
f:id:bitterharvest:20160813090912j:plain

これらをオリーブオイルで炒め、塩、コショウをする。
f:id:bitterharvest:20160813091227j:plain

ムール貝も電子レンジで解凍し、温める(600Wで7分だった)。
f:id:bitterharvest:20160813091423j:plain

シーフードはフライパンでそのまま炒め、塩、コショウをした。
f:id:bitterharvest:20160813091529j:plain

炊き上がったご飯を、別のフライパンに移す。そして、ムール貝を除いた食材をご飯の上に移す。この時、ムール貝からのトマトガーリックソースもご飯の上にかける。
f:id:bitterharvest:20160813091830j:plain

次に、軽くかき混ぜて、具材がご飯と混ざるようにする(あまり混ぜるとご飯がべとべとになるので、ほどほどに)。
f:id:bitterharvest:20160813092026j:plain

最後にムール貝をのせて出来上がり。
f:id:bitterharvest:20160813092117j:plain

トマトが嫌いだといっていた孫の一人もおいしそうに食べていた。

沖縄:グスクを訪れる

姪の結婚式が8月8日に沖縄であった。最近は、入籍してから、結婚式を挙げるのが普通になっているようだ。以前であれば、結婚式を挙げた後は新郎・新婦はハネムーンへと旅だってしまうので、その後の旅を彼らとすることなどは考えられなかった。しかし、最近は、結婚式とハネムーンはセットになっていないことが多いようで、結婚式後に取る休みを利用して、色々な楽しみ方をしているようだ。今回の場合は、親族たちと一緒に過ごすことが大きな目的だったようで、観光客に人気のある場所に、新郎と新婦が自ら我々を案内してくれた。結婚式の習慣が、有り難い方向に、変化してくれたことに感謝して、沖縄を楽しんだ。

その中にグスクの観光が含まれていた。グスクは、今年になって古代史を学び始めてから、意識するようになった言葉である。それまでもどこかで教えてもらったことがあったのかもしれないが、残念ながら、覚えていない。古代史のなかで、沖縄では採集漁労文化が(稲作文化を受け入れないで)平安時代に並行するグスク時代まで続いた、と学んだ。

グスク時代は、11あるいは12世紀から始まり、琉球王国が誕生する15世紀前半あるいは16世紀までとされている。グスクは城を意味する。そして、グスク時代は、採集・漁労の時代から農耕時代へと推移し、奄美諸島から先島諸島にかけていくつもの城が設けられている時代をさしている。

中山世譜』などの史書によると、一組の女神と男神琉球の島々を造り、天帝子が三男二女を設け、長男は王(国君)のはじめとなり、次男は諸侯(按司)のはじめとなり、三男は平民(百姓)となったとされている。

上の記述は伝承であるが、実際の歴史の中では、農耕社会が成立した12世紀頃、按司琉球諸島の各地に現れ、グスクを拠点にして、地方豪族となった。やんばるロードネットではグスクの場所を示している。
f:id:bitterharvest:20160811165415j:plain

14世紀には、按司を束ねるような強力な王が出現し、北部の北山、中部の中山、南部の南山の三王国が並立する時代が100年続き、いずれも中国の明朝に朝貢する(冊封となる)。
15世紀にはいると、佐敷の按司が中山、北山、南山の順で王国を滅ぼし、沖縄諸島奄美群島を制圧し、統一王朝を確立する。この王家は第一尚氏と呼ばれる。この王家は7代まで続く。

1469年には、重臣であった金丸がクーデターによって王家を乗っ取る。この王家は第二尚氏と呼ばれ1879年まで続く。この王朝は、進貢貿易(明および清との)を中心にして中国、日本、東南アジアと広く交易し、全盛期を迎える。1609年には薩摩藩の侵攻を受け、実質的な支配下にはいる。第二尚氏の初代の王として、ウィキペディアでは次の写真が掲載されている。
f:id:bitterharvest:20160811170419j:plain

さて、最初に訪れたグスクは、世界遺産に登録されている今帰仁(なきじん)城である。この城は、琉球王国成立以前は、北山の国王の居城であった。1416年に滅ぼされるが、その後もこの地域の統治のために、北山監守が今帰仁城に派遣された。

現在の城跡は、石垣が整備され、往時をしのばせてくれる。城の全体像は写真のようで、幾重の石垣で囲まれている。
f:id:bitterharvest:20160811171508j:plain

一番外側の石垣は次のようだ。
f:id:bitterharvest:20160811171644j:plain

中ほどの石垣は、
f:id:bitterharvest:20160811171758j:plain

城では祭祀が行われた。
f:id:bitterharvest:20160811172032j:plain
f:id:bitterharvest:20160811172125j:plain

一番奥まで進み、外を見ると石垣の様子がよく分かる。
f:id:bitterharvest:20160811172322j:plain

最も奥には女官たちの住まいの跡がある。
f:id:bitterharvest:20160811172810j:plain
f:id:bitterharvest:20160811173003j:plain

次の日(8月10日)は、その一部が世界遺産に登録されている首里城を訪問した。復元される前に何度か訪れたことがあるが、復元されてからは初めての訪問だ。琉球王朝時代の王家の城だが、三山時代には中山の城として利用されていたと推定されている。
正殿は漆塗りのきれいな建物だ。
f:id:bitterharvest:20160811173839j:plain
正殿の前での謁見の様子は、、
f:id:bitterharvest:20160811174011j:plain

正殿の模型もあった。
f:id:bitterharvest:20160811174542j:plain

正殿に入るためには、いくつかの門を通らなければならない。その中の一つが次の写真である。雨にもかかわらず、沢山の観光客がこの門をくぐり抜けようとしていた。
f:id:bitterharvest:20160811174346j:plain

夕飯は古民家の大家でとった。外国人観光客であふれかえっていた。さらに、店員の多くも、外国人。沖縄の多様性を実感した。
f:id:bitterharvest:20160811175104j:plain

後で調べてみると、昨年度、沖縄県を訪ねた観光客の総数は776万人で、そのうち、外国人が150万人を占めるそうだ、
沖縄タイムスの資料では次のようになっている。
f:id:bitterharvest:20160811175747j:plain

外国人観光客の伸びが著しいことが分かる。

ワイキキでのんびりと過ごす

息子の結婚式があり、15年ぶりにハワイに行ってきた。前回と前々回はハワイ島とカウアイ島がメインだったが、今回はオハフ島、それも、ワイキキである。とても、久しぶりのことだ。

これまで登ったことがなかったダイアモンドヘッドに挑戦してみた。
f:id:bitterharvest:20160728095532j:plain

といってもたいしたことはない。ワイキキからJTBがサービスで提供しているOlioliバスが火口まで連れていってくれる。
f:id:bitterharvest:20160728095718j:plain

この記事は、成田へ向かう飛行機の中から、作成している。飛び立って、すぐに、ホノルルの街が見え、やがて、ダイアモンドヘッドを空から見ることができた。大きな火口で、ほとんどが吹き飛ばされたようで、山のすそ野がほんの少ししか残されていない。火口を囲むように、山のふちが残っているのだが、ダイアモンドヘッドはその中で一番高いところである。そこには、三角点が構築されていた。
f:id:bitterharvest:20160728095849j:plain

ダイアモンドヘッドは人気があるようで、たくさんの人が蟻のように列をなしてハイキングを楽しんでいた。
f:id:bitterharvest:20160728100019j:plain

昔から、人気があったのだろうかと疑問に思ったが、最近の健康志向が人々を駆り立てているのかもしれない。歩数計で計測したが、往復1時間、歩数にして6000歩であった。一日の運動としては丁度いいのだが、暑いので、快適とは言えない。

別の日には、カイルアに行ってみた。ハワイで一番美しい海岸といわれているビーチがある。海辺では、正式な名前が分からないのだが、ハンググライダーの道具を利用して、海上を滑ってゆくマリンスポーツに興じている人を見かけた。とても面白そうで、時間があれば、習ってみたいなと思った。
f:id:bitterharvest:20160728100101j:plain
f:id:bitterharvest:20160728100145j:plain

アメリカも夏休みに入っていたので、地元の子供たちが海岸で遊んでいた。彼らの写真を撮っていると、カンザスから来たというご婦人が我々の写真も撮ってあげましょうと話しかけてきた。息子さんがカレッジを卒業し、お金がかからなくなったのでほっとしていると教えてくれた。どこの親も同じ思いを抱くようだ。
f:id:bitterharvest:20160728100251j:plain
f:id:bitterharvest:20160728100459j:plain

アラモア公園の近くのビーチでも、地元の子供たちがヨットを操る練習をしていた。
f:id:bitterharvest:20160728100555j:plain
彼等にとっても、この夏休みは、大事な季節のようだ。

時間があったので、近くの水族館も訪問した(この周りにはポケモンGOに興じている人がたくさんいた。事故を起こさないとよいが)。
f:id:bitterharvest:20160728102136j:plain
いろいろな割引がついて、3ドルで入場できたのには感激とともに感謝もした。ニモを見ることもできた。
f:id:bitterharvest:20160728101854j:plain

量子力学で生命の謎を解く』の本を読んでいるときに、ニモの帰趨本能についての記述があったが(第5章ニモの家を探せ)、生きているニモに会えて、嬉しくなった。

量子力学の世界を垣間見る(1):粒子が相互に交換されるモデルの概略

ケットとブラでの状態の表し方、そして、状態の重ね合わせも学んだので、量子力学の世界を少しだけ垣間見ることにしよう。

3年前の秋(2013年)に情報科学・工学関連の学会が鳥取大学で開催された。修士の学生が発表したのだが、彼の発表の合間を利用して、鳥取砂丘を訪れた。台風が通り過ぎた後で、すさまじい風が吹いていて、砂丘では、多量の砂が飛散していた。たくさんの砂が飛び散っているにもかかわらず、(平行移動しているかもしれないが)砂丘の形が変わらないのは、現象として興味深かった。飛び散った砂粒の後に、他の場所からそれを補う砂粒が移ってくるのだろう。
f:id:bitterharvest:20160715135827j:plain

今回はこれに似たような現象を量子力学の世界で考えてみよう。

粒子が飛び交っている世界、何で表したらよいであろうか。一つは時間だ。時間とともに、砂粒が移動しているので、それを上手に表すことが必要になる。粒子の移動はどのように表したらよいであろうか。時間ごとの位置というのもある。しかし、これらは、それぞれの粒子の位置を表さなければならないので大変そうである。

もし、粒子が等速運動をしていると仮定したらどうであろうか。個々の粒子に共通する速度で現象を表すことができるようになる。それでは速度はどのように表したらよいであろうか。我々が手に入れている道具は、生成演算子と消滅演算子である。単位時間の間に作用する生成演算子と消滅演算子の列を粒子が移動する速度ととらえてはどうであろうか。

冒頭の話では、粒子は飛んでいるけれども、砂丘の形は変わっていないという話をした。そこで、単位時間の中で、隣り合う場所にある粒子が入れ替わるという単純なモデルを考えてみることにしよう。これであれば、それぞれの格子点で観察される粒子の数は変化しないので、砂丘の形が変わらないのと似たような現象を見ることができるかもしれない。

1.粒子が相互に交換されるモデル

それでは隣り合う格子点の間で粒子が相互に交換されるモデルを考えることとする。モデルは図のようになる。図で上の矢印は、\(l\)番目の格子点から\(l+1\)番目の格子点へ1粒子が移る姿を示した。具体的には、\(l\)番目の格子点で消滅演算子が作用し、それに引き続いて、\(l+1\)番目の格子点で生成演算子が作用する。図の下の矢印はこれとは反対である。
f:id:bitterharvest:20160826082049p:plain
今、1粒子状態の重なり合いを考える。重ね合わせは時間\(t\)とともに変化するものとし、\( \hat{\Psi}\),\( \hat{\psi}_l\)は\(t\)の関数とする。そこで、1粒子の状態を例によって次のように表す。なお、\( \hat{\Psi}(t)\)は規格化されているとする。
\( \hat{\Psi}(t) = \sum_{l=-\infty}^\infty \psi_l(t) \hat{a}^\dagger_l|0> \)

今、\( \hat{\Psi}(t)\)を状態であることを強調するために、\( \hat{\Psi}(t)=|\Psi(t)>\)と表すことにしよう。


微小時間\(dt\)での、状態の移動量は次のようになる。
\begin{align*}
& \sum_{l=-\infty}^\infty (\hat{a}^\dagger_{l+1} \hat{a}_l + \hat{a}^\dagger_{l} \hat{a}_{l+1}) | \Psi(t)> \\
=& \sum_{l=-\infty}^\infty (\psi_{l-1}(t)+\psi_{l+1}(t))\hat{a}^\dagger_{l}|0>
\end{align*}

状態を微分したものは、係数が異なるだけで状態の移動量と同じになる。即ち、
\begin{align*}
&\frac{d}{dt} |\Psi(t)> \\
=& \alpha \sum_{l=-\infty}^\infty (\hat{a}^\dagger_{l+1} \hat{a}_l + \hat{a}^\dagger_{l} \hat{a}_{l+1}) | \Psi(t)> \\
=& \alpha \sum_{l=-\infty}^\infty (\psi_{l-1}(t)+\psi_{l+1}(t))\hat{a}^\dagger_{l}|0>
\end{align*}

上の式を一般化しよう。微小時間\(dt\)での、粒子への作用を\(\hat{H}\)で表すことにしよう。これはハミルトニアンと呼ばれる。一般に、重ね合わせの状態\(|\Psi(t)>\)を微分したものは、この状態にハミルトニアン\(\hat{H}\)で与えられる作用を施したものに、係数\(\alpha\)倍だけ異なる。即ち、
\(\frac{d}{dt}|\Psi(t)>=\alpha \hat{H}|\Psi(t)>\)
となる。なお、\(|\Psi(t)>\)は、重ね合わせ状態である。従って、これまで話を進めている1粒子状態に限らず、一つの格子点に複数の粒子が存在する場合も含んでいる。

一般に量子力学では係数を次のように定めている。
\(i \hbar \frac{d}{dt}|\Psi(t)>=\hat{H}|\Psi(t)>\)
ここで、\(\hbar\)はディラック定数と呼ばれる。\(\hbar\)は、\(1.054571...\times 10^{-34} \ J \ sec\)で、\(J \ sec\)は\(Kg \ m^2 /sec\)である。

隣り合う格子点の間で粒子が相互に移動するモデルでは
\(\hat{H}=-g\sum_{l=-\infty}^\infty (\hat{a}^\dagger_{l+1} \hat{a}_l + \hat{a}^\dagger_{l} \hat{a}_{l+1})\)
として計算しよう。これより、
\( i \hbar \frac{d}{dt}\psi_m(t) = -g [\psi_{m -1}(t) + \psi_{m+1}(t)] \)
を得る。

2.定常解を求める

方程式
\( l \hbar \frac{d}{dt}\psi_m(t) = -g [\psi_{m -1}(t) + \psi_{m+1}(t)]\)
を得ることができたので、これの解を求めることにしよう。取り敢えず、定常解を求めることにする。

専門用語を説明する必要がある。定常解の前提となるのが定常状態だ。これは、任意の演算子\(\hat{O}\)に対して、\(<\Psi(t)|\hat{O}|\Psi(t)>\)が時間\(t\)に依存しない場合、状態\(|\Psi(t)>\)を定常状態と呼ぶ。このとき、
定常状態\(|\Psi(t)>\)が
\(i \hbar \frac{d}{dt}|\Psi(t)>=\hat{H}|\Psi(t)>\)
の解であるとき定常解という。

1粒子状態のときは、粒子が\(l\)番目の格子点で発見される確率\(P_l(t)=\psi^*_l(t)\psi_l(t)\)が時間に依存しないとき、
\(\psi_l(t)\)が
\( i \hbar \frac{d}{dt}\psi_m(t) = -g [\psi_{m -1}(t) + \psi_{m+1}(t)]\)
の定常解である。

定常解はいくつかあるが、その一つは、
\(\psi_l(t) = Ae^{-i \omega t+ i \kappa l}\)
である。但し、\(\hbar \omega= -2g \cos \kappa \)である。また、\(\omega\)は角振動数と呼ばれる。\(\kappa\)は1格子点間の間での位相差である。\(d\)を格子点間の長さとすると、\(\frac{2\pi}{\kappa}\times d = \lambda\)(波長)である。\(k = \kappa / d\)は波数と呼ばれる。

定常解であることは、下記の式
\(\psi^*_l(t)\psi_l(t) = A^* e^{i \omega t- i \kappa l}Ae^{-i \omega t+ i \kappa l}=A^*A=|A|^2 \)
が時間\(t\)に寄らないことから明らかである。

\(\psi_l(t) = Ae^{-i \omega t+ i \kappa l}\)がどのようなものかをイメージさせてくれるのがスクリューである(fukutiの製品紹介から借用させてもらう)。スクリューは角振動数\(\omega\)で回転し、その刃のピッチは格子点間での位相差が\(\kappa\)となるように刻まれている。スクリューの刃先が\(\psi_l(t)\)を表しているといえる。なお、図で横方向が格子点の並びを表し、縦方向が\(\psi_l(t)\)の実数部、奥行方向が虚数部である。
f:id:bitterharvest:20160719093533j:plain

それでは上記のスクリューを図に垂直方向に切断してその断面を見てみよう。
\(t=0\)の時は、次のようになっている。なお、下図で、上の部分が断面図、下の部分は、解の実数部を描いたものである(刃先を壁面に投影したもの)。
f:id:bitterharvest:20160719094922p:plain
解の実数部を見ると、コサインのカーブをがいていることが分かる。

次の図は、\(\omega\)だけ進んだ\(t=t'\)の時の断面図と解の実数部を描いたものである。
f:id:bitterharvest:20160719095611p:plain

解が無限な領域であるので、プログラムでは表現しにくい。そこで、次回は、区間を有限にし、Haskellの世界で描写することにしよう。

そろそろ梅雨も明けそうなので、明日から一週間ハワイで休養する。その間に、有限な区間での量子力学の世界を考えることとする。

量子力学の初歩をHaskellで学ぶ(2):重ね合わせ

量子力学の特徴の一つは、状態の重ね合わせである。これは、量子状態の時はいくつかの状態を複数個同時に取るが、観察すると、ある一つの状態しか得られないという摩訶不思議な現象である。また、同じ条件で観察したとしても、観察するたびに取る状態が異なる。そこで、観察される度合いを、それぞれの状態の係数で表すこととする。数学的には、状態の重ね合わせは、状態の線形結合であらわす。それぞれの状態は、観察される度合いを表した係数を有する。係数には、複素数が用いられる。

状態の重なり合いは、ケットを用いての状態の線形結合でも、ブラを用いての状態の線形結合でも表すことができる。

1粒子状態の重なり合いをケットで表すと次のようになる。
\begin{align*}
& \hat{\Psi}^\dagger | ...00\dot{0}00...> \\
= & \sum_{i=-\infty}^\infty \psi_i \hat{a}_i^\dagger | ...00\dot{0}00...> \\
= & ... + \psi_{-2} |...0010\dot{0}00...> + \psi_{-1} |...001\dot{0}00...> + \psi_0 |...00\dot{1}00...> \\
& + \psi_1 |...00\dot{0}100...> + \psi_2 |...00\dot{0}0100...> + ...
\end{align*}

これをブラで表すと次のようになる。
\begin{align*}
& <...00\dot{0}00...|\hat{\Psi} \\
= & <...000\dot{0}00...| \sum_{i=-\infty}^\infty \hat{a}_i \psi_i^* \\
= & ...<...0010\dot{0}00...| \psi_{-2}^* + <...001\dot{0}00...|_{-1} \psi_{-1}^* + <...000\dot{1}00...| \psi_0^* \\
& + <...00\dot{0}100...|\psi_1^* + <...000\dot{0}0100...| \psi_2^* + ...
\end{align*}

ただし、同じ状態を表しているケットでの係数\(\psi_i\)とブラの係数\(\psi_i^*\)はお互いに共役な複素数となっている。

これらの線形結合は次のことを意味する。全体で、\( \sum_{i=-\infty}^\infty \psi_i^*\psi_i \)回の実験を行った。この時、状態\(i\)が観察された回数は\( \psi_i^*\psi_i \)である。もし、\( \sum_{i=-\infty}^\infty \psi_i^*\psi_i =1\)ならば、この線形結合は規格化されているという。

以上が重ね合わせの概略であるが、以下で、プログラムを動かして、そのニュアンスをつかむことにしよう。

1.ケットでの重ね合わせ

Teat1のプログラムをロードしてみよう。次のようになると思う。

GHCi, version 7.8.3: http://www.haskell.org/ghc/  :? for help
Loading package ghc-prim ... linking ... done.
Loading package integer-gmp ... linking ... done.
Loading package base ... linking ... done.
Prelude> :cd C:\Users\XXXXXX
Prelude> :load "test1.hs"
[1 of 7] Compiling Qtm.KetBra.Ket   ( Qtm\KetBra\Ket.hs, interpreted )
[2 of 7] Compiling Qtm.KetBra.Bra   ( Qtm\KetBra\Bra.hs, interpreted )
[3 of 7] Compiling Qtm.Entangle.BraEntangle ( Qtm\Entangle\BraEntangle.hs, interpreted )
[4 of 7] Compiling Qtm.Entangle.KetEntangle ( Qtm\Entangle\KetEntangle.hs, interpreted )
[5 of 7] Compiling Qtm.Entangle     ( Qtm\Entangle.hs, interpreted )
[6 of 7] Compiling Qtm.KetBra       ( Qtm\KetBra.hs, interpreted )
[7 of 7] Compiling Test1            ( test1.hs, interpreted )
Ok, modules loaded: Qtm.KetBra, Qtm.Entangle, Qtm.Entangle.KetEntangle, Qtm.Entangle.BraEntangle, Qtm.KetBra.Bra, Qtm.KetBra.Ket, Test1.
*Test1> 

まずケットについてだが、test1では次の状態を用意している。
\begin{align*}
a =& \\
b =& (5.3 + 4.2i)|...00\dot{0}100...> \\
c =& (3.3 + 3.2i)|...00\dot{0}00100...> + (5.3 + 4.2i)|...00\dot{0}100...>\\
d =& (1.3 + 1.2i)|...00\dot{0}0100...> + (3.3 + 3.2i)|...00\dot{0}00100...> + (5.3 + 4.2i)|...00\dot{0}100...>\\
g =& (3.3 - 3.2i)|...00\dot{0}100...> + (3.1 - 0.2i)|...00\dot{0}000100...> + (2.3 - 1.2i)|...001\dot{0}00...> \\
& + (4.3 + 3.3i)|...00\dot{0}0100...> + (3.3 + 0.2i)|...00\dot{0}00100...>\\
h =& (2.3 - 0.2i)|...00\dot{0}00100...> + (3.4 - 2.2i)|...0010\dot{0}00...> + (5.3 - 1.5i)|...001\dot{0}00...> \\
& + (1.3 + 0.3i)|...00\dot{0}100...> + (3.2 + 2.2i)|...00\dot{0}0100...>\\
\end{align*}

その他に、\(p\)と\(q\)は\(g\)と\(h\)を状態を右から左へ昇順に並べたもの、\(r\)は\(g\)と\(h\)をさらに重ね合わせたもの、\(t\)は\(r\)を正規化したものである。

それでは、\(a,b,c,d,g,h\)それぞれのHaskellでの内部表現を見てみよう。

*Test1> a

*Test1> b
5.3 :+ 4.2_a1^
*Test1> c
3.3 :+ 3.2_a3^ + 5.3 :+ 4.2_a1^
*Test1> d
1.3 :+ 1.2_a2^ + 3.3 :+ 3.2_a3^ + 5.3 :+ 4.2_a1^
*Test1> g
3.3 :+ (-3.2)_a1^ + 3.1 :+ (-0.2)_a4^ + 2.3 :+ (-1.2)_a-1^ + 4.3 :+ 3.3_a2^ + 3.3 :+ 0.2_a3^
*Test1> h
2.3 :+ (-0.2)_a3^ + 3.4 :+ (-2.2)_a-2^ + 5.3 :+ (-1.5)_a-1^ + 1.3 :+ 0.3_a1^ + 3.2 :+ 2.2_a2^

上手くいっているようである。でも、分かりにくいので、プリティー・プリントで見てみよう。

*Test1> prEntangle a
""
*Test1> prEntangle b
"(5.3 :+ 4.2)|...0000(0)1000....>"
*Test1> prEntangle c
"(3.3 :+ 3.2)|...000000(0)001000....> + (5.3 :+ 4.2)|...0000(0)1000....>"
*Test1> prEntangle d
"(1.3 :+ 1.2)|...00000(0)01000...> + (3.3 :+ 3.2)|...000000(0)001000...> + (5.3 :+ 4.2)|...0000(0)1000...>"
*Test1> prEntangle g
"(3.3 :+ (-3.2))|...0000(0)1000...> + (3.1 :+ (-0.2))|...0000000(0)0001000...> + (2.3 :+ (-1.2))|...0001(0)000...> + (4.3 :+ 3.3)|...00000(0)01000...> + (3.3 :+ 0.2)|...000000(0)001000...>"
*Test1> prEntangle h
"(2.3 :+ (-0.2))|...000000(0)001000...> + (3.4 :+ (-2.2))|...00010(0)0000...> + (5.3 :+ (-1.5))|...0001(0)000...> + (1.3 :+ 0.3)|...0000(0)1000...> + (3.2 :+ 2.2)|...00000(0)01000...>"

\(g,h\)を状態でソートした\(p,q\)を見てみよう。

*Test1> prEntangle p
"(2.3 :+ (-1.2))|...0001(0)000...> + (3.3 :+ (-3.2))|...0000(0)1000...> + (4.3 :+ 3.3)|...00000(0)01000...> + (3.3 :+ 0.2)|...000000(0)001000...> + (3.1 :+ (-0.2))|...0000000(0)0001000...>"
*Test1> prEntangle q
"(3.4 :+ (-2.2))|...00010(0)0000...> + (5.3 :+ (-1.5))|...0001(0)000...> + (1.3 :+ 0.3)|...0000(0)1000...> + (3.2 :+ 2.2)|...00000(0)01000...> + (2.3 :+ (-0.2))|...000000(0)001000...>"

\(g,h\)を重ね合わせた\(r\)を見てみよう。

*Test1> prEntangle r
"(3.4 :+ (-2.2))|...00010(0)0000...> + (7.6 :+ (-2.7))|...0001(0)000...> + (4.6 :+ (-2.9000000000000004))|...0000(0)1000...> + (7.5 :+ 5.5)|...00000(0)01000...> + (5.6 :+ 0.0)|...000000(0)001000...> + (3.1 :+ (-0.2))|...0000000(0)0001000...>"

これを正規化した\(t\)を見てみよう。

*Test1> prEntangle t
"(0.22014428368391428 :+ (-0.14244630120723867))|...00010(0)0000...> + (0.492087222352279 :+ (-0.17482046057252018))|...0001(0)000...> + (0.2978422661605899 :+ (-0.1877701243186328))|...0000(0)1000...> + (0.4856123904792227 :+ 0.35611575301809667)|...00000(0)01000...> + (0.3625905848911529 :+ 0.0)|...000000(0)001000...> + (0.20071978806474539 :+ (-1.2949663746112606e-2))|...0000000(0)0001000...>"

2.ブラでの重ね合わせ

ブラについてだが、test1では次の状態を用意している。
\begin{align*}
a' =& \\
b' =& <...00\dot{0}100...|(5.3 - 4.2i) \\
c' =& <...00\dot{0}100...|(5.3 - 4.2i) + <...00\dot{0}00100...|(3.3 - 3.2i)\\
d' =& <...00\dot{0}100...|(5.3 - 4.2i) + <...00\dot{0}00100...|(3.3 - 3.2i) + <...00\dot{0}0100...|(1.3 - 1.2i)\\
g' =& <...00\dot{0}100...|(3.3 + 3.2i) + <...00\dot{0}000100...|(3.1 + 0.2i) + <...001\dot{0}00...|(2.3 + 1.2i) \\
& + <...00\dot{0}0100...>(4.3 - 3.3i) + <...00\dot{0}00100...>(3.3 - 0.2i)\\
h' =& <...00\dot{0}00100...|(2.3 + 0.2i) + <...0010\dot{0}00...|(3.4 + 2.2i) + <...001\dot{0}00...|(5.3 + 1.5i) \\
& + <...00\dot{0}100...|(1.3 - 0.3i) + <...00\dot{0}0100...|(3.2 - 2.2i)\\
\end{align*}

その他に、\(p'\)と\(q'\)は\(g'\)と\(h'\)を状態を右から左へ昇順に並べたもの、\(r'\)は\(g'\)と\(h'\)をさらに重ね合わせたもの、\(t'\)は\(r'\)を正規化したものである。

それでは、\(a',b',c',d',g',h'\)それぞれのHaskellでの内部表現を見てみよう。

*Test1> a'

*Test1> b'
a1_5.3 :+ (-4.2)
*Test1> c'
a1_5.3 :+ (-4.2) + a3_3.3 :+ (-3.2)
*Test1> d'
a1_5.3 :+ (-4.2) + a3_3.3 :+ (-3.2) + a2_3.3 :+ (-3.2)
*Test1> g'
a1_3.3 :+ 3.2 + a4_3.1 :+ 0.2 + a-1_2.3 :+ 1.2 + a2_4.3 :+ (-3.3) + a3_3.3 :+ (-0.2)
*Test1> h'
a3_2.3 :+ 0.2 + a-2_3.4 :+ 2.2 + a-1_5.3 :+ 1.5 + a1_1.3 :+ (-0.3) + a2_3.2 :+ (-2.2)

上手くいっているようである。でも、分かりにくいので、プリティー・プリントで見てみよう。

*Test1> prCoEntangle a'
""
*Test1> prCoEntangle b'
"<...0000(0)1000...|5.3 :+ (-4.2)"
*Test1> prCoEntangle c'
"<...0000(0)1000...|5.3 :+ (-4.2) + <...000000(0)001000...|3.3 :+ (-3.2)"
*Test1> prCoEntangle d'
"<...0000(0)1000...|5.3 :+ (-4.2) + <...000000(0)001000...|3.3 :+ (-3.2) + <...00000(0)01000...|3.3 :+ (-3.2)"
*Test1> prCoEntangle g'
"<...0000(0)1000...|3.3 :+ 3.2 + <...0000000(0)0001000...|3.1 :+ 0.2 + <...0001(0)000...|2.3 :+ 1.2 + <...00000(0)01000...|4.3 :+ (-3.3) + <...000000(0)001000...|3.3 :+ (-0.2)"
*Test1> prCoEntangle h'
"<...000000(0)001000...|2.3 :+ 0.2 + <...00010(0)0000...|3.4 :+ 2.2 + <...0001(0)000...|5.3 :+ 1.5 + <...0000(0)1000...|1.3 :+ (-0.3) + <...00000(0)01000...|3.2 :+ (-2.2)"

\(g',h'\)を状態でソートした\(p',q'\)を見てみよう。

*Test1> prCoEntangle p'
"<...0000000(0)0001000...|3.1 :+ 0.2 + <...000000(0)001000...|3.3 :+ (-0.2) + <...00000(0)01000...|4.3 :+ (-3.3) + <...0000(0)1000...|3.3 :+ 3.2 + <...0001(0)000...|2.3 :+ 1.2"
*Test1> prCoEntangle q'
"<...000000(0)001000...|2.3 :+ 0.2 + <...00000(0)01000...|3.2 :+ (-2.2) + <...0000(0)1000...|1.3 :+ (-0.3) + <...0001(0)000...|5.3 :+ 1.5 + <...00010(0)0000...|3.4 :+ 2.2"

\(g',h'\)を重ね合わせた\(r'\)を見てみよう。

*Test1> prCoEntangle r'
"<...0000000(0)0001000...|3.1 :+ 0.2 + <...000000(0)001000...|5.6 :+ 0.0 + <...00000(0)01000...|7.5 :+ (-5.5) + <...0000(0)1000...|4.6 :+ 2.9000000000000004 + <...0001(0)000...|7.6 :+ 2.7 + <...00010(0)0000...|3.4 :+ 2.2"

これを正規化した\(t'\)を見てみよう。

*Test1> prCoEntangle t'
"<...0000000(0)0001000...|0.20071978806474539 :+ 1.2949663746112606e-2 + <...000000(0)001000...|0.3625905848911529 :+ 0.0 + <...00000(0)01000...|0.4856123904792227 :+ (-0.35611575301809667) + <...0000(0)1000...|0.2978422661605899 :+ 0.1877701243186328 + <...0001(0)000...|0.492087222352279 :+ 0.17482046057252018 + <...00010(0)0000...|0.22014428368391428 :+ 0.14244630120723867"

3.重ね合わせの内積

重ね合わせでの内積を求めてみよう。\(g\)と\(g'\)、\(h\)と\(h'\)、\(t\)と\(t'\)はそれぞれ、同じ重ね合わせをケットとブラで表したものである。このうち、\(t\)と\(t'\)は規格化されている。それでは、\(g\)と\(g'\)、\(h\)と\(h'\)、\(t\)と\(t'\)のそれぞれの内積\(u,v,w\)を見てみよう。

*Test1> u
9.65 :+ 0.0
*Test1> v
5.329999999999999 :+ 0.0
*Test1> w
1.0 :+ 0.0

量子力学の初歩をHaskellで学ぶ(1):ブラとケット

前回の記事までで、量子力学Haskellで表す方法について説明してきた。まだ、初歩の初歩という段階だが、ここまでのプログラムを利用して量子力学の世界に少しだけ触れてみよう。

プログラムはすべてBitHubに登録してあるので、そこからダウンロードして利用してほしい。テストプログラムとして、ケットとブラを利用するTest0と重ね合わせを利用するTest1があるので、これを利用してほしい。

なお、量子力学での演算子Haskellでの関数との対応は以下の表のとおりである(量子力学演算子については、西野友年著『場の理論』に準拠している)。

量子力学ケットブラ
真空状態(ケット)\(|...00\dot000...>\)KetZero
真空状態(ブラ)\(<...00\dot000...|\)BraZero
区間1,2に1粒子(有)\(|...00\dot01100...>\)2 :+: 1 :+: KetZero
区間1,2に1粒子(待)\(<...00\dot01100...|\)BraZero :-: 1 :-: 2
生成演算子\(\hat{a}^\dagger_i\)i +^^+ i
消滅演算子\(\hat{a}_i\)i -^^- i
生成演算子使用例\(\hat{a}^\dagger_1|...00\dot000...>\)i +^ KetZero
生成演算子使用例\(<...00\dot000...|\hat{a}^\dagger_1\)BraZero ^+ i
消滅演算子使用例\(\hat{a}_1|...00\dot000...>\)1 -^ KetZero
消滅演算子使用例\(<...00\dot000...|\hat{a}_1\)BraZero ^- 1
内積 ^*^
内積使用例\(<...00\dot000...|...00\dot000...>\)BraZero ^*^ KetZero
状態でない\(0\)ZeroZero'
f:id:bitterharvest:20160502092414j:plain

0.復習

前の記事を読まなくても良いようにするために、簡単に復習しておこう。

量子力学では、量子の状態をケットとブラで表現する。ケットとブラは、本来は、3次元で連続な状態を表す。しかし、ここでは、量子力学の考え方を理解するために、ケットとブラは、1次元で離散的である。即ち、1次元の直線が、等間隔の格子で区切られている。

ケットは、どの格子点に粒子が存在するかで、量子の状態を表す。ケットは、左側に\(|\)の記号、右側に\(>\)の記号を有し、それらの間で、状態を表す。ここでは、0番目の格子点を表しているところの上にドットをつけ、左側に行くにしたがって番号が一つずつ下がり、右に行くにしたがって番号が一つずつ上がるようにする。

例えば、1と2番目のそれぞれに1粒子が存在する場合には、\(|...00\dot{0}1100...>\)となる。また、どこにも粒子が存在しない状態\(|...00\dot{0}00...>\)は真空状態と呼ばれる。

ケットとブラに作用するものとして、演算子が存在する。これらの演算子はケットの場合には左から、ブラの場合には右から作用する。

\(\hat{a}^\dagger_i\)は生成演算子と呼ばれる。これはケットに左から作用させると、\(i\)番目の格子点での粒子を1増やす。\(\hat{a}_i\)は消滅演算子と呼ばれ、生成演算子とは逆の働きをする。即ち、ケットに左から作用させると、\(i\)番目の格子点での粒子を1減ずる。しかし、減ずることができないとき、即ち、\(i\)番目のそれが作用させる前に0のときは、状態ではなくなる。例を挙げると、
\begin{align*}
\hat{a}^\dagger_{-2}|...00\dot{0}1100...>=&|...0010\dot{0}1100...> \\
\hat{a}_2 |...00\dot{0}1100...>=&|...00\dot{0}100...>
\end{align*}
さてもう一方のブラであるが、ケットとは共役になっていて、これも量子の状態を表す。ケットは、左側に\(<\)の記号、右側に\(|\)の記号を有し、それらの間で、状態を表す。ここでは、0番目の格子点を表しているところの上にドットをつけ、左側に行くにしたがって番号が一つずつ下がり、右に行くにしたがって番号が一つずつ上がるようにする。真空の状態は、ケットと同じように、\(<...00\dot{0}00...|\)である。

しかし、演算子は逆に働く。消滅演算子\(\hat{a}_i\)を右から作用させると、\(i\)番目の格子点での値が1増える。例えば、真空状態に\(\hat{a}_1\)を作用させると\(<...00\dot{0}00...|\hat{a}_1=<...00\dot{0}100...|\)となる。生成演算子はこれとは逆の作用をする。

なお、共役であることから次の関係が成り立つ。
\begin{align*}
(\hat{a}_{i})^\dagger=&\hat{a}^\dagger_{i} \\
(\hat{a}^\dagger_{i})^\dagger=&\hat{a}_{i} \\
(\hat{a}_{i}\hat{a}^\dagger_{k})^\dagger=&\hat{a}_{k}\hat{a}^\dagger_{i} \\
(\hat{a}^\dagger_{i}|...00\dot{0}00...>)^\dagger=&<...00\dot{0}00...|\hat{a}_{i} \\
(<...00\dot{0}00...|\hat{a}_{i})^\dagger=&\hat{a}^\dagger_{i}|...00\dot{0}00...> \\
\end{align*}

1.ケット

Teat0のプログラムをロードしてみよう。次のようになると思う。

GHCi, version 7.8.3: http://www.haskell.org/ghc/  :? for help
Loading package ghc-prim ... linking ... done.
Loading package integer-gmp ... linking ... done.
Loading package base ... linking ... done.
Prelude> :cd C:\Users\xxxxxx
Prelude> :load "Test0.hs"
[1 of 4] Compiling Qtm.KetBra.Ket   ( Qtm\KetBra\Ket.hs, interpreted )
[2 of 4] Compiling Qtm.KetBra.Bra   ( Qtm\KetBra\Bra.hs, interpreted )
[3 of 4] Compiling Qtm.KetBra       ( Qtm\KetBra.hs, interpreted )
[4 of 4] Compiling Test0             ( Test0.hs, interpreted )
Ok, modules loaded: Test0, Qtm.KetBra, Qtm.KetBra.Ket, Qtm.KetBra.Bra.
*Test0> 

まずケットについてだが、test0では次の状態を用意している。
\begin{align*}
a =& |...00\dot{0}00..> \\
b =& |...00\dot{0}0100..> \\
c =& |...00\dot{0}01100..> \\
d =& |...00\dot{1}01100..> \\
e =& \hat{a}_4 \hat{a}_3 \hat{a}^\dagger_2 \hat{a}^\dagger_4 \hat{a}^\dagger_0 \hat{a}^\dagger_3|...00\dot{0}00..>
\end{align*}

それでは、それぞれのHaskellでの内部表現を見てみよう。

*Test0> a
| ...00(0)00... >
*Test0> b
,a2+| ...00(0)00... >
*Test0> c
,a3+,a2+| ...00(0)00... >
*Test0> d
,a0+,a3+,a2+| ...00(0)00... >
*Test0> e
,a2+,a0+| ...00(0)00... >

上手くいっているようである。でも、分かりにくいので、プリティー・プリントで見てみよう。

*Test0> prKet a
"|...000(0)000...>"
*Test0> prKet b
"|...00000(0)01000...>"
*Test0> prKet c
"|...000000(0)011000...>"
*Test0> prKet d
"|...000000(1)011000...>"
*Test0> prKet e
"|...00000(1)01000...>"

それでは、これらの状態を使って、少し、遊んでみよう。dの状態から始めて、生成演算子\(\hat{a}^\dagger_{-1}\),\(\hat{a}^\dagger_{-3}\),\(\hat{a}^\dagger_0\)を次々に作用させてみよう。

*Test0> prKet $ (-1) +^ d
"|...000001(1)011000...>"
*Test0> prKet $ (-3) +^ (-1) +^ d
"|...000101(1)011000...>"
*Test0> prKet $ 0 +^ (-3) +^ (-1) +^ d
"|...000101(2)011000...>"

引き続き消滅演算子\(\hat{a}_3\),\(\hat{a}_0\),\(\hat{a}_{-3}\),\(\hat{a}_4\)を次々に作用させてみよう。次のようになるが、最後は状態がなくなってしまう(これは、粒子がないところから消滅しようとしたため、である)。

*Test0> prKet $ 3 -^ 0 +^ (-3) +^ (-1) +^ d
"|...000101(2)01000...>"
*Test0> prKet $ 0 -^ 3 -^ 0 +^ (-3) +^ (-1) +^ d
"|...000101(1)01000...>"
*Test0> prKet $ (-3) -^ 0 -^ 3 -^ 0 +^ (-3) +^ (-1) +^ d
"|...00001(1)01000...>"
*Test0> prKet $ 4 -^ (-3) -^ 0 -^ 3 -^ 0 +^ (-3) +^ (-1) +^ d
"0"

2.ブラ

まずケットについてだが、test0では次の状態を用意している。
\begin{eqnarray}
a' &=& <...00\dot{0}00..| \\
b' &=& <...00\dot{0}0100..| \\
c' &=& <...00\dot{0}01100..| \\
d' &=& <...00\dot{1}01100..| \\
e' &=& <...00\dot{0}00..|\hat{a}_4 \hat{a}_3 \hat{a}_2 \hat{a}^\dagger_4 \hat{a}_0 \hat{a}^\dagger_3
\end{eqnarray}

それでは、それぞれのHaskellでの内部表現を見てみよう。

*Test0> a'
< ...00(0)00... |
*Test0> b'
< ...00(0)00... |-a2,
*Test0> c'
< ...00(0)00... |-a2,-a3,
*Test0> d'
< ...00(0)00... |-a2,-a3,-a0,
*Test0> e'
< ...00(0)00... |-a2,-a0,

上手くいっているようである。でも、分かりにくいので、プリティー・プリントで見てみよう。

*Test0> prBra a'
"<...000(0)000...|"
*Test0> prBra b'
"<...00000(0)01000...|"
*Test0> prBra c'
"<...000000(0)011000...|"
*Test0> prBra d'
"<...000000(1)011000...|"
*Test0> prBra e'
"<...00000(1)01000...|"

それでは、これらの状態を使って、少し、遊んでみよう。dの状態から始めて、消滅演算子\(\hat{a}_{-1}\),\(\hat{a}_{-3}\),\(\hat{a}_0\)を次々に作用させてみよう。

*Test0> prBra $ d' ^- (-1)
"<...000001(1)011000...|"
*Test0> prBra $ d' ^- (-1) ^- (-3)
"<...000101(1)011000...|"
*Test0> prBra $ d' ^- (-1) ^- (-3) ^- 0
"<...000101(2)011000...|"

引き続き生成演算子\(\hat{a}^\dagger_3\),\(\hat{a}^\dagger_0\),\(\hat{a}^\dagger_{-3}\),\(\hat{a}^\dagger_4\)を次々に作用させてみよう。次のようになるが、最後は状態がなくなってしまう。

*Test0> prBra $ d' ^- (-1) ^- (-3) ^- 0 ^+ 3
"<...000101(2)01000...|"
*Test0> prBra $ d' ^- (-1) ^- (-3) ^- 0 ^+ 3 ^+ 0
"<...000101(1)01000...|"
*Test0> prBra $ d' ^- (-1) ^- (-3) ^- 0 ^+ 3 ^+ 0 ^+ (-3)
"<...00001(1)01000...|"
*Test0> prBra $ d' ^- (-1) ^- (-3) ^- 0 ^+ 3 ^+ 0 ^+ (-3) ^+ 4
"0"

3.ケットとブラの内積

test0には、内積の例もある。最初は\( e = |...00000(1)01000...> \)と\( e' = <...00000(1)01000...| \)の内積\(f\)である。最後は\( e = |...000(0)000...> \)と\( e' = <...00000(1)01000...| \)との内積\(g\)である。それぞれの値を求めよう。次に示すように正しい結果が得られている。

*Test0> f
1
*Test0> g
0

最後に共役の関係を見ておこう。

*Test0> e
,a2+,a0+| ...00(0)00... >
*Test0> invK e
< ...00(0)00... |-a0,-a2,
*Test0> prBra $ invK e
"<...00000(1)01000...|"
*Test0> e'
< ...00(0)00... |-a2,-a0,
*Test0> invB e'
,a0+,a2+| ...00(0)00... >
*Test0> prKet $ invB e'
"|...00000(1)01000...>"