1010% Standalone tests for the rsecprime helper (streaming RSEC over GF(p)).
1111% Uses small primes so expected values can be hand-computed.
1212%
13+ % Calling convention:
14+ %
15+ % {getdata} nd coeffsrev lfsr p //rsecprime exec
16+ %
17+ % where coeffsrev holds the generator coefficients reversed.
18+ %
1319
1420/rsecprime dup /uk.co.terryburton.bwipp findresource cvx def
1521
1622%
17- % Test 1: Minimal case. p=11, nc=1, nd=1, data=[3], coeffs =[7].
23+ % Test 1: Minimal case. p=11, nc=1, nd=1, data=[3], coeffsrev =[7].
1824% Hand-computed:
1925% lfsr = [0]
2026% m=0: fb = (3 - 0) mod 11 = 3
2127% inner j loop has nc-2 = -1 range -> no iterations
22- % lfsr[0] = (coeffs [0] * fb) mod 11 = (7*3) mod 11 = 10
28+ % lfsr[0] = (coeffsrev [0] * fb) mod 11 = (7*3) mod 11 = 10
2329% Expected ECC = [10]
2430%
2531/rsdata [3] def
2632/lfsr 1 array def
27- { rsdata exch get } 1 [7] 1 lfsr 11 //rsecprime exec
33+ { rsdata exch get } 1 [7] lfsr 11 //rsecprime exec
2834lfsr 0 1 getinterval
2935[10] debugIsEqual
3036
3137%
32- % Test 2: nc=2, nd=1, p=11, data=[3], coeffs=[2, 3 ].
38+ % Test 2: nc=2, nd=1, p=11, data=[3], coeffsrev=[3, 2 ].
3339% Hand-computed:
3440% lfsr = [0, 0]
3541% m=0: fb = (3 - 0) mod 11 = 3
36- % j=0: lfsr[0] = (lfsr[1] + coeffs[1 ]*fb) mod 11 = (0 + 3*3) mod 11 = 9
37- % lfsr[1] = (coeffs[0 ] * fb) mod 11 = (2*3) mod 11 = 6
42+ % j=0: lfsr[0] = (lfsr[1] + coeffsrev[0 ]*fb) mod 11 = (0 + 3*3) mod 11 = 9
43+ % lfsr[1] = (coeffsrev[1 ] * fb) mod 11 = (2*3) mod 11 = 6
3844% Expected ECC = [9, 6]
3945%
4046/lfsr 2 array def
41- { rsdata exch get } 1 [2 3] 2 lfsr 11 //rsecprime exec
47+ { rsdata exch get } 1 [3 2] lfsr 11 //rsecprime exec
4248lfsr 0 2 getinterval
4349[9 6] debugIsEqual
4450
4551%
46- % Test 3: nc=2, nd=2, p=11, data=[3, 5], coeffs=[2, 3 ].
52+ % Test 3: nc=2, nd=2, p=11, data=[3, 5], coeffsrev=[3, 2 ].
4753% After m=0 as Test 2: lfsr = [9, 6]
4854% m=1: fb = (5 - 9 + 11) mod 11 = 7
4955% j=0: lfsr[0] = (lfsr[1] + 3*7) mod 11 = (6 + 21) mod 11 = 5
5056% lfsr[1] = (2 * 7) mod 11 = 14 mod 11 = 3
5157% Expected ECC = [5, 3]
5258%
5359/rsdata [3 5] def
54- { rsdata exch get } 2 [2 3] 2 lfsr 11 //rsecprime exec
60+ { rsdata exch get } 2 [3 2] lfsr 11 //rsecprime exec
5561lfsr 0 2 getinterval
5662[5 3] debugIsEqual
5763
5864%
5965% Test 4: nd=0 boundary. Empty data -> ECC stays all zero.
6066%
6167/lfsr 3 array def
62- { rsdata exch get } 0 [1 2 3] 3 lfsr 11 //rsecprime exec
68+ { rsdata exch get } 0 [3 2 1] lfsr 11 //rsecprime exec
6369lfsr 0 3 getinterval
6470[0 0 0] debugIsEqual
6571
@@ -70,25 +76,20 @@ lfsr 0 3 getinterval
7076/lfsr 2 array def
7177/rsdata [3] def
7278% p=11
73- { rsdata exch get } 1 [2 3] 2 lfsr 11 //rsecprime exec
79+ { rsdata exch get } 1 [3 2] lfsr 11 //rsecprime exec
7480lfsr 0 2 getinterval
7581[9 6] debugIsEqual
7682% p=13 with same buffer. Hand-computed:
7783% fb = 3 mod 13 = 3
7884% j=0: lfsr[0] = (0 + 3*3) mod 13 = 9
7985% lfsr[1] = (2*3) mod 13 = 6
80- { rsdata exch get } 1 [2 3] 2 lfsr 13 //rsecprime exec
86+ { rsdata exch get } 1 [3 2] lfsr 13 //rsecprime exec
8187lfsr 0 2 getinterval
8288[9 6] debugIsEqual
8389
8490%
85- % Test 6: Smoke test with p=929 (PDF417's field). Not hand-computed; captures
86- % the helper's output as a regression guard for PDF417-sized arithmetic.
87- %
88- /rsdata [100 200 300] def
89- /lfsr 2 array def
90- { rsdata exch get } 3 [500 600] 2 lfsr 929 //rsecprime exec
91- % Expected: verified against direct computation with the helper in current state.
91+ % Test 6: Smoke test with p=929 (PDF417's field), coeffsrev=[600, 500].
92+ % Hand-computed:
9293% m=0: fb = (100-0) mod 929 = 100
9394% j=0: S[0] = (0 + 600*100) mod 929 = 60000 mod 929 = 60000 - 64*929 = 544
9495% S[1] = (500*100) mod 929 = 50000 mod 929 = 50000 - 53*929 = 763
@@ -100,5 +101,9 @@ lfsr 0 2 getinterval
100101% j=0: S[0] = (794 + 600*628) mod 929 = (794+376800) mod 929 = 377594 mod 929; 929*406 = 377174; 377594-377174 = 420
101102% S[1] = (500*628) mod 929 = 314000 mod 929; 929*337 = 313073; 314000-313073 = 927
102103% Expected ECC = [420 927]
104+ %
105+ /rsdata [100 200 300] def
106+ /lfsr 2 array def
107+ { rsdata exch get } 3 [600 500] lfsr 929 //rsecprime exec
103108lfsr 0 2 getinterval
104109[420 927] debugIsEqual
0 commit comments