qml.spin.fermi_hubbard

fermi_hubbard(lattice, n_cells, hopping=1.0, coulomb=1.0, boundary_condition=False, neighbour_order=1, mapping='jordan_wigner')[source]

Generates the Hamiltonian for the Fermi-Hubbard model on a lattice.

The Hamiltonian is represented as:

\[\hat{H} = -t\sum_{<i,j>, \sigma}(c_{i\sigma}^{\dagger}c_{j\sigma}) + U\sum_{i}n_{i \uparrow} n_{i\downarrow}\]

where t is the hopping term representing the kinetic energy of electrons, U is the on-site Coulomb interaction, representing the repulsion between electrons, i,j represent the indices for neighbouring spins, \(\sigma\) is the spin degree of freedom, and \(n_{i \uparrow}, n_{i \downarrow}\) are number operators for spin-up and spin-down fermions at site i. This function assumes there are two fermions with opposite spins on each lattice site.

Parameters
  • lattice (str) – Shape of the lattice. Input values can be 'chain', 'square', 'rectangle', 'honeycomb', 'triangle', or 'kagome'.

  • n_cells (List[int]) – Number of cells in each direction of the grid.

  • hopping (float or List[float] or List[math.array(float)]) – Hopping strength between neighbouring sites, it can be a number, a list of length equal to neighbour_order or a square matrix of size (num_spins, num_spins), where num_spins is the total number of spins. Default value is 1.0.

  • coulomb (float or List[float]) – Coulomb interaction between spins. It can be a constant or a list of length equal to number of spins.

  • boundary_condition (bool or list[bool]) – Defines boundary conditions for different lattice axes, default is False indicating open boundary condition.

  • neighbour_order (int) – Specifies the interaction level for neighbors within the lattice. Default is 1, indicating nearest neighbours.

  • mapping (str) – Specifies the fermion-to-qubit mapping. Input values can be 'jordan_wigner', 'parity' or 'bravyi_kitaev'.

Returns

Hamiltonian for the Fermi-Hubbard model.

Return type

Sum

Example

>>> n_cells = [2]
>>> h = [0.5]
>>> u = 1.0
>>> spin_ham = qml.spin.fermi_hubbard("chain", n_cells, hopping=h, coulomb=u)
>>> spin_ham
(
-0.25 * (Y(0) @ Z(1) @ Y(2))
+ -0.25 * (X(0) @ Z(1) @ X(2))
+ 0.5 * I(0)
+ -0.25 * (Y(1) @ Z(2) @ Y(3))
+ -0.25 * (X(1) @ Z(2) @ X(3))
+ -0.25 * Z(1)
+ -0.25 * Z(0)
+ 0.25 * (Z(0) @ Z(1))
+ -0.25 * Z(3)
+ -0.25 * Z(2)
+ 0.25 * (Z(2) @ Z(3))
)