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.

Contents

## 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
4```

The 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
7```

```   d=: +/"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'
5```

The 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'
2```

The 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'
7```

The 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. ]```

Essays/Check Sums (last edited 2008-12-08 10:45:28 by anonymous)