def test_controlled_addition(self, tol): """Test the CX symplectic transform.""" s = 0.543 S = controlled_addition(s) # test that S = B(theta+pi/2, 0) [S(z) x S(-z)] B(theta, 0) r = np.arcsinh(-s / 2) theta = 0.5 * np.arctan2(-1 / np.cosh(r), -np.tanh(r)) Sz = block_diag(squeezing(r, 0), squeezing(-r, 0))[:, [0, 2, 1, 3]][[0, 2, 1, 3]] expected = beamsplitter(theta + np.pi / 2, 0) @ Sz @ beamsplitter( theta, 0) assert S == pytest.approx(expected, abs=tol) # test that S[x1, x2, p1, p2] -> [x1, x2+sx1, p1-sp2, p2] x1 = 0.5432 x2 = -0.453 p1 = 0.154 p2 = -0.123 out = S @ np.array([x1, x2, p1, p2]) * np.sqrt(2 * hbar) expected = np.array([x1, x2 + s * x1, p1 - s * p2, p2]) * np.sqrt( 2 * hbar) assert out == pytest.approx(expected, abs=tol)
def test_two_mode_squeezing(self, tol): """Test the two mode squeezing symplectic transform.""" r = 0.543 phi = 0.123 S = two_mode_squeezing(r, phi) # test that S = B^\dagger(pi/4, 0) [S(z) x S(-z)] B(pi/4) B = beamsplitter(np.pi / 4, 0) Sz = block_diag(squeezing(r, phi), squeezing(-r, phi))[:, [0, 2, 1, 3]][[0, 2, 1, 3]] expected = B.conj().T @ Sz @ B assert S == pytest.approx(expected, abs=tol) # test that S |a1, a2> = |ta1+ra2, ta2+ra1> a1 = 0.23 + 0.12j a2 = 0.23 + 0.12j out = S @ np.array([a1.real, a2.real, a1.imag, a2.imag]) * np.sqrt( 2 * hbar) T = np.cosh(r) R = np.exp(1j * phi) * np.sinh(r) a1out = T * a1 + R * np.conj(a2) a2out = T * a2 + R * np.conj(a1) expected = np.array([a1out.real, a2out.real, a1out.imag, a2out.imag ]) * np.sqrt(2 * hbar) assert out == pytest.approx(expected, abs=tol)
def test_beamsplitter(self, tol): """Test the beamsplitter symplectic transform.""" theta = 0.543 phi = 0.312 S = beamsplitter(theta, phi) # apply to a coherent state. BS|a1, a2> -> |ta1-r^*a2, ra1+ta2> a1 = 0.23 + 0.12j a2 = 0.23 + 0.12j out = S @ np.array([a1.real, a2.real, a1.imag, a2.imag]) * np.sqrt( 2 * hbar) T = np.cos(theta) R = np.exp(1j * phi) * np.sin(theta) a1out = T * a1 - R.conj() * a2 a2out = R * a2 + T * a1 expected = np.array([a1out.real, a2out.real, a1out.imag, a2out.imag ]) * np.sqrt(2 * hbar) assert out == pytest.approx(expected, abs=tol)