【化学】高校時代化学赤点だったベンチャーのおっさんが量子化学を極めるため頑張るブログ


はじめに

ベンチャー(中小)企業を頑張って経営している社長です。40を超えましたが量子コンピュータ市場を根性のみで頑張ってます。今回は量子コンピュータはある程度理解してきたけど、量子化学が全くわからないという悩みがあります。しかし量子化学は仕事柄極めなくてはいけないというジレンマのなか、なんとか習得するまで根性で頑張ろうと思い、シリーズ化することにしました。ちなみにどうしても化学が理解できなくて高校時代はずっと赤点でした。スマートに理解できる気がしません。


何がわからないのか?

正直、量子化学の1から10まで何もかもが理解できません。しかし、仕事で量子コンピュータを行なっている以上わからないでは済まされないのです。1ヶ月で極めるべく基礎から学んでいきます。。。全てがわからないので、片っ端から学びます。とにかく化学が苦手です。今日は久々疎外感を感じまして、そろそろきちんと理解をして置こうと思います。


ハートリーフォック

最初に出てきてよくわからないのがハートリーフォックです。みんなかっこよく連呼しますが、正直何もわからず困ってます。ハートリーフォックが打ち合わせに出るたびに胃が痛くなります。調べます。

ハートリー=フォック方程式(ハートリーフォックほうていしき、英: Hartree–Fock equation)は、多電子系を表すハミルトニアンの固有関数(波動関数)を一個のスレーター行列式で近似(ハートリー=フォック近似)した場合に、それが基底状態に対する最良の近似となるような(スピンを含む)1電子分子軌道の組を探し出すための方程式である。ウラジミール・フォックによって導かれた。分子軌道法の基本となる方程式である。

https://ja.wikipedia.org/wiki/%E3%83%8F%E3%83%BC%E3%83%88%E3%83%AA%E3%83%BC%EF%BC%9D%E3%83%95%E3%82%A9%E3%83%83%E3%82%AF%E6%96%B9%E7%A8%8B%E5%BC%8F

ここからしてもうわかりませんが、なんかの関数を近似したときに何かを探すための方程式のようです。次によく聞くのがポストハートリーフォックです。


ポストハートリーフォック

ポスト-ハートリー–フォック (英: post-Hartree–Fock) 法とは、ハートリー–フォック法(平均場近似)を超える、より高精度な第一原理計算手法の総称である。代表的なものに、メラー–プレセット (MP) 法、配置間相互作用 (CI) 法、カップルドクラスター (CC) 法がある。何れも波動関数として複数のスレイター行列式の線形結合をとったものを使っており、計算精度を上げるに従って計算コストは飛躍的に増大する。

https://ja.wikipedia.org/wiki/%E3%83%9D%E3%82%B9%E3%83%88-%E3%83%8F%E3%83%BC%E3%83%88%E3%83%AA%E3%83%BC-%E3%83%95%E3%82%A9%E3%83%83%E3%82%AF%E6%B3%95

ハートリーフォックを超える計算のようです。代表的なものに挙げられているCI法とかCC法は量子コンピュータをやっているとよく聞きます。第一原理計算というのがよくわかりません。


第一原理計算

第一原理計算(だいいちげんりけいさん、英語:first-principles calculation、Ab initio calculation):第一原理に基づいて行われる計算(手法)の総称。

https://ja.wikipedia.org/wiki/%E7%AC%AC%E4%B8%80%E5%8E%9F%E7%90%86%E8%A8%88%E7%AE%97

。。。たらいまわしになってきました。


第一原理

第一原理(だいいちげんり、英語:first principles)とは、他のものから推論することができない命題である。

自然科学での第一原理(first principles)は、近似や経験的なパラメータ等を含まない最も根本となる基本法則をさし、そのことを前提にすると自然現象を説明することができるものである。第一原理には運動量の保存や物質の二重性など様々なものがある。理論計算の分野における第一原理の解釈は人により様々で、「既存の実験結果(事実)を含めて経験的パラメーター等を一切用いない」という強いものから、「実験結果に依らない」とする比較的緩い解釈まである。代表的第一原理は、ニュートン力学のような決定論と、確率論の根源をなす等確率の原理や熱力学に大別されその中間的性質として以下のような量子論的方法論が展開される。

https://ja.wikipedia.org/wiki/%E7%AC%AC%E4%B8%80%E5%8E%9F%E7%90%86

だいぶ違うところまできてしまった印象がありますが、「近似や経験的なパラメータ等を含まない最も根本となる基本法則」というところでかろうじて雰囲気がわかりました。根本的な原理みたいなやつだと思います。

つまり、第一原理計算も根本的な原理に基づいた計算みたいな感じでしょうか。

ということはポストハートリーフォックも高精度な根本的な原理に基づいた計算ということでしょうか。ということは、ハートリーフォックも第一原理計算なのでしょうか>>どうやら第一原理計算のようです。

つまり第一原理計算同士の争いのようです。だいぶわかってきました。次にわからないのが上に書いてある多電子系です。


多電子系

多電子系がよくわかりませんので調べました。多電子系で調べたら「電子相関」というキーワードが出てきました。正直こういう展開を求めていました。わからないのはこういう基本的なパワーワードです。

電子相関(でんしそうかん、英: electron correlation)とは、多電子系における電子間の位置の相関のこと。また電子相関エネルギーEcorr とは、多電子系における正確なエネルギーEexact とハートリー‐フォック近似によって計算したエネルギーEHF との差として定義される。つまり多電子系における電子間の相互作用をハートリー-フォック法で扱った場合、電子相関の一部しか取り込めていない。

https://ja.wikipedia.org/wiki/%E9%9B%BB%E5%AD%90%E7%9B%B8%E9%96%A2

多電子系を調べようと思ったのに文章の中に多電子系が出てきてしまいました。他のあらゆるところを探してもみんな多電子という言葉を知っていることを前提として話をしており、多電子を調べることができません。。。しかしここは実務者です。仮説を立ててさっさと次に行きます。「多」い「電子」の「系」ということで、多分たくさん電子があるのだと予想します。

次に解決は「電子の位置の相関」。。。何を言ってるのか全くわかりません。

相関を調べました。

二つのものが密接にかかわり合っていること。

二つのものの間に関連があること。互いに影響し合うこと。

https://kotobank.jp/word/%E7%9B%B8%E9%96%A2-89175

どうやら電子の位置の間に関連があるようです。たくさん電子があるので、その位置に関連性があるということでしょうか。

「電子相関エネルギーEcorr とは、多電子系における正確なエネルギーEexact とハートリー‐フォック近似によって計算したエネルギーEHF との差として定義」

ときました。つまり、ハートリーフォック近似は正確なエネルギーと差があるということで、近似を見てみたいです。


ハートリーフォック近似

ようやくここまできました。これは量子コンピュータをしているとよく出てきますのでぜひ覚えておきたいです。先ほどのハートリーフォックで出てきたのをみ返すと、

ハートリー=フォック方程式(ハートリーフォックほうていしき、英: Hartree–Fock equation)は、多電子系を表すハミルトニアンの固有関数(波動関数)を一個のスレーター行列式で近似(ハートリー=フォック近似)した場合に、それが基底状態に対する最良の近似となるような(スピンを含む)1電子分子軌道の組を探し出すための方程式

ということでした。ハートリーフォック近似は関数を一個のスレーター行列式で近似するということで、ここでわからないスレーター行列式を先に確認します。


スレーター行列式

