quan における波動関数の密度行列表現

著者: 禅とコンピュータープログラミングの芸術

1 はじめに

密度行列表現は、量子力学において非常に重要な概念です。電子の状態、プロセッサの状態、その他の物理システムの状態情報を測定することで、対応する密度行列を取得できます。測定された密度行列は、ブロッホ球線図やスペクトログラムなどの何らかの手段で表示できます。近年、機械学習の台頭により、機械学習手法を使用して密度行列情報を予測しようとする研究者が増えています。

一方、波動関数トモグラフィー (WFT) も非常に有意義で古典的な計算手法です。WFT は、測定された密度行列情報を使用して波動関数の係数に分解して実際の波動関数を取得するため、本来測定結果に隠されている実際の物理システムの特性を理解するのに役立ちます。

最近の WFT 技術会議では、NMR ベースの質量分析データが WFT の最先端の研究を推進しました。この記事では、WFT の古典的な理論とその実装テクノロジーを組み合わせて、量子力学で密度行列をエンコードする方法と、エンコードされた密度行列を実際の波動関数に復元する方法を説明します。

2. 基本的な概念と用語の説明

  1. 量子状態: 量子状態は、一連の決定論的量子ビットとそれらのさまざまな制約相互作用で構成される目的系の状態を指します。ここでの状態は、双極振動または共振曲線である場合もあれば、任意の複素波動関数である場合もあります。

  2. 測定: 測定とは、ある量子状態からその状態に特有の情報をランダムに抽出することです。物理的な測定(特定の量子状態を測定するために特定の測定装置を準備し、その測定装置を使用して対応する粒子の数を測定するなど)と、計算によってシミュレートする(ランダムなサンプルを生成するなど)に分けることができます。確率分布に基づいて点を抽出し、サンプリング結果に基づいて対応する密度行列を推定します)。

  3. 密度行列: 密度行列。システムの波動関数分布を記述するために使用される行列形式です。システムが異なる状態にあるとき、システムは特定の確率分布に従って異なる位置を占めます。これらの確率分布は密度行列によって特徴付けられます。行列の各行と列はシステムの固有状態に対応し、各要素は固有状態の確率を表します。与えられたパラメータのセットについて、密度行列はシステムのすべての可能な局所混合状態の分布を一意に記述することができます。

  4. 波動関数トモグラフィー: 波動関数トポロジーは、波動関数再構成またはフォノン再構成としても知られ、測定された密度行列情報を使用して波動関数の係数に分解し、実際の波動関数を再構成するプロセスです。その中心原理は、測定結果に現れるもつれ効果を利用して、さまざまな種類の測定結果をさまざまな次元の空間にマッピングし、それによって実際の波動関数を復元することです。

3. コアアルゴリズム原理、具体的な操作手順、数式の説明

(1) 密度行列の符号化

3.1.ボーンルールと密度行列表現

N 量子ビットを備えた量子システムがあり、それぞれが測定可能であると仮定します。測定したい量子状態が、N 次元ユークリッド空間内の複素ベクトルの集合によって表される確率分布であると仮定します。次に、これらのベクトルに対して次の制約を作成できます。

  1. すべてのベクトルは、合意された仕様、つまり正規化条件を満たさなければなりません。つまり、Σ|ψi|^2=1です。これは、系の総エネルギーは系内の陽電子のエネルギーにのみ関係することがわかっているため、正規化後に得られる各ベクトルは標準化され、正規化条件を満たすため、確率分布を表すことができるからです。

  2. すべてのベクトルは、規則の補題 Δ|ψi-ψj|=sqrt{α {ij}^2+β {ij}^2} を満たさなければなりません。ここで、α と β は 2 つの異なる量子ビット間の運動量です。

