Definindo a dimensão de um operador no qutip

Aug 16 2020

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

2 glS Aug 18 2020 at 15:29

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)