Source code for qkdsec.proofs.protocols.bb84
import numpy as np
from ..channels.base import Channel
from .base import Protocol
_Z = np.diag([1.0, -1.0])
_X = np.array([[0.0, 1.0], [1.0, 0.0]])
_P0 = np.array([[1.0, 0.0], [0.0, 0.0]])
_P1 = np.array([[0.0, 0.0], [0.0, 1.0]])
def _h(p: float) -> float:
if p <= 0.0 or p >= 1.0:
return 0.0
return float(-p * np.log2(p) - (1.0 - p) * np.log2(1.0 - p))
[docs]
class BB84(Protocol):
dim_a = 2
dim_b = 2
[docs]
def observables(self) -> dict[str, np.ndarray]:
return {
"ZZ": np.kron(_Z, _Z),
"XX": np.kron(_X, _X),
}
[docs]
def key_projectors(self) -> list[np.ndarray]:
return [_P0, _P1]
[docs]
def leakage(self, channel: Channel) -> float:
return channel.total_yield() * _h(channel.total_qber())