スレイター行列式(スレイターぎょうれつしき、英: Slater determinant)とは、フェルミ粒子からなる多粒子系の状態を記述する波動関数を表すときに使われる行列式である。この行列式は2つの電子(または他のフェルミ粒子)の交換に関して符号を変化させることによって反対称性の必要条件と、その結果としてパウリの排他原理を満たす[。

https://ja.wikipedia.org/wiki/%E3%82%B9%E3%83%AC%E3%82%A4%E3%82%BF%E3%83%BC%E8%A1%8C%E5%88%97%E5%BC%8F

ここでも初見殺しです。。。フェルミ粒子がわかりません。

フェルミ粒子(フェルミりゅうし)は、フェルミオン(Fermion)とも呼ばれるスピン角運動量の大きさがhの半整数 (1/2, 3/2, 5/2, …) 倍の量子力学的粒子であり、その代表は電子である。

https://ja.wikipedia.org/wiki/%E3%83%95%E3%82%A7%E3%83%AB%E3%83%9F%E7%B2%92%E5%AD%90

もうスピン角運動量がわかりませんが、どうやら代表格が電子ということで、今回は電子でいいと思いました。つまり、多粒子系も多電子系としていいのではないでしょうか。ということは、、、

多電子系の状態を記述する波動関数を表すときに使われる行列式である。ということで、波動関数の表現のことのようです。波動関数は状態を表すベクトルのことだと思います。さらに続けると、、、

この行列式は2つの電子(または他のフェルミ粒子)の交換に関して符号を変化させることによって反対称性の必要条件と、その結果としてパウリの排他原理を満たす。

これは最近わからなかった2つの電子の交換に関して符号を変化がでてきました。反対称性を調べたいと思います。

反対称性(はんたいしょうせい)とは数学で、ある要素にある変換を施した結果が、元の要素に逆符号を付けたもの(実数でいえば絶対値が同じで正負が逆)と等しくなる、という性質をいう。

https://ja.wikipedia.org/wiki/%E5%8F%8D%E5%AF%BE%E7%A7%B0%E6%80%A7

電子を交換するとマイナスがつくようです。。。交換が何を指すのかまだわかりませんが、交換するとマイナスがつくことはわかりました。


パウリの排他原理

こちらもよく名前を聞きますが、よくわかりませんので調べます。

パウリの排他原理(パウリのはいたげんり、Pauli exclusion principle)とは、2つ以上のフェルミ粒子は同一の量子状態を占めることはできない、というものであり、1925年にヴォルフガング・パウリが提出したフェルミ粒子に関する仮定である[。

https://ja.wikipedia.org/wiki/%E3%83%91%E3%82%A6%E3%83%AA%E3%81%AE%E6%8E%92%E4%BB%96%E5%8E%9F%E7%90%86

どうやらパウリさんが提出したらしいのですが、2つ以上の電子(フェルミ粒子の代表は電子なので)は同一の量子状態を占めることはできないときました。

同一の量子状態を占める。。。とはなんのことなのでしょうか。正直難しくてwikipediaをみてもその後が理解できませんでした。

ブリタニカで調べました。

排他律あるいは禁制原理などとも呼ばれる。 1925年に W.パウリにより提唱された。同一の状態に電子はただ1個しか入ることができないという形で表わされ,元素の周期律を説明するのに不可欠の原理である。

https://kotobank.jp/word/%E3%83%91%E3%82%A6%E3%83%AA%E3%81%AE%E5%8E%9F%E7%90%86-113352

なんとかなるかと思いきやここでも肝心の説明は同一の状態と書いてあります。全くわかりません。デジタル大辞泉にチャレンジします。

一つの原子内では、2個以上の電子が同時にエネルギー・スピンなどの同じ状態をとることはないという原理。パウリが発見。禁制原理。排他原理。排他律。

https://kotobank.jp/word/%E3%83%91%E3%82%A6%E3%83%AA%E3%81%AE%E5%8E%9F%E7%90%86-113352

!!!エネルギー・スピンなどの同じ状態をとることはないという原理と書いてあります。少し先が見えました。エネルギーとスピンが関係あるようです。。。エネルギーはなんかエネルギーをもってるのでしょうか、、、スピンは回転してるのはなんとなくわかりますが、なんでこれがダメなのか全然わかりません。初心者にあまり優しくありません。世界大百科事典が助けてくれました。

原子の状態は,その原子に固有な各電子軌道に何個の電子が入っているかによって規定されるが,同一の軌道には反対向きのスピンをもつ電子が各1個ずつ,すなわち,合計2個までしか入れないという量子力学の原理をパウリの原理という。スピンまで指定すると,一つの電子状態にすでに電子が1個入っていれば,第2の電子はその状態に入れないことになるので,排他律exclusion principle,禁制原理ともいう。

https://kotobank.jp/word/%E3%83%91%E3%82%A6%E3%83%AA%E3%81%AE%E5%8E%9F%E7%90%86-113352

原子の状態はその原子に固有な電子軌道に何個の電子が入っているかによって規定されるが、同一の軌道には反対向きのスピンを持つ電子が各1個ずつすなわち合計2個までしか入れない。

この事典の説明が一番すごい。状態と言ってたものは、電子軌道に何個電子が入っているかに関係するようですし、1つの軌道には反対向きのスピンが2つ入るようです。

正直まだわかってませんが、ここまで説明してもらえると、高校時代に赤点をとった化学の思い出が蘇ってきました。なんか原子の周りを電子が回っていた気がします。イメージついてきました。


電子軌道

電子軌道(でんしきどう、英: electron orbital)とは、電子の状態を表す、位置表示での波動関数のことを指す。電子軌道は単に「軌道」と呼ばれることもある。

https://ja.wikipedia.org/wiki/%E9%9B%BB%E5%AD%90%E8%BB%8C%E9%81%93

電子軌道と状態が対応してるのは先ほど理解ができました。位置表示での波動関数だそうです。

!!!!!波動関数???状態ってことは状態ベクトルで波動関数ということでしょうか。ちょっとわからなくなりました。。。すぐ下に書いてありました。

英語では、古典的な軌道をorbit と呼び、それに対して量子力学的な軌道は orbital(軌道のようなもの)と呼んで区別している。しかし日本語ではこの全く異なる2つのものを両方とも「軌道」と呼ぶため、量子力学的な軌道(orbital)についての誤解や混乱が生まれることもある。このような誤解を避けるために、量子力学的な軌道をオービタルと呼んで区別することもある。

僕が思ってたくるくる電子が回るのは古典的な軌道のことで、ここでいう量子力学的な軌道のこととはイメージが少し違うようです。

波動関数のことを「軌道」と呼ぶのは歴史的な経緯による。量子力学が成立する以前に、長岡半太郎、アーネスト・ラザフォード、ニールス・ボーア、アルノルト・ゾンマーフェルトらによって提唱されていた原子模型では、電子は原子核の周りを古典力学に従ってある軌跡を描いて運動している粒子であった。古典力学によれば、この軌跡(軌道、orbit)が分かれば、電子のある時刻における位置や運動量といった物理量を計算することができると考えられていた。

しかし、量子力学成立後、電子は粒子と波動の二重性を持ち、このような特定の軌跡を描いて運動しているわけではないことが明らかとなった。その代わりに、電子の状態は波動関数によって表されることが示された。波動関数からは、電子の位置や運動量などの物理量の期待値を計算することができる(つまり、電子の位置や運動量などは確率的にしか知りえない)。そのため、古典的な電子の軌道に対応する量子力学的な概念として、波動関数を「軌道」と呼ぶようになったのである。定常状態では、電子の軌道は自由な位置を取れず、決まった軌道に決まった数の電子が入れるようになっており、それらを電子殻という。

つまり波動関数のようです!

波動関数(はどうかんすう、英: wave function)は、もともとは波動現象一般を表す関数のことだが、現在では量子論における状態(より正確には純粋状態)を表す複素数値関数のことを指すことがほとんどである。

https://ja.wikipedia.org/wiki/%E6%B3%A2%E5%8B%95%E9%96%A2%E6%95%B0

電子が軌道の中をくるくる回って動いてるのではなく(動いてるのかもしれないですが)て、位置の期待値で決まる波動関数が大事のようです。

##ここまでを頑張って理解すると、、、

どうやら電子軌道は波動関数のことらしく、スレーター式も波動関数のようです。ハートリーフォック近似をすると正確な値とズレるらしいということもなんとなくわかりました。。。もっと詳しくみてみたいと思います。

大事なことにだんだん気がついてきました。それは、色々な呼び名があるけど、「結局全部波動関数を説明している」らしいということです。スレイター行列式は波動関数のことで、電子軌道は波動関数のことらしいということがわかってきました。


ハートリーフォック近似

ハートリー=フォック方程式(ハートリーフォックほうていしき、英: Hartree–Fock equation)は、多電子系を表すハミルトニアンの固有関数(波動関数)を一個のスレーター行列式で近似(ハートリー=フォック近似)した場合に、それが基底状態に対する最良の近似となるような(スピンを含む)1電子分子軌道の組を探し出すための方程式である。

https://ja.wikipedia.org/wiki/%E3%83%8F%E3%83%BC%E3%83%88%E3%83%AA%E3%83%BC%EF%BC%9D%E3%83%95%E3%82%A9%E3%83%83%E3%82%AF%E6%96%B9%E7%A8%8B%E5%BC%8F

前回のブログでは見れませんでしたが、この辺りを少しみてみます。どうやらハートリーフォック近似というのは、スレーター行列式(波動関数のこと)で近似することのようです。この近似がよくなるように、1電子分子軌道の組を探すようです。

電子相関エネルギーEcorr とは、多電子系における正確なエネルギーEexact とハートリー‐フォック近似によって計算したエネルギーEHF との差として定義される。つまり多電子系における電子間の相互作用をハートリー-フォック法で扱った場合、電子相関の一部しか取り込めていない。

https://ja.wikipedia.org/wiki/%E9%9B%BB%E5%AD%90%E7%9B%B8%E9%96%A2

ということは、ハートリーフォック近似は万能ではなく、正確なエネルギー算出との間に差があるということのようです。しかも電子間の相互作用がきちんと考慮しきれてないと書いてあります。

ここまで頭の整理をすると。。。

・1電子分子軌道(これが何かわかってないですが、、、)のいい組を探す。

・スレーター行列式で近似する。

・正確なエネルギー計算と誤差が出る。

波動関数を、1電子分子軌道の組を探して、スレーター行列式というのを使って近似表現するということでしょうか。


スレイター行列式

結構難しくて大変ですが、「スレーター行列式」と「1電子分子軌道」を理解するよう頑張ってみます。

スレイター行列式(スレイターぎょうれつしき、英: Slater determinant)とは、フェルミ粒子からなる多粒子系の状態を記述する波動関数を表すときに使われる行列式である。この行列式は2つの電子(または他のフェルミ粒子)の交換に関して符号を変化させることによって反対称性の必要条件と、その結果としてパウリの排他原理を満たす。

https://ja.wikipedia.org/wiki/%E3%82%B9%E3%83%AC%E3%82%A4%E3%82%BF%E3%83%BC%E8%A1%8C%E5%88%97%E5%BC%8F

実はパウリの排他原理はまだ理解できてませんが、もうちょい頑張ります。スレーター行列式は波動関数の表現方法であるというのはなんとなくわかってきました。

この行列式は2つの電子の交換に関して(中略)反対称性の必要条件と、その結果としてパウリの排他原理を満たす。とありますが、どうやらスレイター行列式は反対称性を満たすのでいいらしいです。

スレイター行列式は、複数のフェルミ粒子系の波動関数が持っている反対称性と同じ性質を持っている。またスレイター行列式の線形結合も反対称性を満たす。よって多電子系などを表すときに、スレイター行列式は便利なのでよく用いられる。

https://ja.wikipedia.org/wiki/%E3%82%B9%E3%83%AC%E3%82%A4%E3%82%BF%E3%83%BC%E8%A1%8C%E5%88%97%E5%BC%8F

便利らしいので使います。それにしても難しいです。専門家の方はすごい。


ここでタイトルの壮大さに気づく

どうやら量子化学を「極める」と書きましたが目標が大きすぎました。正しくは、「理解する」くらいです。しかも量子化学を完全に理解するのではなく、量子コンピュータでの量子化学を理解して仕事についていくのが目的です。。。


フェルミ粒子の性質とスレイター行列式

同種の複数のフェルミ粒子からなる系の波動関数が満たすべき性質は次の3つである。

任意の2つの粒子の位置のラベルを交換すると符号が逆になる。

任意の2つの粒子が同じ座標を持つと0になる。(パウリの排他原理)

全ての粒子は区別できない。

これは行列式の以下の性質と良く似ている。

任意の2つの行、または列を交換すると符号が逆になる。

任意の2つの行、または列が同じ時は0になる。

全ての置換パターンが考慮される。

よって複数のフェルミ粒子から成る系の波動関数を表すときに、行列式を用いると便利であることが分かる。 実際、上記のスレイター行列式を見ると分かるように、フェルミ粒子の波動関数の性質を全て満たしていることが分かる。

https://ja.wikipedia.org/wiki/%E3%82%B9%E3%83%AC%E3%82%A4%E3%82%BF%E3%83%BC%E8%A1%8C%E5%88%97%E5%BC%8F

少しずつみていきます。フェルミ粒子の性質として、

「任意の2つの粒子の位置のラベルを交換すると符号が逆になる。」

これは前回のブログで出てきた反対称性のことであると思います。理解はできてませんが、こういうものだと覚えてます。

「任意の2つの粒子が同じ座標を持つと0になる。(パウリの排他原理)」

???わからなくなりました。同じ座標を持つというのはなんとなくわかります。波動関数の期待値が位置xなので電子の波動関数の期待値が同じになるということでしょうか。しかし0とは、、、

「全ての粒子は区別できない。」

これもいきなり出てきて全くわかりません。今後のなんか鍵になるのでしょうか。。。

ここまでwikipediaをたどって延々とたらい回しになるwikipediaあるある状態ですが、少しずつ理解してきました。ここで後輩から助け舟です。


電子軌道

先に勉強をした後輩の方が助けてくれました。感謝。やはり電子軌道は波動関数のことでしたが、上スピンと下スピン1つずつしか入らないらしいです。上スピン、下スピンがまだ理解できてませんが、このような特徴を持つことがわかりました。


スピン軌道

こちらも助け舟。電子軌道とスピンを掛け算した波動関数。 χ(x) = Ψ(r)α(ω) (上スピン)またはχ(x) = Ψ(r)β(ω) (下スピン)。電子ひとつしか入らない。とのことですが、これまでスピン軌道なんていう言葉は出てこなかったので多少混乱です。

しかし軌道は波動関数のことなので、スピンと波動関数を組み合わせた波動関数のことのようです。いきなりでてきたのでこれも今後調べる必要があります。


ハートリー積

これも助け舟。電子が複数あるときの波動関数で、単純にスピン軌道を電子の数だけ掛け算したもの。不完全。これもいきなり出てきましたが、今後調べます。。。どこで出てくるのかわからない。。。


スレイター行列式

これも助け舟。ハートリー積には反対称性がないけど、行列式にしたら持つようになる。とのこと。やはりスレーター行列式を調べていくことで見える気がしてくる。


2粒子の事例

多粒子系の波動関数を近似するための最も単純な方法は、適切に選ばれた個々の粒子の直交波動関数の積を取ることである。空間座標x1およびx2の2粒子の事例では以下のようになる。

c90da50c15c35c67ac3f35f56a39fb61.png

この表現は多粒子波動関数に対するアンザッツとしてハートリー近似で用いられており、ハートリー積(英語版)として知られている。しかしながら、上記の波動関数がフェルミ粒子のもののように反対称ではないため、これはフェルミ粒子に対しては満足のいくものではない。

https://ja.wikipedia.org/wiki/%E3%82%B9%E3%83%AC%E3%82%A4%E3%82%BF%E3%83%BC%E8%A1%8C%E5%88%97%E5%BC%8F

早速さっきのハートリー積が出てきました。多粒子波動関数というところは多電子波動関数ということでしょうか。上の説明でわからないのがいくつかあります。。。

直交波動関数とは?なんなのか、、、


直交波動関数

これがわかりませんでしたので調べましたが得意のwikipediaがありませんでした。。。yahoo知恵袋を見つけましたので、

量子化学の質問です。

固有関数が直交性をもつというのは具体的にどういうことを表しているのでしょうか?

https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q14118935484

ベストアンサー

内積が0になるということです。内積というのは、固有関数の重なり(相関)を表しているので、それが0ということは、直交性を持つ異なる固有関数は同じ状態には絶対にならないということを表しています。ちなみに固有関数とは、電子などの粒子の状態を表している関数だと思ってください。

電子の状態を表す関数=波動関数が直交性を持つとは内積が0となる。内積は波動関数の相関を表すので、内積が0ということは直交性をもつ異なる波動関数は同じ状態を取らないということのようです。これもなんかよくわからないですが、一旦飲み込みます。


アンザッツ

この表現は多粒子波動関数に対するアンザッツとあります。正直よくみたら多電子波動関数というのもよくわかってないのですが、先にアンザッツを見てみます。仮設というものらしいです。

物理学および数学における仮設(かせつ、独: Ansatz, ドイツ語: [ˈʔanzats])とは、ある命題を導き出す推論の出発点におかれる前提条件を指し、経験則に基づく推測で[、のちに結果により裏付けされたものである。

こちらはなんとか先ほどの後輩の助け舟と組み合わせて考えることで雰囲気がつかめました。ハートリー積は不完全なので、これはどうやらアンザッツは多電子波動関数の表現として仮設としての出発点のようなもののようです。正しいかわからないけどとりあえず仮定してみようみたいな感じでしょうか。案の定何かが足りないと書いてありましたので。


ハートリー積の線形結合

というのも、 そもそも反対称な波動関数は以下の式を満たすはずである

スクリーンショット 2019-05-26 12.05.39.png

ハートリー積はこれを満たさない。この困難は、 ハートリー積の線形結合を取ることで克服することができる:

c90da50c15c35c67ac3f35f56a39fb61-1.png

何が改善されたのか頭がついていきませんが、これはいい解決方法のようです。

この波動関数は反対称であり、もはやフェルミ粒子同士を区別しない。つまり、特定の粒子に序数を示すことはできず、与えられた添え字は交換可能である。さらに、もし2つのフェルミ粒子のどの2つの波動関数が同じとすると、この式はゼロとなる。これはパウリの排他原理を満たすことと等価である。

https://ja.wikipedia.org/wiki/%E3%82%B9%E3%83%AC%E3%82%A4%E3%82%BF%E3%83%BC%E8%A1%8C%E5%88%97%E5%BC%8F

反対称性を満たすので電子の性質を満たすようです。


一旦まとめる

やはりブログ1の途中で気づいたように、全て波動関数の話のようです。つまり新しい用語が出てきたらまた波動関数なのでは?と疑うようにしました。そして量子化学分野はとても前提知識が多いこともわかりました。。。

まだまだスレイター行列式の説明が終わらないので、次回は引き続きスレイター行列式について理解を深めていきたいと思います。なかなか量子コンピュータまで行き着きません。。。


スレイター行列式

とにかくここに時間がかかります。

スレイター行列式の説明はwikipediaを愛用しています。あってるのかどうかすら今の僕には判断がつきませんが、なんとかここまできました。

https://ja.wikipedia.org/wiki/%E3%82%B9%E3%83%AC%E3%82%A4%E3%82%BF%E3%83%BC%E8%A1%8C%E5%88%97%E5%BC%8F

前回は2電子のスレイター行列式をハートリー積から導き出しました。これは一般化できるようです。

33.png

一般化は大事です。これで安心しました。


複数スレイター行列式

安心したので軽く流して読み進めてましたが、ここでまた無視できない用語がいくつか出てきました。CIとCCです。量子コンピュータや量子化学勉強会でよく出てくる用語です。

スレイター行列式は、パウリの排他原理を全て満たしているが、その逆は成り立たない。すなわちパウリの排他原理を満たす関数は、スレイター行列式のみではないのである。

とはいっても、それらの関数は、スレイター行列式と大きくは違わない。単に複数のスレイター行列式の線形結合を取ったものなだけである。分子軌道を N 個から増やし、次のように表される。

33.png

これを複数スレイター行列式と呼び、パウリの排他原理はすべて、この形式を用いて展開できる。ただし任意の波動関数を表すためには、これらは完全系を成す必要がある。

量子化学におけるハートリー-フォック法は、分子軌道を1つのスレイター行列式で表す。しかし電子相関を正確に取り込む場合は、複数スレイター行列式を用いなければならず、そのような方法を配置間相互作用 (configuration interaction、 CI) 法という。しかし、厳密な波動関数を求めるには、無限個の分子軌道と無限個のスレイター行列式が必要になる。

https://ja.wikipedia.org/wiki/%E3%82%B9%E3%83%AC%E3%82%A4%E3%82%BF%E3%83%BC%E8%A1%8C%E5%88%97%E5%BC%8F

よく出てくるCI法というのは複数スレイター行列式を使うようです。

また線形結合だけでなく非線形な結合も含めると、CI法と同じ数のスレイター行列式で打ち切っても、よりも多くの電子相関を取り込むことができる。このような方法を結合クラスター(coupled cluster、 CC)法と呼ぶ。

1つのスレイター行列式よりも当然、複数スレイター行列式の方が表現力が大きく、計算精度は高くなる。 しかし、その代償として、考慮しなければならないスレイター行列式の数は、精度を上げるにつれ極端に大きくなるため、計算コストの面から、あまり多くするわけにはいかないのが現状である。

ここでは量子コンピュータをやってるとよく出てくるCC法が出てきました。ようやく量子コンピュータに近づいてきた気がします。今はまだ理解ができないのでもう少し勉強を進めてみます。CI法は表現がいい代わりに波動関数の近似としてたくさんのスレイター行列式が必要となる。CC法は非線形な結合を含めて複数スレイター行列式の数を減らして精度をだそうということでしょうか。


途中まとめと助け舟

ここで助け舟がきました。。。持つべきものはコミュニティですね。。。

これまで「多電子」を考えてきたので、電子同士の相互作用を考えると3体問題以上の多体の相互作用を考えなくてはいけないので多体問題となって(惑星みたいな感じ)でとても複雑になってしまうため、単体の挙動を考えてから、少しずつ相互作用などをいれて精度を上げていって、電子相関を取り込んでいく。

アンザッツとしての出発点としてハートリー積があり、そこからまずは条件を満たすためにスレーター行列式があり、ハートリーフォック近似が成り立つが、その後により精度を上げるためにスレーター行列式を複数利用して表現力をあげたCI法があり、さらに非線形な結合を考慮した複数スレーター行列式を活用した方式としてCC法があるような感じでしょうか。

そうなるとポストハートリーフォックのwikipedia説明にあった、

ポスト-ハートリー–フォック (英: post-Hartree–Fock) 法とは、ハートリー–フォック法(平均場近似)を超える、より高精度な第一原理計算手法の総称である。代表的なものに、メラー–プレセット (MP) 法、配置間相互作用 (CI) 法、カップルドクラスター (CC) 法がある。何れも波動関数として複数のスレイター行列式の線形結合をとったものを使っており、計算精度を上げるに従って計算コストは飛躍的に増大する。

https://ja.wikipedia.org/wiki/%E3%83%9D%E3%82%B9%E3%83%88-%E3%83%8F%E3%83%BC%E3%83%88%E3%83%AA%E3%83%BC-%E3%83%95%E3%82%A9%E3%83%83%E3%82%AF%E6%B3%95

高精度な第一原理計算を実現するために波動関数の表現を高める複数スレイター行列の線形結合の仕方をそれぞれ工夫するという戦略は共通しているという感じでしょうか。

CI法に比べてCC法は少ないスレーター行列式で解けるのでそれを使って量子コンピュータの計算が考えられているという感じでしょうか。

量子コンピュータはユニタリー行列を扱う演算ですが、CC法では必ずしもユニタリー行列ではないので、ユニタリー行列化するためにUCC法という量子コンピュータに最適な理論もあるようです。

出発点(アンザッツ)としてのハートリー積>>スレイター行列式>>複数スレイター行列式というように読み解いていくとわかりやすい気がしました。


スレイター行列式と第二量子化

まだわからないところも多いですが、どんどん進んでみます。wikipediaの最後に載っていたのでみてみると、

第二量子化では、多粒子系の状態を、1粒子状態を占めている粒子数の組で表現する。これを座標表示したものがスレイター行列式である。

スクリーンショット 2019-05-26 12.08.18.png

フェルミ粒子の場合、n1,…,nNは0か1のどちらかである。

!!!急に0と1が出てきました。なんとなく量子コンピュータで解ける気がしてきました。第二量子化というのをすると、多電子系の波動関数を座標表示するスレイター行列式になおす?ようです。

しかもボーズ粒子は0からNの値をとるみたいですが、フェルミ粒子である電子は0か1で済むようです。このバイナリ値への変換が量子コンピュータとの相性の良さなんでしょうか。

細かい説明もありましたが難しそうだったので一旦これで納得してみます。。。


再度まとめ

出発点はアンザッツなのでハートリー積な気がします。ハートリー積だとダメなので、実質的にはスレーター行列式がスタートでしょうか。

ハートリー積>>スレーター行列式>>複数スレーター行列式(CC法とくにユニタリ性が必要でUCC法)>>第二量子化でバイナリ値を採用>>演算子を量子コンピュータ向けに変換>>シミュレーションという感じですかね。。。

量子コンピュータ向けに変換を行う変換はJW変換とBK変換があるのは以前調べたことがあります。それも難しかったですが、、、


Jordan-Wigner変換とは?

Jordan-Wigner変換は、スピン演算子をフェルミオンの生成消滅演算子にマッピングする変換で、Pascual JordanとEugene Wignerによって1次元格子モデルが提案された。

引用:https://en.wikipedia.org/wiki/Jordan%E2%80%93Wigner_transformation

生成消滅演算子とパウリ演算子の変換によって、量子コンピュータ分野では特定の問題をゲートマシンで解ける形に変換できるようです。


Bravi-Kitaev変換概要

量子シミュレーション分野は種々の問題を解く可能性がある。Jordan-Wigner変換は、O(n)量子ビット操作によるフェミニオン演算子の表現を可能にする一方、Bravyi-Kitaev変換によって、O(log n)の量子ビット操作によって同じ問題を解けることを確認する。


平均場近似

HFのところで(mean-field theory)と書いてありました。mean-field theoryがなんなのか確認してみます。。。

平均場近似(へいきんばきんじ、英: mean field approximation)とは多体問題を一体問題に帰着させる近似のことである。

まさに多体問題を解くための近似のようです。HFのことなんでしょうか。


量子状態=量子回路

なんとなく全体の点が線に繋がってきた気がします。一番最初はやはりHFが基本となっていて、そこに表現としていろいろな相互作用やその他の効果を量子状態として適用していく感じでしょうか?

量子コンピュータでは量子回路を組むことでさまざまな量子状態へともっていくことができると後輩がいっておりました。ということは、最初にアンザッツとして出発点としての適当な波動関数を置いてみて、その波動関数に量子回路を適用して量子状態を変化させる。その変化はスレイター行列式を線形結合したCC法をつかって有限のスレイター行列式で精度が出るように考える。CC法のなかでも量子コンピュータに相性の良いユニタリー行列を扱えるUCC法がある。量子回路では量子状態の基底エネルギーをVQEなどのアルゴリズムを使って計算できるので、準備したHFの単純なアンザッツの量子状態に対してUCC理論に準じて量子状態を変化させて複雑な量子状態を準備して、その基底状態を求めることを原子間距離を変えながら少しずつ行ってみる。

という感じでしょうか。なんか急に全体像がおぼろげに見えてきました。。。

UCC理論は複数のスレイター行列式の線形結合だけど、その線型結合の方法によって様々な量子状態の実現ができて、そのあたりの相互作用の考え方などたくさんルールがあって、その調整が難しそうです。

その過程で第二量子化は01のバイナリに置き換えて量子ビットに合わせるようにする。JW変換やBK変換は第二量子化した演算子を量子コンピュータ向けのパウリ演算子に変換できる。という感じでしょうか。


ここまでのまとめで量子コンピュータを使って量子化学をするためにすること(たぶん)

アンザッツと呼ばれる単純な単体電子の運動を考えたHFからスタートして、そこにCC(UCC)理論を活用してそのアンザッツの波動関数の量子状態を量子回路を用いて変化させて、その最終的な量子状態の基底状態をVQEアルゴリズムを用いて求めるのが量子コンピュータを使って量子化学計算をするという手順のような気がしました。

そうなると僕もまだよくわかっていませんがその量子ビットの量子状態を変化させる量子回路の作り方を少し続きとして次回見てみたいと思います。

スクリーンショット 2019-05-26 12.09.30.png

第二量子化された多電子状態は01の配列で持てるようなので、それらを量子回路のXゲートを使って準備してそっからCC理論を使って量子状態を変化させるような手順なのでしょうか。そのあたりを確認してみたいと思いますし、ここまでくればあとはデータを揃えて実際にHFを準備してCCに合わせて例題を1つつくって測定を通じて基底状態を機械的にできそうな気がしてきました。

次回以降は早速H2について、初期のハミルトニアンから各種変換を通じて量子状態を実現する量子回路をつくってみてVQEを通じて基底状態を求めるという具体的な手順について調べて実装を目指してみます。


ツールを調べる

とにかく習うより慣れろということで早速H2の水素分子の基底エネルギーを求めるために頑張りたいと思います。

僕の知ってる限り&教えてもらったところによると、PySCFもしくはPSI4というツールを使って水素分子関連のデータを取り、それをOpenfermionなどにいれてBK変換を行い、さらにそれをBlueqatなどのシミュレーションにかけて答えを探索するようです。順番にみていきたいと思います。


水素分子関連の情報を収集する

見つけました。うちの会社はIBM推しなので、qiskitのリポジトリを検索したらいきなり出てきました。

https://github.com/Qiskit/qiskit-tutorials/tree/master/qiskit/aqua/chemistry/H2

これはpyscfからのデータのようです。pyscfやpsi4はとにかくインストールが大変というので最初から諦めてデータ取得を試みました。これをOpenFermionに入れればいいみたいです。

13d1fed737038e03792bf19bed087e3b-1024x545.png

データはこんな感じになってるようです。多分0.2とか0.3というのは原子間距離でしょう。sto-3gというのは基底のようですが、詳しくはわかりません。機会が来たら学びます。。。頭パンクしてしまうので。


OpenFermionを入れる

こちらから入手できます。

https://github.com/quantumlib/OpenFermion

python -m pip install --user openfermion

おそらく準備は万端のはずです。

quantumlib-OpenFermion-The-electronic-structure-package-for-quantum-computers--1024x545.png


量子コンピュータで計算できるように変換する

こっからは得意分野なので早いと思います。前回まで学んだ第二量子化されたハミルトニアンのフェルミオンオペレーターを量子コンピュータのゲートで計算できるようにパウリオペレーターに変換します。そこは簡単です。下記のように決められた通りフェルミオンオペレーターを書いて、変換かけると出ます。

from openfermion.ops import FermionOperator

from openfermion.transforms import jordan_wigner, bravyi_kitaev
from openfermion.utils import eigenspectrum, hermitian_conjugated

# Initialize an operator.
fermion_operator = FermionOperator('2^ 0', 3.17)
fermion_operator += hermitian_conjugated(fermion_operator)
print(fermion_operator)

# Transform to qubits under the Jordan-Wigner transformation and print its spectrum.
jw_operator = jordan_wigner(fermion_operator)
print('')
print(jw_operator)
jw_spectrum = eigenspectrum(jw_operator)
print(jw_spectrum)

# Transform to qubits under the Bravyi-Kitaev transformation and print its spectrum.
bk_operator = bravyi_kitaev(fermion_operator)
print('')
print(bk_operator)
bk_spectrum = eigenspectrum(bk_operator)
print(bk_spectrum)

なので、H2のデータを入手してここからOpenFermionで読み込み変換をかけるところは自動でやってくれるそうです。JW変換でもBK変換でもいいですが、BK変換の方が量子ビット数が少なくて済むようです。

せっかくなのでもちょい簡単にやって見ます。Openfermionの役割はフェルミオンオペレーターと呼ばれるものをパウリオペレーターに変えるらしいです。実際に使うのちょっと面倒ですが、使って見たいと思います。インストール方法は上の方に書いてありますのでみてみてください。

まずはモジュールを読み込みます。こちらはお約束です。

from openfermion.ops import FermionOperator

from openfermion.transforms import jordan_wigner, bravyi_kitaev
from openfermion.utils import eigenspectrum, hermitian_conjugated

どうやら生成消滅演算子とその係数の書き方にコツがあるようです。

21-9.png

https://github.com/quantumlib/OpenFermion/blob/master/examples/openfermion_tutorial.ipynb

記述方法はダガーという十字マークがついたものは^マークで代用します。それで順番にかけられてる演算子と呼ばれるものを順番にスペースでつないで書きます。

my_term = FermionOperator('3^ 1')

print(my_term)

こちらを行うと、、、

1.0 [3^ 1]

このように出力されました。1.0は係数のようです。これでフェルミオンオペレーターが記述できました。係数を書く際にもルールがあります。

good_way_to_initialize = FermionOperator('3^ 1', -1.7)

print(good_way_to_initialize)

-1.7 [3^ 1]

そこからの複数の演算子をつなげるには+記号で繋げます。

term_1 = FermionOperator('4^ 3^ 9 1', 1. + 2.j)

term_2 = FermionOperator('3^ 1', -1.7)
my_operator = term_1 + term_2
print(my_operator)

-1.7 [3^ 1] +
(1+2j) [4^ 3^ 9 1]

いい感じになりました。次にこれを変換です。

jw_operator = jordan_wigner(my_operator)

print(jw_operator)

作ったオペレーターをjordan_wigner(ここ!)にいれると勝手にやってくれるみたいです。

(-0.425+0j) [X1 Z2 X3] +

(-0.0625-0.125j) [X1 Z2 X3 X4 Z5 Z6 Z7 Z8 X9] +
(0.125-0.0625j) [X1 Z2 X3 X4 Z5 Z6 Z7 Z8 Y9] +
(-0.125+0.0625j) [X1 Z2 X3 Y4 Z5 Z6 Z7 Z8 X9] +
(-0.0625-0.125j) [X1 Z2 X3 Y4 Z5 Z6 Z7 Z8 Y9] +
0.425j [X1 Z2 Y3] +
(-0.125+0.0625j) [X1 Z2 Y3 X4 Z5 Z6 Z7 Z8 X9] +
(-0.0625-0.125j) [X1 Z2 Y3 X4 Z5 Z6 Z7 Z8 Y9] +
(0.0625+0.125j) [X1 Z2 Y3 Y4 Z5 Z6 Z7 Z8 X9] +
(-0.125+0.0625j) [X1 Z2 Y3 Y4 Z5 Z6 Z7 Z8 Y9] +
-0.425j [Y1 Z2 X3] +
(0.125-0.0625j) [Y1 Z2 X3 X4 Z5 Z6 Z7 Z8 X9] +
(0.0625+0.125j) [Y1 Z2 X3 X4 Z5 Z6 Z7 Z8 Y9] +
(-0.0625-0.125j) [Y1 Z2 X3 Y4 Z5 Z6 Z7 Z8 X9] +
(0.125-0.0625j) [Y1 Z2 X3 Y4 Z5 Z6 Z7 Z8 Y9] +
(-0.425+0j) [Y1 Z2 Y3] +
(-0.0625-0.125j) [Y1 Z2 Y3 X4 Z5 Z6 Z7 Z8 X9] +
(0.125-0.0625j) [Y1 Z2 Y3 X4 Z5 Z6 Z7 Z8 Y9] +
(-0.125+0.0625j) [Y1 Z2 Y3 Y4 Z5 Z6 Z7 Z8 X9] +
(-0.0625-0.125j) [Y1 Z2 Y3 Y4 Z5 Z6 Z7 Z8 Y9]

よくわからんがこうなりました。ブラビキタエフ変換という効率的なものもあります。

bk_operator = bravyi_kitaev(my_operator)

print(bk_operator)

こうなりました。

(0.425+0j) [Z0 X1 Z3] +

(0.125-0.0625j) [Z0 X1 X4 X5 Y7 Z8 X9] +
(0.0625+0.125j) [Z0 X1 X4 X5 Y7 Y9] +
(-0.0625-0.125j) [Z0 X1 Y4 X5 Y7 Z8 X9] +
(0.125-0.0625j) [Z0 X1 Y4 X5 Y7 Y9] +
-0.425j [Z0 Y1 Z2] +
(-0.0625-0.125j) [Z0 Y1 Z2 Z3 X4 X5 Y7 Z8 X9] +
(0.125-0.0625j) [Z0 Y1 Z2 Z3 X4 X5 Y7 Y9] +
(-0.125+0.0625j) [Z0 Y1 Z2 Z3 Y4 X5 Y7 Z8 X9] +
(-0.0625-0.125j) [Z0 Y1 Z2 Z3 Y4 X5 Y7 Y9] +
(-0.425+0j) [X1 Z2] +
(-0.125+0.0625j) [X1 Z2 Z3 X4 X5 Y7 Z8 X9] +
(-0.0625-0.125j) [X1 Z2 Z3 X4 X5 Y7 Y9] +
(0.0625+0.125j) [X1 Z2 Z3 Y4 X5 Y7 Z8 X9] +
(-0.125+0.0625j) [X1 Z2 Z3 Y4 X5 Y7 Y9] +
0.425j [Y1 Z3] +
(0.0625+0.125j) [Y1 X4 X5 Y7 Z8 X9] +
(-0.125+0.0625j) [Y1 X4 X5 Y7 Y9] +
(0.125-0.0625j) [Y1 Y4 X5 Y7 Z8 X9] +
(0.0625+0.125j) [Y1 Y4 X5 Y7 Y9]

短くなった気がします。難しそうに見えますが、きちんと変換をしていてBK変換の方が効率的のようです。ここで得たパウリオペレーターをゲートマシンもしくはシミュレータにかけます。

コードは動かしましたが、正直全くわかってません。でも大丈夫そうです。大事なところはプロに任せましょう。


シミュレータを準備

今回はBlueqatを準備します。自社製品なので。

https://github.com/Blueqat/Blueqat

vqeのモジュールはこの辺りのAPIリファレンスにあります。ただ、現在寝不足で読む元気がありません。先に行きます。

https://blueqat.readthedocs.io/ja/latest/api/blueqat.html#module-blueqat.vqe

基本的にはansatzをルール通り作った上で、vqeにかければいいみたいです。

こちらは量子化学ではないですが、maxcutでのvqeの実行です。パウリ演算子を使ってZZだけで計算をする古典最適化ですが、vqeの実行がなんとなくわかると思います。

from blueqat import vqe, pauli

edges = [(0, 1), (1, 2), (2, 3), (3, 0), (1, 3), (0, 2), (4, 0), (4, 3)]
ansatz = vqe.QaoaAnsatz(sum([pauli.Z(i) * pauli.Z(j) for i, j in edges]), 1)

result = vqe.Vqe(ansatz).run()

print(
""" {4}
/
\\
{0}---{3}
| x |
{1}---{2}"""
.format(*result.most_common()[0][0]))

ここではvqeモジュールを使って、vqe.Vqe(ansatz).run()でいけます。ansatzの中にハミルトニアンを導入した波動関数を入れるようです。

ansatzの作り方がよくわかませんが、次回以降開発者に聞いて見ます。


OpenFermion-Blueqatを準備

OpenFermionから毎回データを入力するのが大変なので、勝手に変換してくれるのがあります。それがOpenFermion-Blueqatです。

https://github.com/Blueqat/OpenFermion-Blueqat

インストールは下記が楽です。

pip3 install openfermionblueqat

多分さっき手作業でやってた作業を自動的にやってくれるはずです。中のコードを読もうと思いましたがやはりここでも眠いし、難しそうなので見て見ないふりをすることにしてあとでこっそり聞きます。


準備はできた

多分揃ってるはずです。これでなんとか順番に組んで行けばできるはずです。準備はできました。やることは、

1、ときたい分子を選び、既存ライブラリで第二量子化したハミルトニアンのデータを原子間距離に基づいて取得。

2、OpenFermionにそれをいれて変換してさらにシミュレータに入れる。しかし、僕の情報ではここは自動化されているために私たちはやらなくてもいいみたいです。プロに任せましょう。

3、あとはシミュレーションをする。好きなシミュレータを使いましょう。出した結果をプロットなどできるようです。

もう少し情報収集をして次回はいよいよ水素分子の基底状態を解いてプロットして見ます。しかし1つわかったことがあります。先人と周りの方々の知恵を借りて、量子化学は専門家に任せるです。。。。やり方をサクッと教えてもらいましたので取りまとめます。。。


データの準備

まずH2などのデータはGoogleが非公式に配布しているOpenFermionがあります。

pip install blueqat openfermionblueqat openfermion

こちらはBlueqatといっしょに、openfermionblueqat / openfermionとともにインストールしました。合わせて使います。そして、それぞれのツールを読み込んで使うのです。

from blueqat import *

from openfermion import *
from openfermionblueqat import*

openfermionからハミルトニアンが取れます。あんまり理解してないですが。。。

() 1.322943021475

((0, 1), (0, 0)) -1.4820918858979102
((1, 1), (1, 0)) -1.4820918858979102
((2, 1), (2, 0)) -0.1187350527865787
((3, 1), (3, 0)) -0.1187350527865787
((0, 1), (0, 1), (0, 0), (0, 0)) 0.36843967630348756
((0, 1), (0, 1), (2, 0), (2, 0)) 0.08225771204699692
((0, 1), (1, 1), (1, 0), (0, 0)) 0.36843967630348756
((0, 1), (1, 1), (3, 0), (2, 0)) 0.08225771204699692
((0, 1), (2, 1), (0, 0), (2, 0)) 0.082257712046997
((0, 1), (2, 1), (2, 0), (0, 0)) 0.3626667179796745
((0, 1), (3, 1), (1, 0), (2, 0)) 0.082257712046997
((0, 1), (3, 1), (3, 0), (0, 0)) 0.3626667179796745
((1, 1), (0, 1), (0, 0), (1, 0)) 0.36843967630348756
((1, 1), (0, 1), (2, 0), (3, 0)) 0.08225771204699692
((1, 1), (1, 1), (1, 0), (1, 0)) 0.36843967630348756
((1, 1), (1, 1), (3, 0), (3, 0)) 0.08225771204699692
((1, 1), (2, 1), (0, 0), (3, 0)) 0.082257712046997
((1, 1), (2, 1), (2, 0), (1, 0)) 0.3626667179796745
((1, 1), (3, 1), (1, 0), (3, 0)) 0.082257712046997
((1, 1), (3, 1), (3, 0), (1, 0)) 0.3626667179796745
((2, 1), (0, 1), (0, 0), (2, 0)) 0.36266671797967454
((2, 1), (0, 1), (2, 0), (0, 0)) 0.08225771204699726
((2, 1), (1, 1), (1, 0), (2, 0)) 0.36266671797967454
((2, 1), (1, 1), (3, 0), (0, 0)) 0.08225771204699726
((2, 1), (2, 1), (0, 0), (0, 0)) 0.08225771204699728
((2, 1), (2, 1), (2, 0), (2, 0)) 0.38272169831413727
((2, 1), (3, 1), (1, 0), (0, 0)) 0.08225771204699728
((2, 1), (3, 1), (3, 0), (2, 0)) 0.38272169831413727
((3, 1), (0, 1), (0, 0), (3, 0)) 0.36266671797967454
((3, 1), (0, 1), (2, 0), (1, 0)) 0.08225771204699726
((3, 1), (1, 1), (1, 0), (3, 0)) 0.36266671797967454
((3, 1), (1, 1), (3, 0), (1, 0)) 0.08225771204699726
((3, 1), (2, 1), (0, 0), (1, 0)) 0.08225771204699728
((3, 1), (2, 1), (2, 0), (3, 0)) 0.38272169831413727
((3, 1), (3, 1), (1, 0), (1, 0)) 0.08225771204699728
((3, 1), (3, 1), (3, 0), (3, 0)) 0.38272169831413727

フェルミオンの演算子が取れます。。。演算子の記述は確認した通り。

1.322943021475 [] +

-1.4820918858979102 [0^ 0] +
0.36843967630348756 [0^ 0^ 0 0] +
0.08225771204699692 [0^ 0^ 2 2] +
0.36843967630348756 [0^ 1^ 1 0] +
0.08225771204699692 [0^ 1^ 3 2] +
0.082257712046997 [0^ 2^ 0 2] +
0.3626667179796745 [0^ 2^ 2 0] +
0.082257712046997 [0^ 3^ 1 2] +
0.3626667179796745 [0^ 3^ 3 0] +
0.36843967630348756 [1^ 0^ 0 1] +
0.08225771204699692 [1^ 0^ 2 3] +
-1.4820918858979102 [1^ 1] +
0.36843967630348756 [1^ 1^ 1 1] +
0.08225771204699692 [1^ 1^ 3 3] +
0.082257712046997 [1^ 2^ 0 3] +
0.3626667179796745 [1^ 2^ 2 1] +
0.082257712046997 [1^ 3^ 1 3] +
0.3626667179796745 [1^ 3^ 3 1] +
0.36266671797967454 [2^ 0^ 0 2] +
0.08225771204699726 [2^ 0^ 2 0] +
0.36266671797967454 [2^ 1^ 1 2] +
0.08225771204699726 [2^ 1^ 3 0] +
-0.1187350527865787 [2^ 2] +
0.08225771204699728 [2^ 2^ 0 0] +
0.38272169831413727 [2^ 2^ 2 2] +
0.08225771204699728 [2^ 3^ 1 0] +
0.38272169831413727 [2^ 3^ 3 2] +
0.36266671797967454 [3^ 0^ 0 3] +
0.08225771204699726 [3^ 0^ 2 1] +
0.36266671797967454 [3^ 1^ 1 3] +
0.08225771204699726 [3^ 1^ 3 1] +
0.08225771204699728 [3^ 2^ 0 1] +
0.38272169831413727 [3^ 2^ 2 3] +
-0.1187350527865787 [3^ 3] +
0.08225771204699728 [3^ 3^ 1 1] +
0.38272169831413727 [3^ 3^ 3 3]

ブラビキタエフ変換した後のパウリオペレーター

(-0.5426621369378548+0j) [] +

(0.06953111089848073+0j) [X0 Z1 X2] +
(0.06953111089848073+0j) [X0 Z1 X2 Z3] +
(0.06953111089848073+0j) [Y0 Z1 Y2] +
(0.06953111089848073+0j) [Y0 Z1 Y2 Z3] +
(0.05487898038865937+0j) [Z0] +
(0.05487898038865934+0j) [Z0 Z1] +
(0.12437613557828386+0j) [Z0 Z1 Z2] +
(0.12437613557828386+0j) [Z0 Z1 Z2 Z3] +
(0.05484502467980314+0j) [Z0 Z2] +
(0.05484502467980314+0j) [Z0 Z2 Z3] +
(0.122357292075653+0j) [Z1] +
(0.02284792288824078+0j) [Z1 Z2 Z3] +
(0.12689922137139442+0j) [Z1 Z3] +
(0.02284792288824078+0j) [Z2]

そしてIBMのOpenQASMに変換された実際のH2の量子化学計算のゲート回路。

OPENQASM 2.0;

include "qelib1.inc";
qreg q[4];
creg c[4];
x q[0];
rz(-0.49757951122103866) q[0];
cx q[0],q[1];
rz(-0.4975795112210386) q[1];
cx q[0],q[1];
rz(0.9591122042120854) q[2];
cx q[1],q[2];
cx q[2],q[3];
rz(0.9591122042120854) q[3];
cx q[2],q[3];
cx q[1],q[2];
rz(-0.3895817994046274) q[1];
rx(-1.5707963267948966) q[0];
rx(-1.5707963267948966) q[2];
cx q[0],q[1];
cx q[1],q[2];
cx q[2],q[3];
rz(-0.08697789498593556) q[3];
cx q[2],q[3];
cx q[1],q[2];
cx q[0],q[1];
rx(1.5707963267948966) q[0];
rx(1.5707963267948966) q[2];
h q[0];
h q[2];
cx q[0],q[1];
cx q[1],q[2];
rz(-0.08697789498593556) q[2];
cx q[1],q[2];
cx q[0],q[1];
h q[0];
h q[2];
h q[0];
h q[2];
cx q[0],q[1];
cx q[1],q[2];
cx q[2],q[3];
rz(-0.08697789498593556) q[3];
cx q[2],q[3];
cx q[1],q[2];
cx q[0],q[1];
h q[0];
h q[2];
rx(-1.5707963267948966) q[0];
rx(-1.5707963267948966) q[2];
cx q[0],q[1];
cx q[1],q[2];
rz(-0.08697789498593556) q[2];
cx q[1],q[2];
cx q[0],q[1];
rx(1.5707963267948966) q[0];
rx(1.5707963267948966) q[2];
cx q[0],q[2];
rz(-0.2964996772240439) q[2];
cx q[0],q[2];
cx q[0],q[1];
cx q[1],q[2];
cx q[2],q[3];
rz(-0.3834775722099795) q[3];
cx q[2],q[3];
cx q[1],q[2];
cx q[0],q[1];
cx q[0],q[1];
cx q[1],q[2];
rz(-0.3834775722099795) q[2];
cx q[1],q[2];
cx q[0],q[1];
cx q[0],q[2];
cx q[2],q[3];
rz(-0.2964996772240439) q[3];
cx q[2],q[3];
cx q[0],q[2];
cx q[1],q[3];
rz(-0.40468336471341426) q[3];
cx q[1],q[3];
rz(-0.4707008818330128) q[0];
cx q[0],q[1];
rz(-0.47070088183301273) q[1];
cx q[0],q[1];
rz(0.9073021499450052) q[2];
cx q[1],q[2];
cx q[2],q[3];
rz(0.9073021499450052) q[3];
cx q[2],q[3];
cx q[1],q[2];
rz(-0.36853707275014597) q[1];
rx(-1.5707963267948966) q[0];
rx(-1.5707963267948966) q[2];
cx q[0],q[1];
cx q[1],q[2];
cx q[2],q[3];
rz(-0.08227945674329043) q[3];
cx q[2],q[3];
cx q[1],q[2];
cx q[0],q[1];
rx(1.5707963267948966) q[0];
rx(1.5707963267948966) q[2];
h q[0];
h q[2];
cx q[0],q[1];
cx q[1],q[2];
rz(-0.08227945674329043) q[2];
cx q[1],q[2];
cx q[0],q[1];
h q[0];
h q[2];
h q[0];
h q[2];
cx q[0],q[1];
cx q[1],q[2];
cx q[2],q[3];
rz(-0.08227945674329043) q[3];
cx q[2],q[3];
cx q[1],q[2];
cx q[0],q[1];
h q[0];
h q[2];
rx(-1.5707963267948966) q[0];
rx(-1.5707963267948966) q[2];
cx q[0],q[1];
cx q[1],q[2];
rz(-0.08227945674329043) q[2];
cx q[1],q[2];
cx q[0],q[1];
rx(1.5707963267948966) q[0];
rx(1.5707963267948966) q[2];
cx q[0],q[2];
rz(-0.28048313161062516) q[2];
cx q[0],q[2];
cx q[0],q[1];
cx q[1],q[2];
cx q[2],q[3];
rz(-0.3627625883539156) q[3];
cx q[2],q[3];
cx q[1],q[2];
cx q[0],q[1];
cx q[0],q[1];
cx q[1],q[2];
rz(-0.3627625883539156) q[2];
cx q[1],q[2];
cx q[0],q[1];
cx q[0],q[2];
cx q[2],q[3];
rz(-0.28048313161062516) q[3];
cx q[2],q[3];
cx q[0],q[2];
cx q[1],q[3];
rz(-0.3828228701907626) q[3];
cx q[1],q[3];


演算

ここまで揃うとあとはループを回すだけのようです。Blueqatでまわします。。。

1.png

このように綺麗なプロットができました。曲線はFullCIという奴のようです。


プロはすごい

量子化学のプロの方々はやはりすごいです。餅は餅屋でした。

計算手順は色々学ぶことができましたが正直会得するには年月を必要とするでしょう。

加藤くんがスライドを公開してくれました。ツールを開発している立場から、かなり頑張ってくれました。スライドの中に量子コンピュータを利用した量子化学の基礎が書いてあります。

https://speakerdeck.com/gyudon/blueqatliang-zi-hua-xue

おっさんは途中で力尽きたのでプロと若い人たちの量子コンピュータを使いこなすスライドやブログの手伝いをするために裏方に回ることにしました。。。泣

しょうもない最後ですが、引き続き量子化学はプロの方々を引き連れて戻ってきます。以上です。。。