![]() |
Decompose a square matrix into a sequence of Givens rotations.
openfermion.linalg.givens_decomposition_square(
unitary_matrix, always_insert=False
)
The input is a square :math:n \times n
matrix :math:Q
.
:math:Q
can be decomposed as follows:
.. math::
Q = DU
where :math:U
is unitary and :math:D
is diagonal.
Furthermore, we can decompose :math:U
as
.. math::
U = G_k ... G_1
where :math:G_1, \ldots, G_k
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
.. math::
\begin{pmatrix}
\cos(\theta) & -e^{i \varphi} \sin(\theta) \\
\sin(\theta) & e^{i \varphi} \cos(\theta)
\end{pmatrix}.
Args | |
---|---|
unitary_matrix
|
A numpy array with orthonormal rows, representing the matrix Q. |
Returns
decomposition (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 :math:`(i, j, \theta, \varphi)`, which represents a
Givens rotation of coordinates
:math:`i` and :math:`j` by angles :math:`\theta` and
:math:`\varphi`.
diagonal (ndarray):
A list of the nonzero entries of :math:`D`.