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