Path: utzoo!attcan!utgpu!jarvis.csri.toronto.edu!cs.utexas.edu!samsung!think!ames!sgi!rpw3@rigden.wpd.sgi.com From: rpw3@rigden.wpd.sgi.com (Robert P. Warnock) Newsgroups: comp.protocols.tcp-ip Subject: Re: Fletcher Checksum Summary: Correcting some R-S codes is easy Keywords: Error correction, ECC, FEC, R-S, Reed Solomon Message-ID: <46404@sgi.sgi.com> Date: 15 Dec 89 05:13:12 GMT References: <0CEC4873D71F21B02A@sdi.polaroid.com> Sender: rpw3@rigden.wpd.sgi.com Reply-To: rpw3%rigden.wpd@sgi.com (Robert P. Warnock) Organization: Silicon Graphics, Inc., Mountain View, CA Lines: 66 HORN%HYDRA@sdi.polaroid.COM writes: +--------------- | FEC techniques are improving steadily and are now in widespread use | both within modems (typically convolution codes) and in | media like CDROM (Reed Solomon codes). For the non-error case, | there are table lookup approaches to RS (and some other) codes that | reduce the computation load to 10-20 instructions per byte for a | code that can withstand 0.001 ber. The computation needed to repair | an error is much larger... +--------------- Actually, correcting can be pretty simple for certain special cases, such as the modified (255, 252) R-S code that IBM used in the 3370(?) disk. (Sorry, not sure about the model number; my Costello & Liu is at home.) That code computes and transmits the residuals over the various primitive polynomials separately, rather than with a single generator polynomial with the primitives as factors (which is the usual case). It will correct one bad byte in 252 bytes of data. (You can use shorter blocks, but each block needs 3 check bytes.) In the special case of using a**(-1), a**0, and a**1 ["a" primitive in GF(256)] as the divisors, three checksums (bytes) are generated, and if you have 256-byte lookup tables to do your GF(256) multiplication (o.k., division by multiplying by the inverse), you get code like this (unoptimized!): for (i = 0; i