Skip to article frontmatterSkip to article content
Site not loading correctly?

This may be due to an incorrect BASE_URL configuration. See the MyST Documentation for reference.

Second quantization

Fock space

Consider a system of electrons in MM spin orbitals. An occupation number vector lists the spin-orbital occupation

k=k1kpkM| \mathbf{k} \rangle = | k_1 \ldots k_p\ldots k_M \rangle

where the occupation numbers, kpk_p, are restricted to 0 or 1.

The Fock space, F(M)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

    km=p=1Mδkpmp\langle \mathbf{k} | \mathbf{m} \rangle = \prod_{p=1}^{M} \delta_{k_p m_p}
  • the identity operator can be written as

    I^=kkk\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)F(1,M)F(M,M)F(M) = F(0,M) \oplus F(1,M) \oplus \cdots \oplus F(M,M)

    where F(N,M)F(N, M) is the set of occupation number vectors with NN occupied spin-orbitals.

  • subspace F(0,M)F(0, M) corresponds to a completely unoccupied Slater determinant known as the vacuum state, vac| \mathrm{vac} \rangle. For the vacuum state, we have

    vac=01020M;vacvac=1| \mathrm{vac} \rangle = | 0_1 0_2 \ldots 0_M \rangle ; \qquad \langle \mathrm{vac} | \mathrm{vac} \rangle = 1

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 a^p\hat{a}_p^\dagger:

a^pk=δkp0i=1p1(1)kpk1k2...1p...kM\hat{a}_p^\dagger | \mathbf{k} \rangle = \delta_{k_p 0} \prod_{i = 1}^{p-1} (-1)^{k_p} | k_1 k_2...1_p ...k_M \rangle
  • annihilation operator a^p\hat{a}_p:

a^pk=δkp1i=1p1(1)kpk1k2...0p...kM\hat{a}_p | \mathbf{k} \rangle = \delta_{k_p 1} \prod_{i = 1}^{p-1} (-1)^{k_p} | k_1 k_2...0_p ...k_M \rangle

where the factor δkp0\delta_{k_p 0} prevents the addition of an electron to a state that is already populated and δkp1\delta_{k_p 1} prevents the destruction of a non-existing electron.

The phase factor i=1p1(1)kp\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:

a^pa^q+a^qa^p=δpqa^pa^q+a^qa^p=0a^pa^q+a^qa^p=0\begin{align*} \hat{a}_p^\dagger \hat{a}_q + \hat{a}_q \hat{a}_p^\dagger &=& \delta_{pq} \\ \hat{a}_p^\dagger \hat{a}_q^\dagger + \hat{a}_q^\dagger \hat{a}_p^\dagger &=& 0 \\ \hat{a}_p \hat{a}_q + \hat{a}_q \hat{a}_p &=& 0 \end{align*}

Ground state

The ground state of an NN-electron system can be formed from the vacuum state

0=i=1Na^ivac| 0 \rangle = \prod_{i = 1}^{N} \hat{a}^\dagger_{i} |\mathrm{vac}\rangle

Slater determinants

There is a one-to-one correspondence between occupation number vectors and Slater determinants. For F(N,M)F(N,M), let us collect the NN positions in a given occupation number vector that have nonzero occupations in an ordered index set {i1,i2,,iN}\{i_1, i_2, \ldots,i_N\}. We then have

k=k1kpkMψi1,ψi2,,ψiN| \mathbf{k} \rangle = | k_1 \ldots k_p\ldots k_M \rangle \leftrightarrow | \psi_{i_1}, \psi_{i_2}, \ldots, \psi_{i_N}\rangle

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 ipi_p to unoccupied orbital aa with direct reference to Slater determinants

a^aa^ipψi1,,ψip,,ψiN=ψi1,,ψa,,ψiN\hat{a}^\dagger_{a}\hat{a}_{i_p} | \psi_{i_1}, \ldots, \psi_{i_p}, \ldots, \psi_{i_N}\rangle = | \psi_{i_1}, \ldots, \psi_{a}, \ldots, \psi_{i_N}\rangle

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

a^aψ1,ψ2,,ψN=ψa,ψ1,ψ2,,ψNa^iψi,ψ1,ψ2,,ψN=ψ1,ψ2,,ψN\begin{align*} \hat{a}^\dagger_{a} | \psi_{1}, \psi_{2}, \ldots, \psi_{N}\rangle & = | \psi_{a}, \psi_{1}, \psi_{2}, \ldots, \psi_{N}\rangle \\ \hat{a}_{i} | \psi_{i}, \psi_{1}, \psi_{2}, \ldots, \psi_{N}\rangle & = | \psi_{1}, \psi_{2}, \ldots, \psi_{N}\rangle \\ \end{align*}

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,

0=1111000000=ψ1,ψ1ˉ,ψ2,ψ2ˉ|0\rangle = |1 1 1 1 0 0 0 0 0 0\rangle = |\psi_1, \psi_{\bar{1}}, \psi_2, \psi_{\bar{2}}\rangle
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

0=iocca^ivac| 0 \rangle = \prod_{i}^\mathrm{occ} \hat{a}^\dagger_i |\mathrm{vac}\rangle
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

