@yuichirominato 2019.02.14更新 54views

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


前回までは量子化学を極めるべくがんばりました。

しかし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でまわします。。。

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

プロはすごい

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

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

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

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

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

Recommended


CONTACT

info@mdrft.com

ブログトップへ Wikiへ移動

量子コンピュータ一般

量子ゲートアルゴリズム

量子アニーリング一般

量子アニーリングアルゴリズム

BlueqatSDKの使い方