We proved the distance property of Tanner codes based on (spectral) expanders using a simple application of the expander mixing lemma. We discussed an decoding algorithm for the codes (to correct up to a number of errors about the bound on minimum distance), based on iterations of decoding the local codes. We saw a distance amplication technique using dispersers which yield codes of relative distance over an alphabet of size .

I’d like to make two clarifications about the lecture. The first one concerns the calculation in the analysis of the decoding algorithm where we argued that the set was a constant factor smaller than . If we are content with ensuring that , then it suffices to take the degree of the expander to be at least (like I had originally intended to set; in particular the degree need not grow as ).

Indeed, by the expander mixing lemma and using that , we have, in the notation from the lecture,

which upon rearranging yields

(The last step follows if .)

The second clarification concerns the linear time implementation of the decoding algorithm (instead of the obvious time implementation). The key insight to argue this is to observe that in each iteration, the only vertices (in the relevant side for that iteration) that need to be locally decoded are those that are adjacent to some vertex on the other side that had some neighboring edges flipped in the local decoding of the previous iteration. The latter set shrinks geometrically in size by an argument as above. Let us be somewhat more specific. After the first (left) iteration, for each , the local subvector of the current vector belongs to the code . Let be the set of right hand side vertices for which does not belong to . Let be the vector after the running the right side decoding on . Note that for each that is not a neighbor of any vertex in , its neighborhood is untouched by the decoding. This means that in the next iteration (left side decoding), all these vertices need not be examined at all.

The algorithmic trick therefore is to keep track of the vertices whose local neighborhoods do not belong to in each round of decoding. In each iteration, we only perform local decoding at a subset of nodes that was computed in the previous iteration. (This subset of left nodes gets initialized after the first two rounds of decoding as discussed above.) After performing local decoding at the nodes in , we prepare the stage for the next round by computing as the set of neighbors of all nodes in whose local neighborhood did not belong to prior to decoding.