Introducing (dynamical) Lie algebras for quantum practitioners¶
Published: February 27, 2024. Last updated: February 26, 2025.
Note
Go to the end to download the full example code.
Are you a quantum practitioner that has so far successfully avoided learning about Lie groups and Lie algebras, but find yourself in a situation where the pressure is steadily growing? Did you have little success in quick online search attempts and found yourself overwhelmed by high energy physics literature? Then this demo might be for you, as we are going to introduce the basic concepts of Lie theory from a perspective that is amenable to quantum scientists, engineers, and practitioners.
Introduction¶
Lie algebras, pronounced like the name “Lee”, offer a fresh perspective on some of the established ideas in quantum physics and become more and more important in quantum computing. Let us recap some of the key concepts of quantum mechanics and how they relate to and give rise to Lie algebras.
Most physicists know quantum physics in terms of wavefunctions $|\psi\rangle$ that live in a Hilbert space $\mathcal{H},$ as well as (bounded) linear operators $\hat{O}$ that live in the space of linear operators on that Hilbert space, $\mathcal{L}(\mathcal{H}).$ For finite dimensional systems (think, $n$ number of qubits) we have complex valued state vectors (wavefunctions) in $\mathcal{H} = \mathbb{C}^{2^n}$ with norm 1 and square matrices (linear operators) in $\mathcal{L}(\mathcal{H}) = \mathbb{C}^{2^n \times 2^n}.$
Two very important sub-classes of linear operators in quantum mechanics are unitary and Hermitian operators. Hermitian operators $H$ are self-adjoint, $H^\dagger = H,$ and describe observables that can be measured. Unitary operators are norm-preserving such that $\langle \psi | U^\dagger U | \psi \rangle = \langle \psi | \psi \rangle,$ in particular we have $U^{-1} = U^\dagger.$ They describe how quantum states are transformed and ensure that their norm is preserved.
A unitary operator can always be written as
where we say that $H$ is the generator of $U.$ Take for example a single qubit rotation $U(\phi) = e^{-i \frac{\phi}{2} X}.$ $U(\phi)$ is the unitary evolution that rotates a quantum state in Hilbert space around the x-axis on the Bloch sphere, and is generated by the Pauli $X$ matrix.
The space of all such unitary operators forms the so-called special unitary group $SU(N),$ where for qubit systems we have $N=2^n$ with $N$ the dimension of the group and n the number of qubits. In quantum computing, we are typically dealing with the Hilbert space $\mathcal{H} = \mathbb{C}^{2^n}$ and for full universality we require the available gates to span all of $SU(2^n).$ That means when we have all unitaries of $SU(2^n)$ available to us, we can reach any state in Hilbert space from any other state.
The Lie group $SU(2^n)$ has an associated Lie algebra to it, called $\mathfrak{su}(2^n)$ (more on that later). In some cases, it is more convenient to work with the associated Lie algebra rather than the Lie group.
So if you are familiar with quantum computing but knew nothing about Lie algebras and Lie groups before this demo, the good news is that you actually already know the elements of both. Roughly speaking, the relevant Lie group in quantum computing is the space of unitaries, and the relevant Lie algebra is the space of Hermitian matrices. Further, they are related to each other: The Lie algebra (Hermitian matrices) generates the Lie group (unitaries) via the exponential map. There are, however, some subtleties if we want to be mathematically precise, as we will explore more in depth now.
Lie algebras¶
After some motivation and connections to concepts we are already familiar with, let us formally introduce Lie algebras. An algebra is a vector space equipped with a bilinear operation. A Lie algebra $\mathfrak{g}$ is a special case where the bilinear operation behaves like a commutator. In particular, the bilinear operation $[\bullet, \bullet]: \mathfrak{g} \times \mathfrak{g} \rightarrow \mathfrak{g}$ needs to satisfy
-
$[x, x] = 0 \ \forall x \in \mathfrak{g}$ (alternativity)
-
$[x, [y, z]] + [y, [z, x]] + [z, [x, y]] = 0 \ \forall x,y,z \in \mathfrak{g}$ (Jacobi identity)
-
$[x, y] = - [y, x] \ \forall x,y \in \mathfrak{g}$ (anti-commutativity)
The last one, anti-commutativity, technically is not an axiom but follows from bilinearity and alternativity, but is so crucial that it is worth highlighting. These properties generally define the so-called Lie bracket, where the commutator is just one special case thereof. A different example would be the cross-product between vectors in $\mathbb{R}^3.$ Note also that we are talking about a vector space in the mathematical sense, and the elements (“vectors”) in $\mathfrak{g}$ are actually operators (matrices) in our case looking at quantum physics.
One very relevant Lie algebra for us is the special unitary algebra $\mathfrak{su}(N),$ the space of $N \times N$ skew-Hermitian matrices with trace zero. The fact that we look at skew-Hermitian ($H^\dagger = - H$) instead of Hermitian ($H^\dagger = H$) matrices is a technical detail (see note below). For all practical purposes you can just think of Hermitian operators with an imaginary factor and note that linear combinations are strictly over the reals. In fact, you may sometimes find references to $\mathfrak{su}(N)$ being the Hermitian matrices in physics literature (see Wikipedia).
Note
The result of a commutator between two Hermitian operators $H_1$ and $H_2$ is always skew-Hermitian due to the commutator’s anti-commutativity, i.e.
This means that Hermitian operators are not closed under commutation, and thus do not form a Lie algebra (because the commutator maps outside the set of Hermitian matrices). But instead, skew-Hermitian operators do. Note that the algebra of $N \times N$ skew-Hermitian matrices is called the unitary algebra $\mathfrak{u}(N),$ whereas the additional property of the trace being zero making it the special unitary algebra $\mathfrak{su}(N).$ They generate the unitary group $U(N)$ and the special unitary group $SU(N)$ with determinant 1, respectively.
The Pauli matrices $\{iX, iY, iZ\}$ span the $\mathfrak{su}(2)$ algebra that we can associate with single qubit dynamics. For multiple qubits we have
where the span is over the reals $\mathbb{R}.$ In particular, we cannot do a complex span over Paulis, since this could destroy the anti-commutativity again. Another way of thinking about this is that Lie algebra elements “live” in the exponent of a unitary operator, and having that exponent become Hermitian instead of skew-Hermitian destroys the unitary property.
Let us briefly test some of these properties numerically. First, let us do a linear combination of $\{iX, iY, iZ\}$ with some real values and check unitarity after putting them in the exponent.
import numpy as np
import pennylane as qml
from pennylane import X, Y, Z
su2 = [1j * X(0), 1j * Y(0), 1j * Z(0)]
coeffs = [1., 2., 3.] # some real coefficients
exponent = qml.dot(coeffs, su2) # linear combination of operators
U = qml.math.expm(exponent.matrix()) # compute matrix exponent of lin. comb.
print(np.allclose(U.conj().T @ U, np.eye(2))) # check that result is unitary UU* = 1
True
If we throw complex values in the mix, the resulting matrix is not unitary anymore.
coeffs = [1., 2.+ 1j, 3.] # some complex coefficients
exponent = qml.dot(coeffs, su2)
U = qml.math.expm(exponent.matrix())
print(np.allclose(U.conj().T @ U, np.eye(2))) # result is not unitary anymore
False
Relation to Lie groups¶
We said earlier that the Lie group $SU(N)$ is generated by the Lie algebra $\mathfrak{su}(N).$ But what do we actually mean by that? Essentially, for every unitary matrix $U \in SU(N)$ there is a (real) linear combination of elements $iP_j \in \mathfrak{su}(N)$ such that
for some real coefficients $\lambda_j \in \mathbb{R}.$
In quantum computing, we are interested in unitary gates that, when composed together, realize a complicated unitary evolution $U.$ That could, for example, be a unitary that prepares the ground state of a Hamiltonian from the $|0\rangle^{\otimes n}$ state or perform a sub-routine like the quantum Fourier transform. In particular, we are not composing quantum circuits via creating superpositions of Lie algebra elements as is done in the last equation.
Luckily, beyond the relation above, we also know that any unitary matrix $U \in SU(2^n)$ can be decomposed in a finite product of elements from a universal gate set $\mathcal{U},$
for $U_j \in \mathcal{U}.$ A universal gate set is formed exactly when the generators of its elements form $\mathfrak{su}(2^n).$ Note that in this equation the product may feature a large number of gates $U_j,$ so universality does not guarantee an efficient decomposition but rather just a finite one.
Dynamical Lie Algebras¶
A different way of looking at this is taking a set of generators $\{iG_j\}$ and asking what kind of unitary evolutions they can generate. This naturally introduces the so-called Dynamical Lie Algebra (DLA), originally proposed in quantum optimal control theory and recently re-emerging in the quantum computing literature. The DLA $i\mathfrak{g}$ is given by all possible nested commutators between the generators $\{iG_j\},$ until no new and linearly independent skew-Hermitian operator is generated. This is called the Lie-closure and is written like
Let us do a quick example and compute the Lie closure of $\{iX, iY\}$ (more examples later).
print(qml.commutator(1j * X(0), 1j * Y(0)))
-2j * Z(0)
We know that the commutator between $iX$ and $iY$ yields a new operator $\propto iZ.$ Note that we do not care for scalar coefficients, just the operators (technically, we care for linear independence, and $2i Z$ is of course linearly dependent on $iZ$). So we add $iZ$ to our list of operators and continue to take commutators between them.
list_ops = [1j * X(0), 1j * Y(0), 1j * Z(0)]
for op1 in list_ops:
for op2 in list_ops:
print(qml.commutator(op1, op2))
0 * I()
-2j * Z(0)
2j * Y(0)
2j * Z(0)
0 * I()
-2j * X(0)
-2j * Y(0)
2j * X(0)
0 * I()
Since no new operators have been created we know the lie closure is complete and our dynamical Lie algebra is $\langle\{iX, iY\}\rangle_\text{Lie} = \{iX, iY, iZ\}( = \mathfrak{su}(2)).$
PennyLane provides some dedicated functionality for Lie algebras. We can compute the Lie closure of the generators using qml.lie_closure
.
dla = qml.lie_closure([X(0), Y(0)])
dla
[X(0), Y(0), Z(0)]
On one hand, the Lie closure ensures that the DLA is closed under commutation. But you can also think of the Lie closure as filling the missing operators to describe the possible dynamics in terms of its Lie algebra. Let us stick to the example above and imagine for a second that we dont take the Lie closure but just take the two generators $\{iX, iY\}.$ These two generators suffice for universality (for a single qubit) in that we can write any evolution in the Dynamical Lie Group $SU(2)$ as a finite product of these $X$ and $Y$ rotations $e^{-i \phi X}$ and $e^{-i \phi Y}.$ For example, let us write a Pauli-Z rotation at non-trivial angle $0.5$ as a product of them.
U_target = qml.matrix(qml.RZ(-0.5, 0))
decomp = qml.ops.one_qubit_decomposition(U_target, 0, rotations="XYX")
print(decomp)
[RX(1.5707963267948966, wires=[0]), RY(0.5000000000000004, wires=[0]), RX(10.995574287564276, wires=[0])]
We can check that this is indeed a valid decomposition by computing the trace distance to the target.
U = qml.prod(*decomp).matrix()
print(1 - np.real(np.trace(U_target @ U))/2)
0.0
So we see that a finite set of generators $iX$ and $iY$ suffice to express the target unitary. However, we cannot write $U = e^{-i(\lambda_1 X + \lambda_2 Y)}$ since we are missing the $iZ$ from the DLA $i\mathfrak{g} = \langle iX, iY \rangle_\text{Lie} = \{iX, iY, iZ\}.$
Ising-type Lie algebras¶
Let us work through another example as an exercise. Let us look at the generators $\{iX_0 X_1, iZ_0, iZ_1\}.$ You may recognize them as the terms in the transverse field Ising model (here for the simple case of $n=2$)
where $\langle i, j \rangle$ indicates a sum over nearest neighbors in the system’s topology. Let us compute the first set of commutators for those generators.
generators = [1j * (X(0) @ X(1)), 1j * Z(0), 1j * Z(1)]
# collection of linearly independent basis vectors, automatically discards linearly dependent ones
dla = qml.pauli.PauliVSpace(generators, dtype=complex)
for i, op1 in enumerate(generators):
for op2 in generators[i+1:]:
res = qml.commutator(op1, op2)/2
res = res.simplify() # ensures all products of scalars are executed
print(f"[{op1}, {op2}] = {res}")
if res.scalar != 0. and dla.is_independent(res.pauli_rep):
# Note that the previous is_independent check is just for pedagocical purposes
# as dla.add already checks linear independence below
print(f"Appending {res}")
dla.add(res)
[1j * (X(0) @ X(1)), 1j * Z(0)] = 1j * (Y(0) @ X(1))
Appending 1j * (Y(0) @ X(1))
[1j * (X(0) @ X(1)), 1j * Z(1)] = 1j * (X(0) @ Y(1))
Appending 1j * (X(0) @ Y(1))
[1j * Z(0), 1j * Z(1)] = 0 * I()
We obtain two new operators $iY_0 X_1$ and $iX_0 Y_1$ and append the list of operators of the DLA. We then continue with depth-1 nested commutators (“nested” as $iY_0 X_1 \propto [iX_0 X_1, iZ_0]$).
for i, op1 in enumerate(dla.basis.copy()):
for op2 in dla.basis.copy()[i+1:]:
res = qml.commutator(op1, op2)/2
res = res.simplify()
print(f"[{op1}, {op2}] = {res}")
if res.scalar != 0. and dla.is_independent(res.pauli_rep):
print(f"Appending {res}")
dla.add(res)
[1j * X(0) @ X(1), 1j * Z(0)] = 1j * (Y(0) @ X(1))
[1j * X(0) @ X(1), 1j * Z(1)] = 1j * (X(0) @ Y(1))
[1j * X(0) @ X(1), 1j * Y(0) @ X(1)] = -1j * Z(0)
[1j * X(0) @ X(1), 1j * X(0) @ Y(1)] = -1j * Z(1)
[1j * Z(0), 1j * Z(1)] = 0 * I()
[1j * Z(0), 1j * Y(0) @ X(1)] = 1j * (X(0) @ X(1))
[1j * Z(0), 1j * X(0) @ Y(1)] = -1j * (Y(0) @ Y(1))
Appending -1j * (Y(0) @ Y(1))
[1j * Z(1), 1j * Y(0) @ X(1)] = -1j * (Y(0) @ Y(1))
[1j * Z(1), 1j * X(0) @ Y(1)] = 1j * (X(0) @ X(1))
[1j * Z(1), -1j * Y(0) @ Y(1)] = -1j * (Y(0) @ X(1))
[1j * Y(0) @ X(1), 1j * X(0) @ Y(1)] = 0 * I()
[1j * Y(0) @ X(1), -1j * Y(0) @ Y(1)] = 1j * Z(1)
[1j * X(0) @ Y(1), -1j * Y(0) @ Y(1)] = 1j * Z(0)
The only new operator here is $iY_0 Y_1,$ which we add to the list of the DLA. We could continue this process with a second nesting layer but will find that no new operators are added past this point. We finally end up with the DLA $\{X_0 X_1, Z_0, Z_1, iY_0 X_1, iX_0 Y_1, iY_0 Y_1\}$
for op in dla.basis:
print(op)
1j * X(0) @ X(1)
1j * Z(0)
1j * Z(1)
1j * Y(0) @ X(1)
1j * X(0) @ Y(1)
-1j * Y(0) @ Y(1)
Curiously, even though both $iZ_0$ and $iZ_1$ are in the DLA, $iZ_0 Z_1$ is not. Hence, products of generators are not necessarily in the DLA.
We have constructed the DLA by hand to showcase the process. We can use the PennyLane function lie_closure()
for convenience.
In that case, we omit the explicit use of the imgaginary factor.
dla2 = qml.lie_closure([X(0) @ X(1), Z(0), Z(1)])
for op in dla2:
print(op)
X(0) @ X(1)
Z(0)
Z(1)
-1.0 * (Y(0) @ X(1))
-1.0 * (X(0) @ Y(1))
Y(0) @ Y(1)
The DLA obtained from the Ising generators form the so-called special orthogonal Lie algebra $\mathfrak{so}(4),$ which has the dimension $4*3/2 = 6$ (see table below), equal to the number of operators we obtain from computing the Lie closure. For more qubits $n,$ the associated DLA for the transverse field Ising model is $\mathfrak{so}(2n)$ for open boundary conditions and $\mathfrak{so}(2n)^{\oplus 2}$ for cyclic boundary conditions in 1D.
We can easily verify this using lie_closure()
.
def IsingGenerators(n, bc="open"):
gens = [X(i) @ X(i+1) for i in range(n-1)]
gens += [Z(i) for i in range(n)]
if bc == "periodic":
gens += [X(n-1) @ X(0)]
return gens
for n in range(2, 5):
open_ = qml.lie_closure(IsingGenerators(n, "open"))
periodic_ = qml.lie_closure(IsingGenerators(n, "periodic"))
print(f"Ising for n = {n}")
print(f"open: {len(open_)} = {n*(2*n-1)} = 2n * (2n - 1)/2")
print(f"open: {len(periodic_)} = {2*n*(2*n-1)} = 2 * 2n * (2n - 1)/2")
Ising for n = 2
open: 6 = 6 = 2n * (2n - 1)/2
open: 6 = 12 = 2 * 2n * (2n - 1)/2
Ising for n = 3
open: 15 = 15 = 2n * (2n - 1)/2
open: 30 = 30 = 2 * 2n * (2n - 1)/2
Ising for n = 4
open: 28 = 28 = 2n * (2n - 1)/2
open: 56 = 56 = 2 * 2n * (2n - 1)/2
This Ising-type Lie algebra is one of only a few handful DLAs that have polynomial scaling (see 1 for a full classification in 1D) and are thus efficiently simulatable 7 6. Less common but also relevant is the symplectic algebra $\mathfrak{sp}(2N).$
In the table below we provide the dimensions of some of the common simple Lie algebras.
Lie algebra |
dimension |
---|---|
$\mathfrak{su}(N)$ |
$N^2-1$ |
$\mathfrak{so}(N)$ |
$N(N-1)/2$ |
$\mathfrak{sp}(N)$ |
$N(N+1)/2$ |
Hamiltonian Symmetries¶
With this new knowledge we are now able to understand what is meant when some Hamiltonian models are said to be symmetric under some symmetry group. Specifically, let us look at the spin-1/2 Heisenberg model Hamiltonian in 1D with nearest neighbor interactions,
with some coupling constants $J_j \in \mathbb{R}.$ First it is important to understand that the generators here are made up of the whole sum of operators $X_j X_{j+1} + Y_j Y_{j+1} + Z_j Z_{j+1}$, and not each individual term $X_j X_{j+1}$, $Y_j Y_{j+1},$ and $Z_j Z_{j+1}.$ This Hamiltonian is said to be $SU(2)$ invariant, but what does that mean?
First, let us identify total spin components
Together, they span a representation of $\mathfrak{su}(2)$ (more on that below). These total spin components each commute with the system Hamiltonian, i.e.
Let us briefly verify this for a small example for n = 3
qubits that readily generalizes to arbitrary sizes.
n = 3
H = qml.sum(*(P(i) @ P(i+1) for i in range(n-1) for P in [X, Y, Z]))
SX = qml.sum(*(X(i) for i in range(n)))
SY = qml.sum(*(Y(i) for i in range(n)))
SZ = qml.sum(*(Z(i) for i in range(n)))
print(qml.commutator(H, SX))
print(qml.commutator(H, SY))
print(qml.commutator(H, SZ))
0j * (Z(0) @ Y(1)) + 0j * (Y(0) @ Z(1)) + 0j * (Z(1) @ Y(2)) + 0j * (Y(1) @ Z(2))
0j * (Z(0) @ X(1)) + 0j * (X(0) @ Z(1)) + 0j * (Z(1) @ X(2)) + 0j * (X(1) @ Z(2))
0j * (Y(0) @ X(1)) + 0j * (X(0) @ Y(1)) + 0j * (Y(1) @ X(2)) + 0j * (X(1) @ Y(2))
Now that we know that the Heisenberg model Hamiltonian commutes with any $S_\text{tot}^{\alpha}$ for $\alpha \in \{x, y, z\},$ we also know that any observable composed of the total spin components
with arbitrary real coefficients $c_x, c_y, c_z \in \mathbb{R}$ commutes with the Hamiltonian,
An immediate consequence of this is that also $[e^{-i\hat{O}}, H_\text{Heis}] = 0.$ Hence, $H_\text{Heis}$ is invariant under any action of $e^{-i \hat{O}} \in SU(2),$
Thus, $H_\text{Heis}$ is said to be $SU(2)$ symmetric.
There are several things to note: We have so far been sloppy in equating Lie algebras with one of many possible representations (e.g. $\text{span}_{\mathbb{R}} \{iX, iY, iZ\} = \mathfrak{su}(2)$ above). The total spin component operators $S_\text{tot}^{x}, S_\text{tot}^{y}, S_\text{tot}^{z}$ span another representation of $\mathfrak{su}(2)$ and, therefore, generate $SU(2).$ This is easily verified by looking at the commutation relation between these operators that match $[\hat{O}_i, \hat{O}_j] = 2i \varepsilon_{ij\ell} \hat{O}_\ell,$ the defining property of $\mathfrak{su}(2).$
print(qml.commutator(SX, SY) == (2j*SZ).simplify())
print(qml.commutator(SZ, SX) == (2j*SY).simplify())
print(qml.commutator(SY, SZ) == (2j*SX).simplify())
True
True
True
Another perspective on the inherent $SU(2)$ symmetry of $H_\text{Heis}$ is that the expectation value of $\hat{O}$ with respect to any state $|\psi\rangle$ is invariant under evolution of $H_\text{Heis}.$ This can be seen by looking at
where $|\psi(t)\rangle = e^{-i t H_\text{Heis}} |\psi\rangle$ is the evolved state under $H_\text{Heis}.$ In that sense, $\hat{O}$ is a conserved quantity of the system. One often associates a so-called quantum number with each generator of the symmetry, here $\{S_\text{tot}^{x}, S_\text{tot}^{y}, S_\text{tot}^{z}\},$ the total spin numbers.
Overall, we saw that $H_\text{Heis}$ is invariant under action of $SU(2)$ and how this gives rise to conserved quantities.
Note
Symmetries also play a big role in quantum phase transitions: Imagine preparing the ground state at zero temperature of a system that has a symmetry. Accordingly, the ground state must be invariant under that symmetry. I.e., the expectation value of the conserved quantities must not change by adiabatically (very slowly) changing the system parameters while staying at zero temperature. However, there may be critical point in the parameter space of the Hamiltonian where a conserved quantity does, in fact, change. That is what is called the spontaneous breaking of the symmetry and it is associated with a quantum phase transition.
Conclusion¶
With this introduction, we hope to clarify some terminology, introduce the basic concepts of Lie theory and motivate their relevance in quantum physics by touching on universality and symmetries. While Lie theory and symmetries are playing a central role in established fields such as quantum phase transitions (see note above) and high energy physics, they have recently also emerged in quantum machine learning with the onset of geometric quantum machine learning 2 3 (see our recent introduction to geometric quantum machine learning). Further, DLAs have recently become instrumental in classifying criteria for barren plateaus 4 5 and designing simulators based on them 6.
References¶
- 1
-
Roeland Wiersema, Efekan Kökcü, Alexander F. Kemper, Bojko N. Bakalov “Classification of dynamical Lie algebras for translation-invariant 2-local spin systems in one dimension” arXiv:2309.05690, 2023.
- 2
-
Johannes Jakob Meyer, Marian Mularski, Elies Gil-Fuster, Antonio Anna Mele, Francesco Arzani, Alissa Wilms, Jens Eisert “Exploiting symmetry in variational quantum machine learning” arXiv:2205.06217, 2022.
- 3
-
Quynh T. Nguyen, Louis Schatzki, Paolo Braccia, Michael Ragone, Patrick J. Coles, Frederic Sauvage, Martin Larocca, M. Cerezo “Theory for Equivariant Quantum Neural Networks” arXiv:2210.08566, 2022.
- 4
-
Enrico Fontana, Dylan Herman, Shouvanik Chakrabarti, Niraj Kumar, Romina Yalovetzky, Jamie Heredge, Shree Hari Sureshbabu, Marco Pistoia “The Adjoint Is All You Need: Characterizing Barren Plateaus in Quantum Ansätze” arXiv:2309.07902, 2023.
- 5
-
Michael Ragone, Bojko N. Bakalov, Frédéric Sauvage, Alexander F. Kemper, Carlos Ortiz Marrero, Martin Larocca, M. Cerezo “A Unified Theory of Barren Plateaus for Deep Parametrized Quantum Circuits” arXiv:2309.09342, 2023.
- 6(1,2)
-
Matthew L. Goh, Martin Larocca, Lukasz Cincio, M. Cerezo, Frédéric Sauvage “Lie-algebraic classical simulations for variational quantum computing” arXiv:2308.01432, 2023.
- 7
-
Rolando D. Somma “Quantum Computation, Complexity, and Many-Body Physics” arXiv:quant-ph/0512209, 2005.
Korbinian Kottmann
Quantum simulation & open source software
Total running time of the script: (0 minutes 0.047 seconds)
Share demo