QCOR
five_qubit_code.hpp
1 #pragma once
2 
3 // Distance-3 quantum error correction code with 5 qubits
4 std::vector<std::vector<qcor::Operator>> five_qubit_code_stabilizers() {
5  static const std::vector<std::vector<qcor::Operator>> STABILIZERS{
6  {qcor::X(0), qcor::Z(1), qcor::Z(2), qcor::X(3)},
7  {qcor::X(1), qcor::Z(2), qcor::Z(3), qcor::X(4)},
8  {qcor::X(0), qcor::X(2), qcor::Z(3), qcor::Z(4)},
9  {qcor::Z(0), qcor::X(1), qcor::X(3), qcor::Z(4)}};
10  return STABILIZERS;
11 }
12 
13 __qpu__ void five_qubit_code_encoder(qreg q, int dataQubitIdx,
14  std::vector<int> scratchQubitIdx) {
15  CX(q[dataQubitIdx], q[scratchQubitIdx[1]);
16  H(q[dataQubitIdx]);
17  H(q[scratchQubitIdx[0]]);
18  CX(q[dataQubitIdx], q[scratchQubitIdx[2]]);
19  CX(q[scratchQubitIdx[0]], q[dataQubitIdx]);
20  CX(q[dataQubitIdx], q[scratchQubitIdx[1]]);
21  CX(q[scratchQubitIdx[0]], q[scratchQubitIdx[3]]);
22  H(q[scratchQubitIdx[0]]);
23  H(q[dataQubitIdx]);
24  CX(q[scratchQubitIdx[0]], q[scratchQubitIdx[2]]);
25  CX(q[dataQubitIdx], q[scratchQubitIdx[3]]);
26  X(q[scratchQubitIdx[2]]);
27 }
28 
29 __qpu__ void five_qubit_code_recover(qreg q, std::vector<int> logicalReg,
30  std::vector<int> syndromes) {
31  auto syndromeIndex = syndrome_array_to_int(syndromes);
32  if (syndromeIndex > 0) {
33  if (syndromeIndex == 1) {
34  X(q[logicalReg[1]]);
35  }
36  if (syndromeIndex == 2) {
37  Z(q[logicalReg[4]]);
38  }
39  if (syndromeIndex == 3) {
40  X(q[logicalReg[2]]);
41  }
42  if (syndromeIndex == 4) {
43  Z(q[logicalReg[2]]);
44  }
45  if (syndromeIndex == 5) {
46  Z(q[logicalReg[0]]);
47  }
48  if (syndromeIndex == 6) {
49  X(q[logicalReg[3]]);
50  }
51  if (syndromeIndex == 7) {
52  Y(q[logicalReg[2]]);
53  }
54  if (syndromeIndex == 8) {
55  X(q[logicalReg[0]]);
56  }
57  if (syndromeIndex == 9) {
58  Z(q[logicalReg[3]]);
59  }
60  if (syndromeIndex == 10) {
61  Z(q[logicalReg[1]]);
62  }
63  if (syndromeIndex == 11) {
64  Y(q[logicalReg[1]]);
65  }
66  if (syndromeIndex == 12) {
67  X(q[logicalReg[4]]);
68  }
69  if (syndromeIndex == 13) {
70  Y(q[logicalReg[0]]);
71  }
72  if (syndromeIndex == 14) {
73  Y(q[logicalReg[4]]);
74  }
75  if (syndromeIndex == 15) {
76  Y(q[logicalReg[3]]);
77  }
78  }
79 }