Polarization
Polarization encoding is stored in AnnotatedFockState objects as a special P
annotation.
Their value follows Jones calculus. Annotations values are represented by two angles \((\theta, \phi)\).
The representation of the polarization in \(\begin{pmatrix}E_h\\E_v\end{pmatrix}\) basis is obtained by applying Jones conversion: \(\overrightarrow{J}=\begin{pmatrix}\cos \frac{\theta}{2}\\e^{i\phi}\sin \frac{\theta}{2}\end{pmatrix}\). The same can also be noted: \(\cos \frac{\theta}{2}\ket{H}+e^{i\phi}\sin \frac{\theta}{2}\ket{V}\).
For instance, the following defines a polarization with \(\theta=\frac{\pi}{2},\phi=\frac{\pi}{4}\) corresponding to Jones vector: \(\begin{pmatrix}\cos \frac{\pi}{4}\\e^{i\frac{\pi}{4}}\sin \frac{\pi}{4}\end{pmatrix}\)
>>> import perceval as pcvl, sympy as sp
>>>
>>> p = pcvl.Polarization((sp.pi/2, sp.pi/4))
>>> p.project_eh_ev()
(0.707106, 0.5+0.5j)
It is also possible to use H
, V
, D
, A
, L
and R
as shortcuts to predefined values:
Code |
\((\phi,\theta)\) |
Jones vector |
---|---|---|
|
\((0,0)\) |
\(\begin{pmatrix}1\\0\end{pmatrix}\) |
|
\((\pi,0)\) |
\(\begin{pmatrix}0\\1\end{pmatrix}\) |
|
\((\frac{\pi}{2},0)\) |
\(\frac{1}{\sqrt 2}\begin{pmatrix}1\\1\end{pmatrix}\) |
|
\((\frac{\pi}{2},\pi)\) |
\(\frac{1}{\sqrt 2}\begin{pmatrix}1\\-1\end{pmatrix}\) |
|
\((\frac{\pi}{2},\frac{\pi}{2})\) |
\(\frac{1}{\sqrt 2}\begin{pmatrix}1\\i\end{pmatrix}\) |
|
\((\frac{\pi}{2},\frac{3\pi}{2})\) |
\(\frac{1}{\sqrt 2}\begin{pmatrix}1\\-i\end{pmatrix}\) |
>>> p = pcvl.Polarization("D")
>>> p.theta_phi
(pi/2, 0)
>>> p.project_eh_ev()
(sqrt(2)/2, sqrt(2)/2)
Defining states with polarization is as simple as using the P
special annotation:
>>> st2 = pcvl.BasicState("|{P:H},{P:V}>")
>>> st2 = pcvl.BasicState("|{P:(sp.pi/2,sp.pi/3)>")
If polarization is used for any photon in the state, the state is considered as using polarization:
>>> pcvl.AnnotatedFockState("|{P:H},0,{P:V}>").has_polarization
True
>>> pcvl.AnnotatedFockState("|{P:V},0,1>").has_polarization
True
>>> pcvl.AnnotatedFockState("|{a:0},0,{a:1}>").has_polarization
False
Note
To simplify the notation:
linear polarization can be defined with a single parameter:
{P:sp.pi/2}
is equivalent to{P:(sp.pi/2,0)}
if the polarization annotation is omitted for some photons, these photons will be considered as having a horizontal polarization.
Polarization code reference
- class perceval.utils.polarization.Polarization(v)
Polarization class
This class is defined values used by polarization annotations P
- Parameters:
v (str | any | tuple[any, any]) – a string (
[HVADLR]
), a single angle or a pair of angle definition either symbolic or numeric. Angles should be in \([0,\pi]\) range.- Raise:
ValueError if the parameters are out of range, or invalid
- static parse(s)
Parse a polarization value string
- Parameters:
s (
str
) – should match regex:^([HVADLR]|\(theta,phi\)|theta$
- Return type:
- Returns:
a Polarization instance
- Raise:
ValueError if the value cannot be parsed, or if parameters are invalid
- project_eh_ev(use_symbolic=False)
Build Jones vector corresponding to the current instance
- Return type:
tuple
[any
,any
]- Returns:
a pair of numeric or symbolic expressions