aboutsummaryrefslogtreecommitdiff
path: root/tester/clifford.c
blob: 4bed17e0ef3cce32fa198c74ceff36569934c951 (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
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
#include "tests.h"

static const double R2 = 0.7071067811865476;

static void build_bell(struct PsiQuantumCircuit* c)
{
    psi_apply_h(c, 0);
    psi_apply_cnot(c, 0, 1);
}

static void build_ghz(struct PsiQuantumCircuit* c)
{
    psi_apply_h(c, 0);
    psi_apply_cnot(c, 0, 1);
    psi_apply_cnot(c, 0, 2);
}

void run_clifford_tests(void)
{
    psi_test_section("Clifford gates");

    struct PsiQuantumCircuit x = psi_new_quantum_circuit(1);
    psi_apply_x(&x, 0);
    struct PsiComplex x_exp[] = { psi_new_complex(0.0, 0.0), psi_new_complex(1.0, 0.0) };
    psi_check_circuit("X|0> = |1>", &x, x_exp, 2);
    psi_free_quantum_circuit(&x);

    struct PsiQuantumCircuit bell = psi_new_quantum_circuit(2);
    build_bell(&bell);
    struct PsiComplex bell_exp[] = {
        psi_new_complex(R2, 0.0),
        psi_new_complex(0.0, 0.0),
        psi_new_complex(0.0, 0.0),
        psi_new_complex(R2, 0.0),
    };
    psi_check_circuit("Bell = (|00>+|11>)/sqrt2", &bell, bell_exp, 4);
    psi_free_quantum_circuit(&bell);

    struct PsiQuantumCircuit ghz = psi_new_quantum_circuit(3);
    build_ghz(&ghz);
    struct PsiComplex ghz_exp[] = {
        psi_new_complex(R2, 0.0),  psi_new_complex(0.0, 0.0), psi_new_complex(0.0, 0.0),
        psi_new_complex(0.0, 0.0), psi_new_complex(0.0, 0.0), psi_new_complex(0.0, 0.0),
        psi_new_complex(0.0, 0.0), psi_new_complex(R2, 0.0),
    };
    psi_check_circuit("GHZ = (|000>+|111>)/sqrt2", &ghz, ghz_exp, 8);
    psi_free_quantum_circuit(&ghz);

    struct PsiQuantumCircuit swap = psi_new_quantum_circuit(2);
    psi_apply_x(&swap, 0);
    psi_apply_cnot(&swap, 0, 1);
    psi_apply_cnot(&swap, 1, 0);
    psi_apply_cnot(&swap, 0, 1);
    struct PsiComplex swap_exp[] = {
        psi_new_complex(0.0, 0.0),
        psi_new_complex(1.0, 0.0),
        psi_new_complex(0.0, 0.0),
        psi_new_complex(0.0, 0.0),
    };
    psi_check_circuit("SWAP via 3 CNOTs: |10> -> |01>", &swap, swap_exp, 4);
    psi_free_quantum_circuit(&swap);

    struct PsiQuantumCircuit toffoli = psi_new_quantum_circuit(3);
    psi_apply_x(&toffoli, 0);
    psi_apply_x(&toffoli, 1);
    psi_apply_ccnot(&toffoli, 0, 1, 2);
    struct PsiComplex toffoli_exp[8];
    for (size_t i = 0; i < 8; i++)
        toffoli_exp[i] = psi_new_complex(0.0, 0.0);
    toffoli_exp[7] = psi_new_complex(1.0, 0.0);
    psi_check_circuit("Toffoli: |110> -> |111>", &toffoli, toffoli_exp, 8);
    psi_free_quantum_circuit(&toffoli);

    psi_check_runtimes_agree("Runtimes agree on GHZ", 3, build_ghz);
}