Skip to main content
IBM Quantum Platform

givens_decomposition

givens_decomposition(unitary)

Décompose une matrice unitaire en rotations de Givens et en phases diagonales.

La matrice unitaire n×nn \times n, UU, peut être décomposée en une matrice diagonale, DD, et en une suite de rotations de Givens de type « 2×22 \times 2 », GG, agissant sur des indices adjacents. Cet algorithme [1] nécessite au maximum rotations de Givens n(n−1)/2n (n-1) / 2 de ce type.

Chaque rotation de Givens est définie par un quadruplet, (c, s, i, j), où :

  • c: le cosinus à valeurs réelles
  • s: la fonction sinus à valeurs complexes
  • i: l'index de la première ligne
  • j: l'index de la deuxième ligne

ce qui donne une matrice de la forme suivante :

(cs−s†c)\begin{pmatrix} c & s \\ -s^\dagger & c \end{pmatrix}

Paramètres

unitaire – la matrice unitaire UU à 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, DD

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 GkG_k (telle que définie ci-dessus). Autrement dit, pour les rotations renvoyées par NN,

U=D⋅GN‾⋅GN−1‾⋯G1‾,U = D \cdot \overline{G_N} \cdot \overline{G_{N-1}} \cdots \overline{G_1},

où Gk‾\overline{G_k} désigne la conjugaison élément par élément (et non la transposée conjuguée) et où chaque GkG_k n'agit que sur les lignes/colonnes ii et jj 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.

Cette page a-t-elle été utile ?
Signaler un bogue, une coquille ou proposer du contenu sur GitHub.