Skip to main content
IBM Quantum Platform

givens_decomposition

givens_decomposition(unitary)

Zerlegt eine unitäre Matrix in Givens-Rotationen und Diagonalphasen.

Die Einheitsmatrix n×nn \times n, UU, lässt sich in eine Diagonalmatrix, DD, und eine Folge von Givens-Drehungen 2×22 \times 2, GG, zerlegen, die auf benachbarte Indizes wirken. Dieser Algorithmus [1] benötigt höchstens n(n−1)/2n (n-1) / 2 solche Givens-Rotationen.

Jede Givens-Rotation wird durch ein 4-Tupel definiert (c, s, i, j), wobei:

  • c: der reellwertige Kosinus
  • s: die komplexwertige Sinusfunktion
  • i: der Index der ersten Zeile
  • j: der Index der zweiten Zeile

was zu einer Matrix der folgenden Form führt:

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

Parameter

einheitlich – die einheitliche Matrix UU, 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, DD

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 GkG_k (wie oben definiert) multipliziert wird. Das heißt, für NN wurden Rotationen zurückgegeben,

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

wobei Gk‾\overline{G_k} die elementweise Konjugation (nicht die konjugierte Transponierte) bezeichnet und jede GkG_k nur auf die Zeilen/Spalten ii und jj 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.

War diese Seite hilfreich?
Melden Sie auf GitHub einen Fehler, einen Tippfehler oder fordern Sie Inhalte an.