Skip to content

Fermionic Models

Fermionic systems like the tight-binding model or spinless fermions can be built using FermionBasis and FermionSite.

Basis and Sectors

The FermionBasis handles the Hilbert space mapping. For identical/spinless fermions, sectors are defined by the total particle number.

Sectors: - use_n: Boolean flag to enable total number conservation. - n: Total number of particles.

For spin-½ models, use HubbardBasis where sectors include use_nup, nup, use_ndn, ndn, use_n, n.

Site Operators

The FermionSite provides standard creation/annihilation operators: - Cdag: Creation operator \(c^\dagger\) - C: Annihilation operator \(c\)

Example: Free Fermion Chain (Tight-Binding)

Hamiltonian: \(H = -t \sum_{\langle i, j \rangle} (c^\dagger_i c_j + h.c.)\)

from qkrylov import FermionBasis, FermionSite, Sector, OpSum, MatrixFreeHamiltonian

# 10 sites, half-filling (N=5)
basis = FermionBasis(10, Sector(use_n=True, n=5))
site = FermionSite()
opsum = OpSum()

t = 1.0
for i in range(10):
    j = (i + 1) % 10
    opsum += (-t, site.Cdag, i, site.C, j)
    opsum += (-t, site.Cdag, j, site.C, i)

H = MatrixFreeHamiltonian(basis, opsum)
#include <qkrylov/models/fermion.hpp>
#include <qkrylov/core/opsum.hpp>
#include <qkrylov/core/hamiltonian.hpp>

using namespace qkrylov;

int main() {
    Sector sector;
    sector.use_n = true;
    sector.n = 5;

    FermionBasis basis(10, sector);
    FermionSite site;
    OpSum opsum;

    double t = 1.0;
    for(int i = 0; i < 10; ++i) {
        int j = (i + 1) % 10;
        opsum.add({-t, site.Cdag, i, site.C, j});
        opsum.add({-t, site.Cdag, j, site.C, i});
    }

    MatrixFreeHamiltonian H(basis, opsum);
    return 0;
}

Coming Soon

Julia bindings are planned via extern "C" FFI. See the roadmap.