Ω^=p,qωpqa^pa^q\hat{\Omega} = \sum_{p,q} \omega_{pq} \, \hat{a}_p^\dagger \hat{a}_q

where

ωpq=ψpω^ψq\omega_{pq} = \langle \psi_p | \hat{\omega} | \psi_q \rangle

One-particle density

The one-particle density matrix becomes

Dpq=0a^pa^q0D_{pq} = \langle 0| \hat{a}_p^\dagger \hat{a}_q| 0\rangle
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

Ω^=p,q,r,sωpqrsa^pa^qa^sa^r\hat{\Omega} = \sum_{p,q,r,s} \omega_{pqrs} \, \hat{a}_p^\dagger \hat{a}_q^\dagger \hat{a}_s \hat{a}_r

where, in the physicist’s notation,

ωpqrs=ψpψqω^ψrψs\omega_{pqrs} = \langle \psi_p \psi_q | \hat{\omega} | \psi_r \psi_s \rangle

Hamiltonian

The Hamiltonian becomes

H^=p,qhpqa^pa^q+12p,q,r,sgpqrsa^pa^ra^sa^q\hat H = \sum_{p,q} h_{pq} \hat{a}_p^\dagger \hat{a}_q + \frac{1}{2} \sum_{p,q,r,s} g_{pqrs} \hat{a}_p^\dagger \hat{a}_r^\dagger \hat{a}_s \hat{a}_q

where, in the chemist’s notation,

gpqrs=(ϕpϕqω^ϕrϕs)δσpσqδσrσrg_{pqrs} = (\phi_p \phi_q | \hat{\omega} | \phi_r \phi_s ) \delta_{\sigma_p\sigma_q} \delta_{\sigma_r\sigma_r}

Here ϕp\phi_p is the spatial part (MO) of spin orbital ψp\psi_p and the Kronecker deltas are the result of the spin integration.

Energy

The energy of a single-determinant state equals

0H^0=p,qhpq0a^pa^q0+12p,q,r,sgpqrs0a^pa^ra^sa^q0\langle 0| \hat H | 0\rangle = \sum_{p,q} h_{pq} \langle 0| \hat{a}_p^\dagger \hat{a}_q| 0\rangle + \frac{1}{2} \sum_{p,q,r,s} g_{pqrs} \langle 0| \hat{a}_p^\dagger \hat{a}_r^\dagger \hat{a}_s \hat{a}_q | 0\rangle

We thus need to evaluate the one- and two-particle density matrices.

One-electron term

For the one-electron term, we notice that orbital qq has to be occupied to obtain a nonzero result as the annihilation operator acts to the right on 0| 0\rangle. Using the anti-commutator relation, we get

0a^pa^i0=δpi000a^ia^p0=δpi\langle 0| \hat{a}_p^\dagger \hat{a}_i | 0 \rangle = \delta_{pi} \langle 0| 0 \rangle - \langle 0| \hat{a}_i \hat{a}_p^\dagger | 0 \rangle = \delta_{pi}

This results in

p,qhpq0a^pa^q0=iocchii\sum_{p,q} h_{pq} \langle 0| \hat{a}_p^\dagger \hat{a}_q| 0\rangle = \sum_i^\mathrm{occ} h_{ii}

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 qq and ss both have to be occupied to obtain a nonzero result. We focus on ss and will use the same trick to move a^i\hat{a}_i to the left

a^pa^ra^ia^q=δria^pa^qa^pa^ia^ra^q=δria^pa^qδpia^ra^q+a^ia^pa^ra^q\begin{align*} \hat{a}_p^\dagger \hat{a}_r^\dagger \hat{a}_i \hat{a}_q & = \delta_{ri} \hat{a}_p^\dagger \hat{a}_q - \hat{a}_p^\dagger \hat{a}_i \hat{a}_r^\dagger \hat{a}_q \\ &= \delta_{ri} \hat{a}_p^\dagger \hat{a}_q - \delta_{pi} \hat{a}_r^\dagger \hat{a}_q + \hat{a}_i \hat{a}_p^\dagger \hat{a}_r^\dagger \hat{a}_q \end{align*}

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

p,q,r,sgpqrs0a^pa^ra^sa^q0=i,p,qgpqii0a^pa^q0i,q,rgiqri0a^ra^q0=i,j(gjjiigijji)\begin{align*} \sum_{p,q,r,s} g_{pqrs} \langle 0| \hat{a}_p^\dagger \hat{a}_r^\dagger \hat{a}_s \hat{a}_q | 0\rangle &= \sum_{i,p,q} g_{pqii} \langle 0|\hat{a}_p^\dagger \hat{a}_q | 0\rangle - \sum_{i,q,r} g_{iqri} \langle 0| \hat{a}_r^\dagger \hat{a}_q | 0\rangle \\ & = \sum_{i,j} \big( g_{jjii} - g_{ijji} \big) \end{align*}

and the total energy thus becomes equal to

0H^0=ihii+12i,j(gjjiigijji)\langle 0| \hat H | 0\rangle = \sum_i h_{ii} + \frac{1}{2} \sum_{i,j} \big( g_{jjii} - g_{ijji} \big)