File size: 3,243 Bytes
33f466b
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
from enum import Enum
from abc import ABC, abstractmethod

import numpy as np


class PolarizationMeasurementOutcome(Enum):
    PASSED = True
    ABSORBED = False


class PolarizedParticleBase(ABC):
    @abstractmethod
    def measure_polarization(self, detector_angle_rad: float) -> PolarizationMeasurementOutcome:
        pass


class EntangledPolarizedParticleBase(PolarizedParticleBase):
    @abstractmethod
    def superluminal_communication(self):
        pass


class LocalDeterministicPhoton(PolarizedParticleBase):
    def __init__(self, polarization_angle: float):
        self.polarization_angle = polarization_angle

    def measure_polarization(self, detector_angle_rad: float) -> PolarizationMeasurementOutcome:
        angle_difference = self.polarization_angle - detector_angle_rad
        # This means the difference is within [-pi/4, pi/4]
        if np.cos(angle_difference) ** 2 > 0.5:
            return PolarizationMeasurementOutcome.PASSED
        else:
            # And this means it's more than pi/4 and less than 3pi/4
            return PolarizationMeasurementOutcome.ABSORBED


class OneBitEntangledPhoton(EntangledPolarizedParticleBase):
    def __init__(
        self,
        reference_angle_rad: float,
    ):
        self.decided = False
        self.use_strategy_b = False

        # Entangled photons do not have polarization decided when created
        # but they share a reference frame
        self.reference_angle_rad = reference_angle_rad

    def strategy_a(self, detector_angle_rad: float) -> PolarizationMeasurementOutcome:
        angle_difference = self.reference_angle_rad - detector_angle_rad

        # This means the difference is within [-pi/4, pi/4]
        if np.cos(angle_difference) ** 2 > 0.5:
            return PolarizationMeasurementOutcome.PASSED
        else:
            # And this means it's more than pi/4 and less than 3pi/4
            return PolarizationMeasurementOutcome.ABSORBED

    def strategy_b(self, detector_angle_rad: float) -> PolarizationMeasurementOutcome:
        angle_difference = self.reference_angle_rad - detector_angle_rad

        # This means the difference is within [-pi/4, pi/4]
        if np.cos(angle_difference - np.pi / 4) ** 2 > 0.5:
            return PolarizationMeasurementOutcome.PASSED
        else:
            # And this means it's more than pi/4 and less than 3pi/4
            return PolarizationMeasurementOutcome.ABSORBED

    def entangle(self, other_photon: "OneBitEntangledPhoton"):
        self.other_photon = other_photon

    def superluminal_communication(self, use_strategy_b: bool):
        self.use_strategy_b = use_strategy_b
        self.decided = True

    def measure_polarization(self, detector_angle_rad: float) -> PolarizationMeasurementOutcome:
        # Quantum magic
        if not self.decided:
            angle_difference = self.reference_angle_rad - detector_angle_rad
            self.use_strategy_b = (angle_difference - np.pi / 8) % (np.pi / 2) < np.pi / 4
            self.other_photon.superluminal_communication(use_strategy_b=self.use_strategy_b)

        if self.use_strategy_b:
            return self.strategy_b(detector_angle_rad)
        else:
            return self.strategy_a(detector_angle_rad)