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);
}
|