givens_decomposition
givens_decomposition(unitary)
Scompone una matrice unitaria in rotazioni di Givens e fasi diagonali.
La matrice unitaria , , può essere scomposta in una matrice diagonale, , e in una sequenza di rotazioni di Givens , , che agiscono sugli indici adiacenti. Questo algoritmo [1] richiede al massimo 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 realis: il seno a valori complessii: l'indice della prima rigaj: l'indice della seconda riga
che danno come risultato una matrice della forma:
Parametri
unitaria – la matrice unitaria, , 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,
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 (come definito sopra). Cioè, per rotazioni restituite,
dove indica la coniugazione elemento per elemento (non la trasposta coniugata) e ogni agisce solo sulle righe/colonne e 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.