Skip to main content
IBM Quantum Platform

givens_decomposition

givens_decomposition(unitary)

ユニタリ行列をギブンズ回転と対角位相に分解する。

n×nn \times n の単位行列 UU は、対角行列 DD と、隣接する添字に作用する一連の 2×22 \times 2 ギブンズ回転 GG へと分解することができる。 このアルゴリズムでは、最大で 個のそのような n(n−1)/2n (n-1) / 2 ギブンズ回転が必要 [1] となる。

各ギブンズ回転は、4元組 によって定義され (c, s, i, j)、その構成は以下の通りである:

  • c: 実数値のコサイン
  • s: 複素数値の正弦関数
  • i: 1行目のインデックス
  • j: 2行目のインデックス

その結果、次のような形式の行列が得られる:

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

パラメーター

unitary – 分解対象となる単位行列( UU )。

戻り値

以下からなる2元組

  • 前述のように、4-タプルとして表されるギブンズ回転の列
  • 対角行列の複素位相のベクトル、 DD

元のユニタリーは、返された回転を逆順に処理し、対角行列に各回転行列の要素ごとの複素共役を右から乗算することで復元される。 GkG_k (上記で定義された通り)。 つまり、 NN が回転を返したため、

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

ここで、 Gk‾\overline{G_k} は要素ごとの共役(共役転置ではない)を表し、各 GkG_k は、その回転における行/列 ii および jj に対してのみ作用する。

>>> 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. クレメンツら、 「汎用マルチポート干渉計の最適設計」、Optica 3、1460-1465 (2016)、 doi:10.1364/OPTICA.3.001460。

このページは役に立ちましたか?
バグや誤字の報告、またはコンテンツの要求はGitHubで行ってください。