Below is some Java code, with a comment, from ZXing's ReedSolomon error correction. It points out a hotspot bug with a workaround. What would be the Squeak code to calculate the denominator? I'm guessing that this hotspot bug does not exist in Squeak. I tried this code and it fails:
denominator = field
multiply: denominator
by: (field
addOrSubtract: 1
by: (field
multiply: (errorLocations at: j)
by: xiInverse)).
Notice the commented out code in the first 2 lines of the java comment. The computation seems to revolve around
field addOrSubtract: 1 by: term
or
(term & 0x1) == 0 ? term | 1 : term & ~1;
Here is the Java code.
--//denominator = field.multiply(denominator,
// GenericGF.addOrSubtract(1, field.multiply(errorLocations[j], xiInverse)));
// Above should work but fails on some Apple and Linux JDKs due to a Hotspot bug.
// Below is a funny-looking workaround from Steven Parkes
int term = field.multiply(errorLocations[j], xiInverse);
int termPlus1 = (term & 0x1) == 0 ? term | 1 : term & ~1;
denominator = field.multiply(denominator, termPlus1);