aboutsummaryrefslogtreecommitdiff
path: root/tester/non_clifford.c
blob: e82c86d5e87504c3d8152fd7c44f717642569772 (plain)
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
#include "tests.h"

static const double R2 = 0.7071067811865476;
static const double PI = 3.141592653589793;

void run_non_clifford_tests(void)
{
    psi_test_section("Non-Clifford gates");

    struct PsiQuantumCircuit t = psi_new_quantum_circuit(1);
    psi_apply_x(&t, 0);
    psi_apply_t(&t, 0);
    struct PsiComplex t_exp[] = { psi_new_complex(0.0, 0.0), psi_new_complex(R2, R2) };
    psi_check_circuit("T|1> = e^{i pi/4}|1>", &t, t_exp, 2);
    psi_free_quantum_circuit(&t);

    struct PsiQuantumCircuit rx = psi_new_quantum_circuit(1);
    psi_apply_rx(&rx, 0, PI);
    struct PsiComplex rx_exp[] = { psi_new_complex(0.0, 0.0), psi_new_complex(0.0, -1.0) };
    psi_check_circuit("Rx(pi)|0> = -i|1>", &rx, rx_exp, 2);
    psi_free_quantum_circuit(&rx);

    struct PsiQuantumCircuit ry = psi_new_quantum_circuit(1);
    psi_apply_ry(&ry, 0, PI);
    struct PsiComplex ry_exp[] = { psi_new_complex(0.0, 0.0), psi_new_complex(1.0, 0.0) };
    psi_check_circuit("Ry(pi)|0> = |1>", &ry, ry_exp, 2);
    psi_free_quantum_circuit(&ry);

    struct PsiQuantumCircuit p = psi_new_quantum_circuit(1);
    psi_apply_x(&p, 0);
    psi_apply_p(&p, 0, PI / 2.0);
    struct PsiComplex p_exp[] = { psi_new_complex(0.0, 0.0), psi_new_complex(0.0, 1.0) };
    psi_check_circuit("P(pi/2)|1> = i|1>", &p, p_exp, 2);
    psi_free_quantum_circuit(&p);

    struct PsiQuantumCircuit sx = psi_new_quantum_circuit(1);
    psi_apply_sx(&sx, 0);
    psi_apply_sx(&sx, 0);
    struct PsiComplex sx_exp[] = { psi_new_complex(0.0, 0.0), psi_new_complex(1.0, 0.0) };
    psi_check_circuit("sqrt(X) applied twice = X", &sx, sx_exp, 2);
    psi_free_quantum_circuit(&sx);
}