Si se puede hacer esto, entonces usted necesitará por lo menos $4^n$ ángulos $(\theta_k, \phi_k)$. Sin embargo, el código de abajo sugiere que este método va a generar en la mayoría de las $O\left(2^{\frac32n}\right)$ independiente de las probabilidades. Por lo tanto, sólo funciona para $n=1$.
Supongamos por el momento que se puede hacer; aquí es cómo reconstruir el estado a partir de un conjunto de ángulos. Organizar los ángulos en un conjunto de índices $\Lambda = \{(\theta_k,\phi_k)| k\in\{0,1,2,\ldots,4^n\}\}$. Así que ahora usted tiene un overcomplete (y necesariamente no ortogonal) de los operadores de $\{P(\lambda) | \lambda\in \Lambda\}$. En otras ramas de las matemáticas, esta cosa que se llama marco. Para recuperar el estado del conjunto de probabilidades $\{p(\lambda)|\lambda\in\Lambda\}$ usted necesita para calcular un marco doble, llame a $\{Q(\lambda)|\lambda\in\Lambda\}$. Luego de que el estado está dada por
$$
\rho = \sum_\lambda p(\lambda) Q(\lambda) \stackrel{\text{o}}{=} \sum_\lambda \text{Tr}(\rho P(\lambda)) P(\lambda).
$$
(Igual que en el $P$ $Q$ función en óptica cuántica, excepto en notación inversa.)
Desafortunadamente, usted no puede calcular un marco doble para un objeto que no es una trama (es decir, no abarcan el operador de espacio). El código de MATLAB sugiere que este es el caso. Recoge un montón de azar ángulos y calcula la medición de los operadores para ellos. A continuación, se comprueba si son linealmente independientes y trata de calcular un doble para ellos. Ejecutando miles de veces producido ninguna variación en el resultado de que este procedimiento producirá aproximadamente el $O\left(2^{\frac32n}\right)$ linealmente independientes de medición de los operadores.
% Number of qubits
n = 3;
% ===> Generate random qubit states
num_states = 2^n+2;
% Pick random Bloch sphere directions
phi = 2*pi*rand(1,num_states);
theta = acos(2*rand(1,num_states)-1);
state = [cos(theta/2) ; exp(1i*phi).*sin(theta/2)];
orth_state = [cos((pi-theta)/2) ; exp(1i*(phi+pi)).*sin((pi-theta)/2)];
% Now construct the tensor product states (there should be 2^n for each
% single qubit state since there are this many distinct outcomes)
big_state = zeros(2^n,2^n*num_states);
for state_idx = 1:num_states
for perm_idx = 1:2^n
temp_state = 1;
binrep = repmat(de2bi(perm_idx-1,n),2,1);
to_tensor = repmat(state(:,state_idx),1,n).^binrep.*...
repmat(orth_state(:,state_idx),1,n).^(1-binrep);
for sys_idx = 1:n
temp_state = kron(temp_state,to_tensor(:,sys_idx));
end
big_state(:,(state_idx-1)*(2^n)+perm_idx) = temp_state;
end
end
% ===> Calculate the frame operator
% Vectorize the projectors onto the states
P = zeros(4^n,2^n*num_states);
for state_idx = 1:2^n*num_states
P(:,state_idx) = kron(big_state(:,state_idx)...
,conj(big_state(:,state_idx)));
end
% The frame operator
S = P*P';
% ===> Check for informational completeness and compute dual
% Compute the rank of S
fprintf('Rank of S is %d.\n', rank(S));
% The dual frame
Q = S\P;
% ===> Verify the reconstruction formula
% pick a random state
rho = eye(2^n)/2^n;
rho = rho(:);
% Compute reconstruction error
err = sum(abs(rho - ...
sum(repmat(rho'*P,4^n,1).*Q,2)...
));
fprintf('Error in reconstruction was %d.\n', err);