openfermion.linalg.givens_decomposition

Decompose a matrix into a sequence of Givens rotations.

Main aliases

openfermion.givens_decomposition, openfermion.linalg.givens_rotations.givens_decomposition

The input is an m×n matrix Q with mn. 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(θ)).

unitary_rows A numpy array or matrix with orthonormal rows, representing the matrix Q.

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\\).