aboutsummaryrefslogtreecommitdiff
path: root/tester/clifford.c
blob: 3be9234ad8bcc4cba35790f0a04d856a494545b3 (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);
}