Skip to main content
IBM Quantum Platform

givens_decomposition

givens_decomposition(unitary)

Scompone una matrice unitaria in rotazioni di Givens e fasi diagonali.

La matrice unitaria n×nn \times n, UU, può essere scomposta in una matrice diagonale, DD, e in una sequenza di rotazioni di Givens 2×22 \times 2, GG, che agiscono sugli indici adiacenti. Questo algoritmo [1] richiede al massimo n(n−1)/2n (n-1) / 2 i rotazioni di Givens di questo tipo.

Ogni rotazione di Givens è definita da una quadrupla, (c, s, i, j), in cui:

  • c: il coseno a valori reali
  • s: il seno a valori complessi
  • i: l'indice della prima riga
  • j: l'indice della seconda riga

che danno come risultato una matrice della forma:

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

Parametri

unitaria – la matrice unitaria, UU, da scomporre.

Risultati

Una tupla di 2 elementi composta da

  • la sequenza di rotazioni di Givens rappresentata come quartette, come spiegato sopra
  • il vettore delle fasi complesse della matrice diagonale, DD

L'unità originale viene recuperata elaborando le rotazioni restituite in ordine inverso e moltiplicando per destra la matrice diagonale per il coniugato complesso, elemento per elemento, di ciascuna matrice di rotazione GkG_k (come definito sopra). Cioè, per NN rotazioni restituite,

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

dove Gk‾\overline{G_k} indica la coniugazione elemento per elemento (non la trasposta coniugata) e ogni GkG_k agisce solo sulle righe/colonne ii e jj della propria rotazione.

>>> 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 e altri, Progettazione ottimale per interferometri multiporta universali, Optica 3, 1460-1465 (2016), doi:10.1364/OPTICA.3.001460.

Questa pagina è stata utile?
Segnala un bug, un errore di battitura o richiedi contenuti su GitHub.