Certamente é suficiente sempre calcular a matriz unitária completa e aplicá-la ao vetor de estado de entrada . Se é isso que você escolhe fazer, é tudo o que você precisa fazer, pois todas as informações de emaranhamento estão contidas nesse vetor. Uma maneira rápida e fácil de verificar se um determinado qubit está emaranhado é seguir o rastreio parcial do seu vetor de estado (puro) sobre todos os outros qubits. Se a matriz resultante é de classificação 1, esse qubit está em um estado separável, caso contrário, está emaranhado.2 n2n×2n2n
Suponho que o ponto de sua pergunta seja realmente "Como esse enorme custo computacional pode ser evitado?". Em geral, não pode - se você estiver usando toda a potência do computador quântico, sempre precisará do vetor de estado de entrada . No entanto, existem vários truques que reduzem o custo computacional, como atrasar a necessidade de um vetor de estado tão grande, mantendo o controle do emaranhado.2n
Melhorias na eficiência
A maior economia que você pode fazer em comparação com a implementação ingênua acima é evitar as matrizes unitárias . Por exemplo, se você estiver usando apenas portas de 1 ou 2 qubit, simplesmente usar a escassez de matrizes significa que você só precisa de armazenamento de vez de . O ( 2 n ) O ( 2 2 n )2n×2nO(2n)O(22n)
Depois, existem outras táticas que você pode empregar. Por exemplo, imagine que você deseja aplicar o de dois qubits unitária portão em qubits e . Você pode pegar conjuntos de 4 elementos do seu vetor de estado ( para fixo utilizando todos os ) diferentes e apenas aplicando o unitário nesse vetor de 4 elementos. Repetir isso para cada retornará no vetor de estado original.Uij|x⟩1,2,…n∖i,j|y⟩i,jx∈{0,1}n−2y∈{0,1}24×4UxU
Eu imagino que existem outras estratégias que alguém poderia inventar. O que se sugeriu a partir da pergunta original foi o rastreamento de emaranhamento. Isso fornece melhorias de memória e velocidade no início de uma computação, mas acaba sendo equivalente, porque (presumivelmente) tudo no computador quântico acaba entrelaçado.
Rastreamento de emaranhamento
Vamos supor que seu cálculo consiste apenas em evolução e medição unitárias no conjunto de qubits, ou seja, não há decoerência, mapas probabilísticos etc. Vamos supor ainda que você comece de um estado totalmente separável, como . Nesse ponto, todo qubit é separável e é suficiente manter registros diferentes, cada um transmitindo o estado de um qubit separável. Se o seu primeiro gate for apenas uma operação de qubit único no qubit , basta atualizar o estado armazenado no qubit como e você não precisará tocar em nada outro.n|0⟩⊗nnUii|ψi⟩↦U|ψi⟩
Se você quer fazer um de dois qubits portão entre qubits e , digamos, então você tem que combinar os estados em ambos os locais. Portanto, você substitui dois registros, cada um da dimensão 2, por um registro da dimensão 4, contendo o estado . O problema é que agora você não pode dividir esse estado novamente, portanto, é necessário manter esses dois qubits em um registro para sempre. Obviamente, se você tiver um gate 1 qubit para aplicar no qubit , agora precisará aplicar . Então, da próxima vez que você quer um portão 2-qubit entre, digamos, ei J V | ψ i ⟩ | ψ j ⟩ U i | ψ i , j ⟩ ↦ U ⊗ I | ψ i , j ⟩ j k ( i , j ) k IVijV|ψi⟩|ψj⟩Ui|ψi,j⟩↦U⊗I|ψi,j⟩jk, você terá que combinar os espaços para e . Esses espaços continuarão crescendo, mas se um portão estiver localizado em apenas um espaço, você só precisará aplicá-lo lá (usando os operadores para preenchê-lo no restante dos qubits), e você não precisará faça qualquer coisa para os outros espaços.(i,j)kI
Se você estiver fazendo algo assim, não terá (pelo menos nos primeiros passos do seu algoritmo) um único registro de elemento . Você precisará ter vários registros diferentes e acompanhar quais qubits são descritos por quais registradores em uma matriz separada. Cada vez que você combina os espaços de alguns qubits, atualiza essa matriz extra.2n
Aqui estão alguns pseudocódigos muito grosseiros que podem ajudar a transmitir meu significado:
#initialise variables
entangled_blocks={{1},{2},{3},...,{n}}
quantum_states={{1,0},{1,0},...,{1,0}}
#apply action of each gate
for each gate
for each gate_target
target_block=entangled_blocks entry containing gate_target
next gate_target
if all target_blocks equal then
apply gate on target_block (pad with identity on other qubits)
else
new_entangled_block=union(target_blocks)
new_state_vec=tensor_product(quantum_states for each target block)
apply gate on new_state_vec (pad with identity on other qubits)
replace all target_blocks in entangled_blocks with new_entangled_block
replace all quantum_states(all target blocks) with new_state_vec
end if
next gate
Outras opções
(De modo algum exaustivo)
Você pode estar interessado em ler sobre os Estados dos produtos da matriz, que são uma boa maneira de encapsular as informações sobre estados não muito entrelaçados e que podem fornecer uma rota alternativa para você, dependendo exatamente do que você está tentando alcançar.