このようにして、量子状態ρ(x)の密度行列ρ(x)を求めることができる。しかし、この密度行列は量子コンピューティングで直接使用するには大きすぎます。この密度行列を圧縮するには、次の方法を使用できます。

  1. 上記の密度行列に対して特異値分解を実行して、2 つの N×N 実対角行列 U および D を取得します。ここで、D の要素は特異値です。σ(x)=np.diag(D) で示されるように、対角行列 D の要素の数は行列の特異値 k の数に等しくなります。

  2. 行列 σ(x) を、v(x) で示される長さ k の 1 次元ベクトルに圧縮します。ここで、 v(x)[i] = np.trace(U[i:,:]*U[:i,:], i は、i 番目の特異値に対応する添え字を表します。このステップは、U を並べ替えることと同等です。行列の順序は、より大きな特異値を持つベクトルが最初に来て、より小さな特異値を持つベクトルが後に来るようなものです。

  3. v(x) を使用して、元の密度行列 σ(x) をエンコードされた密度行列として置き換えます。

3.2.ウィグナー分解を使用して確率分布をコンパクトなベクトルにエンコードする

ウィグナー分解は、任意の確率分布 ρ(x) をウィグナー回転行列 W(x) に変換できます。ウィグナー回転行列は複素行列であり、各列は「ウィグナー関数」であり、この関数はαとβで表される任意の運動量に対応する確率の性質を記述します。それは次のように定義されます。

γ(a,b;l,m,n)=(delta_l delta_m)^(-1/2)*(δ (nm)δ (al)+δ (am)δ (bn)-δ (an)δ (うーん))

ここで、δ_nm はクロネッカー デルタ シンボルを表します。方程式系 Ax=b について、可逆行列 X が存在する場合、A の代わりに X を使用して解くことができます。この置換はウィグナー投影と呼ばれます。ウィグナー投影を使用すると、密度行列 ρ(x) をウィグナー回転行列 W(x) と特異値行列 σ(x) に分解できます。

  1. ウィグナー分解を使用して、確率分布 ρ(x) をウィグナー回転行列 W(x) と特異値行列 σ(x) に表現します。

    w(x) = sqrt(σ(x)) * U(x)、U(x) は、要素が γ(a,b;l,m,n) である実数対角行列です。

    W(x) は N*N 次元の複素行列です。指定された座標 (θ、φ) に対して、次の方法を使用して計算します。

    1. θ=π/2、φ=0の場合、直接w(x)[i][j]=1/√2*(σ(x)[i]-σ(x)[j])とします。

    2. θ=0、φ=θ の場合、w(x)[i][j]=1/√2*(σ(x)[i]+σ(x)[j])/sqrt(2) とします。

    3. それ以外の場合は、三角関数の公式を使用して w(x)[i][j] を計算します。

    4. w(x) を U(x) の形式に変換します。

    確率分布ρ(x)はウィグナー回転行列W(x)と特異値行列σ(x)で表されます。

  2. ウィグナー回転行列 W(x) と特異値行列 σ(x) を長さ k の 1 次元ベクトルに圧縮します。

    v(x)=[sqrt(σ(x))[0]] + [sqrt(σ(x))[i]/sqrt(σ(x)[i-1])] 1 から k- 1.

    このステップでは、まず特異値行列 σ(x) の各要素に対して平方根演算を実行します。次に、各特異値の平方根をその前のすべての要素の平方根の積で割って、正規化係数を取得します。この正規化係数を使用して特異値を並べ替えると、よりコンパクトな v(x) ベクトルが得られます。

(2) 密度行列から確率分布への復号

3.3.コンパクトベクトルを復号して確率分布に戻す

v(x) から元の確率分布 ρ(x) を復元するには、ウィグナー射影手法が必要です。まず、U(x) 行列を取得する必要があります。v(x) をスライスして、最初の特異値に対応する要素を取得します。スライスした値をデルタ関数に代入して、deltam(v(x)) を取得します。次に、テイラー展開公式を使用して δm(v(x)) を近似し、双対 δm(v(x))/(2J+1) を取得します。スライスされた値は再びデルタ関数に取り込まれ、deltan(v(x)) が得られます。次に、テイラー展開公式を使用して δn(v(x)) を近似し、双対 δn(v(x))/(2J+1) を取得します。最後に、δm(v(x))/δn(v(x)) の商を使用してδ関数を繰り返し計算することにより、δmm(v(x))、δmn(v(x))、δnn(v( x))。次に、テイラー展開公式を使用して δmm(v(x))、δmn(v(x))、δnn(v(x)) を近似し、 γm(θ,φ)、γn(θ,φ) を取得します。 、w(x) 行列を取得できます。その要素は γm(θ,φ) γn(θ,φ) exp(I(θ+φ)/2)(θ+φ)=exp(I(θ + φ)/2) (ウィグナー関数)。次に、w(x) を累乗して ρ(x) を取得します。

確率分布ρ(x)はv(x)で表される。Wigner 投影技術を使用して、v(x) から元の確率分布 ρ(x) を復元できます。

3.4.Python での Wigner 分解アルゴリズムの実装

以下は、Python 言語での Wigner 分解アルゴリズムの実装コードです。

import numpy as np
from scipy import linalg
import math

def wigner_decomp(psi):
    # convert the complex vectors into real matrices with N^2 elements each
    psi_mat = np.zeros((len(psi), len(psi)))
    for i in range(len(psi)):
        psi_mat[:, i] = psi[i].real**2 + psi[i].imag**2

    # calculate trace of square root of psi_mat to get the variance vector
    var_vec = np.diag(linalg.eigh(psi_mat)[0]**0.5)

    # apply Born Rule to obtain the density matrix
    rho = np.dot(var_vec.T, var_vec) / float(len(psi)**2)

    # use svd to compress the density matrix to a vector of length k
    u, s, vt = linalg.svd(rho)
    if np.sum(s > 1e-9)<len(s):
       raise ValueError('Error: SVD did not converge')

    vect = []
    for j in range(len(s)):
        factor = s[j] / sum([sj for idx, sj in enumerate(s) if idx<=j])
        vect.append(factor)

    return np.array(vect), var_vec

if __name__ == '__main__':
    # Example usage
    n_qubits = 2
    x = {'0': 0, '1': 1, '+': 0.7071, '-': -0.7071}

    psi = {}
    for key in itertools.product(['0', '1'], repeat=n_qubits):
        str_key = ''.join(key)
        if str_key in ['0'*n_qubits, '1'*n_qubits]:
            continue
        value = complex(0,0)
        for qubit in range(n_qubits):
            basis = int(str_key[-(qubit+1)])
            amplitide = (complex(x[basis], 0) if qubit==0 else 1.)
            phase = ((-1)**int(str_key[qubit])) * (-math.pi/2)**(n_qubits-qubit-1)
            value += amplitide * np.exp(phase * 1j)

        psi[str_key] = value

    vec, var_vec = wigner_decomp(psi.values())
    print("Vector form:", vec)
    print("Variance vector:", var_vec)

おすすめ

転載: blog.csdn.net/universsky2015/article/details/133566042