November 18, 2014

We studied Hans Peter Luhn’s algorithm for generating check digits in a previous exercise. Today, we look at an alternate check digit algorithm developed by H. Michael Damm. Both algorithms are useful for creating checked identification numbers, suitable for credit cards or other identity numbers.

Damm’s algorithm is based on table lookup. It is initialized with a current check digit of 0. Then, each digit of the number, from left to right (most-significant to least-significant) is looked up in a two-dimensional table with the current check digit pointing to the row and the digit of the number pointing to the column, using this table:

0

1

2

3

4

5

6

7

8

9

0

0

3

1

7

5

9

8

6

4

2

1

7

0

9

2

1

5

4

8

6

3

2

4

2

0

6

8

7

1

3

5

9

3

1

7

5

0

9

8

3

4

2

6

4

6

1

2

3

0

4

5

9

7

8

5

3

6

7

4

2

0

9

5

8

1

6

5

8

6

9

7

2

0

1

3

4

7

8

9

4

5

3

6

2

0

1

7

8

9

4

3

8

6

1

7

2

0

9

9

2

5

8

1

4

3

6

7

9

0

For instance, given the input 572, the check digit is 4 and the output is 5724. The check digit is computed starting with 0, then row 0 and column 5 gives a new check digit of 9, row 9 and column 7 gives a new check digit of 7, and row 7 and column 2 gives a final check digit of 4. Notice that leading zeroes do not affect the check digit.

Checking goes the same way, and is successful if the final check digit is 0. Given the input 5724, the initial check digit is 0, then row 0 and column 5 gives a new check digit of 9, row 9 and column 7 gives a new check digit of 7, row 7 and column 2 gives a new check digit of 4, and row 4 and column 4 gives a final check digit of 0.

Your task is to write functions that add a check digit to a number and validate a number to which a check digit has been added. When you are finished, you are welcome to read or run a suggested solution, or to post your own solution or discuss the exercise in the comments below.