Definiowanie wymiaru operatora w qutip
Moje główne pytanie: Czy ktoś może mi wyjaśnić, w jaki sposób lista tablic jest używana do określenia wymiaru w qutip?
Kontekst:
Jeśli mój operator gęstości A = Qobj(np.arange(1,65).reshape(8,8))
składa się z 3 kubitów, w jaki sposób mogę dokonać częściowej transpozycji, tak że chcę dokonać dwudzielnego splątania między kubitem 1 z kubitem 2 i 3?
Domyślam się, że musiałbym zdefiniować moją maskę jako X.dims = [[2,4],[2,4]]
i przyjąć, qt.partial_transpose(X, [1,0])
która z częściową transpozycją na drugi podsystem. Ale co to X.dims = [[2,4],[2,4]]
oznacza w qutip?
Jeśli to prawda, w jaki sposób zdefiniowałbym swój wymiar splątania między kubitem 1 i 3 a kubitem 2?
Odpowiedzi
Z oficjalnej dokumentacji :
Q.dims
: Lista ze śledzeniem kształtów dla poszczególnych elementów systemu wieloczęściowego (dla produktów tensorowych i częściowych śladów).
Innymi słowy, można o tym myśleć jako o wymiarach (reprezentacji macierzowej) rozpatrywanego obiektu, biorąc pod uwagę strukturę tensoryczną przestrzeni bazowej. Pierwszy element informuje o liczbie wierszy, a drugi o liczbie kolumn.
Rozważmy jako przykład
fooQ = qutip.tensor(qutip.basis(2, 0), qutip.basis(2, 1))
Jest to iloczyn tensorowy dwóch stanów kubit ket, a więc jest to wektor w przestrzeni wymiaru $2\times 2$. Jako macierz możesz przedstawić ją jako plik$4\times 1$matryca. Ale jeśli chcesz zapamiętać strukturę tensorową tej przestrzeni, która ułatwia wykonywanie takich rzeczy, jak częściowe śledzenie, lepiej przechowywać każdy indywidualny wymiar. Kończysz wtedy fooQ.dims == [[2, 2], [1, 1]]
, ponieważ są$2\times 2$ wiersze i $1=1\times 1$ kolumna.
W twoim przykładzie [[2, 4], [2, 4]]
reprezentuje macierz gęstości w przestrzeni$\mathcal H_1\otimes\mathcal H_2$ z $\dim\mathcal H_1=2$ i $\dim\mathcal H_2=4$.
Możesz odzyskać całkowite wymiary przestrzeni, wykonując np
number_of_rows = np.prod(fooQ.dims[0])
number_of_cols = np.prod(fooQ.dims[1])
Możesz też „rozwikłać” wymiary, uzyskując listę wymiarów każdej przestrzeni składowej za pomocą
unravelled_dimensions = np.transpose(fooQ.dims)