Definindo a dimensão de um operador no qutip
Minha principal dúvida: Alguém pode me explicar como a lista de array é usada para definir a dimensão no qutip?
Contexto:
Se eu tiver meu operador de densidade A = Qobj(np.arange(1,65).reshape(8,8))
de 3 qubits, como faço a transposição parcial de forma que eu queira fazer um emaranhamento bipartido entre o qubit 1 com o qubit 2 e 3?
Eu estou supondo que eu teria que definir minha máscara como X.dims = [[2,4],[2,4]]
e tomar qt.partial_transpose(X, [1,0])
qual tendo a transposição parcial sobre o segundo subsistema. Mas o que isso X.dims = [[2,4],[2,4]]
significa no qutip?
Se isso estiver correto, como eu definiria minha dimensão para emaranhamento entre o qubit 1 e 3 e o qubit 2?
Respostas
Da documentação oficial :
Q.dims
: Lista que mantém o controle de formas para componentes individuais de um sistema multipartido (para produtos tensoriais e traços parciais).
Em outras palavras, você pode pensar nisso como as dimensões do (representação da matriz do) objeto em consideração, levando em consideração a estrutura tensorial do espaço subjacente. O primeiro elemento informa sobre o número de linhas, enquanto o segundo elemento informa sobre o número de colunas.
Considere como exemplo
fooQ = qutip.tensor(qutip.basis(2, 0), qutip.basis(2, 1))
Este é o produto tensorial de dois estados qubit ket, portanto, é um vetor em um espaço de dimensão$2\times 2$. Como uma matriz, você pode representá-la como um$4\times 1$matriz. Mas se você quiser se lembrar da estrutura do tensor desse espaço, o que torna mais fácil fazer coisas como rastreamento parcial, é melhor armazenar cada dimensão individual. Você então termina com fooQ.dims == [[2, 2], [1, 1]]
, porque existem$2\times 2$linhas, e$1=1\times 1$coluna.
No seu exemplo, [[2, 4], [2, 4]]
representa uma matriz de densidade em um espaço$\mathcal H_1\otimes\mathcal H_2$com$\dim\mathcal H_1=2$e$\dim\mathcal H_2=4$.
Você pode recuperar as dimensões gerais do espaço fazendo, por exemplo ,
number_of_rows = np.prod(fooQ.dims[0])
number_of_cols = np.prod(fooQ.dims[1])
Ou você pode "desvendar" as dimensões, obtendo uma lista das dimensões de cada espaço componente individual, com
unravelled_dimensions = np.transpose(fooQ.dims)