I am feeling the dopamine high from finally finishing (mostly) my Reed Solomon implementation. I got decoding working correctly, with dataMatrix256 and QRCode, including corruption repair, within t/2 errors. It is VERY SLOOOW, way to slow to use yet. There are speedups possible in writing a plugin for the hot spots, which are on the decode side: GFPoly evaluateAt (40.1%), Decoder runEuclideanAlgorithm(38.5%), Decoder findErrorLocations(12.6%) and Decoder find ErrorMagnitudes(2.3%).
It is written in Squeak, my favorite all-time language environment. I have used it for over 20 years. It is so beautiful! The rule of development is #GetItWorking, #GetItWorkingRight #GetItWorkingFast.
If you are interested in checking out the code, go to http://squeak.org and grab squeak. Once you have it running, right click for the World Menu and select open...Monticello Browser. Add a new repository of type HTTP and enter the Cryptography repository.
MCHttpRepository
location: 'https://www.squeaksource.com/Cryptography'
user: 'squeak'
password: 'squeak'
Open a Workspace (World Menu -> Workspace) & run this code (paste into Workspace, select it and right click do it.):
Installer ss
project: 'Cryptography';
install: 'ProCrypto-1-1-1';
install: 'ProCryptoTests-1-1-1'.
Now you can open a Browser to look at the code (categories: CryptographyRSFEC & CryptographyRSFECTests) or open a TestRunner to test it (World Menu -> *).
Speedup work: I converted OrderedCollection use to Array use to improve #at: lookup and #at:put: set calls. Code is published to Cryptography. OrderedCollection has fallen off the leaves, from profiling. Plugin support is next.
**Leaves**
16.5% {22153ms} RSFECGenericGF>>exp:
9.6% {12888ms} RSFECGenericGF>>maskValue:
9.1% {12205ms} RSFECGenericGF>>addOrSubtract:by:
7.1% {9561ms} RSFECGenericGF>>log:
6.5% {8694ms} RSFECGenericGF>>normalizeIndex:
4.7% {6299ms} RSFECGenericGF>>multiply:by:
2.6% {3512ms} RSFECGenericGFPoly>>evaluateAt:
1.3% {1780ms} RSFECGenericGFPoly>>addOrSubtractPoly:
1.3% {1682ms} RSFECGenericGFPoly>>multiplyByMonomialDegree:coefficient:
6.0% {8097ms} RSErasureGalois>>normalizeIndex:
1.7% {2336ms} RSErasureGalois>>maskValue:
1.6% {2140ms} RSErasureGalois>>tableMultiply:by:
1.5% {2040ms} RSErasureGalois>>add:by:
1.3% {1797ms} RSErasureGaloisTest(TestCase)>>assert:description:
1.2% {1669ms} RSErasureGalois>>galoisMultiply:by: