Decompose a matrix into a sequence of Givens rotations.
View aliases
Main aliases
openfermion.givens_decomposition
, openfermion.linalg.givens_rotations.givens_decomposition
openfermion.linalg.givens_decomposition(
unitary_rows, always_insert=False
)
The input is an m×n matrix Q with m≤n. The rows of Q are orthonormal. Q can be decomposed as follows:
VQU†=D
where V and U are unitary matrices, and D is an m×n matrix with the first m columns forming a diagonal matrix and the rest of the columns being zero. Furthermore, we can decompose U as
U=Gk...G1
where G1,…,Gk are complex Givens rotations. A Givens rotation is a rotation within the two-dimensional subspace spanned by two coordinate axes. Within the two relevant coordinate axes, a Givens rotation has the form
(cos(θ)−eiφsin(θ)sin(θ)eiφcos(θ)).
Returns
givens_rotations (list[tuple]):
A list of tuples of objects describing Givens
rotations. The list looks like [(G_1, ), (G_2, G_3), ... ].
The Givens rotations within a tuple can be implemented in parallel.
The description of a Givens rotation is itself a tuple of the
form \\((i, j, \theta, \varphi)\\), which represents a
Givens rotation of coordinates
\\(i\\) and \\(j\\) by angles \\(\theta\\) and
\\(\varphi\\).
left_unitary (ndarray):
An \\(m \times m\\) numpy array representing the matrix
\\(V\\).
diagonal (ndarray):
A list of the nonzero entries of \\(D\\).