Representing the Bloch-Redfield equation (Fermions)

FermionBRNoiseOperator: this Bath Mapper object is designed to handle noise in systems involving fermions, which are particles like electrons that follow the Pauli exclusion principle, that means fermions don't commute. In the context of quantum computing fermions are represented by occupational operators. Fermionic noise is relevant in many areas of quantum mechanics and condensed matter physics, including the study of superconductors and quantum dots.

Equation for fermions

As described in the Spins Operator section, the Bloch-Redfield equation for spins reads as follows:

\[ \dot{\rho}(t) = - \frac{\mathrm{i}}{\hbar} \left[ H, \rho(t) \right] - \frac{1}{\hbar^2} \sum_{m} \left[S_m, \Lambda_m(t) \rho(t) - \rho(t) \Lambda_m^{\dagger}(t) \right] , \] with \( \Lambda_m(t) = \sum_n \int_{0}^{\infty} d \tau C_{m, n}(\tau) S_{n, I} (t - \tau) \).

A similar construction can be used to represent fermions coupled to a (bosonic) bath. The operators \(T_n\) would then be of the form \( c^{\dagger}_0 \), \( c_0 \), or \( c^{\dagger}_0 c_0 \). Similarly to the terms stored in the SpinBRNoiseOperator, the terms can only act on one fermion, i.e. terms such as \( c^{\dagger}_0 c_1 \) are not supported.

Using the FermionBlochRedfieldNoiseOperator

The FermionBRNoiseOperator is initialized with a list of frequencies for which to store the spectra. Internally, the FermionBRNoiseOperator stores this list of frequencies, as well as a dictionary of FermionProduct pairs with their corresponding spectral function. Each spectral function must have the same number of points as the number of frequencies and can have complex values.

Additionally, the FermionBRNoiseOperator has the following functions:

  • set - this takes a key (str, str) (representing the left and right FermionProducts) and a value List[complex] (representing the frequency-resolved spectral function corresponding to the key). It sets this combination of inputs in the internal dictionary.
  • set_real - this takes a key (str, str) (representing the left and right FermionProducts) and a value List[float] (representing the frequency-resolved spectral function corresponding to the key). It sets the real part of a spectral function for two spin indices.
  • set_imag - this takes a key (str, str) (representing the left and right FermionProducts) and a value List[float] (representing the frequency-resolved spectral function corresponding to the key). It sets the imaginary part of a spectral function.
  • get - this takes a key (str, str) (representing the left and right FermionProducts) and returns the corresponding spectral function stored in the dictionary. If none is found, a list of zeroes is returned.
  • get_real - this takes a key (str, str) (representing the left and right FermionProducts) and returns the real part of the corresponding spectral function stored in the dictionary. If none is found, a list of zeroes is returned.
  • get_imag - this takes a key (str, str) (representing the left and right FermionProducts) and returns the imaginary part of the corresponding spectral function stored in the dictionary. If none is found, a list of zeroes is returned.
  • frequencies - returns the frequencies for which the spectral functions are defined.
  • get_spectral_function_matrix - gets the matrix of the spectral function of a spin-system at a specific energy index. It takes a spectral function index int (the frequency index for which to return the matrix representation of the spectral function) and a number of spins (to build the correct size matrix). NOTE: The current accepted input for couplings between system fermions and bath bosons is of the form: \( c^{\dagger}_i c_j (b^{\dagger} + b) \). Therefore, the matrix we build is of size \(N^2 \times N^2\) where N is the number of system fermions. The indexing of the columns is \( c^{\dagger}_0 c_0, c^{\dagger}_0 c_1, ..., c^{\dagger}_0 c_{N-1}, c^{\dagger}_1 c_0, c^{\dagger}_1 c_1, ..., c^{\dagger}_{N-1} c_{N-1} \). The indexing of the rows is \( c^{\dagger}_0 c_0, c^{\dagger}_1 c_0, ..., c^{\dagger}_{N-1} c_0, c^{\dagger}_0 c_1, c^{\dagger}_1 c_1, ..., c^{\dagger}_{N-1} c_{N-1} \).
  • resample - this function takes a list of frequencies List[float] and resamples the current spectral functions according to this list of new frequencies.
  • resample_interpolate - this function takes a list of frequencies List[float] and resamples the current spectral functions via interpolation (according to this list of new frequencies).

Additionally, serialisation functions such as to_json/from_json and to_bincode/from_bincode are available for easy transfer of information.

Python example

Below is a python snippet showing how to initialize and interface with the FermionBRNoiseOperator.

from bath_mapper import FermionBRNoiseOperator

frequencies = [0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9]
br_operator = FermionBRNoiseOperator(frequencies)

z_z_spectral_function = [0.0, 0.0, 0.01, 0.012, 0.15, 0.28, 0.16, 0.08, 0.02, 0.01]
br_operator.set(("c0a0", "c0a0"), z_z_spectral_function)

assert br_operator.get_imag(("c0a0", "c0a0")) == [0.0 for _ in range(len(frequencies))]
assert br_operator.get(("c1a1", "c1a1")) == [0.0 for _ in range(len(frequencies))]
assert br_operator.frequencies() == frequencies

new_frequencies = [0, 0.025, 0.05, 0.075, 0.1, 0.125, 0.15, 0.175, 0.2, 0.225]
new_br_operator = br_operator.resample_interpolate(new_frequencies)

print(new_br_operator.frequencies())
print(new_br_operator.get(("c0a0", "c0a0")))

FermionLindbladNoiseOperator vs FermionBRNoiseOperator

As described in the Background Physics section, either the Bloch-Redfield master equation or the Lindblad master equation can be used to describe open quantum systems depending on the context and assumptions. struqture is the quantum computing library by HQS that utilizes the Lindblad equation.

Similarly to the spin case, the user should not confuse the objects FermionLindbladNoiseOperator and FermionBRNoiseOperator: the former is used to represent the Lindblad operators for fermionic systems in struqture, while the latter is usedf to represent the Bloch-Redfield spectral functions defined above.