Second quantization#
Fock space#
Consider a system of electrons in \(M\) spin orbitals. An occupation number vector lists the spin-orbital occupation
where the occupation numbers, \(k_p\), are restricted to 0 or 1.
The Fock space, \(F(M)\), is defined as the vector space of all possible occupation vectors.
There is a unique mapping between occupation number vectors and Slater determinants, but the Fock space includes states with different number of electrons.
The Fock space is a linear vector space with the following properties:
occupation number vectors are orthonormal
\[ \langle \mathbf{k} | \mathbf{m} \rangle = \prod_{p=1}^{M} \delta_{k_p m_p} \]the identity operator can be written as
\[ \hat{I} = \sum_\mathbf{k} | \mathbf{k} \rangle \langle \mathbf{k} | \]it can be partitioned into sub-spaces according to
\[ F(M) = F(0,M) \oplus F(1,M) \oplus \cdots \oplus F(M,M) \]where \(F(N, M)\) is the set of occupation number vectors with \(N\) occupied spin-orbitals.
subspace \(F(0, M)\) corresponds to a completely unoccupied Slater determinant known as the vacuum state, \(| \mathrm{vac} \rangle\). For the vacuum state, we have
\[\begin{equation*} | \mathrm{vac} \rangle = | 0_1 0_2 \ldots 0_M \rangle ; \qquad \langle \mathrm{vac} | \mathrm{vac} \rangle = 1 \end{equation*}\]
Creation and annihilation operators#
Second quantization introduces a convenient way to manipulate states by means of creation and annihilation operators. As their name imply, these operators create and destroy electrons in specific spin-orbitals as follows
creation operator \(\hat{a}_p^\dagger\):
annihilation operator \(\hat{a}_p\):
where the factor \(\delta_{k_p 0}\) prevents the addition of an electron to a state that is already populated and \(\delta_{k_p 1}\) prevents the destruction of a non-existing electron.
The phase factor \(\prod_{i = 1}^{p-1} (-1)^{k_p}\) ensures the anti-symmetry of the associated wave function and it is a direct consequence of the anti-commutator relationships:
Ground state#
The ground state of an \(N\)-electron system can be formed from the vacuum state
Slater determinants#
There is a one-to-one correspondence between occupation number vectors and Slater determinants. For \(F(N,M)\), let us collect the \(N\) positions in a given occupation number vector that have nonzero occupations in an ordered index set \(\{i_1, i_2, \ldots,i_N\}\). We then have
and, out of convenience, we may at times denote the occupation number vector as equal to the associated Slater determinant.
We can write an electron excitation from occupied orbital \(i_p\) to unoccupied orbital \(a\) with direct reference to Slater determinants
where the phase factors associated with the annihilation and creation operators in general cancel at the same time as the energy ordering of orbitals in the resulting Slater determinant is lost.
The actions of individual creation and annihilation operators can also be defined for Slater determinants
The explicit reference to the associated phase factors is also here avoided by a presumed ordering of orbitals in the Slater determinant.
Illustration for Fock space F(4,10)#
Let us consider the closed-shell ground state for a system with four electrons in five molecular orbitals, or ten spin orbitals,
import numpy as np
M = 10 # number of spin orbitals in our Fock space
We implement a class of occupation number vectors.
class OccupationNumberVector:
def __init__(self, occ_orbs=[]):
self.phase = 1
self.occ_num_vec = np.zeros(M, dtype=int) # vacuum state
for i in occ_orbs:
self.occ_num_vec[i] = 1
def __mul__(self, other):
if np.array_equal(self.occ_num_vec, other.occ_num_vec):
inner_prod = self.phase * other.phase
else:
inner_prod = 0
return inner_prod
def __str__(self):
return (
"phase: "
+ str(self.phase)
+ "\noccupation number vector: "
+ str(self.occ_num_vec)
)
def creation(self, p):
if len(self.occ_num_vec) == 0:
return
if self.occ_num_vec[p] == 1:
self.occ_num_vec = []
else:
self.phase *= np.prod((-1) ** self.occ_num_vec[:p])
self.occ_num_vec[p] = 1
def annihilation(self, p):
if len(self.occ_num_vec) == 0:
return
if self.occ_num_vec[p] == 0:
self.occ_num_vec = []
else:
self.phase *= np.prod((-1) ** self.occ_num_vec[:p])
self.occ_num_vec[p] = 0
The ground state can formed by applying a series of creation operators on the vacuum state
ket = OccupationNumberVector()
for i in [3, 2, 1, 0]:
ket.creation(i)
print(ket)
phase: 1
occupation number vector: [1 1 1 1 0 0 0 0 0 0]
One-electron operators#
A one-electron operator takes the form
where
One-particle density#
The one-particle density matrix becomes
bra = OccupationNumberVector([0, 1, 2, 3])
D = np.zeros((M, M), dtype=int)
for p in range(M):
for q in range(M):
ket = OccupationNumberVector([0, 1, 2, 3])
ket.annihilation(q)
ket.creation(p)
D[p, q] = bra * ket
print("One-particle denisty matrix:\n", D)
One-particle denisty matrix:
[[1 0 0 0 0 0 0 0 0 0]
[0 1 0 0 0 0 0 0 0 0]
[0 0 1 0 0 0 0 0 0 0]
[0 0 0 1 0 0 0 0 0 0]
[0 0 0 0 0 0 0 0 0 0]
[0 0 0 0 0 0 0 0 0 0]
[0 0 0 0 0 0 0 0 0 0]
[0 0 0 0 0 0 0 0 0 0]
[0 0 0 0 0 0 0 0 0 0]
[0 0 0 0 0 0 0 0 0 0]]
Two-electron operators#
A two-electron operator takes the form
where, in the physicist’s notation,
Hamiltonian#
The Hamiltonian becomes
where, in the chemist’s notation,
Here \(\phi_p\) is the spatial part (MO) of spin orbital \(\psi_p\) and the Kronecker deltas are the result of the spin integration.
Energy#
The energy of a single-determinant state equals
We thus need to evaluate the one- and two-particle density matrices.
One-electron term#
For the one-electron term, we notice that orbital \(q\) has to be occupied to obtain a nonzero result as the annihilation operator acts to the right on \(| 0\rangle\). Using the anti-commutator relation, we get
This results in
Two-electron term#
bra = OccupationNumberVector([0, 1, 2, 3])
for p, q, r, s in [(0, 0, 1, 1), (0, 1, 1, 0), (0, 1, 0, 1)]:
ket = OccupationNumberVector([0, 1, 2, 3])
ket.annihilation(q)
ket.annihilation(s)
ket.creation(r)
ket.creation(p)
print("Two-particle density matrix element:", bra * ket)
Two-particle density matrix element: 1
Two-particle density matrix element: -1
Two-particle density matrix element: 0
For the two-electron term, we notice that orbitals \(q\) and \(s\) both have to be occupied to obtain a nonzero result. We focus on \(s\) and will use the same trick to move \(\hat{a}_i\) to the left
The last term will vanish in the expectation value and we are left with only terms involving only pairs of creation or annihilation operators. We get
and the total energy thus becomes equal to