注釈
当ページは、 tutorials/chemistry/01_electronic_structure.ipynb から生成されました。
IBM Quantum lab でインタラクティブに実行します。
電子構造¶
はじめに¶
ある分子のハミルトニアンは、以下の数式で表されます。
原子核は電子よりも非常に重い質量を有するため、原子核は電子に比べて非常に遅い運動速度となります。したがって、原子核や電子の運動は分離しているとみなして考えることができます。 これはボルン・オッペンハイマー近似と呼ばれています。
したがって、まずは核座標を一つの入力パラメーターという限定的に扱い、電子構造を明らかにする問題に取り組むことができます。 分子中の電子のエネルギーレベルは、非相対論的かつ時間に依存しないシュレーディンガー方程式の求解による導出が可能です。
ここで
特に、電子の基底状態エネルギーは下記で与えられます。
ここで \(\Psi_0\) は、系の基底状態です。
しかし、この問題の有する次元数は、分子/電子の自由度に応じて指数関数的に増大します。そのため、 こうした計算の次元数の増加を押さえるアプローチとして、 \(\Psi_0\) を量子コンピューター上に用意してハミルトンの期待値(または \(E_0\) )を直接測定する方法が考えられています。
では具体的にはどのようなアプローチなのでしょうか?
ハートリーフォック法による初期推測¶
この問題を解くアプローチの出発点として、ハー トリー・フォック法が用いられます。 この手法では、電子N体を独立したN個体の問題に近似(平均場近似)します。古典コンピューター上でハートリー・フォック方程式を解くことは効率的であり、正確な交換エネルギーにつながりますが、クーロン力による電子同士の相関は考慮されていません。 したがって、電子同士の相関を計算に考慮するのは良い議論の出発点とされています。
上述の電子のハミルトニアンは、ハートリー・フォック法(別名:分子軌道法、 (MOs)) を用いても数学的に表現可能です。
一体積分は次の通りです。
二体積分は次の通りです。
分子軌道法(\(\phi_u\))では、被占軌道もしくは空軌道の状態を取ることができます。ある一つの分子軌道には2つの電子まで入ることができます。しかし、下記では、2つのスピン軌道状態(上向き:math:alpha`または下向き:math:beta`)のどちらかを取り扱います。したがって、あるスピン軌道状態では1つの電子を含むかもしくは空軌道となります。
実際にQiskitにて上記の計算過程を表現する方法を紹介します。
Qiskitは、ハートリー・フォック法関連のソリューションを有する様々な既存ライブラリに接続されています。 既にQiskit上では以下のライブラリを利用することができます: * Gaussian * Psi4 * PyQuante * PySCF
以下では、平衡結合距離 (0.735angstrom) にある電荷なしでシングレット状態の水素分子で、PySCFドライバーを設定しました。
[4]:
from qiskit.chemistry.drivers import PySCFDriver, UnitsType, Molecule
molecule = Molecule(geometry=[['H', [0., 0., 0.]],
['H', [0., 0., 0.735]]],
charge=0, multiplicity=1)
driver = PySCFDriver(molecule = molecule, unit=UnitsType.ANGSTROM, basis='sto3g')
ドライバの詳細については、https://qiskit.org/documentation/apidoc/qiskit.chemistry.drivers.html を参照してください。
フェルミ粒子から量子ビットへのマッピング¶
前項で示したハミルトニアンはフェルミオン演算子で表されています。 対象とする問題を量子コンピュータの状態にエンコードするには、これらの演算子をスピン演算子にマッピングする必要があります(実際の量子ビットはスピン統計に従います)。
異なるプロパティを持つ様々なマッピングの種類が存在します。Qiskitはすでに以下のマッピングをサポートしています。* The Jordan-Wigner ‘jordan_wigner’ マッピング (über das paulische äquivalenzverbot. In The Collected Works of Eugene Paul Wigner (pp. 109-129). Springer, Berlin, Heidelberg (1993)). * The Parity ‘parity’ (The Journal of chemical physics, 137(22), 224109 (2012)) * The Bravyi-Kitaev ‘bravyi_kitaev’ (Annals of Physics, 298(1), 210-226 (2002)) * The Bravyi-Kitaev Super Fast ‘bksf’ (Annals of Physics, 298(1), 210-226 (2002))
Jordan-Wignerのマッピングは、特に、各スピンの軌道状態を量子ビットにエンコードには有用とされています (上記図参照)。
ここで、フェルミ粒子のハミルトニアンから量子ビットのハミルトニアンへの変換に関するすべての情報を含むオブジェクトを設定します。 下記の例では、簡単なJordan-Wigner のマッピングを求めます。
[3]:
from qiskit.chemistry.transformations import (FermionicTransformation,
FermionicTransformationType,
FermionicQubitMappingType)
fermionic_transformation = FermionicTransformation(
transformation=FermionicTransformationType.FULL,
qubit_mapping=FermionicQubitMappingType.JORDAN_WIGNER,
two_qubit_reduction=False,
freeze_core=False)
上記で定義されたドライバに対してハミルトニアンの変換を実行すると、量子ビットの演算子が得られます。
[4]:
qubit_op, _ = fermionic_transformation.transform(driver)
print(qubit_op)
print(fermionic_transformation.molecule_info)
SummedOp([
-0.8105479805373266 * IIII,
0.17218393261915552 * IIIZ,
-0.22575349222402472 * IIZI,
0.1721839326191556 * IZII,
-0.22575349222402466 * ZIII,
0.1209126326177663 * IIZZ,
0.16892753870087912 * IZIZ,
0.045232799946057854 * XXYY,
0.045232799946057854 * YYYY,
0.045232799946057854 * XXXX,
0.045232799946057854 * YYXX,
0.16614543256382414 * ZIIZ,
0.16614543256382414 * IZZI,
0.17464343068300453 * ZIZI,
0.1209126326177663 * ZZII
])
{'num_particles': [1, 1], 'num_orbitals': 4, 'two_qubit_reduction': False, 'z2_symmetries': <qiskit.aqua.operators.legacy.weighted_pauli_operator.Z2Symmetries object at 0x123f6d940>}
最小基底系(STO-3G) では4量子ビットが必要です。 対称性を考慮することで量子ビットの削減を可能にするパリティ・マッピングを活用し、演算に必要な量子ビット数を削減することができます。
[5]:
fermionic_transformation_2 = FermionicTransformation(
transformation=FermionicTransformationType.FULL,
qubit_mapping=FermionicQubitMappingType.PARITY,
two_qubit_reduction=True,
freeze_core=False)
qubit_op_2, _ = fermionic_transformation_2.transform(driver)
print(qubit_op_2)
SummedOp([
-1.052373245772859 * II,
0.39793742484318007 * IZ,
-0.39793742484318007 * ZI,
-0.01128010425623538 * ZZ,
0.18093119978423136 * XX
])
したがって、この計算では2量子ビットのみが必要となります。
別のマッピングとして、Particle-Hole transformation (Physical Review A, 98(2), 022322 (2018)) を使用することも可能です。 これにより、真空状態はN粒子フォック空間とみなすことができます。 この方法では、ハートリー・フォック状態にゼロエネルギーがあり、最適化計算のプロセスがより高速に進みます。
[6]:
fermionic_transformation_3 = FermionicTransformation(
transformation=FermionicTransformationType.PARTICLE_HOLE,
qubit_mapping=FermionicQubitMappingType.JORDAN_WIGNER,
two_qubit_reduction=False,
freeze_core=False)
qubit_op_3, _ = fermionic_transformation_3.transform(driver)
print(qubit_op_3)
SummedOp([
1.0264200106656571 * IIII,
0.17218393261915554 * IIIZ,
-0.22575349222402463 * IIZI,
0.17218393261915554 * IZII,
-0.22575349222402458 * ZIII,
0.16892753870087912 * IZIZ,
0.045232799946057854 * YYYY,
0.045232799946057854 * XXYY,
0.045232799946057854 * YYXX,
0.045232799946057854 * XXXX,
0.1209126326177663 * IIZZ,
0.16614543256382414 * IZZI,
0.16614543256382414 * ZIIZ,
0.17464343068300453 * ZIZI,
0.1209126326177663 * ZZII
])
Qiskitにて利用可能なマッピングと量子ビットへの変換のリストは下記になります。
[7]:
print('*Transformations')
for fer_transform in FermionicTransformationType:
print(fer_transform)
print('\n*Mappings')
for fer_mapping in FermionicQubitMappingType:
print(fer_mapping)
*Transformations
FermionicTransformationType.FULL
FermionicTransformationType.PARTICLE_HOLE
*Mappings
FermionicQubitMappingType.JORDAN_WIGNER
FermionicQubitMappingType.PARITY
FermionicQubitMappingType.BRAVYI_KITAEV
以上でハミルトニアンを導出する準備は完了です。量子アルゴリズムを使用することで、対応する分子の電子構造に関する情報を明らかにすることができます。 Qiskitでの実行方法については、基底状態と励起状態の計算に関するチュートリアルをご覧ください!
[1]:
import qiskit.tools.jupyter
%qiskit_version_table
%qiskit_copyright
Version Information
Qiskit Software | Version |
---|---|
Qiskit | 0.23.0 |
Terra | 0.16.0 |
Aer | 0.7.0 |
Ignis | 0.5.0 |
Aqua | 0.8.0 |
IBM Q Provider | 0.11.0 |
System information | |
Python | 3.6.9 |Anaconda, Inc.| (default, Jul 30 2019, 13:42:17) [GCC 4.2.1 Compatible Clang 4.0.1 (tags/RELEASE_401/final)] |
OS | Darwin |
CPUs | 2 |
Memory (Gb) | 16.0 |
Tue Oct 20 18:02:17 2020 CEST |
This code is a part of Qiskit
© Copyright IBM 2017, 2020.
This code is licensed under the Apache License, Version 2.0. You may
obtain a copy of this license in the LICENSE.txt file in the root directory
of this source tree or at http://www.apache.org/licenses/LICENSE-2.0.
Any modifications or derivative works of this code must retain this
copyright notice, and modified files need to carry a notice indicating
that they have been altered from the originals.
[ ]: