A check sum is a function on a vector-valued argument that provides a check on the correctness and/or uniqueness of the argument. This essay presents check sum computations for various codes.
Parity
The parity bit of a boolean vector v is ~:/v .
CRC
The CRC (cyclic redundancy check) can be computed using the foreign 128!:3 . For a well-chosen polynomial x (or for the monad 128!:3 ) it is highly improbable that (x 128!:3 y) = x 128!:3 y1 when y and y1 are not the same.
crc=: 128!:3 crc 'assiduously avoid any and all asinine alliterations' 1439575093 crc 'assiduously avoid any and all asinine alliteratioms' 2128838646 crc 'assiduously avoid any and all asinine alliteration' _1000314142
SEDOL
A SEDOL is a 7-character alphanumeric string. The last character is a check digit computed as follows:
- The digits 0-9 have values 0 to 9.
- Letters have value 9 + their ordinal position in the alphabet. (e.g. A=10 and M=22).
A weighted sum of the values is computed, using weights 1 3 1 7 3 9
- The check digit is the 10's complement of the weighted sum modulo 10.
sa =: '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'
scd=: (841$'0987654321') {~ 1 3 1 7 3 9 +/ .*~ sa i. ]
scd '026349' NB. BAE Systems
4The maximum weighted sum is 840 = 1 3 1 7 3 9 +/ .* #sa . If w is a weighted sum, the check digit is:
(-10|w) { '0123456789'
(10|w) { '0987654321'
w { 841 $ '0987654321'
CUSIP
A CUSIP is a 9-character alphanumeric string. The last character is a check digit computed as follows:
- The digits 0-9 have values 0 to 9.
- Letters have value 9 + their ordinal position in the alphabet. (e.g. A=10 and M=22).
- Every other value is multipled by 2.
Values are converted to a string of single digits (43 becomes 4 3).
- The check digit is the 10's complement of the sum of the digits.
ca =: '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'
d1 =: [: +/"1 (+/"1 ] 10 10 #: i.#ca) {~ ca i. 0 2 4 6 {"1 ]
d2 =: [: +/"1 (+/"1 ] 10 10 #: 2*i.#ca) {~ ca i. 1 3 5 7 {"1 ]
ccd=: (101$'0987654321') {~ d1 + d2
ccd '93114210' NB. Wal-Mart
3
ccd '912827XN' NB. US Treasury Note
7d=: +/"1 ] 10 10 #: 1 2 */ i.#ca $d 2 36 >./"1 d 11 14 +/ 8 $ >./"1 d 100 +/ 8 $ >./"1 +/"1 ] 10 10 #: 1 2 */ i.#ca 100
The columns of d are the sums of digits for each character of the alphabet ca , with 0{d for characters in even positions and 1{d for characters in odd positions. 11 is the maximum sum-of-digits for the even characters and 14 is the maximum for the odd ones. The maximum total for sums-of-digits for an 8-character CUSIP is therefore 100 . If t is a total for sums-of-digits, the check digit is:
(-10|t) { '0123456789'
(10|t) { '0987654321'
t { 101 $ ''0987654321'
UPC
A UPC is a 12-digit string. The last digit is a check digit computed as follows:
A weighted sum of the first 11 digits is computed using weights 11$3 1 .
- The check digit is the 10's complement of the sum.
ua =: '0123456789'
ucd=: (208$'0987654321') {~ (11$3 1) +/ .*~ ua i. ]
ucd '03600029145'
2
ucd '06038365031'
5The maximum weighted sum is 207 = (11$3 1) +/ .* 9 . If w is a weighted sum, the check digit is:
(-10|w) { '0123456789'
(10|w) { '0987654321'
w { 208 $ '0987654321'
ISBN-10
A ISBN-10 is a 10-digit string. The last digit is a check digit computed as follows:
A weighted sum of the first 9 digits is computed using weights 10-i.9 .
The check digit is the 11's complement of the sum, with an X denoting the value 10 .
i10a =: '0123456789'
i10cd=: (487$'0X987654321') {~ (10-i.9) +/ .* i10a i. ]
i10cd '030640615'
2The maximum weighted sum is 486 = (10-i.9) +/ .* 9 . If w is a weighted sum, the check digit is:
(-11|w) { '0123456789X'
(11|w) { '0X987654321'
w { 487 $ '0X987654321'
ISBN-13
A ISBN-13 is a 13-digit string. The last digit is a check digit computed as follows:
A weighted sum of the first 12 digits is computed using weights 12$1 3 .
- The check digit is the 10's complement of the sum.
i13a =: '0123456789'
i13cd=: (217$'0987654321') {~ (12$1 3) +/ .* i13a i. ]
i13cd '978030640615'
7The maximum weighted sum is 216 = (12$1 3) +/ .* 9 . If w is a weighted sum, the check digit is:
(-10|w) { '0123456789'
(10|w) { '0987654321'
w { 217 $ '0987654321'
Collected Definitions
parity=: ~:/
crc =: 128!:3
NB. SEDOL
sa =: '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'
scd =: (841$'0987654321') {~ 1 3 1 7 3 9 +/ .*~ sa i. ]
NB. CUSIP
ca =: '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'
d1 =: [: +/"1 (+/"1 ] 10 10 #: i.#ca) {~ ca i. 0 2 4 6 {"1 ]
d2 =: [: +/"1 (+/"1 ] 10 10 #: 2*i.#ca) {~ ca i. 1 3 5 7 {"1 ]
ccd =: (101$'0987654321') {~ d1 + d2
NB. UPC
ua =: '0123456789'
ucd =: (208$'0987654321') {~ (11$3 1) +/ .*~ ua i. ]
NB. ISBN-10
i10a =: '0123456789'
i10cd =: (487$'0X987654321') {~ (10-i.9) +/ .* i10a i. ]
NB. ISBN-13
i13a =: '0123456789'
i13cd =: (217$'0987654321') {~ (12$1 3) +/ .* i13a i. ]