givens_decomposition
givens_decomposition(unitary)
Décompose une matrice unitaire en rotations de Givens et en phases diagonales.
La matrice unitaire , , peut être décomposée en une matrice diagonale, , et en une suite de rotations de Givens de type « », , agissant sur des indices adjacents. Cet algorithme [1] nécessite au maximum rotations de Givens de ce type.
Chaque rotation de Givens est définie par un quadruplet, (c, s, i, j), où :
c: le cosinus à valeurs réelless: la fonction sinus à valeurs complexesi: l'index de la première lignej: l'index de la deuxième ligne
ce qui donne une matrice de la forme suivante :
Paramètres
unitaire – la matrice unitaire à décomposer.
Retours
Un tuple à deux éléments composé de
- la suite de rotations de Givens représentée sous forme de quadruplets, comme expliqué ci-dessus
- le vecteur des phases complexes de la matrice diagonale,
On récupère l'unité d'origine en traitant les rotations renvoyées dans l'ordre inverse et en multipliant par la droite la matrice diagonale par le conjugué complexe, élément par élément, de chaque matrice de rotation (telle que définie ci-dessus). Autrement dit, pour les rotations renvoyées par ,
où désigne la conjugaison élément par élément (et non la transposée conjuguée) et où chaque n'agit que sur les lignes/colonnes et de sa rotation.
>>> import numpy as np
>>> from qiskit_fermions.linalg import givens_decomposition
>>> unitary = np.array([[0.6, 0.8j], [0.8, -0.6j]], dtype=complex)
>>> rotations, phases = givens_decomposition(unitary)
>>> reconstructed = np.diag(phases).astype(complex)
>>> for c, s, i, j in rotations[::-1]:
... givens_mat = np.eye(2, dtype=complex)
... givens_mat[np.ix_((i, j), (i, j))] = [[c, s], [-s.conjugate(), c]]
... reconstructed = reconstructed @ givens_mat.conj()
>>> bool(np.allclose(reconstructed, unitary))
True
[ 1 ]
W. R. Clements et al., Conception optimale des interféromètres multiports universels, Optica 3, 1460-1465 (2016), doi:10.1364/OPTICA.3.001460.