$\newcommand{\ket}[1]{|{#1}\rangle}\newcommand{\bra}[1]{\langle{#1}|}$Imaginemos que en el instante $i$, Alice ha generado los bits de clave $a_i=1$ y $b_i=1$, y por tanto, ha codificado el estado $\rho_A^{(i)} = \Pi_{-}$.
import numpy as np
# Definimos las bases de medida
Pi0 = np.array([[1,0],[0,0]])
Pi1 = np.array([[0,0],[0,1]])
Pip = np.array([[+1,+1],[+1,+1]])/2
Pim = np.array([[+1,-1],[-1,+1]])/2
# Y el estado inicial para a_i = b_i = 1
rhoAi = Pim
print('rhoAi =\n', rhoAi)
rhoAi = [[ 0.5 -0.5] [-0.5 0.5]]
Eve conoce el esquema de codificación, pero no conoce el valor de $a_i$ ni de $b_i$, así que escoje una base al azar para realizar una medida con resultado $e_i$:
\Pi_{0}, & e_i=0,\\
\Pi_{1}, & e_i=1.
\end{cases}
\end{align*}Pr_ei_0 = np.trace(Pi0 @ rhoA_i)
Pr_ei_1 = np.trace(Pi1 @ rhoA_i)
print('Pr_ei_0 =', Pr_ei_0, '\nPr_ei_1 =', Pr_ei_1)
rhoEi_0 = Pi0 @ rhoA_i@ Pi0.conj().T / Pr_ei_0
rhoEi_1 = Pi1 @ rhoA_i @ Pi1.conj().T / Pr_ei_1
print('rhoEi_0 =\n', rhoEi_0, '\nrhoEi_1 =\n', rhoEi_1)
Pr_ei_0 = 0.5 Pr_ei_1 = 0.5 rhoEi_0 = [[1. 0.] [0. 0.]] rhoEi_1 = [[0. 0.] [0. 1.]]
Pr_ei_p = np.trace(Pip @ rhoA_i)
Pr_ei_m = np.trace(Pim @ rhoA_i)
print('Pr_ei_p =', Pr_ei_p, '\nPr_ei_m =', Pr_ei_m)
rhoEi_m = Pim @ rhoA_i@ Pim.conj().T / Pr_ei_m
print('rhoEi_m =\n', rhoEi_0)
Pr_ei_p = 0.0 Pr_ei_m = 1.0 rhoEi_m = [[1. 0.] [0. 0.]]
En el segundo caso, Eve puede transmitir el estado $\rho_E^{(i)}$ a Bob y la intrusión permanecería indetectada, ya que $\rho_E^{(i)} = \rho_A^{(i)}$. Sin embargo, en el primer caso tenemos que $\rho_E^{(i)} \neq \rho_A^{(i)}$. Si Eve transmite este estado $\rho_E^{(i)}$ a Bob y éste realiza su medida en la base $\{\Pi_{+}, \Pi_{-}\}$, entonces obtendrá un resultado $\Pr\bigl\{\hat{A}_i = 0\bigr\} = \Pr\bigl\{\hat{A}_i = 1\bigr\} = \frac{1}{2}$ independientemente del valor de $e_i$.
# Medida en Bob cuando Eve utiliza la base {Pi0, Pi1} y Bob aplica la base {Pip, Pim}
ei = 0
Pr_hat_0 = np.trace(Pip @ rhoEi_0)
Pr_hat_1 = np.trace(Pim @ rhoEi_0)
print('\nei = ', ei, '\nPr_hat_0 =', Pr_hat_0, '\nPr_hat_1 =', Pr_hat_1)
ei = 1
Pr_hat_0 = np.trace(Pip @ rhoEi_1)
Pr_hat_1 = np.trace(Pim @ rhoEi_1)
print('\nei = ', ei, '\nPr_hat_0 =', Pr_hat_0, '\nPr_hat_1 =', Pr_hat_1)
ei = 0 Pr_hat_0 = 0.5 Pr_hat_1 = 0.5 ei = 1 Pr_hat_0 = 0.5 Pr_hat_1 = 0.5
Concluimos que en las posiciones donde Eve se ha equivocado en la base de medida, ya no se tiene por qué cumplir $a_i=\hat{a}_i$, aunque coincidan las secuencias $b_i=c_i$.