Definizione della dimensione di un operatore in qutip
La mia domanda principale: qualcuno può spiegarmi come viene utilizzato l'elenco di array per definire la dimensione in qutip?
Contesto:
Se ho il mio operatore A = Qobj(np.arange(1,65).reshape(8,8))
di densità di 3 qubit, come posso prendere la trasposizione parziale in modo tale da voler creare un entanglement bipartito tra il qubit 1 con il qubit 2 e 3?
Immagino che dovrei definire la mia maschera come X.dims = [[2,4],[2,4]]
e prendere qt.partial_transpose(X, [1,0])
quale prendere una trasposizione parziale sul secondo sottosistema. Ma cosa significa questo X.dims = [[2,4],[2,4]]
in qutip?
Se questo è corretto, come definirei la mia dimensione per l'entanglement tra qubit 1 e 3 e qubit 2?
Risposte
Dalla documentazione ufficiale :
Q.dims
: Elenco che tiene traccia delle forme per i singoli componenti di un sistema multipartito (per prodotti tensoriali e tracce parziali).
In altre parole, puoi pensarla come le dimensioni della (rappresentazione matriciale dell') oggetto in esame, tenendo conto della struttura tensoriale dello spazio sottostante. Il primo elemento ti dice il numero di righe mentre il secondo elemento ti dice il numero di colonne.
Considera come esempio
fooQ = qutip.tensor(qutip.basis(2, 0), qutip.basis(2, 1))
Questo è il prodotto tensoriale di due stati qubit ket, quindi è un vettore in uno spazio dimensionale$2\times 2$. Come matrice, puoi rappresentarla come a$4\times 1$matrice. Ma se vuoi ricordare la struttura tensoriale di questo spazio, che rende più facile fare cose come il tracciamento parziale, è meglio memorizzare ogni singola dimensione. Quindi finisci con fooQ.dims == [[2, 2], [1, 1]]
, perché ci sono$2\times 2$righe, e$1=1\times 1$colonna.
Nel tuo esempio, [[2, 4], [2, 4]]
rappresenta una matrice di densità in uno spazio$\mathcal H_1\otimes\mathcal H_2$insieme a$\dim\mathcal H_1=2$e$\dim\mathcal H_2=4$.
Puoi recuperare le dimensioni complessive dello spazio facendo ad es
number_of_rows = np.prod(fooQ.dims[0])
number_of_cols = np.prod(fooQ.dims[1])
Oppure puoi "sbrogliare" le dimensioni, ottenendo un elenco delle dimensioni di ogni singolo spazio componente, con
unravelled_dimensions = np.transpose(fooQ.dims)