aboutsummaryrefslogtreecommitdiff
path: root/tester/clifford.c
diff options
context:
space:
mode:
authorhachem <im@hachem.wtf>2026-09-14 12:20:52 +0200
committerhachem <im@hachem.wtf>2026-09-14 12:20:52 +0200
commitee14ad272e68d9363202d7f668e0b20302827209 (patch)
tree88dd1012ad7f9d6ac7abeb7562dac2194794b823 /tester/clifford.c
parentae07aab1442a45bbddb79e066f15eaf252a4254a (diff)
feat: simd + testing + formatting
Diffstat (limited to 'tester/clifford.c')
-rw-r--r--tester/clifford.c75
1 files changed, 75 insertions, 0 deletions
diff --git a/tester/clifford.c b/tester/clifford.c
new file mode 100644
index 0000000..3be9234
--- /dev/null
+++ b/tester/clifford.c
@@ -0,0 +1,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);
+}