givens_decomposition
givens_decomposition(unitary)
Zerlegt eine unitäre Matrix in Givens-Rotationen und Diagonalphasen.
Die Einheitsmatrix , , lässt sich in eine Diagonalmatrix, , und eine Folge von Givens-Drehungen , , zerlegen, die auf benachbarte Indizes wirken. Dieser Algorithmus [1] benötigt höchstens solche Givens-Rotationen.
Jede Givens-Rotation wird durch ein 4-Tupel definiert (c, s, i, j), wobei:
c: der reellwertige Kosinuss: die komplexwertige Sinusfunktioni: der Index der ersten Zeilej: der Index der zweiten Zeile
was zu einer Matrix der folgenden Form führt:
Parameter
einheitlich – die einheitliche Matrix , die zerlegt werden soll.
Rückgabe
Ein 2-Tupel, bestehend aus
- die Folge von Givens-Rotationen, die, wie oben erläutert, als 4-Tupel dargestellt wird
- der Vektor der komplexen Phasen der Diagonalmatrix,
Die ursprüngliche Einheitsmatrix lässt sich wiederherstellen, indem die zurückgegebenen Rotationen in umgekehrter Reihenfolge verarbeitet werden und die Diagonalmatrix rechtsmit dem elementweisen komplexen Konjugierten jeder Rotationsmatrix (wie oben definiert) multipliziert wird. Das heißt, für wurden Rotationen zurückgegeben,
wobei die elementweise Konjugation (nicht die konjugierte Transponierte) bezeichnet und jede nur auf die Zeilen/Spalten und ihrer Rotation wirkt.
>>> 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 u. a., Optimales Design für universelle Mehrport-Interferometer, Optica 3, 1460–1465 (2016), doi:10.1364/OPTICA.3.001460.