decoders. Product codes (first proposed by Elias in 1954) are constructed from 2D (row and column) arrangements of simple linear block codes (typically simple parity or Hamming codes). In TPCs, iterative decoding is again used, with information passed to and fro between the row and column decoders. The principle can be extended to 3D arrangements of codes. LDPC Codes Low-Density Parity Check (LDPC) codes were first proposed by Robert Gallager in 1960. Implementing them was not feasible then, and they were largely forgotten until Tanner, in 1981, generalized them and developed a graphical method of representing them (called Tanner or bipartite graphs). They were reinvented in 1995 (MacKay and Neal, 1995), and since then there has been a great deal of work on them. LDPC codes are now in many respects the best codes known. An LDPC code is based on the use of a parity check matrix, H (see the Linear Block Codes section), which contains only a few 1s (hence the term "low-density" or "sparse"). It is "random" (generated using random numbers) but follows specific construction rules. The resulting code is unsystematic. Encoding is performed straightforwardly as described in the Linear Block Codes section, using a generator matrix, G, derived from H. The decoder is designed by first deriving from equation 4.2 multiple parity check equations, all of which are satisfied by any generated codeword. A network of processing nodes is created, each one handling one of those equations. Decoding proceeds iteratively; information (compris- ing estimates of some digits, together with confidence levels) is passed between the nodes, which also take in a "soft" (i.e., analogue) input of the received signal. This iterative proba- bilistic equation solver is of a type known as a message-passing algorithm, belief propagation algorithm, or sum-product algorithm. With the flexibility of LDPCs, codes can be constructed to match exactly a particular block size or code rate, though practical implementations can have constraints on block sizes a