Contents

1.1 What is FermiFab?

FermiFab stands for "fermion laboratory" and is a quantum physics toolbox for small numbers of fermions. It is mainly concerned with the representation of (symbolic) fermionic wavefunctions and the calculation of their reduced density matrices (RDMs). The toolbox transparently handles the inherent antisymmetrization of wavefunctions and incorporates the creation and annihilation formalism.

1.2 Fermi states

A fundamental building block of multi-fermion quantum mechanics are Slater determinants, which you can think of as a collection of "orbitals" (or slots), some of which are occupied by a fermionic particle (e.g., an electron):

In this illustration, each circle represents an orbital, and the filled circles denote occupied orbitals. In mathematical terms, the available number of orbitals 'orbs' is the dimension of the underlying single-particle Hilbert space and the number of occupied orbitals is the particle number . Thus there are altogether

Slater determinants. Each quantum mechanical Fermi state is a linear combination of these Slater determinants with complex coefficients. Formally, the quantum Fermi state is an element of the -particle Fock space.

In FermiFab, you can define, say, a particle state (or wavefunction) and 6 available orbitals with the fermistate command:

1.5 Tensor products of operators

For any linear operator (i.e., matrix) , it holds that

That is, we obtain a matrix representation of acting on . The tensor_op command implements precisely this operation. The following code lines are taken from the "natural orbitals" example in test/norbs.m:

crand generates pseudorandom complex numbers (similar to rand), and eig computes eigenvalues and -vectors. Thus, the eigenvectors of the one-body reduced density matrix of are stored in . Performing a corresponding base change on using these eigenvectors should result in a diagonal one-body RDM [Löwdin 1955]:

In many physical applications, one can take advantage of unitary base changes on such that subsequent computations are simplified. The above code shows how to implement the according base change on .

1.6 State configurations

For performance and memory efficiency reasons, the concept of "configurations" are built into FermiFab, i.e. you can partition the orbitals into several groups, each containing a fixed number of particles. Let's say your system involves 3 particles in 9 orbitals, with exactly 2 particles in the first 5 orbitals and 1 particle in the remaining 4 orbitals. Then a fermistate reflecting this configuration is specified by

orbs = [5,4]; N = [2,1];
psi = fermistate(orbs,N)

psi =
Fermi State (orbs == 9, N == 3)
|126>

Note that is the lexicographically first basis vector respecting the configuration constraints, and that requires only

rather than complex entries:

length(psi)

ans =
40

The command rdm works transparently for all configurations, so behaves like a standard 9-orbital 3-particle state.

What happens if you add two fermistate wavefunctions with different but compatible configurations (i.e., the total number of orbitals and particles agrees)?

orbs = [2,7]; N = [1,2];
phi = fermistate(orbs,N)

phi =
Fermi State (orbs == 9, N == 3)
|134>

length(phi)

ans =
42

Adding and gives

chi = psi+phi

chi =
Fermi State (orbs == 9, N == 3)
|126> + |134>

as expected - so how is this accomplished? FermiFab has detected that it needs to merge the two configurations, resulting in the full-fledged 9-orbital 3-particle state, which is reflected by