QCOR
seven_qubit_steane_code.hpp
1 #pragma once
2 
3 // Distance-3 Steane quantum error correction code with 7 qubits
4 std::vector<std::vector<qcor::Operator>> seven_qubit_code_stabilizers() {
5  static const std::vector<std::vector<qcor::Operator>> STABILIZERS{
6  // Steane code has two groups of syndromes to detect X and Z errors.
7  // X syndromes
8  {qcor::X(0), qcor::X(2), qcor::X(4), qcor::X(6)},
9  {qcor::X(1), qcor::X(2), qcor::X(5), qcor::X(6)},
10  {qcor::X(3), qcor::X(4), qcor::X(5), qcor::X(6)},
11  // Z syndromes
12  {qcor::Z(0), qcor::Z(2), qcor::Z(4), qcor::Z(6)},
13  {qcor::Z(1), qcor::Z(2), qcor::Z(5), qcor::Z(6)},
14  {qcor::Z(3), qcor::Z(4), qcor::Z(5), qcor::Z(6)}};
15  return STABILIZERS;
16 }
17 
18 __qpu__ void seven_qubit_code_encoder(qreg q, int dataQubitIdx,
19  std::vector<int> scratchQubitIdx) {
20  H(q[scratchQubitIdx[0]]);
21  H(q[scratchQubitIdx[2]]);
22  H(q[scratchQubitIdx[5]]);
23  CX(q[dataQubitIdx], q[scratchQubitIdx[4]]);
24  CX(q[scratchQubitIdx[5]], q[scratchQubitIdx[1]]);
25  CX(q[scratchQubitIdx[5]], q[scratchQubitIdx[3]]);
26  CX(q[scratchQubitIdx[1]], q[dataQubitIdx]);
27  CX(q[scratchQubitIdx[2]], q[scratchQubitIdx[4]]);
28  CX(q[scratchQubitIdx[0]], q[scratchQubitIdx[4]]);
29  CX(q[scratchQubitIdx[4]], q[scratchQubitIdx[5]]);
30  CX(q[scratchQubitIdx[2]], q[scratchQubitIdx[3]]);
31  CX(q[scratchQubitIdx[0]], q[scratchQubitIdx[1]]);
32 }
33 
34 __qpu__ void seven_qubit_code_recover(qreg q, std::vector<int> logicalReg,
35  std::vector<int> syndromes) {
36  auto xSyndromes = {syndromes[0], syndromes[1], syndromes[2]};
37  auto zSyndromes = {syndromes[3], syndromes[4], syndromes[5]};
38  auto xSyndromeIdx = syndrome_array_to_int(xSyndromes);
39  auto zSyndromeIdx = syndrome_array_to_int(zSyndromes);
40  if (xSyndromeIdx > 0) {
41  Z(q[xSyndromeIdx - 1]);
42  }
43  if (zSyndromeIdx > 0) {
44  X(q[zSyndromeIdx - 1]);
45  }
46 }