TwoQubitWeylDecomposition: failed to diagonalize M2

Qiskit Errors #

TwoQubitWeylDecomposition: failed to diagonalize M2. #

タイトルのエラーに遭遇した。

  • 2022/3/12
  • Qiskit 0.34.2
  • qiskit/quantum_info/synthesis/two_qubit_decompose.py

次の行列$U$を使った処理でTwoQubitWeylDecomposition: failed to diagonalize M2のエラーがでる。

Issues

を見ても良い感じの対処法がなさそうなので、np.allclose()atolの許容誤差を1e-12とかにして緩和するのが良さそうだけども、こういうことはできるだけしたくない。

import numpy as np
import scipy.linalg as la
import cmath
from qiskit.exceptions import QiskitError
from qiskit.quantum_info.synthesis.weyl import transform_to_magic_basis


U = np.array([
    [(0.3945282997653422 + 0.49127685316744496j), (-0.10799362925849759 - 0.046262145472562424j), (-0.17866302937542566 - 0.4579595765217537j), (-0.3299855856919041 - 0.4885219806766785j)],
    [(-0.10799362925849768 - 0.04626214547256243j), (0.8638710645400048 - 0.35880630506234923j), (-0.23218921544778265 + 0.07338827406700994j), (-0.11904147245195221 - 0.19419955337169612j)],
    [(-0.17866302937542586 - 0.4579595765217535j), (-0.2321892154477826 + 0.07338827406701008j), (0.017401577445396693 + 0.32313818065993927j), (-0.17664002536172665 - 0.7504212686269761j)],
    [(-0.32998558569190406 - 0.4885219806766784j), (-0.1190414724519524 - 0.19419955337169617j), (-0.17664002536172668 - 0.7504212686269764j), (-0.02793005810069993 + 0.0738754480515572j)]
    ])

detU = la.det(U)
global_phase = cmath.phase(detU) / 4
Up = transform_to_magic_basis(U, reverse=True)
M2 = Up.T.dot(Up)

state = np.random.default_rng(2020)
for _ in range(100):
    M2real = state.normal() * M2.real + state.normal() * M2.imag
    _, P = np.linalg.eigh(M2real)
    D = P.T.dot(M2).dot(P).diagonal()
    if np.allclose(P.dot(np.diag(D)).dot(P.T), M2, rtol=0, atol=1.0e-13):
        break
else:
    raise QiskitError(
        "TwoQubitWeylDecomposition: failed to diagonalize M2."
        " Please report this at https://github.com/Qiskit/qiskit-terra/issues/4159."
        f" Input: {U.tolist()}"
    )

アルゴリズムはQiskitのソースコードqiskit/quantum_info/synthesis/two_qubit_decompose.pyに書いてあるように、 Constructive Quantum Shannon Decomposition from Cartan Involutionsの結果を用いている。