Any stabilizer code can be used for entanglement purification. Normally stabilizer codes are presented as being encoded, transmitted with noise, and then decoded. Errors are corrected by comparing stabilizer measurements on the encoding side to stabilizer measurements on the decoding side. The transmitted message is in the logical observables of the code. Call this the "transmission ordering".
But the same idea works when comparing stabilizer measurements on the two sides of a set of Bell pairs. The steps are simply re-ordered: noisy Bell pairs are transmitted to the two parties, they both measure the stabilizers of the code on their half of the Bell pairs, and they detect and/or correct errors by comparing the measurements. The corrected entanglement is in the logical observables of the code. Call this the "teleportation ordering".
A major advantage of the teleportation ordering is that you can use error detection instead of error correction. It's fine to discard a suspicious attempt, because you aren't risking an important qubit; just a replaceable Bell pair. Error detecting codes have much better performance (for example, when using a stabilizer code, detecting errors has twice the distance of correcting errors).
Here's one possible strategy for getting to 1-per-billion error rates, parameterized by the input Bell pair fidelity $F$:
- If $F \leq 0.5$, give up because the states you are sharing are provably not entangled, so it's impossible to purify entanglement out of them. You must improve your physical channel until its fidelity exceeds 50%. Ideally not by a little (e.g. $F=0.51$) but by a lot (e.g. $F=0.9$).
- If $F \leq 0.999$, use the absolute smallest code that you can: the distance 2 repetition code. You have a choice of three different repetition codes: X basis, Y basis, or Z basis. The code with basis $A$ has a single stabilizer $A \otimes A$. Pick the basis that will detect the most errors, given what you know about the bias in your input noise. This produces output states with a better fidelity $F^\prime$, and with noise biased more towards the basis you checked. Re-apply this overall strategy, treating your outputs as a new input. Generally you will need at least two rep code stages to see the fidelity improve substantially, as otherwise you are not detecting error in all bases.
- If $F > 0.999$, use the "perfect code"; the [[5,1,3]] code with stabilizers $XZZXI$, $IXZZX$, $XIXZZ$, and $ZXIXZ$. Use it in error detecting mode, where if any of the stabilizers disagree you discard. This will launch you to the desired one error per billion transmissions.
If "X" is the X basis [2,1,2] rep code, "Y" is the Y basis [2,1,2] rep code, "Z" is the Z basis [2,1,2] rep code, and "P" is the [[5,1,3]] code, then the stages of the distillation process can be described by a string like "XZP" meaning "input Bell pairs get checked by X [2,1,2], the survivors of that then get checked by Z [2,1,2], the survivors of that then get checked by the perfect code, the survivors of that are the output".
For a starting fidelity of 0.99, your stages will look something like "XZP". This sequence of stages happens to be a distance 2 Shor code concatenated with the perfect code. It will take ~21 inputs to produce 1 output with ~1e-9 output error rate.
For a starting fidelity of 0.9, your stages will look something like "XYZP". It will take ~54 inputs to produce 1 output with ~1e-9 output error rate.
For a starting fidelity of 2/3, your stages will look something like "XZYZYZP". It will take ~1500 inputs to produce 1 output with ~1e-9 output error rate.
Note that I am assuming the purifying computers are perfect. In practice this would be achieved by having them be fault tolerant quantum computers, so the whole purification process is actually (for example) being performed on data injected into, stored in, and operated on within, surface codes.