密度行列・部分トレース

量子状態
となる。よって、
上記から、

一般には、
この時、スペクトル分解定理から、スペクトルを
つまり、量子システムが多くの状態
どの状態
例)
純粋状態でないものを混合状態と呼ぶ。
例)

となる。
に注意して、
と書ける。ここで、
である。よって ブロッホベクトル を思い出すと、密度行列を成分分解した係数と 1 対 1 対応していることが分かる。
また、正規直交基底
であるので、
この辺の話は、量子コンピュータと量子通信I 演習 2.72 や 量子コンピュータと量子通信III 8.4.2 量子プロセストモグラフィーにも似たような解説が記載されている。

qc = QuantumCircuit(1)
qc.x(0)
という量子回路がある場合に、
という Bloch 球の内部に対応する混合状態になる(
純粋状態
となることに注意したい。

ゲートにノイズが乗っていて 確率 X で状態 p \in (0, 1) のままとする。 \ket{0}
より一般的に書くと、
となる。これを踏まえてエラーチャネルを
と書く。純粋状態を始状態とする密度行列を
となる。上で見た密度行列と ブロッホベクトル との対応付けを思い出すと、
に対応することになるので、純粋状態から始めた結果、Bloch 球が Y 軸と Z 軸方向に潰れたような楕円球にうつる形 (“shrink our Bloch sphere”) になる。

qc = QuantumCircuit(1)
for _ in range(d):
qc.x(0)
すると、終状態の密度行列は
特に、

部分トレース
合成系
この時、
ここで、系 B の正規直交基底を
となる。要するに、
である。純粋状態による合成系のみ記述したが、混合状態でも同様の計算である。
Python
import numpy as np
I = np.eye(2)
ZERO = np.array([1, 0], dtype=complex).reshape(-1, 1)
ONE = np.array([0, 1], dtype=complex).reshape(-1, 1)
def kron(*args):
if len(args) < 2:
raise ValueError("At least two arrays are required for Kronecker product")
return reduce(np.kron, args)
_ = kron
state = _((ZERO+ONE)/np.sqrt(2), (ZERO-ONE)/np.sqrt(2))
rho = state @ state.conj().T
subsystem_rho1 = 0
for psi in [ZERO, ONE]:
subsystem_rho1 += _(I, psi).conj().T @ rho @ _(I, psi)
print(subsystem_rho1)
evals, evecs = np.linalg.eigh(subsystem_rho1)
subsystem_state1 = evecs[:, np.argmax(evals)]
print(subsystem_state1)
subsystem_rho2 = 0
for psi in [ZERO, ONE]:
subsystem_rho2 += _(psi, I).conj().T @ rho @ _(psi, I)
print(subsystem_rho2)
evals, evecs = np.linalg.eigh(subsystem_rho2)
subsystem_state2 = evecs[:, np.argmax(evals)]
print(subsystem_state2)